aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBalakrishna Garapati <balakrishna.garapati@linaro.org>2017-03-03 15:13:43 +0100
committerBalakrishna Garapati <balakrishna.garapati@linaro.org>2017-03-03 15:13:43 +0100
commit4478de9683f9fc875d75220550e7e38f1e4e8224 (patch)
treef8c8fdfa95d1a4c954e9e5c34e00a9b3336b0b68
parent7f5fa185004547dd74304c8c33ebab485891682e (diff)
parenta652887cfebadb30843a6fbfe9d5655031d46881 (diff)
Merge tag 'v1.14.0.0' into odp_dpdk_v1.14.0.0
-rw-r--r--.codecov.yml27
-rw-r--r--.travis.yml95
-rw-r--r--CHANGELOG144
-rw-r--r--CONTRIBUTING6
-rw-r--r--DEPENDENCIES4
-rw-r--r--configure.ac44
-rw-r--r--doc/images/ref.svg58
-rw-r--r--doc/images/reflen.svg45
-rw-r--r--doc/images/refpkt1.svg43
-rw-r--r--doc/images/refpkt2.svg43
-rw-r--r--doc/images/refpktmulti.svg75
-rw-r--r--doc/images/refpktsingle.svg76
-rw-r--r--doc/images/refstatic.svg39
-rw-r--r--doc/users-guide/users-guide-packet.adoc239
-rwxr-xr-xdoc/users-guide/users-guide.adoc120
-rw-r--r--example/Makefile.inc1
-rw-r--r--example/classifier/odp_classifier.c4
-rw-r--r--example/generator/odp_generator.c83
-rw-r--r--example/hello/odp_hello.c15
-rw-r--r--example/ipsec/odp_ipsec.c6
-rw-r--r--example/ipsec/odp_ipsec_fwd_db.h1
-rw-r--r--example/ipsec/odp_ipsec_loop_db.h1
-rw-r--r--example/ipsec/odp_ipsec_misc.h4
-rw-r--r--example/ipsec/odp_ipsec_stream.c4
-rw-r--r--example/l2fwd_simple/odp_l2fwd_simple.c4
-rw-r--r--example/l3fwd/odp_l3fwd.c6
-rw-r--r--example/l3fwd/odp_l3fwd_db.h2
-rw-r--r--example/packet/odp_pktio.c4
-rw-r--r--example/switch/odp_switch.c4
-rw-r--r--example/time/time_global_test.c5
-rw-r--r--example/timer/odp_timer_test.c4
-rw-r--r--helper/Makefile.am38
-rw-r--r--helper/chksum.c4
-rw-r--r--helper/cuckootable.c59
-rw-r--r--helper/hashtable.c51
-rw-r--r--helper/include/odp/helper/linux/process.h84
-rw-r--r--helper/include/odp/helper/linux/pthread.h66
-rw-r--r--helper/include/odp/helper/odph_api.h39
-rw-r--r--helper/include/odp/helper/odph_cuckootable.h (renamed from helper/odph_cuckootable.h)80
-rw-r--r--helper/include/odp/helper/odph_hashtable.h111
-rw-r--r--helper/include/odp/helper/odph_iplookuptable.h125
-rw-r--r--helper/include/odp/helper/odph_lineartable.h101
-rw-r--r--helper/include/odp/helper/table.h10
-rw-r--r--helper/include/odp/helper/threads.h (renamed from helper/include/odp/helper/linux.h)78
-rw-r--r--helper/iplookuptable.c74
-rw-r--r--helper/lineartable.c36
-rw-r--r--helper/linux/thread.c239
-rw-r--r--helper/m4/configure.m414
-rw-r--r--helper/odph_debug.h4
-rw-r--r--helper/odph_hashtable.h40
-rw-r--r--helper/odph_iplookuptable.h58
-rw-r--r--helper/odph_lineartable.h40
-rw-r--r--helper/test/.gitignore1
-rw-r--r--helper/test/Makefile.am42
-rw-r--r--helper/test/chksum.c22
-rw-r--r--helper/test/cuckootable.c15
-rw-r--r--helper/test/iplookuptable.c6
-rw-r--r--helper/test/linux/Makefile.am5
-rw-r--r--helper/test/linux/process.c (renamed from helper/test/process.c)17
-rw-r--r--helper/test/linux/pthread.c (renamed from helper/test/thread.c)16
-rw-r--r--helper/test/odpthreads.c20
-rw-r--r--helper/test/parse.c89
-rw-r--r--helper/test/table.c15
-rw-r--r--helper/threads.c (renamed from helper/linux.c)242
-rw-r--r--include/odp/api/spec/byteorder.h4
-rw-r--r--include/odp/api/spec/packet.h140
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/arm32-linux/odp/api/abi/shared_memory.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/arm64-linux/odp/api/abi/shared_memory.h7
-rw-r--r--include/odp/arch/default/api/abi/buffer.h38
-rw-r--r--include/odp/arch/default/api/abi/classification.h40
-rw-r--r--include/odp/arch/default/api/abi/crypto.h36
-rw-r--r--include/odp/arch/default/api/abi/event.h42
-rw-r--r--include/odp/arch/default/api/abi/packet.h47
-rw-r--r--include/odp/arch/default/api/abi/pool.h43
-rw-r--r--include/odp/arch/default/api/abi/queue.h35
-rw-r--r--include/odp/arch/default/api/abi/shared_memory.h35
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/mips64-linux/odp/api/abi/shared_memory.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/power64-linux/odp/api/abi/shared_memory.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/x86_32-linux/odp/api/abi/shared_memory.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/buffer.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/classification.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/crypto.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/event.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/packet.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/pool.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/queue.h7
-rw-r--r--include/odp/arch/x86_64-linux/odp/api/abi/shared_memory.h7
-rw-r--r--pkgconfig/libodphelper-linux-generic.pc.in (renamed from pkgconfig/libodphelper-linux.pc.in)4
-rw-r--r--platform/Makefile.inc22
-rw-r--r--platform/linux-generic/Makefile.am19
-rw-r--r--platform/linux-generic/_ishm.c9
-rw-r--r--platform/linux-generic/_ishmphy.c42
-rw-r--r--platform/linux-generic/arch/arm/odp/api/cpu_arch.h6
-rw-r--r--platform/linux-generic/include/odp/api/classification.h9
-rw-r--r--platform/linux-generic/include/odp/api/packet.h11
-rw-r--r--platform/linux-generic/include/odp/api/packet_flags.h11
-rw-r--r--platform/linux-generic/include/odp/api/plat/atomic_inlines.h114
-rw-r--r--platform/linux-generic/include/odp/api/plat/buffer_types.h23
-rw-r--r--platform/linux-generic/include/odp/api/plat/byteorder_inlines.h24
-rw-r--r--platform/linux-generic/include/odp/api/plat/byteorder_types.h3
-rw-r--r--platform/linux-generic/include/odp/api/plat/classification_types.h34
-rw-r--r--platform/linux-generic/include/odp/api/plat/crypto_types.h21
-rw-r--r--platform/linux-generic/include/odp/api/plat/event_types.h19
-rw-r--r--platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h90
-rw-r--r--platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h41
-rw-r--r--platform/linux-generic/include/odp/api/plat/packet_inlines.h173
-rw-r--r--platform/linux-generic/include/odp/api/plat/packet_inlines_api.h113
-rw-r--r--platform/linux-generic/include/odp/api/plat/packet_types.h113
-rw-r--r--platform/linux-generic/include/odp/api/plat/pool_types.h21
-rw-r--r--platform/linux-generic/include/odp/api/plat/queue_types.h25
-rw-r--r--platform/linux-generic/include/odp/api/plat/shared_memory_types.h16
-rw-r--r--platform/linux-generic/include/odp/api/plat/static_inline.h.in8
-rw-r--r--platform/linux-generic/include/odp/api/plat/std_clib_inlines.h6
-rw-r--r--platform/linux-generic/include/odp/api/plat/sync_inlines.h6
-rw-r--r--platform/linux-generic/include/odp/api/plat/ticketlock_inlines.h19
-rw-r--r--platform/linux-generic/include/odp/api/plat/ticketlock_inlines_api.h36
-rw-r--r--platform/linux-generic/include/odp/api/queue.h4
-rw-r--r--platform/linux-generic/include/odp/api/ticketlock.h4
-rw-r--r--platform/linux-generic/include/odp_align_internal.h108
-rw-r--r--platform/linux-generic/include/odp_bitmap_internal.h317
-rw-r--r--platform/linux-generic/include/odp_classification_datamodel.h19
-rw-r--r--platform/linux-generic/include/odp_classification_inlines.h133
-rw-r--r--platform/linux-generic/include/odp_crypto_internal.h1
-rw-r--r--platform/linux-generic/include/odp_packet_dpdk.h2
-rw-r--r--platform/linux-generic/include/odp_packet_internal.h67
-rw-r--r--platform/linux-generic/include/odp_packet_io_internal.h2
-rw-r--r--platform/linux-generic/include/odp_packet_netmap.h2
-rw-r--r--platform/linux-generic/include/odp_pool_internal.h1
-rw-r--r--platform/linux-generic/include/odp_queue_internal.h2
-rw-r--r--platform/linux-generic/include/odp_schedule_if.h5
-rw-r--r--platform/linux-generic/include/protocols/ip.h14
-rw-r--r--platform/linux-generic/m4/odp_schedule.m49
-rw-r--r--platform/linux-generic/odp_bitmap.c315
-rw-r--r--platform/linux-generic/odp_buffer.c5
-rw-r--r--platform/linux-generic/odp_classification.c39
-rw-r--r--platform/linux-generic/odp_crypto.c22
-rw-r--r--platform/linux-generic/odp_event.c5
-rw-r--r--platform/linux-generic/odp_packet.c365
-rw-r--r--platform/linux-generic/odp_packet_flags.c41
-rw-r--r--platform/linux-generic/odp_pool.c12
-rw-r--r--platform/linux-generic/odp_queue.c12
-rw-r--r--platform/linux-generic/odp_schedule.c21
-rw-r--r--platform/linux-generic/odp_schedule_if.c6
-rw-r--r--platform/linux-generic/odp_schedule_iquery.c1521
-rw-r--r--platform/linux-generic/odp_schedule_sp.c120
-rw-r--r--platform/linux-generic/odp_shared_memory.c6
-rw-r--r--platform/linux-generic/odp_ticketlock.c24
-rw-r--r--platform/linux-generic/odp_timer.c9
-rw-r--r--platform/linux-generic/odp_traffic_mngr.c7
-rw-r--r--platform/linux-generic/pktio/dpdk.c19
-rw-r--r--platform/linux-generic/pktio/ipc.c2
-rw-r--r--platform/linux-generic/pktio/netmap.c42
-rw-r--r--test/Makefile.inc1
-rw-r--r--test/common_plat/common/odp_cunit_common.c2
-rw-r--r--test/common_plat/miscellaneous/odp_api_from_cpp.cpp2
-rw-r--r--test/common_plat/performance/.gitignore2
-rw-r--r--test/common_plat/performance/Makefile.am19
-rw-r--r--test/common_plat/performance/dummy_crc.h493
-rw-r--r--test/common_plat/performance/odp_bench_packet.c1611
-rw-r--r--test/common_plat/performance/odp_crypto.c2
-rw-r--r--test/common_plat/performance/odp_l2fwd.c26
-rwxr-xr-xtest/common_plat/performance/odp_l2fwd_run.sh10
-rw-r--r--test/common_plat/performance/odp_pktio_ordered.c1342
-rwxr-xr-xtest/common_plat/performance/odp_pktio_ordered_run.sh42
-rw-r--r--test/common_plat/performance/odp_pktio_perf.c5
-rw-r--r--test/common_plat/performance/odp_sched_latency.c2
-rw-r--r--test/common_plat/performance/odp_scheduling.c2
-rw-r--r--test/common_plat/performance/udp64.pcapbin0 -> 7624 bytes
-rw-r--r--test/common_plat/validation/api/classification/classification.h25
-rw-r--r--test/common_plat/validation/api/classification/odp_classification_common.c170
-rw-r--r--test/common_plat/validation/api/classification/odp_classification_test_pmr.c749
-rw-r--r--test/common_plat/validation/api/classification/odp_classification_tests.c46
-rw-r--r--test/common_plat/validation/api/classification/odp_classification_testsuites.h17
-rw-r--r--test/common_plat/validation/api/crypto/crypto.c6
-rw-r--r--test/common_plat/validation/api/crypto/odp_crypto_test_inp.c398
-rw-r--r--test/common_plat/validation/api/crypto/odp_crypto_test_inp.h1
-rw-r--r--test/common_plat/validation/api/packet/packet.c472
-rw-r--r--test/common_plat/validation/api/packet/packet.h2
-rw-r--r--test/common_plat/validation/api/pktio/pktio.c4
-rw-r--r--test/common_plat/validation/api/timer/timer.c2
-rw-r--r--test/common_plat/validation/api/traffic_mngr/traffic_mngr.c6
-rw-r--r--test/linux-generic/Makefile.inc3
-rw-r--r--test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.c30
-rwxr-xr-xtest/linux-generic/mmap_vlan_ins/mmap_vlan_ins.sh15
-rw-r--r--test/linux-generic/pktio_ipc/ipc_common.h5
-rw-r--r--test/linux-generic/ring/ring_stress.c2
221 files changed, 11938 insertions, 1740 deletions
diff --git a/.codecov.yml b/.codecov.yml
new file mode 100644
index 000000000..36270d618
--- /dev/null
+++ b/.codecov.yml
@@ -0,0 +1,27 @@
+codecov:
+ notify:
+ require_ci_to_pass: yes
+
+coverage:
+ precision: 3
+ round: down
+ range: "50...75"
+ status:
+ project:
+ target: 70%
+ threshold: 5%
+ patch: yes
+ changes: yes
+
+parsers:
+ gcov:
+ branch_detection:
+ conditional: yes
+ loop: yes
+ method: no
+ macro: no
+
+comment:
+ layout: "header, diff, files"
+ behavior: default
+ require_changes: no
diff --git a/.travis.yml b/.travis.yml
index 03e61b185..83ec65f89 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,25 +7,68 @@
# pushing to github/coverity_scan will also launch a static analysis
# See https://scan.coverity.com/travis_ci
+language: c
+sudo: required
+dist: trusty
env:
global:
# COVERITY_SCAN_TOKEN
# ** specific to your project **
+ # Note:
+ # You should have a github account and travis linked travis account.
+ # The secure key to be filled below is the 685 character long encrypted
+ # token you can find as follow from your coverity dashboard
+ # (at https://scan.coverity.com/dashboard):
+ # Click on the github project (<you>/odp)
+ # Click on "submit build"
+ # Click on "Configure Travis CI"
+ # Look at the COVERITY_SCAN_TOKEN in the env: global: section
+ # of the configuration example.
+ # copy the secure:<key> below
+ #
- secure: "xxxx"
+ #
+ # By default Linaro CODECOV_TOKEN token is used. It's ok to use it to see
+ # for individual commit validation. But you you want to track tests history
+ # you need generated new one at https://codecov.io specific for your repo.
+ - CODECOV_TOKEN=8e1c0fd8-62ff-411e-a79f-5839f6662c11
-language: c
-compiler: clang
-sudo: required
+matrix:
+ include:
+ - compiler: gcc
+ addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ packages:
+ - gcc
+ env: MY_CF="-O0 -coverage" MY_LDF="--coverage" DOCOV=1
+ - compiler: clang
+ addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ - llvm-toolchain-precise-3.8
+ packages:
+ - clang-3.8
before_install:
+ - echo 1000 | sudo tee /proc/sys/vm/nr_hugepages
+ - sudo mkdir -p /mnt/huge
+ - sudo mount -t hugetlbfs nodev /mnt/huge
+
- sudo apt-get -qq update
- sudo apt-get install automake autoconf libtool libssl-dev graphviz mscgen doxygen
- sudo apt-get install libpcap-dev linux-headers-`uname -r`
+ - sudo pip install coverage
- gem install asciidoctor
+ - PATH=${PATH//:\.\/node_modules\/\.bin/}
+ - if [ "$CC" = "clang" ]; then export CXX="clang++-3.8" CC="clang-3.8" LD="clang-3.8"; fi
# Install cunit for the validation tests because distro version is too old and fails C99 compile
+ - sudo apt-get remove libcunit1-dev libcunit1
- export CUNIT_VERSION=2.1-3
- - curl -sSOL http://sourceforge.net/projects/cunit/files/CUnit/${CUNIT_VERSION}/CUnit-${CUNIT_VERSION}.tar.bz2
+ - curl -sSOL https://github.com/Linaro/libcunit/releases/download/${CUNIT_VERSION}/CUnit-${CUNIT_VERSION}.tar.bz2
- tar -jxf *.bz2
- cd CUnit*
- ./bootstrap
@@ -34,6 +77,7 @@ before_install:
- sudo make install
- cd ..
- export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
+
# DPDK pktio
- TARGET=${TARGET:-"x86_64-native-linuxapp-gcc"}
- git -c advice.detachedHead=false clone -q --depth=1 --single-branch --branch=v16.07 http://dpdk.org/git/dpdk dpdk
@@ -46,17 +90,50 @@ before_install:
- make install T=${TARGET} EXTRA_CFLAGS="-fPIC" > /dev/null
- popd
+# Netmap pktio
+ - sudo apt-get source linux-image-$(uname -r) > /dev/null
+ - KSRC="$PWD/`find . -name kernel-parameters.txt | cut -d / -f 2 `"
+ - git -c advice.detachedHead=false clone -q --depth=1 --single-branch --branch=v11.2 https://github.com/luigirizzo/netmap.git
+ - pushd netmap/LINUX
+ - ./configure --kernel-sources=$KSRC
+ - make > /dev/null
+ - sudo insmod ./netmap.ko
+ - popd
+
script:
+ - echo $TRAVIS_COMMIT_RANGE
+ - ODP_PACHES=`echo $TRAVIS_COMMIT_RANGE | sed 's/\.//'`
+# Generate patches provided with $TRAVIS_COMMIT_RANGE.
+# In case of force push and range is broken validate only the latest commit if it's not merge commit.
+ - git format-patch $ODP_PACHES;
+ if [ $? -ne 0 ]; then
+ git show --summary HEAD| grep -q '^Merge:';
+ if [ $? -ne 0 ]; then
+ git format-patch HEAD^;
+ perl ./scripts/checkpatch.pl *.patch;
+ fi;
+ else
+ perl ./scripts/checkpatch.pl *.patch;
+ fi
- ./bootstrap
- - ./configure --enable-test-cpp --enable-test-vald --enable-test-helper --enable-test-perf --enable-user-guides --enable-test-perf-proc --enable-test-example --with-dpdk-path=`pwd`/dpdk/${TARGET}
- - make check
- - git clean -f -d -x && rm -rf dpdk
- - ./bootstrap
- ./configure
- - make doxygen-doc
+# doxygen does not trap on warnings, check for them here.
+ - make doxygen-doc |tee doxygen.log
+ - fgrep -rvq warning ./doxygen.log
- make distcheck
+ - ./bootstrap
+ - ./configure --enable-test-cpp --enable-test-vald --enable-test-helper --enable-test-perf --enable-user-guides --enable-test-perf-proc --enable-test-example --with-dpdk-path=`pwd`/dpdk/${TARGET} --with-netmap-path=`pwd`/netmap CFLAGS="$MY_CF" CXXFLAGS="$MY_CF" LDFLAGS="$MY_LDF"
+ - make -j 4
+ - sudo LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" make check
+ - sudo rm -rf dpdk
+ - sudo rm -rf netmap
+ - sudo rm -rf $KSRC
+
+after_success:
+ - if [ -n "$DOCOV" ]; then find . -type f -iname '*.[ch]' -not -path ".git/*" -execdir gcov {} \; ; bash <(curl -s https://codecov.io/bash) -X coveragepy; fi
+
addons:
coverity_scan:
project:
diff --git a/CHANGELOG b/CHANGELOG
index 72bf22533..a550a723e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,147 @@
+== OpenDataPlane (1.14.0.0)
+=== New Features
+==== APIs
+ODP v1.14.0.0 represents another preview of the Tiger Moth release series and
+introduces new APIs and extensions.
+
+===== Packet References
+Packet references are a lightweight mechanism to allow applications to create
+and manipulate different "views" of packets. These views consist of shared
+bytes common to all references created on the same `odp_packet_t`, possibly
+prefixed with unique headers that are private to each reference. Five new APIs
+are introduced to enable this feature:
+
+`odp_packet_ref_static()`::
+Static references allow a single packet to have multiple "aliases", all of
+which must be treated as read only. This is useful, for example, to retain
+a reference to a packet being transmitted to support retransmit processing,
+since the actual storage represented by a packet is not released until all
+references to it have been freed via `odp_packet_free()` calls.
+
+`odp_packet_ref()`::
+Dynamic references differ from static references is that they permit the
+individual `odp_packet_t` handles to have unique prefixes created via
+`odp_packet_push_head()` or `odp_packet_extend_head()` calls. This can be
+used, for example, to support multicasting packets to different destinations
+by creating packets that consist of unique headers followed by a common shared
+payload.
+
+`odp_packet_ref_pkt()`::
+Similar to `odp_packet_ref()`, but creates a dynamic reference by prepending a
+preexisting header onto another packet.
+
+`odp_packet_has_ref()`::
+Returns a boolean indicator of whether a given `odp_packet_t` has other
+references that share bytes with this packet.
+
+`odp_packet_unshared_len()`::
+Returns the number of unshared bytes accessible through a given `odp_packet_t`
+handle. These are the only bytes that should be changed. All other bytes
+in the packet should be treated as read only as they are shared with other
+`odp_packet_t` handles.
+
+Note that while the packet reference APIs and associated validation tests are
+present in this release, the `odp-linux` reference implementation currently
+implements references via packet copying. A zero-copy implementation of packet
+references is planned to be part of the ODP v1.15.0.0 release.
+
+==== ABI Specification
+ODP has supported an Application Binary Interface (ABI) that permits
+applications to be generated that are binary portable between select ODP
+implementations. This is now formalized with the addition of structures that
+permit ABI specifications to be defined that are shared between ODP
+implementations. ODP provides a default ABI specification that is the same as
+was provided before. This change means that additional ABIs may be defined
+that are optimized to collections of platforms that share an Instruction Set
+Architecture (ISA) and subscribe to them.
+
+ABI specifications live in the `include/odp/arch/...` directory.
+
+==== Instance Query (iQuery) Scheduler
+Adding to the range of scheduler implementations supported by `odp-linux`, a
+new scheduler, the instance query scheduler, is available by specifying
+`--enable-schedule-iquery` at `configure` time.
+
+This scheduler uses sparse bitmaps and offers scalability advantages when
+dealing with large numbers of schedule queues. It otherwise offers performance
+comparable to the default ODP scheduler implementation.
+
+=== Helpers
+Helpers have been reorganized to provide better independence from odp-linux
+and to make them more useful with other ODP implementations. These
+reorganizations are functionally transparent to ODP users but should
+simplifying packaging and porting to other ODP implementations. This includes
+adding the "umbrella" include file `odph_api.h` which can be used to include
+all helper API definitions in an application.
+
+=== Classifier Improvements
+The `odp-linux` reference implementation now supports Pattern Matching Rules
+(PMRs) for IPv6 addresses, inner and outer VLAN IDs, and inner and outer
+Ethernet types.
+
+=== Performance
+
+==== Improved inlining for embedded applications
+The `odp-linux` reference implementation now offers improved inlining support
+for ODP APIs for applications compiled against ODP configured with the
+`--enable-abi-compat=no` option, meaning they wish to forego binary
+compatibility in exchange for improved performance. These applications remain
+source portable to other ODP implementations.
+
+==== Native `odp_cpu_pause()` for ARM processors
+A native implementation of the `odp_cpu_pause()` API has been added for ARMv7
+and ARMv8 processors.
+
+==== New Microbenchmark
+The `odp_packet_bench` microbenchmark application has been added to the
+test performance directory to allow implementations to measure and calibrate
+the performance of individual ODP packet APIs.
+
+==== Ordered PktIO Test
+The `odp_pktio_ordered` application has been added to the test performance
+directory to provide stress-testing of packet ordering features of ODP.
+
+=== Documentation
+In addition to expanded documentation related to the new packet reference APIs,
+a section on applicatin portability has been added that discusses the types
+of portability offered by ODP and the tradeoffs that application writers should
+consider when using ODP.
+
+=== Bug Fixes
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2806[Bug 2806]
+The `hello.c` application can now run properly if Core 0 is not
+available (any available core will be used).
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2827[Bug 2827]
+Provide proper return code checking within _ishm.c
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2829[Bug 2829]
+Remove unused variables in iplookuptable helper routine.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2830[Bug 2830]
+Avoid memory leaks on error paths in the cuckoo table helper functions.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2834[Bug 2834]
+Fixes a race condition in shared memory allocation.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2842[Bug 2842]
+Provide proper fallback for shared memory when hugepages are not available.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2862[Bug 2862]
+Avoid null pointer dereference in the iplookuptable helper routine.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2865[Bug 2865]
+Missing doxygen documentation for helper table functions are added.
+
+=== Known Issues
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2852[Bug 2852]
+C++ programs fail to compile if they attempt to include the ODP helper APIs.
+
+==== https://bugs.linaro.org/show_bug.cgi?id=2895[Bug 2895]
+The `odp_crypto_operation()` routine does not work with multi-segment packets.
+
== OpenDataPlane (1.13.0.0)
=== New Features
diff --git a/CONTRIBUTING b/CONTRIBUTING
index a81fd8df4..ab77fd3ba 100644
--- a/CONTRIBUTING
+++ b/CONTRIBUTING
@@ -13,7 +13,8 @@ the contributing requirements for ODP
== New Development
-ODP code shall be written with the kernel coding style https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/CodingStyle[Kernel Coding Style]
+ODP code shall be written with the kernel coding style
+https://github.com/torvalds/linux/blob/master/Documentation/process/coding-style.rst[Kernel Coding Style]
ODP code shall be documented using the doxygen style described in the
"Documenting the code" section.
@@ -38,7 +39,8 @@ Signed-off-by: tag line a copy of the description follows:
Signed-off-by: this is a developer's certification that he or she has
the right to submit the patch for inclusion into the [project]. It is
an agreement to the Developer's Certificate of Origin, the full text of
-which can be found in https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/SubmittingPatches[Submitting Patches]
+which can be found in
+https://github.com/torvalds/linux/blob/master/Documentation/process/submitting-patches.rst[Submitting Patches]
Code without a proper signoff cannot be merged into the mainline.
diff --git a/DEPENDENCIES b/DEPENDENCIES
index f1f0edd16..574859ce5 100644
--- a/DEPENDENCIES
+++ b/DEPENDENCIES
@@ -83,13 +83,13 @@ Prerequisites for building the OpenDataPlane (ODP) API
3.3.1 Building netmap kernel modules
ODP works at least with the latest release version of netmap, which is
- currently 11.1. However, if possible one should try to use the latest netmap
+ currently 11.2. However, if possible one should try to use the latest netmap
master branch commit for the best performance and the latest bug fixes.
# Checkout netmap code
$ git clone https://github.com/luigirizzo/netmap.git
$ cd netmap
- $ git checkout v11.1 (optional)
+ $ git checkout v11.2 (optional)
This is enough to build ODP. If you don't want to build netmap kernel
modules you can jump to section 3.3.2.
diff --git a/configure.ac b/configure.ac
index 8cf21a17e..476c92f28 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@ AC_PREREQ([2.5])
# Set correct API version
##########################################################################
m4_define([odpapi_generation_version], [1])
-m4_define([odpapi_major_version], [13])
+m4_define([odpapi_major_version], [14])
m4_define([odpapi_minor_version], [0])
m4_define([odpapi_point_version], [0])
m4_define([odpapi_version],
@@ -38,10 +38,10 @@ AM_SILENT_RULES([yes])
# 3. if interfaces were removed, then use C+1:0:0
##########################################################################
-ODP_LIBSO_VERSION=113:0:0
+ODP_LIBSO_VERSION=114:0:1
AC_SUBST(ODP_LIBSO_VERSION)
-ODPHELPER_LIBSO_VERSION=111:0:2
+ODPHELPER_LIBSO_VERSION=112:0:0
AC_SUBST(ODPHELPER_LIBSO_VERSION)
# Checks for programs.
@@ -53,6 +53,8 @@ AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_MAKE_SET
+AC_PROG_LN_S
+
AM_PROG_AR
#Use libtool
LT_INIT([])
@@ -120,6 +122,26 @@ then
fi
##########################################################################
+# Architecture for ABI support
+##########################################################################
+AS_CASE([$host],
+ [x86*], [ARCH_ABI=x86_64-linux],
+ [i686*], [ARCH_ABI=x86_32-linux],
+ [mips64*], [ARCH_ABI=mips64-linux],
+ [powerpc*], [ARCH_ABI=power64-linux],
+ [aarch64*], [ARCH_ABI=arm64-linux],
+ [arm*], [ARCH_ABI=arm32-linux],
+ [ARCH_ABI=undefined]
+)
+AC_SUBST([ARCH_ABI])
+
+if test "${ARCH_ABI}" == "undefined";
+then
+ echo "ARCH_ABI is undefined, please add your ARCH_ABI based on host=${host}"
+ exit 1
+fi
+
+##########################################################################
# Set correct pkgconfig version
##########################################################################
PKGCONFIG_VERSION=$(echo $VERSION | awk -F '.git' '{print $1}')
@@ -206,6 +228,7 @@ AM_CONDITIONAL([test_example], [test x$test_example = xyes ])
AM_CONDITIONAL([HAVE_DOXYGEN], [test "x${DOXYGEN}" = "xdoxygen"])
AM_CONDITIONAL([user_guide], [test "x${user_guides}" = "xyes" ])
AM_CONDITIONAL([HAVE_MSCGEN], [test "x${MSCGEN}" = "xmscgen"])
+AM_CONDITIONAL([helper_linux], [test x$helper_linux = xyes ])
##########################################################################
# Setup doxygen documentation
@@ -236,6 +259,16 @@ AC_ARG_ENABLE([debug-print],
fi])
ODP_CFLAGS="$ODP_CFLAGS -DODP_DEBUG_PRINT=$ODP_DEBUG_PRINT"
+ODPH_DEBUG_PRINT=0
+AC_ARG_ENABLE([helper-debug-print],
+ [ --enable-helper-debug-print display helper debugging information],
+ [if test "x$enableval" = "xyes"; then
+ ODPH_DEBUG_PRINT=1
+ else
+ ODPH_DEBUG_PRINT=0
+ fi])
+ODP_CFLAGS="$ODP_CFLAGS -DODPH_DEBUG_PRINT=$ODPH_DEBUG_PRINT"
+
##########################################################################
# Enable/disable ODP_DEBUG
##########################################################################
@@ -298,8 +331,6 @@ AM_CFLAGS="$AM_CFLAGS $ODP_CFLAGS"
AM_CXXFLAGS="-std=c++11"
AC_CONFIG_FILES([Makefile
- helper/Makefile
- helper/test/Makefile
pkgconfig/libodp-dpdk.pc
pkgconfig/libodphelper-linux.pc
])
@@ -326,8 +357,11 @@ AC_MSG_RESULT([
Helper Library version: ${ODPHELPER_LIBSO_VERSION}
implementation_name: ${IMPLEMENTATION_NAME}
+ host: ${host}
ARCH_DIR ${ARCH_DIR}
+ ARCH_ABI ${ARCH_ABI}
with_platform: ${with_platform}
+ helper_linux: ${helper_linux}
prefix: ${prefix}
sysconfdir: ${sysconfdir}
libdir: ${libdir}
diff --git a/doc/images/ref.svg b/doc/images/ref.svg
new file mode 100644
index 000000000..70a151b8a
--- /dev/null
+++ b/doc/images/ref.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 794.22089 355.2836" stroke-miterlimit="10" id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="ref.svg" width="794.22089" height="355.2836" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata97">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs95"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1566" inkscape:window-height="807" id="namedview93" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.87799092" inkscape:cx="394.51086" inkscape:cy="152.46457" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="svg2"/>
+ <clipPath id="g182eba8b93_0_70.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path5" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path11" d="m 166.25485,1 491.43307,0 0,82.55118 -491.43307,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path13" d="m 166.25485,1 491.43307,0 0,82.55118 -491.43307,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path15" d="m 364.99116,41.97684 0,-13.640625 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.640625 1.45313,1.828125 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54688,2.73437 -0.54687,1.20313 -1.57812,1.84375 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92188 0,-1.874995 -0.78125,-2.812495 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.890625 z m 15.29761,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.546875 0.5,-0.140625 1.48437,-0.25 2.03125,-0.25 2.98438,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.234375 q 0.23438,-1.046875 0.73438,-1.6875 0.51562,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26562,0 2.04687,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51563,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51632,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.593745 0.51563,-2.781245 0.53125,-1.203125 1.60937,-1.796875 1.09375,-0.609375 2.35938,-0.609375 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.015625 2.15625,0 -3.76562,3.65625 4.14062,6.203125 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 12.76636,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.656245 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.749995 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.9844,-0.65625 -1.53128,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.468745 0.48438,-2.67187 0.5,-1.203125 1.46875,-1.84375 0.9844,-0.640625 2.20315,-0.640625 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.984375 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28128,-4.92188 q 0,1.89063 0.7969,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.015625 -0.78125,-2.953125 -0.78125,-0.953125 -1.92188,-0.953125 -1.10937,0 -1.85937,0.90625 -0.75003,0.90625 -0.75003,2.85937 z m 15.70389,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 7.73511,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.656245 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.749995 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path17" d="m 294.56026,64.19559 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.1257,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 15.54761,4.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09445,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69894,0.73438 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64062 1.45312,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54687,2.73438 -0.54688,1.20312 -1.57813,1.84375 -1.03125,0.64062 -2.17187,0.64062 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35937 -1.07812,-0.89062 l 0,4.79687 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.0007,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.24999 0.0469,-0.14063 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.62499 -0.9375,2.23437 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26559,-1.09375 3.09372,-1.09375 2.03128,0 3.31253,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07813 -1.65625,1.6875 -1.07816,0.59375 -2.37503,0.59375 -2.0625,0 -3.34372,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82809,2.82812 0.82813,0.9375 2.07813,0.9375 1.25,0 2.06253,-0.9375 0.82813,-0.95312 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82816,-0.9375 -2.06253,-0.9375 -1.25,0 -2.07813,0.9375 -0.82809,0.9375 -0.82809,2.82813 z m 15.71948,3.70312 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96527,2.71875 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 16.21887,0.70312 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z M 490.713,58.97684 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.09442,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85937 1.67188,0 0,9.85937 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.5564,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45312 2.76562,-8.92187 0,-1.73438 -0.39062,-3.45313 -0.32813,-1.39062 -0.89063,-2.67187 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57812,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95312,2.32812 -2.32812,4.07812 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path19" d="m 1,1 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path21" d="m 1,1 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path23" d="m 38.576824,49.19559 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95312,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.74999,0 -1.40624,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.12571,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25071,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.093746,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.062496,0 -3.343746,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.078116,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.249996,0 -2.078116,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.281966,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path25" d="m 665.34686,1 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path27" d="m 665.34686,1 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path29" d="m 701.01336,47.69559 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09449,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.1604,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60333,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28192,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path31" d="m 197.5708,120.2836 194.11023,0 0,14.07873 -194.11023,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path33" d="m 208.0708,134.24296 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35938 0.95312,0.35937 1.51562,1.29687 0.5625,0.92188 0.5625,2.04688 0,1.45312 -0.9375,2.45312 -0.92187,0.98438 -2.89062,1.25 0.71875,0.34375 1.09375,0.67188 0.78125,0.73437 1.48437,1.8125 l 2.375,3.70312 -2.26562,0 -1.79688,-2.82812 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26563 -0.8125,-0.35938 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04687 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26562 1.0625,-0.82812 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57813 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17606,4.42188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.51635,5.875 0,-8.54687 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04688 q 0,-0.98437 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04687 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32812 -0.3125,0.3125 -0.3125,1.20313 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54687 -1.65625,0 z m 11.52704,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 12.9783,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.11007,5.875 0,-9.85937 1.5,0 0,1.40625 q 1.09375,-1.625 3.14063,-1.625 0.89062,0 1.64062,0.32812 0.75,0.3125 1.10938,0.84375 0.375,0.51563 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67188,0 0,-6 q 0,-1.01562 -0.20312,-1.51562 -0.1875,-0.51563 -0.6875,-0.8125 -0.5,-0.29688 -1.17188,-0.29688 -1.0625,0 -1.84375,0.67188 -0.76562,0.67187 -0.76562,2.57812 l 0,5.375 -1.67188,0 z m 16.81323,-3.60937 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95312 -2.73438,0.95312 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32812 -1.21875,-3.79687 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89062 1.98438,0.89062 0.98437,0 1.64062,-0.59375 0.65625,-0.60937 0.84375,-1.85937 z m 9.64063,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 13.96528,-0.75 q 0,-3.39062 1.8125,-5.29687 1.82812,-1.92188 4.70312,-1.92188 1.875,0 3.39063,0.90625 1.51562,0.89063 2.29687,2.5 0.79688,1.60938 0.79688,3.65625 0,2.0625 -0.84375,3.70313 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92188 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60937 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45313 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42187 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89063 -0.54687,-1.23437 -1.64062,-1.92187 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39062 z m 13.38641,6.59375 0,-8.54687 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04688 q 0,-0.98437 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04687 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32812 -0.3125,0.3125 -0.3125,1.20313 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54687 -1.65625,0 z m 5.18332,0 0,-8.54687 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04688 q 0,-0.98437 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04687 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32812 -0.3125,0.3125 -0.3125,1.20313 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54687 -1.65625,0 z m 4.10517,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 16.75,-0.23437 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 12.76636,4.375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path35" d="m 363.2694,233.00013 294.42517,0 0,82.55118 -294.42517,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path37" d="m 363.2694,233.00013 294.42517,0 0,82.55118 -294.42517,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path39" d="m 463.50176,273.97696 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20312 -1.57812,1.84375 -1.03125,0.64062 -2.17188,0.64062 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35937 -1.07813,-0.89062 l 0,4.79687 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.51629,1.32813 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95312 -2.73438,0.95312 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32812 -1.21875,-3.79687 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89062 1.98438,0.89062 0.98437,0 1.64062,-0.59375 0.65625,-0.60937 0.84375,-1.85937 z m 2.90625,3.60937 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01562 2.15625,0 -3.76562,3.65625 4.14062,6.20312 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 12.76635,4.375 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 13.10102,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 15.70379,3.70312 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 7.73511,3.4375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96453,0.28125 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path41" d="m 393.07086,296.19571 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.12573,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 15.54758,4.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09442,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55646,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69891,0.73438 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64062 1.45312,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54687,2.73438 -0.54688,1.20312 -1.57813,1.84375 -1.03125,0.64062 -2.17187,0.64062 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35937 -1.07812,-0.89062 l 0,4.79687 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.00073,8.73438 -0.17187,-1.5625 q 0.54687,0.14062 0.95312,0.14062 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51562 0.15625,-0.25 0.5,-1.25 0.0469,-0.14063 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23437 -0.4375,0.82813 -1.01562,1.20313 -0.57813,0.39062 -1.375,0.39062 -0.48438,0 -1.07813,-0.20312 z m 9.375,-3.79688 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07813 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95312 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 15.71942,3.70312 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96527,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21887,0.70312 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51148,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 12.66577,-1.21875 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85937 1.67188,0 0,9.85937 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92602,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.55646,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45312 2.76562,-8.92187 0,-1.73438 -0.39062,-3.45313 -0.32813,-1.39062 -0.89063,-2.67187 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57812,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95312,2.32812 -2.32812,4.07812 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path43" d="m 665.34686,233 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path45" d="m 665.34686,233 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path47" d="m 701.01336,279.69559 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09449,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.1604,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60333,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28192,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path49" d="m 199.7893,233 156.66144,0 0,82.55118 -156.66144,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path51" d="m 199.7893,233 156.66144,0 0,82.55118 -156.66144,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path53" d="m 237.36616,281.19559 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.5476,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25073,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65696,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32813 1.29687,3.67188 0,1.90625 -0.57812,3 -0.5625,1.07812 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95313 0.82812,-2.89063 0,-1.82812 -0.82812,-2.76562 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path55" d="m 231.21063,325.03163 127.87399,0 0,25.63782 -127.87399,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path57" d="m 249.99334,344.77053 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17606,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.5476,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01636,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 9.02704,-0.23437 -3.60938,-13.59375 1.84375,0 2.0625,8.90625 q 0.34375,1.40625 0.57813,2.78125 0.51562,-2.17188 0.60937,-2.51563 l 2.59375,-9.17187 2.17188,0 1.95312,6.875 q 0.73438,2.5625 1.04688,4.8125 0.26562,-1.28125 0.6875,-2.95313 l 2.125,-8.73437 1.8125,0 -3.73438,13.59375 -1.73437,0 -2.85938,-10.35938 q -0.35937,-1.29687 -0.42187,-1.59375 -0.21875,0.9375 -0.40625,1.59375 l -2.89063,10.35938 -1.82812,0 z m 14.99929,0 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 6.24393,-11.6875 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 7.78543,-1.5 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 8.27707,-1.67188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path59" d="m 360.16018,325.03163 127.87399,0 0,25.63782 -127.87399,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path61" d="m 381.52546,344.77053 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17606,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.5476,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01636,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 6.10516,-6.85937 q 0,-3.39063 1.8125,-5.29688 1.82813,-1.92187 4.70313,-1.92187 1.875,0 3.39062,0.90625 1.51563,0.89062 2.29688,2.5 0.79687,1.60937 0.79687,3.65625 0,2.0625 -0.84375,3.70312 -0.82812,1.625 -2.35937,2.46875 -1.53125,0.84375 -3.29688,0.84375 -1.92187,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85938,0.0312 q 0,2.45312 1.3125,3.875 1.32812,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54688,-1.23438 -1.64063,-1.92188 -1.07812,-0.6875 -2.42187,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 12.98016,6.59375 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 10.34448,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 4.09796,3.79687 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path63" d="m 359.06776,318.24423 0,37.03937"/>
+ <path style="fill-rule:nonzero;stroke:#595959;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path65" d="m 359.06776,318.24423 0,37.03937"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path67" d="m 63.099944,112.35619 172.346466,0 0,28.50394 -172.346466,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path69" d="m 73.490564,133.52815 0,-13.59375 5.10937,0 q 1.54688,0 2.48438,0.40625 0.95312,0.40625 1.48437,1.26563 0.53125,0.85937 0.53125,1.79687 0,0.875 -0.46875,1.65625 -0.46875,0.76563 -1.4375,1.23438 1.23438,0.35937 1.89063,1.23437 0.67187,0.875 0.67187,2.0625 0,0.95313 -0.40625,1.78125 -0.39062,0.8125 -0.98437,1.26563 -0.59375,0.4375 -1.5,0.67187 -0.89063,0.21875 -2.1875,0.21875 l -5.1875,0 z m 1.79687,-7.89062 2.9375,0 q 1.20313,0 1.71875,-0.15625 0.6875,-0.20313 1.03125,-0.67188 0.35938,-0.46875 0.35938,-1.1875 0,-0.67187 -0.32813,-1.1875 -0.32812,-0.51562 -0.9375,-0.70312 -0.59375,-0.20313 -2.0625,-0.20313 l -2.71875,0 0,4.10938 z m 0,6.28125 3.39063,0 q 0.875,0 1.21875,-0.0625 0.625,-0.10938 1.04687,-0.35938 0.42188,-0.26562 0.6875,-0.76562 0.26563,-0.5 0.26563,-1.14063 0,-0.76562 -0.39063,-1.32812 -0.39062,-0.5625 -1.07812,-0.78125 -0.6875,-0.23438 -1.98438,-0.23438 l -3.15625,0 0,4.67188 z m 16.94358,0.39062 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 3.40697,2 1.65625,-0.26562 q 0.14063,1 0.76563,1.53125 0.64062,0.51562 1.78125,0.51562 1.156246,0 1.703116,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89062 -0.34375,-0.21875 -1.703126,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.171876,0 2.046876,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.499996,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.765626,0.46875 2.468746,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48437,1.57812 -0.48438,0.73438 -1.40625,1.14063 -0.92188,0.39062 -2.078126,0.39062 -1.92187,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 16.749996,-0.23437 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 14.51214,5.875 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.17188 1.67187,0.64063 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.73437 -1.10937,2.9375 -1.09375,1.20312 -3.98438,1.20312 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.14062 3.51562,0 q 1.75,0 2.46875,-0.64063 0.73438,-0.65625 0.73438,-1.82812 0,-0.85938 -0.4375,-1.46875 -0.42188,-0.60938 -1.125,-0.79688 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.85938 z m 16.86544,5.92187 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.51634,1.32813 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95312 -2.73438,0.95312 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32812 -1.21875,-3.79687 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89062 1.98438,0.89062 0.98437,0 1.64062,-0.59375 0.65625,-0.60937 0.84375,-1.85937 z m 2.90625,3.60937 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01562 2.15625,0 -3.76562,3.65625 4.14062,6.20312 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 12.76632,4.375 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path71" d="M 136.2548,116.49914 168.53826,82.32591"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path73" d="M 136.25479,116.49914 164.41794,86.68742"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path75" d="m 165.6186,87.82172 1.91573,-4.43312 -4.31708,2.16455 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path77" d="M 334.90166,116.49914 367.18514,82.32591"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path79" d="M 334.9017,116.49914 363.06482,86.68742"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path81" d="m 364.2655,87.82172 1.91574,-4.43312 -4.31711,2.16455 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path83" d="m 281.14146,171.20486 172.34644,0 0,28.50394 -172.34644,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path85" d="m 291.64146,192.37683 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95313,0.35938 1.51563,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92188,0.98437 -2.89063,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48438,1.8125 l 2.375,3.70313 -2.26563,0 -1.79687,-2.82813 q -0.79688,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01563,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.85937,0 q 1.23438,0 1.92188,-0.25 0.70312,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70313,-1.57812 -0.70312,-0.625 -2.21875,-0.625 l -4.29687,0 0,4.5 z m 18.17608,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51632,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 11.52707,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.9783,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.1101,5.875 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14063,-1.625 0.89062,0 1.64062,0.32813 0.75,0.3125 1.10938,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67188,0 0,-6 q 0,-1.01563 -0.20312,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17188,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76562,0.67188 -0.76562,2.57813 l 0,5.375 -1.67188,0 z m 16.8132,-3.60938 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 9.64063,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 14.51215,5.875 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.17187 1.67187,0.64062 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.73438 -1.10937,2.9375 -1.09375,1.20313 -3.98438,1.20313 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.14063 3.51562,0 q 1.75,0 2.46875,-0.64062 0.73438,-0.65625 0.73438,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42188,-0.60937 -1.125,-0.79687 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.85937 z m 16.86544,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51636,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15625,0 -3.76563,3.65625 4.14063,6.20313 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76636,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path87" d="m 330.29636,198.52768 32.28345,34.17325"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path89" d="m 330.29632,198.52768 28.16315,29.81171"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path91" d="m 357.25878,229.47369 4.31711,2.16455 -1.91574,-4.43314 z"/>
+</svg>
diff --git a/doc/images/reflen.svg b/doc/images/reflen.svg
new file mode 100644
index 000000000..de232903a
--- /dev/null
+++ b/doc/images/reflen.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 915.17047 183.26279" stroke-miterlimit="10" id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="reflen.svg" width="915.17047" height="183.26279" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata71">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs69"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1628" inkscape:window-height="868" id="namedview67" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.62083333" inkscape:cx="571.31623" inkscape:cy="459.71573" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="svg2"/>
+ <clipPath id="g188eb9bc0a_2_33.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path5" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path11" d="m 463.3302,61.79527 314.36218,0 0,82.55118 -314.36218,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path13" d="m 463.3302,61.79527 314.36218,0 0,82.55118 -314.36218,0 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path15" d="m 786.29646,61.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path17" d="m 786.29646,61.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path19" d="m 821.96286,108.49073 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path21" d="m 166.25364,61.79527 298.01575,0 0,82.55118 -298.01575,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path23" d="m 166.25364,61.79527 298.01575,0 0,82.55118 -298.01575,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path25" d="m 1,61.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path27" d="m 1,61.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path29" d="m 38.57682,109.99073 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469464,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984377,-0.65625 -1.531252,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468747,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.093737,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.062497,0 -3.343737,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.078117,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.249997,0 -2.078117,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.281957,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path31" d="m 322.39276,88.56955 283.0551,0 0,37.98425 -283.0551,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path33" d="m 416.94009,107.26291 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29757,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70386,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 7.73505,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path35" d="m 346.50918,129.48167 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23437 0.84375,-2.34375 2.57813,-4.67188 l 1.20312,0 q -1.125,1.92188 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67188 -0.40625,1.73437 -0.40625,3.48437 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69894,0.73437 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29761,3.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.0007,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.87503,-0.79688 -0.87503,-2.03125 0,-0.73438 0.32816,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46942,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 17.96527,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70312 1.57812,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21893,0.70313 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.66577,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09442,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.55646,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45313 2.76562,-8.92188 0,-1.73437 -0.39062,-3.45312 -0.32813,-1.39063 -0.89063,-2.67188 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57812,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95312,2.32813 -2.32812,4.07813 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path37" d="m 85.343263,0 172.346467,0 0,28.50394 -172.346467,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path39" d="m 95.843263,21.17197 0,-13.59375 6.031247,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.015617,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.859367,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.296867,0 0,4.5 z m 18.176057,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51634,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 11.52705,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09447,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.9783,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 9.1101,5.875 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 16.81321,-3.60938 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 9.64063,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 14.51215,5.875 0,-13.59375 5.125,0 q 1.35937,0 2.07812,0.125 1,0.17187 1.67188,0.64062 0.67187,0.46875 1.07812,1.3125 0.42188,0.84375 0.42188,1.84375 0,1.73438 -1.10938,2.9375 -1.09375,1.20313 -3.98437,1.20313 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.14063 3.51563,0 q 1.75,0 2.46875,-0.64062 0.73437,-0.65625 0.73437,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42187,-0.60937 -1.125,-0.79687 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.85937 z m 16.86545,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51634,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15626,0 -3.76564,3.65625 4.14064,6.20313 -2.06251,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.06251,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path41" d="m 134.49812,27.32282 32.28346,34.17325"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path43" d="m 134.49812,27.32282 28.16315,29.81174"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path45" d="m 161.46058,58.26883 4.31709,2.16455 -1.91574,-4.43314 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path47" d="m 165.9199,145.17847 0,0 c 0,4.72269 0.63806,8.55118 1.42514,8.55118 l 145.48018,0 c 0.78708,0 1.42514,3.82849 1.42514,8.55118 l 0,0 c 0,-4.72269 0.63806,-8.55118 1.42514,-8.55118 l 145.89014,0 c 0.78708,0 1.42514,-3.82849 1.42514,-8.55118 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path49" d="m 165.9199,145.17847 0,0 c 0,4.72269 0.63806,8.55118 1.42514,8.55118 l 145.48018,0 c 0.78708,0 1.42514,3.82849 1.42514,8.55118 l 0,0 c 0,-4.72269 0.63806,-8.55118 1.42514,-8.55118 l 145.89014,0 c 0.78708,0 1.42514,-3.82849 1.42514,-8.55118"/>
+ <path style="fill-rule:nonzero;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path51" d="m 165.9199,145.17847 0,0 c 0,4.72269 0.63806,8.55118 1.42514,8.55118 l 145.48018,0 c 0.78708,0 1.42514,3.82849 1.42514,8.55118 l 0,0 c 0,-4.72269 0.63806,-8.55118 1.42514,-8.55118 l 145.89014,0 c 0.78708,0 1.42514,-3.82849 1.42514,-8.55118"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path53" d="m 157.93869,157.62497 314.3622,0 0,25.63782 -314.3622,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path55" d="m 182.6591,173.3639 q 0,1.78125 -1.28125,3.04687 -1.28125,1.26563 -3.07813,1.26563 -1.8125,0 -3.09375,-1.26563 -1.26562,-1.28125 -1.26562,-3.04687 0,-1.78125 1.26562,-3.04688 1.28125,-1.26562 3.09375,-1.26562 1.79688,0 3.07813,1.26562 1.28125,1.25 1.28125,3.04688 z m -0.79688,0 q 0,-1.46875 -1.04687,-2.5 -1.03125,-1.03125 -2.51563,-1.03125 -1.48437,0 -2.53125,1.04687 -1.04687,1.03125 -1.04687,2.48438 0,1.45312 1.04687,2.5 1.04688,1.03125 2.53125,1.03125 1.48438,0 2.51563,-1.03125 1.04687,-1.04688 1.04687,-2.5 z m 11.65186,-7.64063 0,10.85938 1.04687,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -1.82812,0 0,-1.54688 q -1.35938,1.85938 -3.45313,1.85938 -1.04687,0 -2.01562,-0.5625 -0.96875,-0.5625 -1.53125,-1.59375 -0.5625,-1.04688 -0.5625,-2.15625 0,-1.10938 0.5625,-2.14063 0.5625,-1.04687 1.53125,-1.60937 0.96875,-0.5625 2.03125,-0.5625 2.04687,0 3.4375,1.85937 l 0,-4.40625 -1.04688,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82813,0 z m -0.78125,7.64063 q 0,-1.48438 -1.01563,-2.5 -1,-1.03125 -2.375,-1.03125 -1.39062,0 -2.39062,1.03125 -1,1.01562 -1,2.5 0,1.46875 1,2.5 1,1.03125 2.39062,1.03125 1.375,0 2.375,-1.03125 1.01563,-1.03125 1.01563,-2.5 z m 5.43311,-4.03125 0,1.42187 q 0.6875,-0.84375 1.48437,-1.26562 0.8125,-0.4375 1.89063,-0.4375 1.15625,0 2.125,0.54687 0.96875,0.53125 1.5,1.5 0.54687,0.95313 0.54687,2 0,1.6875 -1.20312,2.89063 -1.20313,1.1875 -2.95313,1.1875 -2.09375,0 -3.39062,-1.70313 l 0,4.6875 1.89062,0 q 0.28125,0 0.39063,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.39063,0.10937 l -3.71875,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.0937 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.04688,0 0,-10.04687 -1.04688,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.82813,0 z m 6.75,3.76562 q 0,-1.34375 -0.98438,-2.29687 -0.96875,-0.96875 -2.375,-0.96875 -1.42187,0 -2.40625,0.96875 -0.98437,0.96875 -0.98437,2.29687 0,1.35938 0.98437,2.32813 0.98438,0.95312 2.40625,0.95312 1.39063,0 2.375,-0.95312 0.98438,-0.96875 0.98438,-2.32813 z m 12.76123,9.46875 -10.35938,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.10938 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 10.35938,0 q 0.29687,0 0.40625,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.40625,0.10937 z m 3.29248,-13.23437 0,1.42187 q 0.6875,-0.84375 1.48437,-1.26562 0.8125,-0.4375 1.89063,-0.4375 1.15625,0 2.125,0.54687 0.96873,0.53125 1.49998,1.5 0.54688,0.95313 0.54688,2 0,1.6875 -1.20313,2.89063 -1.20311,1.1875 -2.95311,1.1875 -2.09375,0 -3.39062,-1.70313 l 0,4.6875 1.89062,0 q 0.28125,0 0.39063,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.39063,0.10937 l -3.71875,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.0937 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.04688,0 0,-10.04687 -1.04688,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.82813,0 z m 6.74998,3.76562 q 0,-1.34375 -0.98437,-2.29687 -0.96874,-0.96875 -2.37499,-0.96875 -1.42187,0 -2.40625,0.96875 -0.98437,0.96875 -0.98437,2.29687 0,1.35938 0.98437,2.32813 0.98438,0.95312 2.40625,0.95312 1.39063,0 2.37499,-0.95312 0.98437,-0.96875 0.98437,-2.32813 z m 9.82373,4.26563 0,-1.125 q -1.6875,1.4375 -3.625,1.4375 -1.40625,0 -2.1875,-0.70313 -0.78125,-0.71875 -0.78125,-1.75 0,-1.14062 1.03125,-1.98437 1.04688,-0.84375 3.03125,-0.84375 0.54688,0 1.17188,0.0781 0.625,0.0625 1.35937,0.21875 l 0,-1.26562 q 0,-0.64063 -0.59375,-1.10938 -0.59375,-0.48437 -1.78125,-0.48437 -0.90625,0 -2.54687,0.53125 -0.29688,0.0937 -0.375,0.0937 -0.15625,0 -0.26563,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.15625 0.0937,-0.25 0.14062,-0.14062 1.0625,-0.375 1.4375,-0.39062 2.1875,-0.39062 1.46875,0 2.29687,0.73437 0.82813,0.71875 0.82813,1.64063 l 0,5.15625 1.03125,0 q 0.29687,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10938,0.10938 -0.40625,0.10938 l -1.82813,0 z m 0,-3.875 q -0.54687,-0.15625 -1.15625,-0.23438 -0.60937,-0.0781 -1.28125,-0.0781 -1.70312,0 -2.65625,0.73437 -0.73437,0.54688 -0.73437,1.3125 0,0.70313 0.54687,1.1875 0.5625,0.48438 1.625,0.48438 1,0 1.85938,-0.40625 0.875,-0.40625 1.79687,-1.28125 l 0,-1.71875 z m 12.41748,-3.375 0,-0.25 q 0,-0.29688 0.10938,-0.40625 0.10937,-0.125 0.28125,-0.125 0.17187,0 0.28125,0.125 0.10937,0.10937 0.10937,0.40625 l 0,1.75 q 0,0.29687 -0.10937,0.42187 -0.10938,0.10938 -0.28125,0.10938 -0.15625,0 -0.26563,-0.0937 -0.10937,-0.10938 -0.125,-0.35938 -0.0625,-0.67187 -0.875,-1.26562 -0.79687,-0.59375 -2.17187,-0.59375 -1.73438,0 -2.64063,1.09375 -0.90625,1.07812 -0.90625,2.48437 0,1.51563 0.98438,2.5 1,0.98438 2.57812,0.98438 0.92188,0 1.85938,-0.32813 0.9375,-0.34375 1.70312,-1.09375 0.1875,-0.17187 0.34375,-0.17187 0.15625,0 0.26563,0.10937 0.10937,0.0937 0.10937,0.25 0,0.40625 -0.9375,1.01563 -1.51562,1 -3.375,1 -1.875,0 -3.09375,-1.20313 -1.20312,-1.20312 -1.20312,-3.04687 0,-1.89063 1.23437,-3.125 1.23438,-1.25 3.125,-1.25 1.78125,0 3,1.0625 z m 6.57373,3.78125 0,3.46875 -1.82812,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.04687,0 0,-10.07813 -1.04687,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82812,0 0,7.17188 3.3125,-2.78125 -0.40625,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 2.5,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -0.90625,0 -3.04687,2.54687 3.85937,3.92188 0.89063,0 q 0.29687,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10938,0.10938 -0.40625,0.10938 l -2.51563,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 0.54688,0 -3.34375,-3.4375 -0.89063,0.75 z m 17.19873,-0.35938 -7.95312,0 q 0.21875,1.51563 1.28125,2.4375 1.0625,0.92188 2.625,0.92188 0.875,0 1.82812,-0.28125 0.95313,-0.29688 1.5625,-0.76563 0.17188,-0.14062 0.29688,-0.14062 0.15625,0 0.26562,0.125 0.10938,0.10937 0.10938,0.26562 0,0.15625 -0.15625,0.29688 -0.4375,0.46875 -1.57813,0.875 -1.14062,0.40625 -2.32812,0.40625 -2,0 -3.34375,-1.3125 -1.34375,-1.3125 -1.34375,-3.1875 0,-1.6875 1.25,-2.90625 1.26562,-1.21875 3.125,-1.21875 1.90625,0 3.14062,1.25 1.23438,1.25 1.21875,3.23437 z m -0.79687,-0.79687 q -0.23438,-1.28125 -1.21875,-2.09375 -0.98438,-0.8125 -2.34375,-0.8125 -1.375,0 -2.35938,0.8125 -0.96875,0.79687 -1.21875,2.09375 l 7.14063,0 z m 6.3706,-3.40625 4.23438,0 q 0.28125,0 0.39062,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.39062,0.10938 l -4.23438,0 0,5.1875 q 0,0.6875 0.54688,1.14062 0.54687,0.45313 1.59375,0.45313 0.78125,0 1.70312,-0.23438 0.92188,-0.25 1.4375,-0.54687 0.1875,-0.10938 0.29688,-0.10938 0.15625,0 0.26562,0.125 0.10938,0.10938 0.10938,0.26563 0,0.14062 -0.125,0.25 -0.29688,0.3125 -1.4375,0.67187 -1.14063,0.35938 -2.1875,0.35938 -1.375,0 -2.1875,-0.64063 -0.79688,-0.64062 -0.79688,-1.73437 l 0,-5.1875 -1.4375,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.4375,0 0,-2.29688 q 0,-0.28125 0.10938,-0.40625 0.10937,-0.125 0.28125,-0.125 0.17187,0 0.28125,0.125 0.10937,0.125 0.10937,0.40625 l 0,2.29688 z m 18.18311,13.23437 -10.35938,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.10938 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 10.35938,0 q 0.29687,0 0.40625,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.40625,0.10937 z m 8.90185,-5.20312 0,-1.14063 q -1.60937,1.45313 -3.45312,1.45313 -1.14063,0 -1.73438,-0.625 -0.78125,-0.8125 -0.78125,-1.90625 l 0,-5.03125 -1.04687,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.82812,0 0,5.8125 q 0,0.76562 0.48438,1.26562 0.48437,0.48438 1.20312,0.48438 1.90625,0 3.5,-1.75 l 0,-5.03125 -1.4375,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 2.20313,0 0,7.25 0.67187,0 q 0.26563,0 0.39063,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.39063,0.10938 l -1.4375,0 z m 6.21436,-8.03125 0,1.17187 q 0.8125,-0.82812 1.46875,-1.14062 0.65625,-0.3125 1.48437,-0.3125 0.89063,0 1.625,0.375 0.51563,0.28125 0.9375,0.9375 0.42188,0.64062 0.42188,1.3125 l 0,4.90625 0.65625,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -2.07813,0 q -0.29687,0 -0.42187,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.42187,-0.10937 l 0.64063,0 0,-4.78125 q 0,-0.82813 -0.60938,-1.39063 -0.59375,-0.57812 -1.60937,-0.57812 -0.76563,0 -1.32813,0.3125 -0.5625,0.3125 -1.60937,1.54687 l 0,4.89063 0.875,0 q 0.28125,0 0.39062,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.39062,0.10938 l -2.54688,0 q -0.26562,0 -0.39062,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.39062,-0.10937 l 0.89063,0 0,-6.46875 -0.65625,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.4375,0 z m 16.4956,0.5 q 0,-0.26563 0.10938,-0.375 0.10937,-0.125 0.28125,-0.125 0.17187,0 0.28125,0.125 0.10937,0.10937 0.10937,0.40625 l 0,1.32812 q 0,0.28125 -0.10937,0.40625 -0.10938,0.10938 -0.28125,0.10938 -0.17188,0 -0.28125,-0.0937 -0.0937,-0.10938 -0.10938,-0.34375 -0.0625,-0.54688 -0.57812,-0.90625 -0.76563,-0.53125 -2.01563,-0.53125 -1.3125,0 -2.03125,0.53125 -0.54687,0.40625 -0.54687,0.89062 0,0.5625 0.64062,0.9375 0.45313,0.25 1.70313,0.39063 1.60937,0.17187 2.25,0.40625 0.89062,0.32812 1.32812,0.90625 0.45313,0.5625 0.45313,1.23437 0,0.98438 -0.95313,1.76563 -0.95312,0.78125 -2.8125,0.78125 -1.84375,0 -3.01562,-0.9375 0,0.3125 -0.0469,0.40625 -0.0312,0.0937 -0.125,0.15625 -0.0937,0.0625 -0.21875,0.0625 -0.17187,0 -0.28125,-0.10938 -0.10937,-0.125 -0.10937,-0.40625 l 0,-1.60937 q 0,-0.28125 0.10937,-0.39063 0.10938,-0.125 0.28125,-0.125 0.17188,0 0.28125,0.125 0.10938,0.10938 0.10938,0.29688 0,0.42187 0.21875,0.71875 0.32812,0.4375 1.03125,0.73437 0.71875,0.29688 1.75,0.29688 1.51562,0 2.25,-0.5625 0.75,-0.57813 0.75,-1.20313 0,-0.71875 -0.75,-1.15625 -0.76563,-0.4375 -2.21875,-0.57812 -1.45313,-0.15625 -2.07813,-0.39063 -0.625,-0.25 -0.98437,-0.73437 -0.35938,-0.48438 -0.35938,-1.03125 0,-1.01563 0.98438,-1.59375 0.98437,-0.59375 2.35937,-0.59375 1.60938,0 2.625,0.78125 z m 6.26123,-4.10938 0,4.79688 q 0.73438,-0.8125 1.40625,-1.14063 0.6875,-0.32812 1.54688,-0.32812 0.90625,0 1.53125,0.32812 0.64062,0.3125 1.0625,0.98438 0.4375,0.65625 0.4375,1.39062 l 0,4.82813 0.85937,0 q 0.29688,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.40625,0.10938 l -2.53125,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 0.875,0 0,-4.78125 q 0,-0.84375 -0.60937,-1.40625 -0.60938,-0.5625 -1.6875,-0.5625 -0.85938,0 -1.45313,0.42187 -0.4375,0.29688 -1.4375,1.39063 l 0,4.9375 0.875,0 q 0.28125,0 0.39063,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10938,0.10938 -0.39063,0.10938 l -2.54687,0 q -0.26563,0 -0.39063,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.39063,-0.10937 l 0.89062,0 0,-10.07813 -1.04687,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82812,0 z m 16.19873,11.64063 0,-1.125 q -1.6875,1.4375 -3.625,1.4375 -1.40625,0 -2.1875,-0.70313 -0.78125,-0.71875 -0.78125,-1.75 0,-1.14062 1.03125,-1.98437 1.04688,-0.84375 3.03125,-0.84375 0.54688,0 1.17188,0.0781 0.625,0.0625 1.35937,0.21875 l 0,-1.26562 q 0,-0.64063 -0.59375,-1.10938 -0.59375,-0.48437 -1.78125,-0.48437 -0.90625,0 -2.54687,0.53125 -0.29688,0.0937 -0.375,0.0937 -0.15625,0 -0.26563,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.15625 0.0937,-0.25 0.14062,-0.14062 1.0625,-0.375 1.4375,-0.39062 2.1875,-0.39062 1.46875,0 2.29687,0.73437 0.82813,0.71875 0.82813,1.64063 l 0,5.15625 1.03125,0 q 0.29687,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10938,0.10938 -0.40625,0.10938 l -1.82813,0 z m 0,-3.875 q -0.54687,-0.15625 -1.15625,-0.23438 -0.60937,-0.0781 -1.28125,-0.0781 -1.70312,0 -2.65625,0.73437 -0.73437,0.54688 -0.73437,1.3125 0,0.70313 0.54687,1.1875 0.5625,0.48438 1.625,0.48438 1,0 1.85938,-0.40625 0.875,-0.40625 1.79687,-1.28125 l 0,-1.71875 z m 8.22998,-4.15625 0,1.96875 q 1.53125,-1.375 2.28125,-1.76563 0.75,-0.40625 1.39063,-0.40625 0.70312,0 1.29687,0.46875 0.59375,0.46875 0.59375,0.71875 0,0.17188 -0.10937,0.29688 -0.10938,0.10937 -0.29688,0.10937 -0.0937,0 -0.15625,-0.0312 -0.0625,-0.0312 -0.23437,-0.21875 -0.32813,-0.3125 -0.57813,-0.4375 -0.23437,-0.125 -0.46875,-0.125 -0.5,0 -1.21875,0.40625 -0.71875,0.40625 -2.5,2 l 0,4.26563 3.45313,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -6.10938,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.26562 0,-0.15625 0.10937,-0.26563 0.10938,-0.10937 0.40625,-0.10937 l 1.875,0 0,-6.5 -1.4375,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 2.21875,0 z m 16.55811,4.20312 -7.95313,0 q 0.21875,1.51563 1.28125,2.4375 1.0625,0.92188 2.625,0.92188 0.875,0 1.82813,-0.28125 0.95312,-0.29688 1.5625,-0.76563 0.17187,-0.14062 0.29687,-0.14062 0.15625,0 0.26563,0.125 0.10937,0.10937 0.10937,0.26562 0,0.15625 -0.15625,0.29688 -0.4375,0.46875 -1.57812,0.875 -1.14063,0.40625 -2.32813,0.40625 -2,0 -3.34375,-1.3125 -1.34375,-1.3125 -1.34375,-3.1875 0,-1.6875 1.25,-2.90625 1.26563,-1.21875 3.125,-1.21875 1.90625,0 3.14063,1.25 1.23437,1.25 1.21875,3.23437 z m -0.79688,-0.79687 q -0.23437,-1.28125 -1.21875,-2.09375 -0.98437,-0.8125 -2.34375,-0.8125 -1.375,0 -2.35937,0.8125 -0.96875,0.79687 -1.21875,2.09375 l 7.14062,0 z m 11.79248,-7.01563 0,10.85938 1.04688,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -1.82813,0 0,-1.54688 q -1.35937,1.85938 -3.45312,1.85938 -1.04688,0 -2.01563,-0.5625 -0.96875,-0.5625 -1.53125,-1.59375 -0.5625,-1.04688 -0.5625,-2.15625 0,-1.10938 0.5625,-2.14063 0.5625,-1.04687 1.53125,-1.60937 0.96875,-0.5625 2.03125,-0.5625 2.04688,0 3.4375,1.85937 l 0,-4.40625 -1.04687,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82812,0 z m -0.78125,7.64063 q 0,-1.48438 -1.01562,-2.5 -1,-1.03125 -2.375,-1.03125 -1.39063,0 -2.39063,1.03125 -1,1.01562 -1,2.5 0,1.46875 1,2.5 1,1.03125 2.39063,1.03125 1.375,0 2.375,-1.03125 1.01562,-1.03125 1.01562,-2.5 z m 13.54248,9.20312 -10.35937,0 q -0.28125,0 -0.40625,-0.10937 -0.10938,-0.10938 -0.10938,-0.28125 0,-0.17188 0.10938,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 10.35937,0 q 0.29688,0 0.40625,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10937,0.10937 -0.40625,0.10937 z m 6.62061,-16.84375 0,10.85938 3.0625,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -6.90625,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 3.0625,0 0,-10.07813 -2.23438,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.10938,-0.28125 0.125,-0.10938 0.42187,-0.10938 l 3.01563,0 z m 15.22998,7.8125 -7.95313,0 q 0.21875,1.51563 1.28125,2.4375 1.0625,0.92188 2.625,0.92188 0.875,0 1.82813,-0.28125 0.95312,-0.29688 1.5625,-0.76563 0.17187,-0.14062 0.29687,-0.14062 0.15625,0 0.26563,0.125 0.10937,0.10937 0.10937,0.26562 0,0.15625 -0.15625,0.29688 -0.4375,0.46875 -1.57812,0.875 -1.14063,0.40625 -2.32813,0.40625 -2,0 -3.34375,-1.3125 -1.34375,-1.3125 -1.34375,-3.1875 0,-1.6875 1.25,-2.90625 1.26563,-1.21875 3.125,-1.21875 1.90625,0 3.14063,1.25 1.23437,1.25 1.21875,3.23437 z m -0.79688,-0.79687 q -0.23437,-1.28125 -1.21875,-2.09375 -0.98437,-0.8125 -2.34375,-0.8125 -1.375,0 -2.35937,0.8125 -0.96875,0.79687 -1.21875,2.09375 l 7.14062,0 z m 5.46436,-3.40625 0,1.17187 q 0.8125,-0.82812 1.46875,-1.14062 0.65625,-0.3125 1.48437,-0.3125 0.89063,0 1.625,0.375 0.51563,0.28125 0.9375,0.9375 0.42188,0.64062 0.42188,1.3125 l 0,4.90625 0.65625,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -2.07813,0 q -0.29687,0 -0.42187,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.42187,-0.10937 l 0.64063,0 0,-4.78125 q 0,-0.82813 -0.60938,-1.39063 -0.59375,-0.57812 -1.60937,-0.57812 -0.76563,0 -1.32813,0.3125 -0.5625,0.3125 -1.60937,1.54687 l 0,4.89063 0.875,0 q 0.28125,0 0.39062,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.39062,0.10938 l -2.54688,0 q -0.26562,0 -0.39062,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.39062,-0.10937 l 0.89063,0 0,-6.46875 -0.65625,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.4375,0 z m 13.82373,3.40625 q 0,-1.0625 0.28125,-2.25 0.28125,-1.20313 1.0625,-2.76563 0.79687,-1.57812 1.15625,-1.90625 0.10937,-0.0937 0.23437,-0.0937 0.17188,0 0.28125,0.10938 0.125,0.10937 0.125,0.26562 0,0.0937 -0.0625,0.20313 -1.03125,1.875 -1.46875,3.40625 -0.42187,1.51562 -0.42187,3.03125 0,1.53125 0.42187,3.0625 0.4375,1.51562 1.46875,3.375 0.0625,0.125 0.0625,0.20312 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.28125,0.10938 -0.125,0 -0.23437,-0.0937 -0.34375,-0.3125 -1.125,-1.84375 -0.78125,-1.53125 -1.07813,-2.70313 -0.29687,-1.1875 -0.29687,-2.39062 z m 11.71435,0.0156 q 0,1.0625 -0.28125,2.26563 -0.26562,1.1875 -1.0625,2.75 -0.78125,1.57812 -1.14062,1.89062 -0.10938,0.10938 -0.25,0.10938 -0.15625,0 -0.28125,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.0781 0.0625,-0.20312 1.01563,-1.85938 1.45313,-3.375 0.4375,-1.53125 0.4375,-3.04688 0,-1.53125 -0.4375,-3.04687 -0.4375,-1.53125 -1.45313,-3.40625 -0.0625,-0.10938 -0.0625,-0.20313 0,-0.15625 0.10938,-0.26562 0.125,-0.10938 0.28125,-0.10938 0.14062,0 0.25,0.0937 0.34375,0.32813 1.10937,1.85938 0.78125,1.51562 1.07813,2.70312 0.29687,1.17188 0.29687,2.375 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path57" d="m 169.91769,54.48294 0,0 c 0,-5.24454 0.70856,-9.49606 1.58261,-9.49606 l 300.22058,0 c 0.87406,0 1.58264,-4.25153 1.58264,-9.49607 l 0,0 c 0,5.24454 0.70856,9.49607 1.58261,9.49607 l 300.2206,0 c 0.87403,0 1.58258,4.25152 1.58258,9.49606 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path59" d="m 169.91769,54.48294 0,0 c 0,-5.24454 0.70856,-9.49606 1.58261,-9.49606 l 300.22058,0 c 0.87406,0 1.58264,-4.25153 1.58264,-9.49607 l 0,0 c 0,5.24454 0.70856,9.49607 1.58261,9.49607 l 300.2206,0 c 0.87403,0 1.58258,4.25152 1.58258,9.49606"/>
+ <path style="fill-rule:nonzero;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path61" d="m 169.91769,54.48294 0,0 c 0,-5.24454 0.70856,-9.49606 1.58261,-9.49606 l 300.22058,0 c 0.87406,0 1.58264,-4.25153 1.58264,-9.49607 l 0,0 c 0,5.24454 0.70856,9.49607 1.58261,9.49607 l 300.2206,0 c 0.87403,0 1.58258,4.25152 1.58258,9.49606"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path63" d="m 374.07254,0 202.26773,0 0,28.50394 -202.26773,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path65" d="m 393.13504,17.17197 q 0,1.78125 -1.28125,3.04687 -1.28125,1.26563 -3.07812,1.26563 -1.8125,0 -3.09375,-1.26563 -1.26563,-1.28125 -1.26563,-3.04687 0,-1.78125 1.26563,-3.04688 1.28125,-1.26562 3.09375,-1.26562 1.79687,0 3.07812,1.26562 1.28125,1.25 1.28125,3.04688 z m -0.79687,0 q 0,-1.46875 -1.04688,-2.5 -1.03125,-1.03125 -2.51562,-1.03125 -1.48438,0 -2.53125,1.04687 -1.04688,1.03125 -1.04688,2.48438 0,1.45312 1.04688,2.5 1.04687,1.03125 2.53125,1.03125 1.48437,0 2.51562,-1.03125 1.04688,-1.04688 1.04688,-2.5 z m 11.65185,-7.64063 0,10.85938 1.04688,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -1.82813,0 0,-1.54688 q -1.35937,1.85938 -3.45312,1.85938 -1.04688,0 -2.01563,-0.5625 -0.96875,-0.5625 -1.53125,-1.59375 -0.5625,-1.04688 -0.5625,-2.15625 0,-1.10938 0.5625,-2.14063 0.5625,-1.04687 1.53125,-1.60937 0.96875,-0.5625 2.03125,-0.5625 2.04688,0 3.4375,1.85937 l 0,-4.40625 -1.04687,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82812,0 z m -0.78125,7.64063 q 0,-1.48438 -1.01562,-2.5 -1,-1.03125 -2.375,-1.03125 -1.39063,0 -2.39063,1.03125 -1,1.01562 -1,2.5 0,1.46875 1,2.5 1,1.03125 2.39063,1.03125 1.375,0 2.375,-1.03125 1.01562,-1.03125 1.01562,-2.5 z m 5.43311,-4.03125 0,1.42187 q 0.6875,-0.84375 1.48437,-1.26562 0.8125,-0.4375 1.89063,-0.4375 1.15625,0 2.125,0.54687 0.96875,0.53125 1.5,1.5 0.54687,0.95313 0.54687,2 0,1.6875 -1.20312,2.89063 -1.20313,1.1875 -2.95313,1.1875 -2.09375,0 -3.39062,-1.70313 l 0,4.6875 1.89062,0 q 0.28125,0 0.39063,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.39063,0.10937 l -3.71875,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.0937 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.04688,0 0,-10.04687 -1.04688,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.82813,0 z m 6.75,3.76562 q 0,-1.34375 -0.98438,-2.29687 -0.96875,-0.96875 -2.375,-0.96875 -1.42187,0 -2.40625,0.96875 -0.98437,0.96875 -0.98437,2.29687 0,1.35938 0.98437,2.32813 0.98438,0.95312 2.40625,0.95312 1.39063,0 2.375,-0.95312 0.98438,-0.96875 0.98438,-2.32813 z m 12.76123,9.46875 -10.35938,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.10938 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 10.35938,0 q 0.29687,0 0.40625,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.40625,0.10937 z m 3.29248,-13.23437 0,1.42187 q 0.6875,-0.84375 1.48437,-1.26562 0.8125,-0.4375 1.89063,-0.4375 1.15625,0 2.125,0.54687 0.96875,0.53125 1.5,1.5 0.54687,0.95313 0.54687,2 0,1.6875 -1.20312,2.89063 -1.20313,1.1875 -2.95313,1.1875 -2.09375,0 -3.39062,-1.70313 l 0,4.6875 1.89062,0 q 0.28125,0 0.39063,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10938,0.10937 -0.39063,0.10937 l -3.71875,0 q -0.28125,0 -0.40625,-0.10937 -0.10937,-0.0937 -0.10937,-0.28125 0,-0.17188 0.10937,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.04688,0 0,-10.04687 -1.04688,0 q -0.28125,0 -0.40625,-0.10938 -0.10937,-0.10937 -0.10937,-0.28125 0,-0.17187 0.10937,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.82813,0 z m 6.75,3.76562 q 0,-1.34375 -0.98438,-2.29687 -0.96875,-0.96875 -2.375,-0.96875 -1.42187,0 -2.40625,0.96875 -0.98437,0.96875 -0.98437,2.29687 0,1.35938 0.98437,2.32813 0.98438,0.95312 2.40625,0.95312 1.39063,0 2.375,-0.95312 0.98438,-0.96875 0.98438,-2.32813 z m 9.82373,4.26563 0,-1.125 q -1.6875,1.4375 -3.625,1.4375 -1.40625,0 -2.1875,-0.70313 -0.78125,-0.71875 -0.78125,-1.75 0,-1.14062 1.03125,-1.98437 1.04687,-0.84375 3.03125,-0.84375 0.54687,0 1.17187,0.0781 0.625,0.0625 1.35938,0.21875 l 0,-1.26562 q 0,-0.64063 -0.59375,-1.10938 -0.59375,-0.48437 -1.78125,-0.48437 -0.90625,0 -2.54688,0.53125 -0.29687,0.0937 -0.375,0.0937 -0.15625,0 -0.26562,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.15625 0.0937,-0.25 0.14063,-0.14062 1.0625,-0.375 1.4375,-0.39062 2.1875,-0.39062 1.46875,0 2.29688,0.73437 0.82812,0.71875 0.82812,1.64063 l 0,5.15625 1.03125,0 q 0.29688,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.40625,0.10938 l -1.82812,0 z m 0,-3.875 q -0.54688,-0.15625 -1.15625,-0.23438 -0.60938,-0.0781 -1.28125,-0.0781 -1.70313,0 -2.65625,0.73437 -0.73438,0.54688 -0.73438,1.3125 0,0.70313 0.54688,1.1875 0.5625,0.48438 1.625,0.48438 1,0 1.85937,-0.40625 0.875,-0.40625 1.79688,-1.28125 l 0,-1.71875 z m 12.41748,-3.375 0,-0.25 q 0,-0.29688 0.10937,-0.40625 0.10938,-0.125 0.28125,-0.125 0.17188,0 0.28125,0.125 0.10938,0.10937 0.10938,0.40625 l 0,1.75 q 0,0.29687 -0.10938,0.42187 -0.10937,0.10938 -0.28125,0.10938 -0.15625,0 -0.26562,-0.0937 -0.10938,-0.10938 -0.125,-0.35938 -0.0625,-0.67187 -0.875,-1.26562 -0.79688,-0.59375 -2.17188,-0.59375 -1.73437,0 -2.64062,1.09375 -0.90625,1.07812 -0.90625,2.48437 0,1.51563 0.98437,2.5 1,0.98438 2.57813,0.98438 0.92187,0 1.85937,-0.32813 0.9375,-0.34375 1.70313,-1.09375 0.1875,-0.17187 0.34375,-0.17187 0.15625,0 0.26562,0.10937 0.10938,0.0937 0.10938,0.25 0,0.40625 -0.9375,1.01563 -1.51563,1 -3.375,1 -1.875,0 -3.09375,-1.20313 -1.20313,-1.20312 -1.20313,-3.04687 0,-1.89063 1.23438,-3.125 1.23437,-1.25 3.125,-1.25 1.78125,0 3,1.0625 z m 6.57373,3.78125 0,3.46875 -1.82813,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.04688,0 0,-10.07813 -1.04688,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.125,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 1.82813,0 0,7.17188 3.3125,-2.78125 -0.40625,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 2.5,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -0.90625,0 -3.04688,2.54687 3.85938,3.92188 0.89062,0 q 0.29688,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.40625,0.10938 l -2.51562,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 0.54687,0 -3.34375,-3.4375 -0.89062,0.75 z m 17.19876,-0.35938 -7.95316,0 q 0.21875,1.51563 1.28125,2.4375 1.0625,0.92188 2.625,0.92188 0.875,0 1.82813,-0.28125 0.95315,-0.29688 1.56253,-0.76563 0.17187,-0.14062 0.29687,-0.14062 0.15625,0 0.26563,0.125 0.10937,0.10937 0.10937,0.26562 0,0.15625 -0.15625,0.29688 -0.4375,0.46875 -1.57815,0.875 -1.14063,0.40625 -2.32813,0.40625 -2,0 -3.34375,-1.3125 -1.34375,-1.3125 -1.34375,-3.1875 0,-1.6875 1.25,-2.90625 1.26563,-1.21875 3.125,-1.21875 1.90625,0 3.14066,1.25 1.23437,1.25 1.21875,3.23437 z m -0.79688,-0.79687 q -0.23437,-1.28125 -1.21878,-2.09375 -0.98437,-0.8125 -2.34375,-0.8125 -1.375,0 -2.35937,0.8125 -0.96875,0.79687 -1.21875,2.09375 l 7.14065,0 z m 6.37061,-3.40625 4.23437,0 q 0.28125,0 0.39063,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10938,0.10938 -0.39063,0.10938 l -4.23437,0 0,5.1875 q 0,0.6875 0.54687,1.14062 0.54688,0.45313 1.59375,0.45313 0.78125,0 1.70313,-0.23438 0.92187,-0.25 1.4375,-0.54687 0.1875,-0.10938 0.29687,-0.10938 0.15625,0 0.26563,0.125 0.10937,0.10938 0.10937,0.26563 0,0.14062 -0.125,0.25 -0.29687,0.3125 -1.4375,0.67187 -1.14062,0.35938 -2.1875,0.35938 -1.375,0 -2.1875,-0.64063 -0.79687,-0.64062 -0.79687,-1.73437 l 0,-5.1875 -1.4375,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.4375,0 0,-2.29688 q 0,-0.28125 0.10937,-0.40625 0.10938,-0.125 0.28125,-0.125 0.17188,0 0.28125,0.125 0.10938,0.125 0.10938,0.40625 l 0,2.29688 z m 18.1831,13.23437 -10.35937,0 q -0.28125,0 -0.40625,-0.10937 -0.10938,-0.10938 -0.10938,-0.28125 0,-0.17188 0.10938,-0.28125 0.125,-0.10938 0.40625,-0.10938 l 10.35937,0 q 0.29688,0 0.40625,0.10938 0.125,0.10937 0.125,0.28125 0,0.17187 -0.125,0.28125 -0.10937,0.10937 -0.40625,0.10937 z m 6.62061,-16.84375 0,10.85938 3.0625,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -6.90625,0 q -0.28125,0 -0.40625,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 3.0625,0 0,-10.07813 -2.23438,0 q -0.28125,0 -0.40625,-0.10937 -0.125,-0.10938 -0.125,-0.28125 0,-0.17188 0.10938,-0.28125 0.125,-0.10938 0.42187,-0.10938 l 3.01563,0 z m 15.22998,7.8125 -7.95313,0 q 0.21875,1.51563 1.28125,2.4375 1.0625,0.92188 2.625,0.92188 0.875,0 1.82813,-0.28125 0.95312,-0.29688 1.5625,-0.76563 0.17187,-0.14062 0.29687,-0.14062 0.15625,0 0.26563,0.125 0.10937,0.10937 0.10937,0.26562 0,0.15625 -0.15625,0.29688 -0.4375,0.46875 -1.57812,0.875 -1.14063,0.40625 -2.32813,0.40625 -2,0 -3.34375,-1.3125 -1.34375,-1.3125 -1.34375,-3.1875 0,-1.6875 1.25,-2.90625 1.26563,-1.21875 3.125,-1.21875 1.90625,0 3.14063,1.25 1.23437,1.25 1.21875,3.23437 z m -0.79688,-0.79687 q -0.23437,-1.28125 -1.21875,-2.09375 -0.98437,-0.8125 -2.34375,-0.8125 -1.375,0 -2.35937,0.8125 -0.96875,0.79687 -1.21875,2.09375 l 7.14062,0 z m 5.46436,-3.40625 0,1.17187 q 0.8125,-0.82812 1.46875,-1.14062 0.65625,-0.3125 1.48437,-0.3125 0.89063,0 1.625,0.375 0.51563,0.28125 0.9375,0.9375 0.42188,0.64062 0.42188,1.3125 l 0,4.90625 0.65625,0 q 0.28125,0 0.40625,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.125,0.10938 -0.40625,0.10938 l -2.07813,0 q -0.29687,0 -0.42187,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.17187 0.10938,-0.28125 0.125,-0.10937 0.42187,-0.10937 l 0.64063,0 0,-4.78125 q 0,-0.82813 -0.60938,-1.39063 -0.59375,-0.57812 -1.60937,-0.57812 -0.76563,0 -1.32813,0.3125 -0.5625,0.3125 -1.60937,1.54687 l 0,4.89063 0.875,0 q 0.28125,0 0.39062,0.10937 0.125,0.10938 0.125,0.28125 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.39062,0.10938 l -2.54688,0 q -0.26562,0 -0.39062,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.39062,-0.10937 l 0.89063,0 0,-6.46875 -0.65625,0 q -0.28125,0 -0.40625,-0.10938 -0.125,-0.10937 -0.125,-0.28125 0,-0.17187 0.125,-0.28125 0.125,-0.10937 0.40625,-0.10937 l 1.4375,0 z m 13.82373,3.40625 q 0,-1.0625 0.28125,-2.25 0.28125,-1.20313 1.0625,-2.76563 0.79687,-1.57812 1.15625,-1.90625 0.10937,-0.0937 0.23437,-0.0937 0.17188,0 0.28125,0.10938 0.125,0.10937 0.125,0.26562 0,0.0937 -0.0625,0.20313 -1.03125,1.875 -1.46875,3.40625 -0.42187,1.51562 -0.42187,3.03125 0,1.53125 0.42187,3.0625 0.4375,1.51562 1.46875,3.375 0.0625,0.125 0.0625,0.20312 0,0.17188 -0.125,0.28125 -0.10937,0.10938 -0.28125,0.10938 -0.125,0 -0.23437,-0.0937 -0.34375,-0.3125 -1.125,-1.84375 -0.78125,-1.53125 -1.07813,-2.70313 -0.29687,-1.1875 -0.29687,-2.39062 z m 11.71435,0.0156 q 0,1.0625 -0.28125,2.26563 -0.26562,1.1875 -1.0625,2.75 -0.78125,1.57812 -1.14062,1.89062 -0.10938,0.10938 -0.25,0.10938 -0.15625,0 -0.28125,-0.10938 -0.10938,-0.10937 -0.10938,-0.28125 0,-0.0781 0.0625,-0.20312 1.01563,-1.85938 1.45313,-3.375 0.4375,-1.53125 0.4375,-3.04688 0,-1.53125 -0.4375,-3.04687 -0.4375,-1.53125 -1.45313,-3.40625 -0.0625,-0.10938 -0.0625,-0.20313 0,-0.15625 0.10938,-0.26562 0.125,-0.10938 0.28125,-0.10938 0.14062,0 0.25,0.0937 0.34375,0.32813 1.10937,1.85938 0.78125,1.51562 1.07813,2.70312 0.29687,1.17188 0.29687,2.375 z"/>
+</svg>
diff --git a/doc/images/refpkt1.svg b/doc/images/refpkt1.svg
new file mode 100644
index 000000000..a83a92b5c
--- /dev/null
+++ b/doc/images/refpkt1.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 915.17047 184.4823" stroke-miterlimit="10" id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="refpkt1.svg" width="915.17047" height="184.4823" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata63">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs61"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1304" inkscape:window-height="681" id="namedview59" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.43899546" inkscape:cx="450.51086" inkscape:cy="-23.131867" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="g7"/>
+ <clipPath id="g188eb9bc0a_0_116.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path5" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <g clip-path="url(#g188eb9bc0a_0_116.0)" id="g7" transform="translate(-29.489136,-62.385826)">
+ <path d="m 415.9005,124.18097 391.27557,0 0,82.55118 -391.27557,0 z" id="path11" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 415.9005,124.18097 391.27557,0 0,82.55118 -391.27557,0 z" id="path13" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 815.7856,124.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path15" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 815.7856,124.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path17" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 851.452,170.87656 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z" id="path19" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 195.74278,124.18097 220.15749,0 0,82.55118 -220.15749,0 z" id="path21" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 195.74278,124.18097 220.15749,0 0,82.55118 -220.15749,0 z" id="path23" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 30.489136,124.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path25" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 30.489136,124.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path27" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 68.065956,172.37656 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468748,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09374,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34374,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.28196,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z" id="path29" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 351.8819,149.05627 283.0551,0 0,37.98425 -283.0551,0 z" id="path31" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 446.42923,167.74965 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29757,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70386,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 7.73505,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z" id="path33" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 375.99832,189.9684 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23437 0.84375,-2.34375 2.57813,-4.67188 l 1.20312,0 q -1.125,1.92188 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67188 -0.40625,1.73437 -0.40625,3.48437 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69894,0.73437 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29761,3.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.0007,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.87503,-0.79688 -0.87503,-2.03125 0,-0.73438 0.32816,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46942,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 17.96527,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70312 1.57812,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21893,0.70313 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.66577,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09442,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.55646,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45313 2.76562,-8.92188 0,-1.73437 -0.39062,-3.45312 -0.32813,-1.39063 -0.89063,-2.67188 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57812,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95312,2.32813 -2.32812,4.07813 z" id="path35" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 287.80954,216.61617 127.87402,0 0,25.63779 -127.87402,0 z" id="path37" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 306.5923,236.35506 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95313,0.35938 1.51563,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92188,0.98437 -2.89063,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48438,1.8125 l 2.375,3.70313 -2.26563,0 -1.79687,-2.82813 q -0.79688,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01563,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.85937,0 q 1.23438,0 1.92188,-0.25 0.70312,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70313,-1.57812 -0.70312,-0.625 -2.21875,-0.625 l -4.29687,0 0,4.5 z m 18.17605,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.5476,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01636,5.15625 3.93747,-14.0625 1.34375,0 -3.93747,14.0625 -1.34375,0 z m 9.02704,-0.23437 -3.60938,-13.59375 1.84375,0 2.0625,8.90625 q 0.34375,1.40625 0.57813,2.78125 0.51562,-2.17188 0.60937,-2.51563 l 2.59375,-9.17187 2.17188,0 1.95312,6.875 q 0.73438,2.5625 1.04688,4.8125 0.26562,-1.28125 0.6875,-2.95313 l 2.125,-8.73437 1.8125,0 -3.73438,13.59375 -1.73437,0 -2.85938,-10.35938 q -0.35937,-1.29687 -0.42187,-1.59375 -0.21875,0.9375 -0.40625,1.59375 l -2.89063,10.35938 -1.82812,0 z m 14.99926,0 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 6.24393,-11.6875 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 7.78546,-1.5 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 8.27704,-1.67188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z" id="path39" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 416.7591,216.61617 127.87402,0 0,25.63779 -127.87402,0 z" id="path41" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 438.12436,236.35506 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95313,0.35938 1.51563,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92188,0.98437 -2.89063,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48438,1.8125 l 2.375,3.70313 -2.26563,0 -1.79687,-2.82813 q -0.79688,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01563,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.85937,0 q 1.23438,0 1.92188,-0.25 0.70312,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70313,-1.57812 -0.70312,-0.625 -2.21875,-0.625 l -4.29687,0 0,4.5 z m 18.17608,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.54757,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01633,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 6.10519,-6.85937 q 0,-3.39063 1.8125,-5.29688 1.82813,-1.92187 4.70313,-1.92187 1.875,0 3.39062,0.90625 1.51563,0.89062 2.29688,2.5 0.79687,1.60937 0.79687,3.65625 0,2.0625 -0.84375,3.70312 -0.82812,1.625 -2.35937,2.46875 -1.53125,0.84375 -3.29688,0.84375 -1.92187,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85938,0.0312 q 0,2.45312 1.3125,3.875 1.32812,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54688,-1.23438 -1.64063,-1.92188 -1.07812,-0.6875 -2.42187,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 12.98016,6.59375 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 10.34448,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 4.09796,3.79687 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z" id="path43" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 415.66666,209.82875 0,37.03938" id="path45" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 415.66666,209.82875 0,37.03938" id="path47" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#595959;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 82.42776,62.385826 183.46457,0 0,28.503937 -183.46457,0 z" id="path49" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 92.92776,83.55779 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.359375 0.95313,0.359375 1.51563,1.296875 0.5625,0.921875 0.5625,2.046875 0,1.453125 -0.9375,2.453125 -0.92188,0.984375 -2.89063,1.25 0.71875,0.34375 1.09375,0.671875 0.78125,0.734375 1.48438,1.8125 l 2.375,3.703125 -2.26563,0 -1.79687,-2.828125 q -0.79688,-1.21875 -1.312505,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.265625 -0.8125,-0.359375 -0.3125,-0.07813 -1.015625,-0.07813 l -2.078125,0 0,6.046875 -1.796875,0 z m 1.796875,-7.59375 3.859375,0 q 1.234375,0 1.92188,-0.25 0.70312,-0.265625 1.0625,-0.828125 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70313,-1.578125 -0.70312,-0.625 -2.21875,-0.625 l -4.296875,0 0,4.5 z m 18.176075,4.421875 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42187,-1.328125 -1.26563,-1.328125 -1.26563,-3.734375 0,-2.484375 1.26563,-3.859375 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.484375 0.82812,0.859375 2.0625,0.859375 0.90625,0 1.54687,-0.46875 0.65625,-0.484375 1.04688,-1.546875 z m -5.48438,-2.703125 5.5,0 q -0.10937,-1.234375 -0.625,-1.859375 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.765625 -0.85938,2.046875 z m 9.51634,5.875 0,-8.546875 -1.48437,0 0,-1.3125 1.48437,0 0,-1.046875 q 0,-0.984375 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.046875 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.09375 -0.98437,-0.09375 -0.76563,0 -1.07813,0.328125 -0.3125,0.3125 -0.3125,1.203125 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.546875 -1.65625,0 z m 11.52705,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09374,0.828125 -2.81249,0.828125 -2.15625,0 -3.42187,-1.328125 -1.26563,-1.328125 -1.26563,-3.734375 0,-2.484375 1.26563,-3.859375 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34374,0 q 0.0937,1.625 0.92188,2.484375 0.82812,0.859375 2.0625,0.859375 0.90625,0 1.54687,-0.46875 0.65624,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.49999,0 q -0.10937,-1.234375 -0.62499,-1.859375 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.765625 -0.85938,2.046875 z m 9.09446,5.875 0,-9.859375 1.5,0 0,1.5 q 0.57813,-1.046875 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.546875 l -0.57813,1.546875 q -0.60937,-0.359375 -1.23437,-0.359375 -0.54688,0 -0.98438,0.328125 -0.42187,0.328125 -0.60937,0.90625 -0.28125,0.890625 -0.28125,1.953125 l 0,5.15625 -1.67188,0 z m 12.9783,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 9.11009,5.875 0,-9.859375 1.5,0 0,1.40625 q 1.09375,-1.625 3.14063,-1.625 0.89062,0 1.64062,0.328125 0.75,0.3125 1.10938,0.84375 0.375,0.515625 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67188,0 0,-6 q 0,-1.015625 -0.20312,-1.515625 -0.1875,-0.515625 -0.6875,-0.8125 -0.5,-0.296875 -1.17188,-0.296875 -1.0625,0 -1.84375,0.671875 -0.76562,0.671875 -0.76562,2.578125 l 0,5.375 -1.67188,0 z m 16.81322,-3.609375 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.953125 -2.73437,0.953125 -2.01563,0 -3.25,-1.3125 -1.21875,-1.328125 -1.21875,-3.796875 0,-1.59375 0.51562,-2.78125 0.53125,-1.203125 1.60938,-1.796875 1.09375,-0.609375 2.35937,-0.609375 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.984375 0.76563,2.890625 0.76562,0.890625 1.98437,0.890625 0.98438,0 1.64063,-0.59375 0.65625,-0.609375 0.84375,-1.859375 z m 9.64062,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 14.51214,5.875 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.171875 1.67187,0.640625 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.734375 -1.10937,2.9375 -1.09375,1.203125 -3.98438,1.203125 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.140625 3.51562,0 q 1.75,0 2.46875,-0.640625 0.73438,-0.65625 0.73438,-1.828125 0,-0.859375 -0.4375,-1.46875 -0.42188,-0.609375 -1.125,-0.796875 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.859375 z m 16.86545,5.921875 q -0.9375,0.796875 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.796875 -0.875,-2.03125 0,-0.734375 0.32812,-1.328125 0.32813,-0.59375 0.85938,-0.953125 0.53125,-0.359375 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.328125 0.0937,2.953125 0.10938,0.609375 0.4375,1.171875 l -1.75,0 q -0.26562,-0.515625 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.359375 -2.73437,0.625 -1.03125,0.140625 -1.45313,0.328125 -0.42187,0.1875 -0.65625,0.546875 -0.23437,0.359375 -0.23437,0.796875 0,0.671875 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.421875 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.578125 0.26562,-1.671875 l 0,-0.609375 z m 10.51634,1.328125 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.953125 -2.73438,0.953125 -2.01562,0 -3.25,-1.3125 -1.21875,-1.328125 -1.21875,-3.796875 0,-1.59375 0.51563,-2.78125 0.53125,-1.203125 1.60937,-1.796875 1.09375,-0.609375 2.35938,-0.609375 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.984375 0.76562,2.890625 0.76563,0.890625 1.98438,0.890625 0.98437,0 1.64062,-0.59375 0.65625,-0.609375 0.84375,-1.859375 z m 2.90625,3.609375 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.015625 2.15625,0 -3.76562,3.65625 4.14062,6.203125 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 12.76634,4.375 0.23438,1.484375 q -0.70313,0.140625 -1.26563,0.140625 -0.90625,0 -1.40625,-0.28125 -0.5,-0.296875 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.984375 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.921875 0.0937,0.203125 0.29687,0.328125 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.07813 z m 12.53848,1.5 -1.67187,0 0,-10.640625 q -0.59375,0.578125 -1.57813,1.15625 -0.98437,0.5625 -1.76562,0.859375 l 0,-1.625 q 1.40625,-0.65625 2.45312,-1.59375 1.04688,-0.9375 1.48438,-1.8125 l 1.07812,0 0,13.65625 z" id="path51" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 163.5837,89.708664 32.28346,34.173226" id="path53" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 163.5837,89.708664 28.16315,29.811706" id="path55" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 190.54616,120.65465 4.31709,2.16456 -1.91574,-4.43312 z" id="path57" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ </g>
+</svg>
diff --git a/doc/images/refpkt2.svg b/doc/images/refpkt2.svg
new file mode 100644
index 000000000..e64b50308
--- /dev/null
+++ b/doc/images/refpkt2.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 915.17047 183.39034" stroke-miterlimit="10" id="svg3661" inkscape:version="0.91 r13725" sodipodi:docname="refpkt2.svg" width="915.17047" height="183.39034" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata3722">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs3720"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1067" inkscape:window-height="689" id="namedview3718" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.43899546" inkscape:cx="459.62258" inkscape:cy="220.33202" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="g3666"/>
+ <clipPath id="g188eb9bc0a_0_139.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path3664" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <g clip-path="url(#g188eb9bc0a_0_139.0)" id="g3666" transform="translate(-29.489136,-302.38583)">
+ <path d="m 195.74278,364.1811 298.01575,0 0,82.55118 -298.01575,0 z" id="path3670" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 195.74278,364.1811 298.01575,0 0,82.55118 -298.01575,0 z" id="path3672" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 30.489136,364.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path3674" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 30.489136,364.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path3676" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 68.065956,412.37656 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468748,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09374,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34374,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.28196,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z" id="path3678" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 493.75854,364.1811 313.4173,0 0,82.55118 -313.4173,0 z" id="path3680" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 493.75854,364.1811 313.4173,0 0,82.55118 -313.4173,0 z" id="path3682" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 815.7856,364.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path3684" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 815.7856,364.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path3686" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 851.452,410.87656 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z" id="path3688" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 351.8819,389.05627 283.0551,0 0,37.98425 -283.0551,0 z" id="path3690" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 446.42923,407.74963 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64062 1.45312,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54687,2.73438 -0.54688,1.20312 -1.57813,1.84375 -1.03125,0.64062 -2.17187,0.64062 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35937 -1.07812,-0.89062 l 0,4.79687 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89062 z m 15.29757,3.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.51635,1.32813 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95312 -2.73438,0.95312 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32812 -1.21875,-3.79687 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89062 1.98438,0.89062 0.98437,0 1.64062,-0.59375 0.65625,-0.60937 0.84375,-1.85937 z m 2.90625,3.60937 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01562 2.15625,0 -3.76562,3.65625 4.14062,6.20312 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 12.76633,4.375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 15.70386,3.70312 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 7.73505,3.4375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z" id="path3692" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 375.99832,429.96838 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.1257,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 15.54761,4.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09445,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69894,0.73438 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64062 1.45312,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54687,2.73438 -0.54688,1.20312 -1.57813,1.84375 -1.03125,0.64062 -2.17187,0.64062 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35937 -1.07812,-0.89062 l 0,4.79687 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.0007,8.73438 -0.17187,-1.5625 q 0.54687,0.14062 0.95312,0.14062 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51562 0.15625,-0.25 0.5,-1.25 0.0469,-0.14063 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23437 -0.4375,0.82813 -1.01562,1.20313 -0.57813,0.39062 -1.375,0.39062 -0.48438,0 -1.07813,-0.20312 z m 9.375,-3.79688 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07813 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95312 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 15.71948,3.70312 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.87503,-0.79687 -0.87503,-2.03125 0,-0.73437 0.32816,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46942,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96527,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21893,0.70312 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 12.66577,-1.21875 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85937 1.67188,0 0,9.85937 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09442,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.55646,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45312 2.76562,-8.92187 0,-1.73438 -0.39062,-3.45313 -0.32813,-1.39062 -0.89063,-2.67187 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57812,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95312,2.32812 -2.32812,4.07812 z" id="path3694" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 365.91043,455.52417 127.87402,0 0,25.63779 -127.87402,0 z" id="path3696" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 384.69315,475.26306 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17609,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.54757,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01633,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 9.02707,-0.23437 -3.60938,-13.59375 1.84375,0 2.0625,8.90625 q 0.34375,1.40625 0.57813,2.78125 0.51562,-2.17188 0.60937,-2.51563 l 2.59375,-9.17187 2.17188,0 1.95312,6.875 q 0.73438,2.5625 1.04688,4.8125 0.26562,-1.28125 0.6875,-2.95313 l 2.125,-8.73437 1.8125,0 -3.73438,13.59375 -1.73437,0 -2.85938,-10.35938 q -0.35937,-1.29687 -0.42187,-1.59375 -0.21875,0.9375 -0.40625,1.59375 l -2.89063,10.35938 -1.82812,0 z m 14.99926,0 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 6.24393,-11.6875 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 7.78546,-1.5 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 8.27704,-1.67188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z" id="path3698" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 494.86,455.52417 127.87402,0 0,25.63779 -127.87402,0 z" id="path3700" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 516.2253,475.26306 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17603,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01636,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 6.10516,-6.85937 q 0,-3.39063 1.8125,-5.29688 1.82812,-1.92187 4.70312,-1.92187 1.875,0 3.39063,0.90625 1.51562,0.89062 2.29687,2.5 0.79688,1.60937 0.79688,3.65625 0,2.0625 -0.84375,3.70312 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45312 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54687,-1.23438 -1.64062,-1.92188 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 12.98017,6.59375 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 10.34448,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 4.09796,3.79687 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z" id="path3702" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 493.76755,448.73676 0,37.0394" id="path3704" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 493.76755,448.73676 0,37.0394" id="path3706" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#595959;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 82.427826,302.38583 190.110234,0 0,28.50394 -190.110234,0 z" id="path3708" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 92.927826,323.5578 0,-13.59375 6.03125,0 q 1.812504,0 2.750004,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.890624,1.25 0.718754,0.34375 1.093754,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.312499,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.015625,-0.0781 l -2.078125,0 0,6.04688 -1.796875,0 z m 1.796875,-7.59375 3.859375,0 q 1.234375,0 1.921874,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.218754,-0.625 l -4.296875,0 0,4.5 z m 18.176069,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51634,5.875 0,-8.54688 -1.48438,0 0,-1.3125 1.48438,0 0,-1.04687 q 0,-0.98438 0.17187,-1.46875 0.23438,-0.65625 0.84375,-1.04688 0.60938,-0.40625 1.70313,-0.40625 0.70312,0 1.5625,0.15625 l -0.25,1.46875 q -0.51563,-0.0937 -0.98438,-0.0937 -0.76562,0 -1.07812,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92187,0 0,1.3125 -1.92187,0 0,8.54688 -1.65625,0 z m 11.52705,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09446,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 12.97831,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 9.11009,5.875 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14063,-1.625 0.89062,0 1.64062,0.32813 0.75,0.3125 1.10938,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67188,0 0,-6 q 0,-1.01563 -0.20312,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17188,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76562,0.67188 -0.76562,2.57813 l 0,5.375 -1.67188,0 z m 16.81322,-3.60938 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 9.64063,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 14.51215,5.875 0,-13.59375 5.125,0 q 1.35937,0 2.07812,0.125 1,0.17187 1.67188,0.64062 0.67187,0.46875 1.07812,1.3125 0.42188,0.84375 0.42188,1.84375 0,1.73438 -1.10938,2.9375 -1.09375,1.20313 -3.98437,1.20313 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.14063 3.51563,0 q 1.75,0 2.46875,-0.64062 0.73437,-0.65625 0.73437,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42187,-0.60937 -1.125,-0.79687 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.85937 z m 16.86545,5.92188 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15625,0 -3.76563,3.65625 4.14063,6.20313 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76634,4.375 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 15.02286,-0.10938 0,1.60938 -8.98437,0 q -0.0156,-0.60938 0.1875,-1.15625 0.34375,-0.92188 1.09375,-1.8125 0.76562,-0.89063 2.1875,-2.0625 2.21875,-1.8125 3,-2.875 0.78125,-1.0625 0.78125,-2.01563 0,-0.98437 -0.71875,-1.67187 -0.70313,-0.6875 -1.84375,-0.6875 -1.20313,0 -1.9375,0.73437 -0.71875,0.71875 -0.71875,2 l -1.71875,-0.17187 q 0.17187,-1.92188 1.32812,-2.92188 1.15625,-1.01562 3.09375,-1.01562 1.95313,0 3.09375,1.09375 1.14063,1.07812 1.14063,2.6875 0,0.8125 -0.34375,1.60937 -0.32813,0.78125 -1.10938,1.65625 -0.76562,0.85938 -2.5625,2.39063 -1.5,1.26562 -1.9375,1.71875 -0.42187,0.4375 -0.70312,0.89062 l 6.67187,0 z" id="path3710" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 163.5837,329.70865 32.28346,34.17325" id="path3712" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 163.5837,329.70865 28.16315,29.81174" id="path3714" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 190.54616,360.65466 4.31709,2.16455 -1.91574,-4.43314 z" id="path3716" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ </g>
+</svg>
diff --git a/doc/images/refpktmulti.svg b/doc/images/refpktmulti.svg
new file mode 100644
index 000000000..8d7c3c959
--- /dev/null
+++ b/doc/images/refpktmulti.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 915.17047 465.34647" stroke-miterlimit="10" id="svg3983" inkscape:version="0.91 r13725" sodipodi:docname="refpktmulti.svg" width="915.17047" height="465.34647" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata4108">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs4106"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1156" inkscape:window-height="678" id="namedview4104" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.43899546" inkscape:cx="450.51086" inkscape:cy="217.73228" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="g3988"/>
+ <clipPath id="g182eba8b93_0_33.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path3986" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <g clip-path="url(#g182eba8b93_0_33.0)" id="g3988" transform="translate(-29.489136,-22.385826)">
+ <path d="m 315.744,244.18103 491.43307,0 0,82.55118 -491.43307,0 z" id="path3992" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 315.744,244.18103 491.43307,0 0,82.55118 -491.43307,0 z" id="path3994" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 514.4803,285.15787 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.2976,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76629,4.375 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 13.10102,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70385,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 7.73511,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z" id="path3996" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 444.0494,307.37662 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23437 0.84375,-2.34375 2.57813,-4.67188 l 1.20312,0 q -1.125,1.92188 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67188 -0.40625,1.73437 -0.40625,3.48437 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69891,0.73437 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56269,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64063 1.45313,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54688,2.73437 -0.54687,1.20313 -1.57812,1.84375 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89063 z m 15.29755,3.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.00073,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 17.96527,2.71875 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 16.21887,0.70313 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.66583,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09448,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.5564,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45313 2.76562,-8.92188 0,-1.73437 -0.39062,-3.45312 -0.32813,-1.39063 -0.89063,-2.67188 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57812,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95312,2.32813 -2.32812,4.07813 z" id="path3998" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 150.48914,244.18103 156.6614,0 0,82.55118 -156.6614,0 z" id="path4000" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 150.48914,244.18103 156.6614,0 0,82.55118 -156.6614,0 z" id="path4002" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 188.06595,292.37662 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.12572,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25071,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.60331,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32813 1.29687,3.67188 0,1.90625 -0.57812,3 -0.5625,1.07812 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95313 0.82812,-2.89063 0,-1.82812 -0.82812,-2.76562 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 8.65696,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28197,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z" id="path4004" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 815.7856,244.18103 127.87402,0 0,82.55118 -127.87402,0 z" id="path4006" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 815.7856,244.18103 127.87402,0 0,82.55118 -127.87402,0 z" id="path4008" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 851.452,290.87662 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z" id="path4010" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 195.74278,404.1811 298.01575,0 0,82.55118 -298.01575,0 z" id="path4012" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 195.74278,404.1811 298.01575,0 0,82.55118 -298.01575,0 z" id="path4014" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 297.77042,445.15793 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20312 -1.57812,1.84375 -1.03125,0.64062 -2.17188,0.64062 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35937 -1.07813,-0.89062 l 0,4.79687 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.51635,1.32813 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95312 -2.73441,0.95312 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32812 -1.21875,-3.79687 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.6094,0 2.62503,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59378,-0.5 -1.4219,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89062 1.98438,0.89062 0.98437,0 1.64065,-0.59375 0.65625,-0.60937 0.84375,-1.85937 z m 2.90625,3.60937 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01562 2.15625,0 -3.76562,3.65625 4.14062,6.20312 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 12.76633,4.375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 15.70386,3.70312 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 7.73508,3.4375 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96457,0.28125 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z" id="path4016" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 227.33952,467.37668 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.12571,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 15.54761,4.65625 q -0.9375,0.79688 -1.79689,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03127,-0.25 2.98439,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90626,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26564,0 2.04689,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73439,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71876,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64062 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92187 q 0,1.89062 0.79688,2.82812 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89062 0.76562,-0.89063 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01636,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 9.09446,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.55642,-2.9375 1.65625,-0.26562 q 0.14063,1 0.76563,1.53125 0.64062,0.51562 1.78125,0.51562 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89062 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.17188,0 2.04688,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48437,1.57812 -0.48438,0.73438 -1.40625,1.14063 -0.92188,0.39062 -2.07813,0.39062 -1.92187,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69895,0.73438 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 12.56262,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20312 -1.57812,1.84375 -1.03125,0.64062 -2.17188,0.64062 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35937 -1.07813,-0.89062 l 0,4.79687 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 4.0007,8.73438 -0.17188,-1.5625 q 0.54688,0.14062 0.95313,0.14062 0.54687,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51562 0.15625,-0.25 0.5,-1.25 0.0469,-0.14063 0.15625,-0.40625 l -3.73438,-9.875 1.79688,0 2.04687,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67188,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23437 -0.4375,0.82813 -1.01563,1.20313 -0.57812,0.39062 -1.375,0.39062 -0.48437,0 -1.07812,-0.20312 z m 9.375,-3.79688 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32812 1.29687,3.67187 0,1.90625 -0.57812,3 -0.5625,1.07813 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82812,2.82812 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95312 0.82812,-2.89062 0,-1.82813 -0.82812,-2.76563 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82813 z m 15.71945,3.70312 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64062 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92187 q 0,1.89062 0.79688,2.82812 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89062 0.76562,-0.89063 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96528,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21887,0.70312 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 1.51144,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 12.6658,-1.21875 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 4.09445,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85937 1.67188,0 0,9.85937 -1.67188,0 z m 4.09796,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 10.92606,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26562 q 0.14063,1 0.76563,1.53125 0.64062,0.51562 1.78125,0.51562 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89062 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.17188,0 2.04688,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48437,1.57812 -0.48438,0.73438 -1.40625,1.14063 -0.92188,0.39062 -2.07813,0.39062 -1.92187,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76563,-4.45312 2.76563,-8.92187 0,-1.73438 -0.39063,-3.45313 -0.32812,-1.39062 -0.89062,-2.67187 -0.35938,-0.84375 -1.48438,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57813,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95313,2.32812 -2.32813,4.07812 z" id="path4018" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 30.489136,404.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path4020" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 30.489136,404.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path4022" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 68.065956,452.37656 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468748,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09374,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34374,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.28196,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z" id="path4024" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 502.29004,404.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path4026" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 502.29004,404.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path4028" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 537.9565,450.87656 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z" id="path4030" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 195.74278,84.1811 220.15749,0 0,82.55119 -220.15749,0 z" id="path4032" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 195.74278,84.1811 220.15749,0 0,82.55119 -220.15749,0 z" id="path4034" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 258.84128,114.15794 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64063 1.45313,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54688,2.73437 -0.54687,1.20313 -1.57812,1.84375 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89063 z m 15.29761,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51632,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76636,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.437495 1.65625,-1 0,3.437495 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70383,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 7.73511,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.437495 1.65625,-1 0,3.437495 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z" id="path4036" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 222.0973,136.3767 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59376 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25001 -1.67188,0 0,-6.25001 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.12571,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.62501 0.92187,2.48438 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 15.54759,4.65626 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71876 q -0.90625,0.35938 -2.73438,0.62501 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60938 z m 10.46946,4.93751 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59376 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01636,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.62501 0.92188,2.48438 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 9.09446,5.87501 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15626 -1.67187,0 z m 5.55642,-2.9375 1.65625,-0.26563 q 0.14063,1 0.76563,1.53125 0.64062,0.51563 1.78125,0.51563 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89063 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.17188,0 2.04688,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48437,1.57813 -0.48438,0.73437 -1.40625,1.14062 -0.92188,0.39063 -2.07813,0.39063 -1.92187,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69895,0.73437 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 12.56262,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20313 -1.57812,1.84375 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65626 q 0,1.90626 0.76563,2.81251 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29758,3.65626 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.87497,-0.79688 -0.87497,-2.03125 0,-0.73438 0.3281,-1.32813 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71876 q -0.90625,0.35938 -2.73438,0.62501 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60938 z m 4.00073,8.73438 -0.17188,-1.5625 q 0.54688,0.14063 0.95313,0.14063 0.54687,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73438,-9.875 1.79688,0 2.04687,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67188,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01563,1.20312 -0.57812,0.39063 -1.375,0.39063 -0.48437,0 -1.07812,-0.20313 z m 9.375,-3.79687 0,-13.59376 1.67187,0 0,13.59376 -1.67187,0 z m 3.55106,-4.92188 q 0,-2.73438 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32812 1.29687,3.67187 0,1.90626 -0.57812,3.00001 -0.5625,1.07812 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95313 0.82812,-2.89063 0,-1.82813 -0.82812,-2.76563 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82813 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71876 q -0.90625,0.35938 -2.73437,0.62501 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60938 z m 10.46945,4.93751 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59376 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96528,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z" id="path4038" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 279.6325,152.8767 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 1.51141,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 12.66581,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 4.09793,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 10.92609,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.55642,-2.9375 1.65625,-0.26563 q 0.14063,1 0.76563,1.53125 0.64062,0.51563 1.78125,0.51563 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89063 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60938 -0.35938,-1.32813 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48437 0.67188,-0.20313 1.4375,-0.20313 1.17188,0 2.04688,0.34375 0.875,0.32813 1.28125,0.90625 0.42187,0.5625 0.57812,1.51563 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39063 -0.48438,0.375 -0.48438,0.875 0,0.32812 0.20313,0.59375 0.20312,0.26562 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76562 0.70313,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48437,1.57813 -0.48438,0.73437 -1.40625,1.14062 -0.92188,0.39063 -2.07813,0.39063 -1.92187,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76563,-4.45313 2.76563,-8.92188 0,-1.73437 -0.39063,-3.45312 -0.32812,-1.39063 -0.89062,-2.67188 -0.35938,-0.84375 -1.48438,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57813,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95313,2.32813 -2.32813,4.07813 z" id="path4040" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 30.489136,84.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path4042" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 30.489136,84.18097 156.661424,0 0,82.55118 -156.661424,0 z" id="path4044" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 68.065956,132.37656 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35937 2.953125,-1.35937 1.09375,0 1.890625,0.4375 0.8125,0.42187 1.15625,1.1875 0.359375,0.76562 0.359375,2.20312 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.640625,0.375 -0.921875,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48437 1.265625,-3.85937 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23437 -0.625,-1.85937 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76562 -0.859375,2.04687 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59374 0.859375,-0.95312 0.53125,-0.35937 1.203125,-0.54687 0.5,-0.14063 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23437 q 0.234375,-1.04688 0.734375,-1.6875 0.515625,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.265625,0 2.046875,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.515625,1.14063 0.09375,0.42187 0.09375,1.53125 l 0,2.23437 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35938 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.68749 0,-1.46875 0.484375,-2.67188 0.5,-1.20312 1.468748,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92187 q 0,1.89062 0.79688,2.82812 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 9.25072,4.92187 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.81249 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 8.65697,0 q 0,-2.73438 1.53125,-4.0625 1.26562,-1.09375 3.09374,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34374,-1.32813 -1.28125,-1.32812 -1.28125,-3.81249 z m 1.71875,0 q 0,1.89062 0.82812,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82812,0.9375 -0.82812,2.82813 z m 9.28196,4.92187 0,-9.85937 1.5,0 0,1.39062 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45312 1.76562,-0.45312 1.09375,0 1.79688,0.45312 0.70312,0.45313 0.98437,1.28125 1.17188,-1.73437 3.04688,-1.73437 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76562 -1.67187,0 0,-6.20312 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45313 -0.59375,-0.71875 -0.42188,-0.26563 -1,-0.26563 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10937 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35938 -0.85937,1.07813 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10937 -1.67187,0 z" id="path4046" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 423.2396,84.18097 127.87399,0 0,82.55118 -127.87399,0 z" id="path4048" inkscape:connector-curvature="0" style="fill:#d9ead3;fill-rule:nonzero"/>
+ <path d="m 423.2396,84.18097 127.87399,0 0,82.55118 -127.87399,0 z" id="path4050" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 458.90607,130.87656 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65624 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.74999 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59374 0.85938,-0.95312 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09449,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85937 1.67187,0 0,9.85937 -1.67187,0 z m 4.09793,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.81249 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 8.65695,0 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.81249 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 9.28198,4.92187 0,-9.85937 1.5,0 0,1.39062 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45312 1.76563,-0.45312 1.09375,0 1.79684,0.45312 0.70313,0.45313 0.98438,1.28125 1.17187,-1.73437 3.04687,-1.73437 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76562 -1.67188,0 0,-6.20312 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45313 -0.59375,-0.71875 -0.42187,-0.26563 -1,-0.26563 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67184,0 0,-6.40625 q 0,-1.10937 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35938 -0.85938,1.07813 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10937 -1.67188,0 z" id="path4052" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 113.88285,22.385826 172.34647,0 0,28.503937 -172.34647,0 z" id="path4054" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 124.39848,43.557793 0,-13.59375 1.8125,0 0,5.578125 7.06249,0 0,-5.578125 1.79687,0 0,13.59375 -1.79687,0 0,-6.40625 -7.06249,0 0,6.40625 -1.8125,0 z m 19.95731,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 15.54759,4.65625 q -0.9375,0.796875 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.796875 -0.875,-2.03125 0,-0.734375 0.32812,-1.328125 0.32813,-0.59375 0.85938,-0.953125 0.53125,-0.359375 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.328125 0.0937,2.953125 0.10938,0.609375 0.4375,1.171875 l -1.75,0 q -0.26562,-0.515625 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.359375 -2.73437,0.625 -1.03125,0.140625 -1.45313,0.328125 -0.42187,0.1875 -0.65625,0.546875 -0.23437,0.359375 -0.23437,0.796875 0,0.671875 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.421875 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.578125 0.26562,-1.671875 l 0,-0.609375 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.640625 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.171875 -0.53125,-2.6875 0,-1.46875 0.48438,-2.671875 0.5,-1.203125 1.46875,-1.84375 0.98437,-0.640625 2.20312,-0.640625 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.984375 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.921875 q 0,1.890625 0.79687,2.828125 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.890625 0.76563,-0.890625 0.76563,-2.734375 0,-2.015625 -0.78125,-2.953125 -0.78125,-0.953125 -1.92188,-0.953125 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.859375 z m 16.01634,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 9.09446,5.875 0,-9.859375 1.5,0 0,1.5 q 0.57813,-1.046875 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.546875 l -0.57813,1.546875 q -0.60937,-0.359375 -1.23437,-0.359375 -0.54688,0 -0.98438,0.328125 -0.42187,0.328125 -0.60937,0.90625 -0.28125,0.890625 -0.28125,1.953125 l 0,5.15625 -1.67188,0 z m 11.63036,0 0,-13.59375 5.125,0 q 1.35937,0 2.07812,0.125 1,0.171875 1.67188,0.640625 0.67187,0.46875 1.07812,1.3125 0.42188,0.84375 0.42188,1.84375 0,1.734375 -1.10938,2.9375 -1.09375,1.203125 -3.98437,1.203125 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.140625 3.51563,0 q 1.75,0 2.46875,-0.640625 0.73437,-0.65625 0.73437,-1.828125 0,-0.859375 -0.4375,-1.46875 -0.42187,-0.609375 -1.125,-0.796875 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.859375 z m 16.86545,5.921875 q -0.9375,0.796875 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.796875 -0.875,-2.03125 0,-0.734375 0.32813,-1.328125 0.32812,-0.59375 0.85937,-0.953125 0.53125,-0.359375 1.20313,-0.546875 0.5,-0.140625 1.48437,-0.25 2.03125,-0.25 2.98438,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.234375 q 0.23438,-1.046875 0.73438,-1.6875 0.51562,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26562,0 2.04687,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51563,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.328125 0.0937,2.953125 0.10937,0.609375 0.4375,1.171875 l -1.75,0 q -0.26563,-0.515625 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.359375 -2.73438,0.625 -1.03125,0.140625 -1.45312,0.328125 -0.42188,0.1875 -0.65625,0.546875 -0.23438,0.359375 -0.23438,0.796875 0,0.671875 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.421875 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.578125 0.26563,-1.671875 l 0,-0.609375 z m 10.51634,1.328125 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.953125 -2.73437,0.953125 -2.01563,0 -3.25,-1.3125 -1.21875,-1.328125 -1.21875,-3.796875 0,-1.59375 0.51562,-2.78125 0.53125,-1.203125 1.60938,-1.796875 1.09375,-0.609375 2.35937,-0.609375 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.984375 0.76563,2.890625 0.76562,0.890625 1.98437,0.890625 0.98438,0 1.64063,-0.59375 0.65625,-0.609375 0.84375,-1.859375 z m 2.90625,3.609375 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.015625 2.15625,0 -3.76563,3.65625 4.14063,6.203125 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42187,-1.328125 -1.26563,-1.328125 -1.26563,-3.734375 0,-2.484375 1.26563,-3.859375 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.484375 0.82812,0.859375 2.0625,0.859375 0.90625,0 1.54687,-0.46875 0.65625,-0.484375 1.04688,-1.546875 z m -5.48438,-2.703125 5.5,0 q -0.10937,-1.234375 -0.625,-1.859375 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.765625 -0.85938,2.046875 z m 12.76635,4.375 0.23437,1.484375 q -0.70312,0.140625 -1.26562,0.140625 -0.90625,0 -1.40625,-0.28125 -0.5,-0.296875 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.984375 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.921875 0.0937,0.203125 0.29688,0.328125 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.07813 z m 12.53848,1.5 -1.67188,0 0,-10.640625 q -0.59375,0.578125 -1.57812,1.15625 -0.98438,0.5625 -1.76563,0.859375 l 0,-1.625 q 1.40625,-0.65625 2.45313,-1.59375 1.04687,-0.9375 1.48437,-1.8125 l 1.07813,0 0,13.65625 z" id="path4056" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 163.0377,49.70866 32.28346,34.17323" id="path4058" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 163.0377,49.70866 28.16315,29.81171" id="path4060" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 190.00017,80.65465 4.31709,2.164558 -1.91574,-4.43312 z" id="path4062" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ <path d="m 202.42885,182.38583 172.34645,0 0,28.50394 -172.34645,0 z" id="path4064" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 212.81947,203.5578 0,-13.59375 5.10937,0 q 1.54688,0 2.48438,0.40625 0.95312,0.40625 1.48437,1.26562 0.53125,0.85938 0.53125,1.79688 0,0.875 -0.46875,1.65625 -0.46875,0.76562 -1.4375,1.23437 1.23438,0.35938 1.89063,1.23438 0.67187,0.875 0.67187,2.0625 0,0.95312 -0.40625,1.78125 -0.39062,0.8125 -0.98437,1.26562 -0.59375,0.4375 -1.5,0.67188 -0.89063,0.21875 -2.1875,0.21875 l -5.1875,0 z m 1.79687,-7.89063 2.9375,0 q 1.20313,0 1.71875,-0.15625 0.6875,-0.20312 1.03125,-0.67187 0.35938,-0.46875 0.35938,-1.1875 0,-0.67188 -0.32813,-1.1875 -0.32812,-0.51563 -0.9375,-0.70313 -0.59375,-0.20312 -2.0625,-0.20312 l -2.71875,0 0,4.10937 z m 0,6.28125 3.39063,0 q 0.875,0 1.21875,-0.0625 0.625,-0.10937 1.04687,-0.35937 0.42188,-0.26563 0.6875,-0.76563 0.26563,-0.5 0.26563,-1.14062 0,-0.76563 -0.39063,-1.32813 -0.39062,-0.5625 -1.07812,-0.78125 -0.6875,-0.23437 -1.98438,-0.23437 l -3.15625,0 0,4.67187 z m 16.94358,0.39063 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 3.40697,2 1.65625,-0.26563 q 0.14063,1 0.76563,1.53125 0.64062,0.51563 1.78125,0.51563 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89063 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60938 -0.35938,-1.32813 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48437 0.67188,-0.20313 1.4375,-0.20313 1.17188,0 2.04688,0.34375 0.875,0.32813 1.28125,0.90625 0.42187,0.5625 0.57812,1.51563 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39063 -0.48438,0.375 -0.48438,0.875 0,0.32812 0.20313,0.59375 0.20312,0.26562 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76562 0.70313,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48437,1.57813 -0.48438,0.73437 -1.40625,1.14062 -0.92188,0.39063 -2.07813,0.39063 -1.92187,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 16.75,-0.23438 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 14.51214,5.875 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.17187 1.67187,0.64062 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.73438 -1.10937,2.9375 -1.09375,1.20313 -3.98438,1.20313 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.14063 3.51562,0 q 1.75,0 2.46875,-0.64062 0.73438,-0.65625 0.73438,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42188,-0.60937 -1.125,-0.79687 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.85937 z m 16.86544,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51633,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15625,0 -3.76563,3.65625 4.14063,6.20313 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76636,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z" id="path4066" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 283.5837,209.70866 32.28345,34.17323" id="path4068" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 283.5837,209.70866 28.16315,29.81169" id="path4070" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 310.54617,240.65465 4.31708,2.16455 -1.91574,-4.4331 z" id="path4072" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ <path d="m 445.13507,354.99118 172.34644,0 0,28.50394 -172.34644,0 z" id="path4074" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 455.63507,376.16315 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17609,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51632,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 9.63224,-6.625 q 0,-3.39063 1.8125,-5.29688 1.82812,-1.92187 4.70312,-1.92187 1.875,0 3.39063,0.90625 1.51562,0.89062 2.29687,2.5 0.79688,1.60937 0.79688,3.65625 0,2.0625 -0.84375,3.70312 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45312 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54687,-1.23438 -1.64062,-1.92188 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 13.38644,6.59375 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 5.18329,0 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70315,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76566,0 -1.07816,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92191,0 0,1.3125 -1.92191,0 0,8.54688 -1.65625,0 z m 4.1052,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 16.75,-0.23438 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76636,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 15.02283,-0.10938 0,1.60938 -8.98438,0 q -0.0156,-0.60938 0.1875,-1.15625 0.34375,-0.92188 1.09375,-1.8125 0.76563,-0.89063 2.1875,-2.0625 2.21875,-1.8125 3,-2.875 0.78125,-1.0625 0.78125,-2.01563 0,-0.98437 -0.71875,-1.67187 -0.70312,-0.6875 -1.84375,-0.6875 -1.20312,0 -1.9375,0.73437 -0.71875,0.71875 -0.71875,2 l -1.71875,-0.17187 q 0.17188,-1.92188 1.32813,-2.92188 1.15625,-1.01562 3.09375,-1.01562 1.95312,0 3.09375,1.09375 1.14062,1.07812 1.14062,2.6875 0,0.8125 -0.34375,1.60937 -0.32812,0.78125 -1.10937,1.65625 -0.76563,0.85938 -2.5625,2.39063 -1.5,1.26562 -1.9375,1.71875 -0.42188,0.4375 -0.70313,0.89062 l 6.67188,0 z" id="path4076" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 487.23947,360.62967 32.28348,-34.17325" id="path4078" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 487.2395,360.62967 28.16315,-29.81171" id="path4080" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 516.60333,331.95224 1.91571,-4.43314 -4.31708,2.16455 z" id="path4082" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ <path d="m 113.88285,342.38583 172.34647,0 0,28.50394 -172.34647,0 z" id="path4084" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 124.39848,363.5578 0,-13.59375 1.8125,0 0,5.57812 7.06249,0 0,-5.57812 1.79687,0 0,13.59375 -1.79687,0 0,-6.40625 -7.06249,0 0,6.40625 -1.8125,0 z m 19.95731,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01634,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09446,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 11.63036,0 0,-13.59375 5.125,0 q 1.35937,0 2.07812,0.125 1,0.17187 1.67188,0.64062 0.67187,0.46875 1.07812,1.3125 0.42188,0.84375 0.42188,1.84375 0,1.73438 -1.10938,2.9375 -1.09375,1.20313 -3.98437,1.20313 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.14063 3.51563,0 q 1.75,0 2.46875,-0.64062 0.73437,-0.65625 0.73437,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42187,-0.60937 -1.125,-0.79687 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.85937 z m 16.86545,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51634,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15625,0 -3.76563,3.65625 4.14063,6.20313 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76635,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 15.02285,-0.10938 0,1.60938 -8.98437,0 q -0.0156,-0.60938 0.1875,-1.15625 0.34375,-0.92188 1.09375,-1.8125 0.76562,-0.89063 2.1875,-2.0625 2.21875,-1.8125 3,-2.875 0.78125,-1.0625 0.78125,-2.01563 0,-0.98437 -0.71875,-1.67187 -0.70313,-0.6875 -1.84375,-0.6875 -1.20313,0 -1.9375,0.73437 -0.71875,0.71875 -0.71875,2 l -1.71875,-0.17187 q 0.17187,-1.92188 1.32812,-2.92188 1.15625,-1.01562 3.09375,-1.01562 1.95313,0 3.09375,1.09375 1.14063,1.07812 1.14063,2.6875 0,0.8125 -0.34375,1.60937 -0.32813,0.78125 -1.10938,1.65625 -0.76562,0.85938 -2.5625,2.39063 -1.5,1.26562 -1.9375,1.71875 -0.42187,0.4375 -0.70312,0.89062 l 6.67187,0 z" id="path4086" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 163.0377,369.70865 32.28346,34.17325" id="path4088" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 163.0377,369.70865 28.16315,29.81174" id="path4090" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 190.00017,400.65466 4.31709,2.16455 -1.91574,-4.43314 z" id="path4092" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ <path d="m 359.1766,182.38583 172.34647,0 0,28.50394 -172.34647,0 z" id="path4094" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 369.6766,203.5578 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17609,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51632,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 9.63224,-6.625 q 0,-3.39063 1.8125,-5.29688 1.82812,-1.92187 4.70312,-1.92187 1.875,0 3.39063,0.90625 1.51562,0.89062 2.29687,2.5 0.79688,1.60937 0.79688,3.65625 0,2.0625 -0.84375,3.70312 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45312 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54687,-1.23438 -1.64062,-1.92188 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 13.38644,6.59375 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 5.18329,0 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 4.1052,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 16.75,-0.23438 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 12.53848,1.5 -1.67187,0 0,-10.64063 q -0.59375,0.57813 -1.57813,1.15625 -0.98437,0.5625 -1.76562,0.85938 l 0,-1.625 q 1.40625,-0.65625 2.45312,-1.59375 1.04688,-0.9375 1.48438,-1.8125 l 1.07812,0 0,13.65625 z" id="path4096" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 400.33148,209.70866 32.28345,34.17323" id="path4098" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 400.33148,209.70866 28.16315,29.81169" id="path4100" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 427.29395,240.65465 4.31708,2.16455 -1.91571,-4.4331 z" id="path4102" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ </g>
+</svg>
diff --git a/doc/images/refpktsingle.svg b/doc/images/refpktsingle.svg
new file mode 100644
index 000000000..501a79de8
--- /dev/null
+++ b/doc/images/refpktsingle.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 915.17047 504.07874" stroke-miterlimit="10" id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="refpktsingle.svg" width="915.17047" height="504.07874" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata133">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs131"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1975" inkscape:window-height="886" id="namedview129" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.87799092" inkscape:cx="496.5656" inkscape:cy="188.13777" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="svg2"/>
+ <clipPath id="g188eb9bc0a_2_4.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path5" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path11" d="m 286.25486,61.795143 491.43307,0 0,82.551177 -491.43307,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path13" d="m 286.25486,61.795143 491.43307,0 0,82.551177 -491.43307,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path15" d="m 484.99116,102.77198 0,-13.640622 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.640625 1.45312,1.828125 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.796877 -1.67188,0 z m 1.51563,-8.656247 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.874995 -0.78125,-2.812495 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.890625 z m 15.2976,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.546875 0.5,-0.140625 1.48437,-0.25 2.03125,-0.25 2.98438,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.234375 q 0.23438,-1.046875 0.73438,-1.6875 0.51562,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26562,0 2.04687,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51563,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.593745 0.51563,-2.781245 0.53125,-1.203125 1.60937,-1.796875 1.09375,-0.609375 2.35938,-0.609375 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.015625 2.15625,0 -3.76562,3.65625 4.14062,6.203125 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 12.76629,4.375 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.656245 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.749995 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 13.10102,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.468745 0.48438,-2.67187 0.5,-1.203125 1.46875,-1.84375 0.98437,-0.640625 2.20312,-0.640625 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.984375 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.015625 -0.78125,-2.953125 -0.78125,-0.953125 -1.92188,-0.953125 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70385,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.546875 0.5,-0.140625 1.48437,-0.25 2.03125,-0.25 2.98438,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.234375 q 0.23438,-1.046875 0.73438,-1.6875 0.51562,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26562,0 2.04687,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51563,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 7.73511,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.656245 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.749995 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path17" d="m 414.56026,124.99073 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.1257,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 15.54761,4.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09445,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69891,0.73438 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56269,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20312 -1.57812,1.84375 -1.03125,0.64062 -2.17188,0.64062 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35937 -1.07813,-0.89062 l 0,4.79687 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29755,3.65625 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.00073,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.24999 0.0469,-0.14063 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.62499 -0.9375,2.23437 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32812 1.29688,3.67187 0,1.90625 -0.57813,3 -0.5625,1.07813 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82813,2.82812 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95312 0.82813,-2.89062 0,-1.82813 -0.82813,-2.76563 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82813 z m 15.71948,3.70312 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64062 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92187 q 0,1.89062 0.79687,2.82812 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89062 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96527,2.71875 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70313 1.57813,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 16.21887,0.70312 0.23438,1.48438 q -0.70313,0.14062 -1.26563,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98437 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29687,0.32813 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 12.66583,-1.21875 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85937 1.67187,0 0,9.85937 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.5564,-2.9375 1.65625,-0.26562 q 0.14062,1 0.76562,1.53125 0.64063,0.51562 1.78125,0.51562 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89062 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60937 -0.35937,-1.32812 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48438 0.67187,-0.20312 1.4375,-0.20312 1.17187,0 2.04687,0.34375 0.875,0.32812 1.28125,0.90625 0.42188,0.5625 0.57813,1.51562 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39062 -0.48437,0.375 -0.48437,0.875 0,0.32813 0.20312,0.59375 0.20313,0.26563 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76563 0.70312,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48438,1.57812 -0.48437,0.73438 -1.40625,1.14063 -0.92187,0.39062 -2.07812,0.39062 -1.92188,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45312 2.76562,-8.92187 0,-1.73438 -0.39062,-3.45313 -0.32813,-1.39062 -0.89063,-2.67187 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57812,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95312,2.32812 -2.32812,4.07812 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path19" d="m 121,61.795143 156.6614,0 0,82.551177 -156.6614,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path21" d="m 121,61.795143 156.6614,0 0,82.551177 -156.6614,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path23" d="m 158.57681,109.99073 0,-13.593747 1.67187,0 0,4.874997 q 1.17188,-1.359377 2.95313,-1.359377 1.09375,0 1.89062,0.437497 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.12572,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.374997 3.32812,-1.374997 1.98438,0 3.23438,1.343747 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.359377 2.25,-0.359377 1.26562,0 2.04687,0.296877 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.640627 2.20312,-0.640627 0.89063,0 1.57813,0.374997 0.70312,0.375 1.14062,0.98438 l 0,-4.874997 1.65625,0 0,13.593747 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25071,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.343747 1.07813,-0.343747 0.84375,0 1.71875,0.546877 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.60331,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.093747 3.09375,-1.093747 2.03125,0 3.3125,1.343747 1.29687,1.32813 1.29687,3.67188 0,1.90625 -0.57812,3 -0.5625,1.07812 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95313 0.82812,-2.89063 0,-1.82812 -0.82812,-2.76562 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 8.65696,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.093747 3.09375,-1.093747 2.03125,0 3.3125,1.343747 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28197,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.453127 1.76562,-0.453127 1.09375,0 1.79688,0.453127 0.70312,0.45312 0.98437,1.28125 1.17188,-1.734377 3.04688,-1.734377 1.46875,0 2.25,0.812497 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path25" d="m 786.29646,61.795143 127.87402,0 0,82.551177 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path27" d="m 786.29646,61.795143 127.87402,0 0,82.551177 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path29" d="m 821.96286,108.49073 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.437497 1.65625,-1 0,3.437497 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.359377 2.25,-0.359377 1.26563,0 2.04688,0.296877 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.749997 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.687497 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.593747 1.67187,0 0,13.593747 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.343747 1.07812,-0.343747 0.84375,0 1.71875,0.546877 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.093747 3.09375,-1.093747 2.03125,0 3.3125,1.343747 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.093747 3.09375,-1.093747 2.03125,0 3.3125,1.343747 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.453127 1.76563,-0.453127 1.09375,0 1.79687,0.453127 0.70313,0.45312 0.98438,1.28125 1.17187,-1.734377 3.04687,-1.734377 1.46875,0 2.25,0.812497 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path31" d="m 166.25364,213.79527 298.01575,0 0,82.55116 -298.01575,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path33" d="m 166.25364,213.79527 298.01575,0 0,82.55116 -298.01575,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path35" d="m 268.28128,254.7721 0,-13.64061 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20311 -1.57812,1.84373 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65624 q 0,1.90625 0.76563,2.8125 0.78125,0.90624 1.875,0.90624 1.10937,0 1.89062,-0.93749 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65624 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03124 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95311 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71874 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.43748 1.48438,0.43748 0.96875,0 1.71875,-0.42186 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 10.51635,1.32813 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65623 -1.10938,0.95313 -2.73441,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32811 -1.21875,-3.79686 0,-1.59375 0.51563,-2.78125 0.53125,-1.20313 1.60937,-1.79688 1.09375,-0.60937 2.35938,-0.60937 1.6094,0 2.62503,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59378,-0.5 -1.4219,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85937 0,1.98438 0.76562,2.89063 0.76563,0.89061 1.98438,0.89061 0.98437,0 1.64065,-0.59374 0.65625,-0.60937 0.84375,-1.85937 z m 2.90625,3.60936 0,-13.59374 1.67188,0 0,7.75 3.95312,-4.01562 2.15625,0 -3.76562,3.65625 4.14062,6.20311 -2.0625,0 -3.25,-5.03124 -1.17187,1.125 0,3.90624 -1.67188,0 z m 16.0625,-3.17186 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34373 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32811 -1.26562,-3.73436 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85936 2.0625,0.85936 0.90625,0 1.54688,-0.46874 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 12.76633,4.375 0.23437,1.48436 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98436 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.49999 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.81248 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98437,-0.64062 2.20312,-0.64062 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98437 l 0,-4.875 1.65625,0 0,13.59374 -1.54687,0 z m -5.28125,-4.92186 q 0,1.89062 0.79687,2.82812 0.8125,0.93749 1.89063,0.93749 1.09375,0 1.85937,-0.89061 0.76563,-0.89063 0.76563,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92188,-0.95313 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85938 z m 15.70386,3.70311 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03124 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95311 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71874 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.43748 1.48437,0.43748 0.96875,0 1.71875,-0.42186 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 7.73508,3.4375 0.23437,1.48436 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98436 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96457,0.28124 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03123 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.9531 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71873 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.43748 1.48437,0.43748 0.96875,0 1.71875,-0.42185 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path37" d="m 197.85038,276.99085 q -1.375,-1.75 -2.32813,-4.07812 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23438 0.84375,-2.34375 2.57813,-4.67187 l 1.20312,0 q -1.125,1.92187 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67187 -0.40625,1.73438 -0.40625,3.48438 0,4.46875 2.78125,8.92187 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35937 2.95313,-1.35937 1.09375,0 1.89062,0.4375 0.8125,0.42187 1.15625,1.1875 0.35938,0.76562 0.35938,2.20312 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57812 -1.53125,-0.57812 -0.75,0 -1.40625,0.39062 -0.64063,0.375 -0.92188,1.04688 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39062 -1.67187,0 z m 17.12571,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42188,-1.32812 -1.26562,-1.32813 -1.26562,-3.73438 0,-2.48437 1.26562,-3.85937 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48438 0.82813,0.85937 2.0625,0.85937 0.90625,0 1.54688,-0.46875 0.65625,-0.48437 1.04687,-1.54687 z m -5.48437,-2.70313 5.5,0 q -0.10938,-1.23437 -0.625,-1.85937 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76562 -0.85937,2.04687 z m 15.54761,4.65625 q -0.9375,0.79688 -1.79689,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03127,-0.25 2.98439,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90626,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26564,0 2.04689,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73439,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71876,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64062 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92187 q 0,1.89062 0.79688,2.82812 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89062 0.76562,-0.89063 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 16.01636,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 9.09446,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57812,-1.04688 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54687 l -0.57812,1.54688 q -0.60938,-0.35938 -1.23438,-0.35938 -0.54687,0 -0.98437,0.32813 -0.42188,0.32812 -0.60938,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67187,0 z m 5.55642,-2.9375 1.65625,-0.26562 q 0.14063,1 0.76563,1.53125 0.64062,0.51562 1.78125,0.51562 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89062 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.17188,0 2.04688,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48437,1.57812 -0.48438,0.73438 -1.40625,1.14063 -0.92188,0.39062 -2.07813,0.39062 -1.92187,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 18.69895,0.73438 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 12.56262,5.98437 0,-13.64062 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64062 1.45313,1.82812 0.5,1.1875 0.5,2.59375 0,1.51563 -0.54688,2.73438 -0.54687,1.20312 -1.57812,1.84375 -1.03125,0.64062 -2.17188,0.64062 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35937 -1.07813,-0.89062 l 0,4.79687 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92187 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89062 z m 15.29761,3.65625 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 4.0007,8.73438 -0.17188,-1.5625 q 0.54688,0.14062 0.95313,0.14062 0.54687,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51562 0.15625,-0.25 0.5,-1.25 0.0469,-0.14063 0.15625,-0.40625 l -3.73438,-9.875 1.79688,0 2.04687,5.71875 q 0.40625,1.07812 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67188,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23437 -0.4375,0.82813 -1.01563,1.20313 -0.57812,0.39062 -1.375,0.39062 -0.48437,0 -1.07812,-0.20312 z m 9.375,-3.79688 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 3.55109,-4.92187 q 0,-2.73438 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32812 1.29687,3.67187 0,1.90625 -0.57812,3 -0.5625,1.07813 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32812 -1.28125,-1.32813 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89062 0.82812,2.82812 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95312 0.82812,-2.89062 0,-1.82813 -0.82812,-2.76563 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82813 z m 15.71945,3.70312 q -0.9375,0.79688 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32812,-1.32812 0.32813,-0.59375 0.85938,-0.95313 0.53125,-0.35937 1.20312,-0.54687 0.5,-0.14063 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23437 q 0.23437,-1.04688 0.73437,-1.6875 0.51563,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26563,0 2.04688,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51562,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10938,0.60937 0.4375,1.17187 l -1.75,0 q -0.26562,-0.51562 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35938 -2.73437,0.625 -1.03125,0.14063 -1.45313,0.32813 -0.42187,0.1875 -0.65625,0.54687 -0.23437,0.35938 -0.23437,0.79688 0,0.67187 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57812 0.26562,-1.67187 l 0,-0.60938 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64062 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17188 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67188 0.5,-1.20312 1.46875,-1.84375 0.98438,-0.64062 2.20313,-0.64062 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98437 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92187 q 0,1.89062 0.79688,2.82812 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89062 0.76562,-0.89063 0.76562,-2.73438 0,-2.01562 -0.78125,-2.95312 -0.78125,-0.95313 -1.92187,-0.95313 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85938 z m 17.96528,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70313 1.57812,0 0,3.70313 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21887,0.70312 0.23437,1.48438 q -0.70312,0.14062 -1.26562,0.14062 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29687 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98437 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92187 0.0937,0.20313 0.29688,0.32813 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 1.51144,1.5 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 12.6658,-1.21875 q -0.9375,0.79688 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79687 -0.875,-2.03125 0,-0.73437 0.32813,-1.32812 0.32812,-0.59375 0.85937,-0.95313 0.53125,-0.35937 1.20313,-0.54687 0.5,-0.14063 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57813 0,-0.34375 0,-0.4375 0,-1.01562 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23437 q 0.23438,-1.04688 0.73438,-1.6875 0.51562,-0.64063 1.46875,-0.98438 0.96875,-0.35937 2.25,-0.35937 1.26562,0 2.04687,0.29687 0.78125,0.29688 1.15625,0.75 0.375,0.45313 0.51563,1.14063 0.0937,0.42187 0.0937,1.53125 l 0,2.23437 q 0,2.32813 0.0937,2.95313 0.10937,0.60937 0.4375,1.17187 l -1.75,0 q -0.26563,-0.51562 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35938 -2.73438,0.625 -1.03125,0.14063 -1.45312,0.32813 -0.42188,0.1875 -0.65625,0.54687 -0.23438,0.35938 -0.23438,0.79688 0,0.67187 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42188 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57812 0.26563,-1.67187 l 0,-0.60938 z m 4.09445,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85937 1.67188,0 0,9.85937 -1.67188,0 z m 4.09796,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 10.92606,-3.17187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82812 -2.8125,0.82812 -2.15625,0 -3.42187,-1.32812 -1.26563,-1.32813 -1.26563,-3.73438 0,-2.48437 1.26563,-3.85937 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79687 0,0.14063 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48438 0.82812,0.85937 2.0625,0.85937 0.90625,0 1.54687,-0.46875 0.65625,-0.48437 1.04688,-1.54687 z m -5.48438,-2.70313 5.5,0 q -0.10937,-1.23437 -0.625,-1.85937 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76562 -0.85938,2.04687 z m 9.09448,5.875 0,-9.85937 1.5,0 0,1.5 q 0.57813,-1.04688 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54687 l -0.57813,1.54688 q -0.60937,-0.35938 -1.23437,-0.35938 -0.54688,0 -0.98438,0.32813 -0.42187,0.32812 -0.60937,0.90625 -0.28125,0.89062 -0.28125,1.95312 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26562 q 0.14063,1 0.76563,1.53125 0.64062,0.51562 1.78125,0.51562 1.15625,0 1.70312,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48437,-0.89062 -0.34375,-0.21875 -1.70313,-0.5625 -1.84375,-0.46875 -2.5625,-0.79688 -0.70312,-0.34375 -1.07812,-0.9375 -0.35938,-0.60937 -0.35938,-1.32812 0,-0.65625 0.29688,-1.21875 0.3125,-0.5625 0.82812,-0.9375 0.39063,-0.28125 1.0625,-0.48438 0.67188,-0.20312 1.4375,-0.20312 1.17188,0 2.04688,0.34375 0.875,0.32812 1.28125,0.90625 0.42187,0.5625 0.57812,1.51562 l -1.625,0.21875 q -0.10937,-0.75 -0.65625,-1.17187 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64062,0.39062 -0.48438,0.375 -0.48438,0.875 0,0.32813 0.20313,0.59375 0.20312,0.26563 0.64062,0.4375 0.25,0.0937 1.46875,0.4375 1.76563,0.46875 2.46875,0.76563 0.70313,0.29687 1.09375,0.875 0.40625,0.57812 0.40625,1.4375 0,0.82812 -0.48437,1.57812 -0.48438,0.73438 -1.40625,1.14063 -0.92188,0.39062 -2.07813,0.39062 -1.92187,0 -2.9375,-0.79687 -1,-0.79688 -1.28125,-2.35938 z m 11.09375,6.9375 -1.1875,0 q 2.76563,-4.45312 2.76563,-8.92187 0,-1.73438 -0.39063,-3.45313 -0.32812,-1.39062 -0.89062,-2.67187 -0.35938,-0.84375 -1.48438,-2.78125 l 1.1875,0 q 1.75,2.32812 2.57813,4.67187 0.71875,2.01563 0.71875,4.23438 0,2.5 -0.96875,4.84375 -0.95313,2.32812 -2.32813,4.07812 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path39" d="m 1,213.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path41" d="m 1,213.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path43" d="m 38.57682,261.99073 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468748,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.093736,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.062496,0 -3.343736,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.078116,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.249996,0 -2.078116,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.281956,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path45" d="m 472.8009,213.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path47" d="m 472.8009,213.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path49" d="m 508.46736,260.49073 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path51" d="m 463.3302,381.79527 314.36218,0 0,82.55118 -314.36218,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path53" d="m 463.3302,381.79527 314.36218,0 0,82.55118 -314.36218,0 z"/>
+ <path style="fill:#b6d7a8;fill-rule:nonzero" inkscape:connector-curvature="0" id="path55" d="m 786.29646,381.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path57" d="m 786.29646,381.79514 127.87402,0 0,82.55118 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path59" d="m 821.96286,428.49073 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.16046,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60327,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28198,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path61" d="m 166.25364,381.79527 298.01575,0 0,82.55118 -298.01575,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path63" d="m 166.25364,381.79527 298.01575,0 0,82.55118 -298.01575,0 z"/>
+ <path style="fill:#d9ead3;fill-rule:nonzero" inkscape:connector-curvature="0" id="path65" d="m 1,381.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6" inkscape:connector-curvature="0" id="path67" d="m 1,381.79514 156.66142,0 0,82.55118 -156.66142,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path69" d="m 38.57682,429.99073 0,-13.59375 1.671875,0 0,4.875 q 1.171875,-1.35938 2.953125,-1.35938 1.09375,0 1.890625,0.4375 0.8125,0.42188 1.15625,1.1875 0.359375,0.76563 0.359375,2.20313 l 0,6.25 -1.671875,0 0,-6.25 q 0,-1.25 -0.546875,-1.8125 -0.546875,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.640625,0.375 -0.921875,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.671875,0 z m 17.125717,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.515625,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.421875,-1.32813 -1.265625,-1.32812 -1.265625,-3.73437 0,-2.48438 1.265625,-3.85938 1.28125,-1.375 3.328125,-1.375 1.984375,0 3.234375,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.01563,0.4375 l -7.34375,0 q 0.09375,1.625 0.921875,2.48437 0.828125,0.85938 2.0625,0.85938 0.90625,0 1.546875,-0.46875 0.65625,-0.48438 1.046875,-1.54688 z m -5.484375,-2.70312 5.5,0 q -0.109375,-1.23438 -0.625,-1.85938 -0.796875,-0.96875 -2.078125,-0.96875 -1.140625,0 -1.9375,0.78125 -0.78125,0.76563 -0.859375,2.04688 z m 15.547592,4.65625 q -0.9375,0.79687 -1.796875,1.125 -0.859375,0.3125 -1.84375,0.3125 -1.609375,0 -2.484375,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.328125,-1.32813 0.328125,-0.59375 0.859375,-0.95312 0.53125,-0.35938 1.203125,-0.54688 0.5,-0.14062 1.484375,-0.25 2.03125,-0.25 2.984375,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.640625,-0.5625 -1.90625,-0.5625 -1.171875,0 -1.734375,0.40625 -0.5625,0.40625 -0.828125,1.46875 l -1.640625,-0.23438 q 0.234375,-1.04687 0.734375,-1.6875 0.515625,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.265625,0 2.046875,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.515625,1.14062 0.09375,0.42188 0.09375,1.53125 l 0,2.23438 q 0,2.32812 0.09375,2.95312 0.109375,0.60938 0.4375,1.17188 l -1.75,0 q -0.265625,-0.51563 -0.328125,-1.21875 z m -0.140625,-3.71875 q -0.90625,0.35937 -2.734375,0.625 -1.03125,0.14062 -1.453125,0.32812 -0.421875,0.1875 -0.65625,0.54688 -0.234375,0.35937 -0.234375,0.79687 0,0.67188 0.5,1.125 0.515625,0.4375 1.484375,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.109375,-1.15625 0.265625,-0.57813 0.265625,-1.67188 l 0,-0.60937 z m 10.469465,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.984378,-0.65625 -1.531253,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.484375,-2.67187 0.5,-1.20313 1.468748,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25072,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.6033,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65697,0 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.093736,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.062496,0 -3.343736,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82812,0.9375 2.078116,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.249996,0 -2.078116,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 9.281956,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path71" d="m 322.39276,408.56955 283.0551,0 0,37.98425 -283.0551,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path73" d="m 416.94009,427.26291 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29757,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 13.10098,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70386,3.70313 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 7.73505,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.9646,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path75" d="m 346.50918,449.48167 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23437 0.84375,-2.34375 2.57813,-4.67188 l 1.20312,0 q -1.125,1.92188 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67188 -0.40625,1.73437 -0.40625,3.48437 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69894,0.73437 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56262,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.29761,3.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.0007,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.87503,-0.79688 -0.87503,-2.03125 0,-0.73438 0.32816,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46942,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 17.96527,2.71875 0,-3.71875 -3.70313,0 0,-1.5625 3.70313,0 0,-3.70312 1.57812,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57812,0 z m 16.21893,0.70313 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.66577,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09448,-6.75 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 4.09797,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09442,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.55646,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45313 2.76562,-8.92188 0,-1.73437 -0.39062,-3.45312 -0.32813,-1.39063 -0.89063,-2.67188 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57812,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95312,2.32813 -2.32812,4.07813 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path77" d="m 336.42129,473.82677 127.87402,0 0,25.63782 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path79" d="m 355.20401,493.56567 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17609,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.54757,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17187,0 -2.17187,-0.64063 -0.98438,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48437,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98438,-0.64063 2.20313,-0.64063 0.89062,0 1.57812,0.375 0.70313,0.375 1.14063,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54688,0 z m -5.28125,-4.92188 q 0,1.89063 0.79688,2.82813 0.8125,0.9375 1.89062,0.9375 1.09375,0 1.85938,-0.89063 0.76562,-0.89062 0.76562,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92187,-0.95312 -1.10938,0 -1.85938,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01633,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 9.02707,-0.23437 -3.60938,-13.59375 1.84375,0 2.0625,8.90625 q 0.34375,1.40625 0.57813,2.78125 0.51562,-2.17188 0.60937,-2.51563 l 2.59375,-9.17187 2.17188,0 1.95312,6.875 q 0.73438,2.5625 1.04688,4.8125 0.26562,-1.28125 0.6875,-2.95313 l 2.125,-8.73437 1.8125,0 -3.73438,13.59375 -1.73437,0 -2.85938,-10.35938 q -0.35937,-1.29687 -0.42187,-1.59375 -0.21875,0.9375 -0.40625,1.59375 l -2.89063,10.35938 -1.82812,0 z m 14.99926,0 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 6.24393,-11.6875 0,-1.90625 1.67188,0 0,1.90625 -1.67188,0 z m 0,11.6875 0,-9.85938 1.67188,0 0,9.85938 -1.67188,0 z m 7.78546,-1.5 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 8.27704,-1.67188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path81" d="m 465.37086,473.82677 127.87402,0 0,25.63782 -127.87402,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path83" d="m 486.73616,493.56567 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17603,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 8.01636,5.15625 3.9375,-14.0625 1.34375,0 -3.9375,14.0625 -1.34375,0 z m 6.10516,-6.85937 q 0,-3.39063 1.8125,-5.29688 1.82812,-1.92187 4.70312,-1.92187 1.875,0 3.39063,0.90625 1.51562,0.89062 2.29687,2.5 0.79688,1.60937 0.79688,3.65625 0,2.0625 -0.84375,3.70312 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45312 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54687,-1.23438 -1.64062,-1.92188 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 12.98017,6.59375 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 10.34448,0 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 4.09796,3.79687 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path85" d="m 464.27841,467.03937 0,37.03937"/>
+ <path style="fill-rule:nonzero;stroke:#595959;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path87" d="m 464.27841,467.03937 0,37.03937"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path89" d="m 205.74682,0 172.34647,0 0,28.503937 -172.34647,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path91" d="m 216.13745,21.171966 0,-13.593749 5.10937,0 q 1.54688,0 2.48438,0.40625 0.95312,0.40625 1.48437,1.265625 0.53125,0.859374 0.53125,1.796874 0,0.875 -0.46875,1.65625 -0.46875,0.765625 -1.4375,1.234375 1.23438,0.359375 1.89063,1.234375 0.67187,0.875 0.67187,2.0625 0,0.953125 -0.40625,1.78125 -0.39062,0.8125 -0.98437,1.265625 -0.59375,0.4375 -1.5,0.671875 -0.89063,0.21875 -2.1875,0.21875 l -5.1875,0 z m 1.79687,-7.890625 2.9375,0 q 1.20313,0 1.71875,-0.15625 0.6875,-0.203125 1.03125,-0.671875 0.35938,-0.46875 0.35938,-1.1875 0,-0.671875 -0.32813,-1.1875 -0.32812,-0.515624 -0.9375,-0.703124 -0.59375,-0.203125 -2.0625,-0.203125 l -2.71875,0 0,4.109374 z m 0,6.28125 3.39063,0 q 0.875,0 1.21875,-0.0625 0.625,-0.109375 1.04687,-0.359375 0.42188,-0.265625 0.6875,-0.765625 0.26563,-0.5 0.26563,-1.140625 0,-0.765625 -0.39063,-1.328125 -0.39062,-0.5625 -1.07812,-0.78125 -0.6875,-0.234375 -1.98438,-0.234375 l -3.15625,0 0,4.671875 z m 16.94358,0.390625 q -0.9375,0.796875 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.796875 -0.875,-2.03125 0,-0.734375 0.32812,-1.328125 0.32813,-0.59375 0.85938,-0.953125 0.53125,-0.359375 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.328125 0.0937,2.953125 0.10938,0.609375 0.4375,1.171875 l -1.75,0 q -0.26562,-0.515625 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.359375 -2.73437,0.625 -1.03125,0.140625 -1.45313,0.328125 -0.42187,0.1875 -0.65625,0.546875 -0.23437,0.359375 -0.23437,0.796875 0,0.671875 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.421875 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.578125 0.26562,-1.671875 l 0,-0.609375 z m 3.40699,2 1.65625,-0.265625 q 0.14062,1 0.76562,1.53125 0.64063,0.515625 1.78125,0.515625 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.890625 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.796875 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.609375 -0.35937,-1.328125 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.484375 0.67187,-0.203125 1.4375,-0.203125 1.17187,0 2.04687,0.34375 0.875,0.328125 1.28125,0.90625 0.42188,0.5625 0.57813,1.515625 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.171875 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.390625 -0.48437,0.375 -0.48437,0.875 0,0.328125 0.20312,0.59375 0.20313,0.265625 0.64063,0.4375 0.25,0.09375 1.46875,0.4375 1.76562,0.46875 2.46875,0.765625 0.70312,0.296875 1.09375,0.875 0.40625,0.578125 0.40625,1.4375 0,0.828125 -0.48438,1.578125 -0.48437,0.734375 -1.40625,1.140625 -0.92187,0.390625 -2.07812,0.390625 -1.92188,0 -2.9375,-0.796875 -1,-0.796875 -1.28125,-2.359375 z m 16.75,-0.234375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42187,-1.328125 -1.26563,-1.328125 -1.26563,-3.734375 0,-2.484375 1.26563,-3.859375 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.484375 0.82812,0.859375 2.0625,0.859375 0.90625,0 1.54687,-0.46875 0.65625,-0.484375 1.04688,-1.546875 z m -5.48438,-2.703125 5.5,0 q -0.10937,-1.234375 -0.625,-1.859375 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.765625 -0.85938,2.046875 z m 14.51215,5.875 0,-13.593749 5.125,0 q 1.35937,0 2.07812,0.125 1,0.171875 1.67188,0.640625 0.67187,0.46875 1.07812,1.312499 0.42188,0.84375 0.42188,1.84375 0,1.734375 -1.10938,2.9375 -1.09375,1.203125 -3.98437,1.203125 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.140625 3.51563,0 q 1.75,0 2.46875,-0.640625 0.73437,-0.65625 0.73437,-1.828125 0,-0.859375 -0.4375,-1.46875 -0.42187,-0.609374 -1.125,-0.796874 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.859374 z m 16.86545,5.921875 q -0.9375,0.796875 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.796875 -0.875,-2.03125 0,-0.734375 0.32812,-1.328125 0.32813,-0.59375 0.85938,-0.953125 0.53125,-0.359375 1.20312,-0.546875 0.5,-0.140625 1.48438,-0.25 2.03125,-0.25 2.98437,-0.578125 0,-0.34375 0,-0.4375 0,-1.015625 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.234375 q 0.23437,-1.046875 0.73437,-1.6875 0.51563,-0.640625 1.46875,-0.984375 0.96875,-0.359375 2.25,-0.359375 1.26563,0 2.04688,0.296875 0.78125,0.296875 1.15625,0.75 0.375,0.453125 0.51562,1.140625 0.0937,0.421875 0.0937,1.53125 l 0,2.234375 q 0,2.328125 0.0937,2.953125 0.10938,0.609375 0.4375,1.171875 l -1.75,0 q -0.26562,-0.515625 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.359375 -2.73437,0.625 -1.03125,0.140625 -1.45313,0.328125 -0.42187,0.1875 -0.65625,0.546875 -0.23437,0.359375 -0.23437,0.796875 0,0.671875 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.421875 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.578125 0.26562,-1.671875 l 0,-0.609375 z m 10.51633,1.328125 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.953125 -2.73438,0.953125 -2.01562,0 -3.25,-1.3125 -1.21875,-1.328125 -1.21875,-3.796875 0,-1.59375 0.51563,-2.78125 0.53125,-1.203125 1.60937,-1.796875 1.09375,-0.609375 2.35938,-0.609375 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.859375 0,1.984375 0.76562,2.890625 0.76563,0.890625 1.98438,0.890625 0.98437,0 1.64062,-0.59375 0.65625,-0.609375 0.84375,-1.859375 z m 2.90625,3.609375 0,-13.593749 1.67188,0 0,7.749999 3.95312,-4.015625 2.15625,0 -3.76562,3.65625 4.14062,6.203125 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.171875 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.828125 -2.8125,0.828125 -2.15625,0 -3.42188,-1.328125 -1.26562,-1.328125 -1.26562,-3.734375 0,-2.484375 1.26562,-3.859375 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.796875 0,0.140625 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.484375 0.82813,0.859375 2.0625,0.859375 0.90625,0 1.54688,-0.46875 0.65625,-0.484375 1.04687,-1.546875 z m -5.48437,-2.703125 5.5,0 q -0.10938,-1.234375 -0.625,-1.859375 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.765625 -0.85937,2.046875 z m 12.76635,4.375 0.23438,1.484375 q -0.70313,0.140625 -1.26563,0.140625 -0.90625,0 -1.40625,-0.28125 -0.5,-0.296875 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.984375 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.437499 1.65625,-1 0,3.437499 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.921875 0.0937,0.203125 0.29687,0.328125 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.07813 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path93" d="m 254.90166,27.322833 32.28348,34.17323"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path95" d="M 254.90166,27.322833 283.06481,57.13454"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path97" d="m 281.86413,58.268823 4.31708,2.164558 -1.91574,-4.433117 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path99" d="m 86.696384,152 172.346466,0 0,28.50394 -172.346466,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path101" d="m 97.212004,173.17197 0,-13.59375 1.8125,0 0,5.57812 7.062496,0 0,-5.57812 1.79687,0 0,13.59375 -1.79687,0 0,-6.40625 -7.062496,0 0,6.40625 -1.8125,0 z m 19.957316,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01634,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09446,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 11.63036,0 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.17187 1.67187,0.64062 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.73438 -1.10937,2.9375 -1.09375,1.20313 -3.98438,1.20313 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.14063 3.51562,0 q 1.75,0 2.46875,-0.64062 0.73438,-0.65625 0.73438,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42188,-0.60937 -1.125,-0.79687 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.85937 z m 16.86544,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51634,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76634,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path103" d="m 135.85124,179.32283 32.28346,34.17323"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path105" d="m 135.85124,179.32283 28.16313,29.81169"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path107" d="m 162.81369,210.26882 4.31708,2.16455 -1.91573,-4.4331 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path109" d="m 85.343264,320 172.346466,0 0,28.50394 -172.346466,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path111" d="m 95.843264,341.17197 0,-13.59375 6.031246,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.015616,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.859366,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.296866,0 0,4.5 z m 18.176056,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51634,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 11.52705,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09447,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.9783,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 9.1101,5.875 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 16.81321,-3.60938 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 9.64063,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 14.51215,5.875 0,-13.59375 5.125,0 q 1.35937,0 2.07812,0.125 1,0.17187 1.67188,0.64062 0.67187,0.46875 1.07812,1.3125 0.42188,0.84375 0.42188,1.84375 0,1.73438 -1.10938,2.9375 -1.09375,1.20313 -3.98437,1.20313 l -3.48438,0 0,5.53125 -1.79687,0 z m 1.79687,-7.14063 3.51563,0 q 1.75,0 2.46875,-0.64062 0.73437,-0.65625 0.73437,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42187,-0.60937 -1.125,-0.79687 -0.45312,-0.125 -1.67187,-0.125 l -3.48438,0 0,4.85937 z m 16.86545,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51634,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15626,0 -3.76564,3.65625 4.14064,6.20313 -2.06251,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.06251,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path113" d="m 134.49812,347.32282 32.28346,34.17325"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path115" d="m 134.49812,347.32282 28.16315,29.81174"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path117" d="m 161.46058,378.26883 4.31709,2.16455 -1.91574,-4.43314 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path119" d="m 381.74682,174.50444 172.34644,0 0,28.50394 -172.34644,0 z"/>
+ <path style="fill:#000000;fill-rule:nonzero" inkscape:connector-curvature="0" id="path121" d="m 392.24682,195.67641 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95312,0.35938 1.51562,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92187,0.98437 -2.89062,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48437,1.8125 l 2.375,3.70313 -2.26562,0 -1.79688,-2.82813 q -0.79687,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01562,-0.0781 l -2.07813,0 0,6.04688 -1.79687,0 z m 1.79687,-7.59375 3.85938,0 q 1.23437,0 1.92187,-0.25 0.70313,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70312,-1.57812 -0.70313,-0.625 -2.21875,-0.625 l -4.29688,0 0,4.5 z m 18.17609,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51632,5.875 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 9.63224,-6.625 q 0,-3.39063 1.8125,-5.29688 1.82812,-1.92187 4.70312,-1.92187 1.875,0 3.39063,0.90625 1.51562,0.89062 2.29687,2.5 0.79688,1.60937 0.79688,3.65625 0,2.0625 -0.84375,3.70312 -0.82813,1.625 -2.35938,2.46875 -1.53125,0.84375 -3.29687,0.84375 -1.92188,0 -3.4375,-0.92187 -1.5,-0.9375 -2.28125,-2.53125 -0.78125,-1.60938 -0.78125,-3.40625 z m 1.85937,0.0312 q 0,2.45312 1.3125,3.875 1.32813,1.40625 3.3125,1.40625 2.03125,0 3.34375,-1.42188 1.3125,-1.4375 1.3125,-4.0625 0,-1.65625 -0.5625,-2.89062 -0.54687,-1.23438 -1.64062,-1.92188 -1.07813,-0.6875 -2.42188,-0.6875 -1.90625,0 -3.28125,1.3125 -1.375,1.3125 -1.375,4.39063 z m 13.38644,6.59375 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 5.18329,0 0,-8.54688 -1.48437,0 0,-1.3125 1.48437,0 0,-1.04687 q 0,-0.98438 0.17188,-1.46875 0.23437,-0.65625 0.84375,-1.04688 0.60937,-0.40625 1.70312,-0.40625 0.70313,0 1.5625,0.15625 l -0.25,1.46875 q -0.51562,-0.0937 -0.98437,-0.0937 -0.76563,0 -1.07813,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92188,0 0,1.3125 -1.92188,0 0,8.54688 -1.65625,0 z m 4.1052,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 16.75,-0.23438 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z"/>
+ <path style="fill:#000000;fill-opacity:0;fill-rule:nonzero" inkscape:connector-curvature="0" id="path123" d="m 454.90166,177.29428 32.28345,-34.17323"/>
+ <path style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" inkscape:connector-curvature="0" id="path125" d="m 454.9017,177.29428 28.16312,-29.81172"/>
+ <path style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" inkscape:connector-curvature="0" id="path127" d="m 484.2655,148.61686 1.91571,-4.43312 -4.31708,2.16455 z"/>
+</svg>
diff --git a/doc/images/refstatic.svg b/doc/images/refstatic.svg
new file mode 100644
index 000000000..0cc442b5f
--- /dev/null
+++ b/doc/images/refstatic.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 794.22089 203.00841" stroke-miterlimit="10" id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="refstatic.svg" width="794.22089" height="203.00841" style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10">
+ <metadata id="metadata55">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id="defs53"/>
+ <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1341" inkscape:window-height="763" id="namedview51" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="0.87291667" inkscape:cx="330.51086" inkscape:cy="99.394237" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="0" inkscape:current-layer="g7"/>
+ <clipPath id="g188eb9bc0a_0_44.0">
+ <path d="M 0,0 960,0 960,540 0,540 0,0 Z" id="path5" inkscape:connector-curvature="0" style="clip-rule:nonzero"/>
+ </clipPath>
+ <g clip-path="url(#g188eb9bc0a_0_44.0)" id="g7" transform="translate(-149.48914,-166.38583)">
+ <path d="m 315.744,228.18097 491.43307,0 0,82.55118 -491.43307,0 z" id="path11" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 315.744,228.18097 491.43307,0 0,82.55118 -491.43307,0 z" id="path13" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 514.4803,269.1578 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20313,-1.125 0.6875,-0.375 1.64062,-0.375 1.26563,0 2.23438,0.65625 0.96875,0.64063 1.45312,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54687,2.73437 -0.54688,1.20313 -1.57813,1.84375 -1.03125,0.64063 -2.17187,0.64063 -0.84375,0 -1.51563,-0.34375 -0.65625,-0.35938 -1.07812,-0.89063 l 0,4.79688 -1.67188,0 z m 1.51563,-8.65625 q 0,1.90625 0.76562,2.8125 0.78125,0.90625 1.875,0.90625 1.10938,0 1.89063,-0.9375 0.79687,-0.9375 0.79687,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76562,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89062,1 -0.8125,1 -0.8125,2.89063 z m 15.2976,3.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51635,1.32812 1.64063,0.21875 q -0.26563,1.6875 -1.375,2.65625 -1.10938,0.95313 -2.73438,0.95313 -2.01562,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51563,-2.78125 0.53125,-1.20312 1.60937,-1.79687 1.09375,-0.60938 2.35938,-0.60938 1.60937,0 2.625,0.8125 1.01562,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23438,-1 -0.82813,-1.5 -0.59375,-0.5 -1.42187,-0.5 -1.26563,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76562,2.89062 0.76563,0.89063 1.98438,0.89063 0.98437,0 1.64062,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67188,0 0,7.75 3.95312,-4.01563 2.15625,0 -3.76562,3.65625 4.14062,6.20313 -2.0625,0 -3.25,-5.03125 -1.17187,1.125 0,3.90625 -1.67188,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 12.76629,4.375 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 13.10102,1.5 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 15.70385,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 7.73511,3.4375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z" id="path15" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 444.0494,291.37656 q -1.375,-1.75 -2.32813,-4.07813 -0.95312,-2.34375 -0.95312,-4.84375 0,-2.21875 0.70312,-4.23437 0.84375,-2.34375 2.57813,-4.67188 l 1.20312,0 q -1.125,1.92188 -1.48437,2.75 -0.5625,1.28125 -0.89063,2.67188 -0.40625,1.73437 -0.40625,3.48437 0,4.46875 2.78125,8.92188 l -1.20312,0 z m 3.02518,-4 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.1257,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54761,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46945,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 16.01635,1.75 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.55643,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 18.69891,0.73437 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 12.56269,5.98438 0,-13.64063 1.53125,0 0,1.28125 q 0.53125,-0.75 1.20312,-1.125 0.6875,-0.375 1.64063,-0.375 1.26562,0 2.23437,0.65625 0.96875,0.64063 1.45313,1.82813 0.5,1.1875 0.5,2.59375 0,1.51562 -0.54688,2.73437 -0.54687,1.20313 -1.57812,1.84375 -1.03125,0.64063 -2.17188,0.64063 -0.84375,0 -1.51562,-0.34375 -0.65625,-0.35938 -1.07813,-0.89063 l 0,4.79688 -1.67187,0 z m 1.51562,-8.65625 q 0,1.90625 0.76563,2.8125 0.78125,0.90625 1.875,0.90625 1.10937,0 1.89062,-0.9375 0.79688,-0.9375 0.79688,-2.92188 0,-1.875 -0.78125,-2.8125 -0.76563,-0.9375 -1.84375,-0.9375 -1.0625,0 -1.89063,1 -0.8125,1 -0.8125,2.89063 z m 15.29755,3.65625 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.00073,8.73437 -0.17187,-1.5625 q 0.54687,0.14063 0.95312,0.14063 0.54688,0 0.875,-0.1875 0.34375,-0.1875 0.5625,-0.51563 0.15625,-0.25 0.5,-1.25 0.0469,-0.14062 0.15625,-0.40625 l -3.73437,-9.875 1.79687,0 2.04688,5.71875 q 0.40625,1.07813 0.71875,2.28125 0.28125,-1.15625 0.6875,-2.25 l 2.09375,-5.75 1.67187,0 -3.75,10.03125 q -0.59375,1.625 -0.9375,2.23438 -0.4375,0.82812 -1.01562,1.20312 -0.57813,0.39063 -1.375,0.39063 -0.48438,0 -1.07813,-0.20313 z m 9.375,-3.79687 0,-13.59375 1.67188,0 0,13.59375 -1.67188,0 z m 3.55109,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 15.71948,3.70313 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46948,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 17.96527,2.71875 0,-3.71875 -3.70312,0 0,-1.5625 3.70312,0 0,-3.70312 1.57813,0 0,3.70312 3.6875,0 0,1.5625 -3.6875,0 0,3.71875 -1.57813,0 z m 16.21887,0.70313 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.51142,1.5 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 12.66583,-1.21875 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09443,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 10.92608,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09448,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.5564,-2.9375 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 11.09375,6.9375 -1.1875,0 q 2.76562,-4.45313 2.76562,-8.92188 0,-1.73437 -0.39062,-3.45312 -0.32813,-1.39063 -0.89063,-2.67188 -0.35937,-0.84375 -1.48437,-2.78125 l 1.1875,0 q 1.75,2.32813 2.57812,4.67188 0.71875,2.01562 0.71875,4.23437 0,2.5 -0.96875,4.84375 -0.95312,2.32813 -2.32812,4.07813 z" id="path17" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 150.48914,228.18097 156.6614,0 0,82.55118 -156.6614,0 z" id="path19" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 150.48914,228.18097 156.6614,0 0,82.55118 -156.6614,0 z" id="path21" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 188.06595,276.37656 0,-13.59375 1.67187,0 0,4.875 q 1.17188,-1.35938 2.95313,-1.35938 1.09375,0 1.89062,0.4375 0.8125,0.42188 1.15625,1.1875 0.35938,0.76563 0.35938,2.20313 l 0,6.25 -1.67188,0 0,-6.25 q 0,-1.25 -0.54687,-1.8125 -0.54688,-0.57813 -1.53125,-0.57813 -0.75,0 -1.40625,0.39063 -0.64063,0.375 -0.92188,1.04687 -0.28125,0.65625 -0.28125,1.8125 l 0,5.39063 -1.67187,0 z m 17.12572,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 15.54759,4.65625 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.46947,4.9375 0,-1.25 q -0.9375,1.46875 -2.75,1.46875 -1.17188,0 -2.17188,-0.64063 -0.98437,-0.65625 -1.53125,-1.8125 -0.53125,-1.17187 -0.53125,-2.6875 0,-1.46875 0.48438,-2.67187 0.5,-1.20313 1.46875,-1.84375 0.98437,-0.64063 2.20312,-0.64063 0.89063,0 1.57813,0.375 0.70312,0.375 1.14062,0.98438 l 0,-4.875 1.65625,0 0,13.59375 -1.54687,0 z m -5.28125,-4.92188 q 0,1.89063 0.79687,2.82813 0.8125,0.9375 1.89063,0.9375 1.09375,0 1.85937,-0.89063 0.76563,-0.89062 0.76563,-2.73437 0,-2.01563 -0.78125,-2.95313 -0.78125,-0.95312 -1.92188,-0.95312 -1.10937,0 -1.85937,0.90625 -0.75,0.90625 -0.75,2.85937 z m 9.25071,4.92188 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 5.60331,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26562,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29687,1.32813 1.29687,3.67188 0,1.90625 -0.57812,3 -0.5625,1.07812 -1.65625,1.6875 -1.07813,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82812,2.82813 0.82813,0.9375 2.07813,0.9375 1.25,0 2.0625,-0.9375 0.82812,-0.95313 0.82812,-2.89063 0,-1.82812 -0.82812,-2.76562 -0.82813,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07813,0.9375 -0.82812,0.9375 -0.82812,2.82812 z m 8.65696,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28197,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45312,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76562,-0.45313 1.09375,0 1.79688,0.45313 0.70312,0.45312 0.98437,1.28125 1.17188,-1.73438 3.04688,-1.73438 1.46875,0 2.25,0.8125 0.79687,0.8125 0.79687,2.5 l 0,6.76563 -1.67187,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42188,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67188,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70312,0 -1.3125,0.375 -0.59375,0.35937 -0.85937,1.07812 -0.26563,0.71875 -0.26563,2.0625 l 0,5.10938 -1.67187,0 z" id="path23" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 814.836,228.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path25" inkscape:connector-curvature="0" style="fill:#b6d7a8;fill-rule:nonzero"/>
+ <path d="m 814.836,228.18097 127.87402,0 0,82.55118 -127.87402,0 z" id="path27" inkscape:connector-curvature="0" style="fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:2, 6"/>
+ <path d="m 850.5025,274.87656 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79688,1.125 -0.85937,0.3125 -1.84375,0.3125 -1.60937,0 -2.48437,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32812,-1.32813 0.32813,-0.59375 0.85938,-0.95312 0.53125,-0.35938 1.20312,-0.54688 0.5,-0.14062 1.48438,-0.25 2.03125,-0.25 2.98437,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64062,-0.5625 -1.90625,-0.5625 -1.17187,0 -1.73437,0.40625 -0.5625,0.40625 -0.82813,1.46875 l -1.64062,-0.23438 q 0.23437,-1.04687 0.73437,-1.6875 0.51563,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26563,0 2.04688,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51562,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10938,0.60938 0.4375,1.17188 l -1.75,0 q -0.26562,-0.51563 -0.32812,-1.21875 z m -0.14063,-3.71875 q -0.90625,0.35937 -2.73437,0.625 -1.03125,0.14062 -1.45313,0.32812 -0.42187,0.1875 -0.65625,0.54688 -0.23437,0.35937 -0.23437,0.79687 0,0.67188 0.5,1.125 0.51562,0.4375 1.48437,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10938,-1.15625 0.26562,-0.57813 0.26562,-1.67188 l 0,-0.60937 z m 4.09449,-6.75 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 4.09796,0 0,-13.59375 1.67187,0 0,13.59375 -1.67187,0 z m 4.1604,0 0,-9.85938 1.5,0 0,1.5 q 0.57812,-1.04687 1.0625,-1.375 0.48437,-0.34375 1.07812,-0.34375 0.84375,0 1.71875,0.54688 l -0.57812,1.54687 q -0.60938,-0.35937 -1.23438,-0.35937 -0.54687,0 -0.98437,0.32812 -0.42188,0.32813 -0.60938,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67187,0 z m 5.60333,-4.92188 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 8.65698,0 q 0,-2.73437 1.53125,-4.0625 1.26563,-1.09375 3.09375,-1.09375 2.03125,0 3.3125,1.34375 1.29688,1.32813 1.29688,3.67188 0,1.90625 -0.57813,3 -0.5625,1.07812 -1.65625,1.6875 -1.07812,0.59375 -2.375,0.59375 -2.0625,0 -3.34375,-1.32813 -1.28125,-1.32812 -1.28125,-3.8125 z m 1.71875,0 q 0,1.89063 0.82813,2.82813 0.82812,0.9375 2.07812,0.9375 1.25,0 2.0625,-0.9375 0.82813,-0.95313 0.82813,-2.89063 0,-1.82812 -0.82813,-2.76562 -0.82812,-0.9375 -2.0625,-0.9375 -1.25,0 -2.07812,0.9375 -0.82813,0.9375 -0.82813,2.82812 z m 9.28192,4.92188 0,-9.85938 1.5,0 0,1.39063 q 0.45313,-0.71875 1.21875,-1.15625 0.78125,-0.45313 1.76563,-0.45313 1.09375,0 1.79687,0.45313 0.70313,0.45312 0.98438,1.28125 1.17187,-1.73438 3.04687,-1.73438 1.46875,0 2.25,0.8125 0.79688,0.8125 0.79688,2.5 l 0,6.76563 -1.67188,0 0,-6.20313 q 0,-1 -0.15625,-1.4375 -0.15625,-0.45312 -0.59375,-0.71875 -0.42187,-0.26562 -1,-0.26562 -1.03125,0 -1.71875,0.6875 -0.6875,0.6875 -0.6875,2.21875 l 0,5.71875 -1.67187,0 0,-6.40625 q 0,-1.10938 -0.40625,-1.65625 -0.40625,-0.5625 -1.34375,-0.5625 -0.70313,0 -1.3125,0.375 -0.59375,0.35937 -0.85938,1.07812 -0.26562,0.71875 -0.26562,2.0625 l 0,5.10938 -1.67188,0 z" id="path29" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 235.91191,166.38583 172.34645,0 0,28.50394 -172.34645,0 z" id="path31" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 246.30254,187.5578 0,-13.59375 5.10937,0 q 1.54688,0 2.48438,0.40625 0.95312,0.40625 1.48437,1.26562 0.53125,0.85938 0.53125,1.79688 0,0.875 -0.46875,1.65625 -0.46875,0.76562 -1.4375,1.23437 1.23438,0.35938 1.89063,1.23438 0.67189,0.875 0.67189,2.0625 0,0.95312 -0.40625,1.78125 -0.39064,0.8125 -0.98439,1.26562 -0.59375,0.4375 -1.5,0.67188 -0.89062,0.21875 -2.1875,0.21875 l -5.1875,0 z m 1.79687,-7.89063 2.9375,0 q 1.20313,0 1.71875,-0.15625 0.6875,-0.20312 1.03125,-0.67187 0.35938,-0.46875 0.35938,-1.1875 0,-0.67188 -0.32813,-1.1875 -0.32812,-0.51563 -0.9375,-0.70313 -0.59375,-0.20312 -2.0625,-0.20312 l -2.71875,0 0,4.10937 z m 0,6.28125 3.39063,0 q 0.875,0 1.21875,-0.0625 0.625,-0.10937 1.04687,-0.35937 0.42188,-0.26563 0.6875,-0.76563 0.26563,-0.5 0.26563,-1.14062 0,-0.76563 -0.39063,-1.32813 -0.39062,-0.5625 -1.07812,-0.78125 -0.6875,-0.23437 -1.98438,-0.23437 l -3.15625,0 0,4.67187 z m 16.94359,0.39063 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 3.40695,2 1.65625,-0.26563 q 0.14062,1 0.76562,1.53125 0.64063,0.51563 1.78125,0.51563 1.15625,0 1.70313,-0.46875 0.5625,-0.46875 0.5625,-1.09375 0,-0.5625 -0.48438,-0.89063 -0.34375,-0.21875 -1.70312,-0.5625 -1.84375,-0.46875 -2.5625,-0.79687 -0.70313,-0.34375 -1.07813,-0.9375 -0.35937,-0.60938 -0.35937,-1.32813 0,-0.65625 0.29687,-1.21875 0.3125,-0.5625 0.82813,-0.9375 0.39062,-0.28125 1.0625,-0.48437 0.67187,-0.20313 1.4375,-0.20313 1.17187,0 2.04687,0.34375 0.875,0.32813 1.28125,0.90625 0.42188,0.5625 0.57813,1.51563 l -1.625,0.21875 q -0.10938,-0.75 -0.65625,-1.17188 -0.53125,-0.4375 -1.5,-0.4375 -1.15625,0 -1.64063,0.39063 -0.48437,0.375 -0.48437,0.875 0,0.32812 0.20312,0.59375 0.20313,0.26562 0.64063,0.4375 0.25,0.0937 1.46875,0.4375 1.76562,0.46875 2.46875,0.76562 0.70312,0.29688 1.09375,0.875 0.40625,0.57813 0.40625,1.4375 0,0.82813 -0.48438,1.57813 -0.48437,0.73437 -1.40625,1.14062 -0.92187,0.39063 -2.07812,0.39063 -1.92188,0 -2.9375,-0.79688 -1,-0.79687 -1.28125,-2.35937 z m 16.75,-0.23438 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 14.51215,5.875 0,-13.59375 5.125,0 q 1.35938,0 2.07813,0.125 1,0.17187 1.67187,0.64062 0.67188,0.46875 1.07813,1.3125 0.42187,0.84375 0.42187,1.84375 0,1.73438 -1.10937,2.9375 -1.09375,1.20313 -3.98438,1.20313 l -3.48437,0 0,5.53125 -1.79688,0 z m 1.79688,-7.14063 3.51562,0 q 1.75,0 2.46875,-0.64062 0.73438,-0.65625 0.73438,-1.82813 0,-0.85937 -0.4375,-1.46875 -0.42188,-0.60937 -1.125,-0.79687 -0.45313,-0.125 -1.67188,-0.125 l -3.48437,0 0,4.85937 z m 16.86544,5.92188 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 10.51636,1.32812 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 2.90625,3.60938 0,-13.59375 1.67187,0 0,7.75 3.95313,-4.01563 2.15625,0 -3.76563,3.65625 4.14063,6.20313 -2.0625,0 -3.25,-5.03125 -1.17188,1.125 0,3.90625 -1.67187,0 z m 16.0625,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51563,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42187,-1.32813 -1.26563,-1.32812 -1.26563,-3.73437 0,-2.48438 1.26563,-3.85938 1.28125,-1.375 3.32812,-1.375 1.98438,0 3.23438,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92188,2.48437 0.82812,0.85938 2.0625,0.85938 0.90625,0 1.54687,-0.46875 0.65625,-0.48438 1.04688,-1.54688 z m -5.48438,-2.70312 5.5,0 q -0.10937,-1.23438 -0.625,-1.85938 -0.79687,-0.96875 -2.07812,-0.96875 -1.14063,0 -1.9375,0.78125 -0.78125,0.76563 -0.85938,2.04688 z m 12.76633,4.375 0.23437,1.48437 q -0.70312,0.14063 -1.26562,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70313,-0.75 -0.20312,-0.46875 -0.20312,-1.98438 l 0,-5.65625 -1.23438,0 0,-1.3125 1.23438,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29688,0.32812 0.20312,0.125 0.57812,0.125 0.26563,0 0.73438,-0.0781 z" id="path33" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 235.91191,340.8903 172.34645,0 0,28.50394 -172.34645,0 z" id="path35" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 245.77129,357.68726 1.6875,-0.14063 q 0.125,1.01563 0.5625,1.67188 0.4375,0.65625 1.35937,1.0625 0.9375,0.40625 2.09375,0.40625 1.03125,0 1.8125,-0.3125 0.79688,-0.3125 1.1875,-0.84375 0.39063,-0.53125 0.39063,-1.15625 0,-0.64063 -0.375,-1.10938 -0.375,-0.48437 -1.23438,-0.8125 -0.54687,-0.21875 -2.42187,-0.65625 -1.875,-0.45312 -2.625,-0.85937 -0.96875,-0.51563 -1.45313,-1.26563 -0.46875,-0.75 -0.46875,-1.6875 0,-1.03125 0.57813,-1.92187 0.59375,-0.90625 1.70312,-1.35938 1.125,-0.46875 2.5,-0.46875 1.51563,0 2.67188,0.48438 1.15625,0.48437 1.76562,1.4375 0.62502,0.9375 0.6719,2.14062 l -1.71877,0.125 q -0.14063,-1.28125 -0.95313,-1.9375 -0.79687,-0.67187 -2.35937,-0.67187 -1.625,0 -2.375,0.60937 -0.75,0.59375 -0.75,1.4375 0,0.73438 0.53125,1.20313 0.51562,0.46875 2.70312,0.96875 2.20313,0.5 3.01563,0.875 1.1875,0.54687 1.75002,1.39062 0.57812,0.82813 0.57812,1.92188 0,1.09375 -0.62501,2.0625 -0.625,0.95312 -1.79688,1.48437 -1.15625,0.53125 -2.60937,0.53125 -1.84375,0 -3.09375,-0.53125 -1.25,-0.54687 -1.96875,-1.625 -0.70313,-1.07812 -0.73438,-2.45312 z m 16.49046,2.875 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 7.96454,0.28125 q -0.9375,0.79687 -1.79687,1.125 -0.85938,0.3125 -1.84375,0.3125 -1.60938,0 -2.48438,-0.78125 -0.875,-0.79688 -0.875,-2.03125 0,-0.73438 0.32813,-1.32813 0.32812,-0.59375 0.85937,-0.95312 0.53125,-0.35938 1.20313,-0.54688 0.5,-0.14062 1.48437,-0.25 2.03125,-0.25 2.98438,-0.57812 0,-0.34375 0,-0.4375 0,-1.01563 -0.46875,-1.4375 -0.64063,-0.5625 -1.90625,-0.5625 -1.17188,0 -1.73438,0.40625 -0.5625,0.40625 -0.82812,1.46875 l -1.64063,-0.23438 q 0.23438,-1.04687 0.73438,-1.6875 0.51562,-0.64062 1.46875,-0.98437 0.96875,-0.35938 2.25,-0.35938 1.26562,0 2.04687,0.29688 0.78125,0.29687 1.15625,0.75 0.375,0.45312 0.51563,1.14062 0.0937,0.42188 0.0937,1.53125 l 0,2.23438 q 0,2.32812 0.0937,2.95312 0.10937,0.60938 0.4375,1.17188 l -1.75,0 q -0.26563,-0.51563 -0.32813,-1.21875 z m -0.14062,-3.71875 q -0.90625,0.35937 -2.73438,0.625 -1.03125,0.14062 -1.45312,0.32812 -0.42188,0.1875 -0.65625,0.54688 -0.23438,0.35937 -0.23438,0.79687 0,0.67188 0.5,1.125 0.51563,0.4375 1.48438,0.4375 0.96875,0 1.71875,-0.42187 0.75,-0.4375 1.10937,-1.15625 0.26563,-0.57813 0.26563,-1.67188 l 0,-0.60937 z m 7.7351,3.4375 0.23438,1.48437 q -0.70313,0.14063 -1.26563,0.14063 -0.90625,0 -1.40625,-0.28125 -0.5,-0.29688 -0.70312,-0.75 -0.20313,-0.46875 -0.20313,-1.98438 l 0,-5.65625 -1.23437,0 0,-1.3125 1.23437,0 0,-2.4375 1.65625,-1 0,3.4375 1.6875,0 0,1.3125 -1.6875,0 0,5.75 q 0,0.71875 0.0781,0.92188 0.0937,0.20312 0.29687,0.32812 0.20313,0.125 0.57813,0.125 0.26562,0 0.73437,-0.0781 z m 1.54267,-10.1875 0,-1.90625 1.67187,0 0,1.90625 -1.67187,0 z m 0,11.6875 0,-9.85938 1.67187,0 0,9.85938 -1.67187,0 z m 10.56671,-3.60938 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 8.32391,3.60938 0,-13.59375 6.03125,0 q 1.8125,0 2.75,0.35937 0.95313,0.35938 1.51563,1.29688 0.5625,0.92187 0.5625,2.04687 0,1.45313 -0.9375,2.45313 -0.92188,0.98437 -2.89063,1.25 0.71875,0.34375 1.09375,0.67187 0.78125,0.73438 1.48438,1.8125 l 2.375,3.70313 -2.26563,0 -1.79687,-2.82813 q -0.79688,-1.21875 -1.3125,-1.875 -0.5,-0.65625 -0.90625,-0.90625 -0.40625,-0.26562 -0.8125,-0.35937 -0.3125,-0.0781 -1.01563,-0.0781 l -2.07812,0 0,6.04688 -1.79688,0 z m 1.79688,-7.59375 3.85937,0 q 1.23438,0 1.92188,-0.25 0.70312,-0.26563 1.0625,-0.82813 0.375,-0.5625 0.375,-1.21875 0,-0.96875 -0.70313,-1.57812 -0.70312,-0.625 -2.21875,-0.625 l -4.29687,0 0,4.5 z m 18.17608,4.42187 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.51633,5.875 0,-8.54688 -1.48438,0 0,-1.3125 1.48438,0 0,-1.04687 q 0,-0.98438 0.17187,-1.46875 0.23438,-0.65625 0.84375,-1.04688 0.60938,-0.40625 1.70313,-0.40625 0.70312,0 1.5625,0.15625 l -0.25,1.46875 q -0.51563,-0.0937 -0.98438,-0.0937 -0.76562,0 -1.07812,0.32813 -0.3125,0.3125 -0.3125,1.20312 l 0,0.90625 1.92187,0 0,1.3125 -1.92187,0 0,8.54688 -1.65625,0 z m 11.52706,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.09445,5.875 0,-9.85938 1.5,0 0,1.5 q 0.57813,-1.04687 1.0625,-1.375 0.48438,-0.34375 1.07813,-0.34375 0.84375,0 1.71875,0.54688 l -0.57813,1.54687 q -0.60937,-0.35937 -1.23437,-0.35937 -0.54688,0 -0.98438,0.32812 -0.42187,0.32813 -0.60937,0.90625 -0.28125,0.89063 -0.28125,1.95313 l 0,5.15625 -1.67188,0 z m 12.9783,-3.17188 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z m 9.11011,5.875 0,-9.85938 1.5,0 0,1.40625 q 1.09375,-1.625 3.14062,-1.625 0.89063,0 1.64063,0.32813 0.75,0.3125 1.10937,0.84375 0.375,0.51562 0.53125,1.21875 0.0937,0.46875 0.0937,1.625 l 0,6.0625 -1.67187,0 0,-6 q 0,-1.01563 -0.20313,-1.51563 -0.1875,-0.51562 -0.6875,-0.8125 -0.5,-0.29687 -1.17187,-0.29687 -1.0625,0 -1.84375,0.67187 -0.76563,0.67188 -0.76563,2.57813 l 0,5.375 -1.67187,0 z m 16.8132,-3.60938 1.64062,0.21875 q -0.26562,1.6875 -1.375,2.65625 -1.10937,0.95313 -2.73437,0.95313 -2.01563,0 -3.25,-1.3125 -1.21875,-1.32813 -1.21875,-3.79688 0,-1.59375 0.51562,-2.78125 0.53125,-1.20312 1.60938,-1.79687 1.09375,-0.60938 2.35937,-0.60938 1.60938,0 2.625,0.8125 1.01563,0.8125 1.3125,2.3125 l -1.625,0.25 q -0.23437,-1 -0.82812,-1.5 -0.59375,-0.5 -1.42188,-0.5 -1.26562,0 -2.0625,0.90625 -0.78125,0.90625 -0.78125,2.85938 0,1.98437 0.76563,2.89062 0.76562,0.89063 1.98437,0.89063 0.98438,0 1.64063,-0.59375 0.65625,-0.60938 0.84375,-1.85938 z m 9.64062,0.4375 1.71875,0.21875 q -0.40625,1.5 -1.51562,2.34375 -1.09375,0.82813 -2.8125,0.82813 -2.15625,0 -3.42188,-1.32813 -1.26562,-1.32812 -1.26562,-3.73437 0,-2.48438 1.26562,-3.85938 1.28125,-1.375 3.32813,-1.375 1.98437,0 3.23437,1.34375 1.25,1.34375 1.25,3.79688 0,0.14062 -0.0156,0.4375 l -7.34375,0 q 0.0937,1.625 0.92187,2.48437 0.82813,0.85938 2.0625,0.85938 0.90625,0 1.54688,-0.46875 0.65625,-0.48438 1.04687,-1.54688 z m -5.48437,-2.70312 5.5,0 q -0.10938,-1.23438 -0.625,-1.85938 -0.79688,-0.96875 -2.07813,-0.96875 -1.14062,0 -1.9375,0.78125 -0.78125,0.76563 -0.85937,2.04688 z" id="path37" inkscape:connector-curvature="0" style="fill:#000000;fill-rule:nonzero"/>
+ <path d="m 285.06677,193.70866 32.28348,34.17323" id="path39" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 285.06677,193.70866 28.16315,29.81169" id="path41" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 312.02924,224.65465 4.31708,2.16455 -1.91574,-4.4331 z" id="path43" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ <path d="m 285.06677,343.6801 32.28348,-34.17325" id="path45" inkscape:connector-curvature="0" style="fill:#000000;fill-opacity:0;fill-rule:nonzero"/>
+ <path d="m 285.06677,343.6801 28.16315,-29.81171" id="path47" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round"/>
+ <path d="m 314.43057,315.0027 1.91574,-4.43311 -4.31708,2.16456 z" id="path49" inkscape:connector-curvature="0" style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt"/>
+ </g>
+</svg>
diff --git a/doc/users-guide/users-guide-packet.adoc b/doc/users-guide/users-guide-packet.adoc
index e3be23c1f..d5f2ff192 100644
--- a/doc/users-guide/users-guide-packet.adoc
+++ b/doc/users-guide/users-guide-packet.adoc
@@ -246,7 +246,7 @@ packet pool as the original packet.
The opposite operation is performed by the `odp_packet_concat()` API. This API
takes a destination and source packet as arguments and the result is that
the source packet is concatenated to the destination packet and ceases to
-have any separete identity. Note that it is legal to concatenate a packet to
+have any separate identity. Note that it is legal to concatenate a packet to
itself, in which case the result is a packet with double the length of the
original packet.
@@ -282,3 +282,240 @@ larger than the underlying segment size. The call may also fail if the
requested alignment is too high. Alignment limits will vary among different ODP
implementations, however ODP requires that all implementations support
requested alignments of at least 32 bytes.
+
+=== Packet References
+To support efficient multicast, retransmit, and related processing, ODP
+supports two additional types of packet manipulation: static and dynamic
+_references_. A reference is a lightweight mechanism for
+creating aliases to packets as well as to create packets that share data bytes
+with other packets to avoid unnecessary data copying.
+
+==== Static References
+The simplest type of reference is the _static reference_. A static reference is
+created by the call:
+
+[source,c]
+-----
+ref_pkt = odp_packet_ref_static(pkt);
+-----
+
+If the reference fails, `ODP_PACKET_INVALID` is returned and `pkt`
+remains unchanged.
+
+The effect of this call is shown below:
+
+.Static Packet Reference
+image::refstatic.svg[align="center"]
+
+A static reference provides a simple and efficient means of creating an alias
+for a packet handle that prevents the packet itself from being freed until all
+references to it have been released via `odp_packet_free()` calls. This is
+useful, for example, to support retransmission processing, since as part of
+packet TX processing, `odp_pktout_send()` or `odp_tm_enq()` will free
+the packet after it has been transmitted.
+
+`odp_packet_ref_static()` might be used in a transmit routine wrapper
+function like:
+
+[source,c]
+-----
+int xmit_pkt(odp_pktout_queue_t queue, odp_packet_t pkt)
+{
+ odp_packet_t ref = odp_packet_ref_static(pkt);
+ return ref == ODP_PACKET_INVALID ? -1 : odp_pktout_send(queue, ref, 1);
+}
+-----
+
+This transmits a reference to `pkt` so that `pkt` is retained by the caller,
+which means that the caller is free to retransmit it if needed at a later
+time. When a higher level protocol (_e.g.,_ receipt of a TCP ACK packet)
+confirms that the transmission was successful, `pkt` can then be discarded via
+an `odp_packet_free()` call.
+
+The key characteristic of a static reference is that because there are
+multiple independent handles that refer to the same packet, the caller should
+treat the packet as read only following the creation of a static reference
+until all other references to it are freed. This is because all static
+references are simply aliases of the same packet, so if multiple threads were
+independently manipulating the packet this would lead to unpredictable race
+conditions.
+
+To assist in determining whether there are other references to a packet, ODP
+provides the API:
+
+[source,c]
+-----
+int odp_packet_has_ref(odp_packet_t pkt);
+-----
+
+that indicates whether other packets exist that share bytes with this
+packet. If this routine returns 0 then the caller can be assured that it is
+safe to modify it as this handle is the only reference to the packet.
+
+==== Dynamic References
+While static references are convenient and efficient, they are limited by the
+need to be treated as read only. For example, consider an application that
+needs to _multicast_ a packet. Here the same packet needs to be sent to two or
+more different destinations. While the packet payload may be the same, each
+sent copy of the packet requires its own unique header to specify the
+destination that is to receive the packet.
+
+To address this need, ODP provides _dynamic references_. These are created
+by the call:
+
+[source,c]
+-----
+ref_pkt = odp_packet_ref(pkt, offset);
+-----
+
+The `offset` parameter specifies the byte offset into `pkt` at which the
+reference is to begin. This must be in the range
+0..`odp_packet_len(pkt)`-1. As before, if the reference is unable to be
+created `ODP_PACKET_INVALID` is returned and `pkt` is unchanged, otherwise the
+result is as shown below:
+
+.Dynamic Packet Reference
+image::ref.svg[align="center"]
+
+Following a successful reference creation, the bytes of `pkt` beginning at
+offset `offset` are shared with the created reference. These bytes should be
+treated as read only since multiple references point to them. Each reference,
+however still retains its own individual headroom and metadata that is not
+shared with any other reference. This allows unique headers to be created by
+calling `odp_packet_push_head()` or `odp_packet_extend_head()` on either
+handle. This allows multiple references to the same packet to prefix unique
+headers onto common shared data it so that they can be properly multicast
+using code such as:
+
+[source,c]
+-----
+int pkt_fanout(odp_packet_t payload, odp_queue_t fanout_queue[], int num_queues)
+{
+ int i;
+
+ for (i = 0, i < num_queues, i++)
+ odp_queue_enq(fanout_queue[i], odp_packet_ref(payload, 0));
+}
+-----
+
+Receiver worker threads can then operate on each reference to the packet in
+parallel to prefix a unique transmit header onto it and send it out.
+
+==== Dynamic References with Headers
+The dynamic references discussed so far have one drawback in that the headers
+needed to make each reference unique must be constructed individually after
+the reference is created. To address this problem, ODP allows these headers
+to be created in advance and then simply prefixed to a base packet as part
+of reference creation:
+
+[source,c]
+-----
+ref_pkt = odp_packet_ref_pkt(pkt, offset, hdr_pkt);
+-----
+
+Here rather than creating a reference with a null header, a _header packet_
+is supplied that is prefixed onto the reference. The result looks like this:
+
+.Packet Reference using a Header Packet
+image::refpktsingle.svg[align="center"]
+
+So now multicasting can be more efficient using code such as:
+
+[source,c]
+-----
+int pkt_fanout_hdr(odp_packet_t payload, odp_queue_q fanout_queue[],
+ odp_packet_t hdr[], int num_queues)
+{
+ int i;
+
+ for (i = 0; i < num_queues, i++)
+ odp_queue_enq(fanout_queue[i],
+ odp_packet_ref_pkt(payload, 0, hdr[i]));
+}
+-----
+
+Now each individual reference has its own header already prefixed to
+it ready for transmission.
+
+Note that when multiple references like this are made they can each have
+their own offset. So if the following code is executed:
+
+[source,c]
+-----
+ref_pkt1 = odp_packet_ref_pkt(pkt, offset1, hdr_pkt1);
+ref_pkt2 = odp_packet_ref_pkt(pkt, offset2, hdr_pkt2);
+-----
+
+the result will look like:
+
+image::refpkt1.svg[align="center"]
+image::refpktmulti.svg[align="center"]
+.Multiple Packet References with Different Offsets
+image::refpkt2.svg[align="center"]
+
+Here two separate header packets are prefixed onto the same shared packet, each
+at their own specified offset, which may or may not be the same. The result is
+three packets visible to the application:
+
+* The original `pkt`, which can still be accessed and manipulated directly.
+* The first reference, which consists of `hdr_pkt1` followed by bytes
+contained in `pkt` starting at `offset1`.
+* The second reference, which consists of `hdr_pkt2` followed by bytes
+contained in `pkt` starting at `offset2`.
+
+Only a single copy of the bytes in `pkt` that are common to the
+references exist.
+
+===== Data Sharing with References
+Because a `pkt` is a shared object when referenced, applications must observe
+certain disciplines when working with them. For best portability and
+reliability, the shared data contained in any packet referred to by references
+should be treated as read only once it has been successfully referenced until
+it is known that all references to it have been freed.
+
+To assist applications in working with references, ODP provides two additional
+APIs:
+
+[source,c]
+-----
+int odp_packet_has_ref(odp_packet_t pkt);
+
+uint32_t odp_packet_unshared_len(odp_packet_t pkt);
+-----
+The `odp_packet_has_ref()` API says whether any other packets
+exist that share any bytes with this packet.
+
+Because references and referenced packets consist of an unshared
+prefix, that is modifiable, followed by a shared body that should not be
+modified, the `odp_packet_unshared_len()` API is available that operates as
+shown here:
+
+.Packet Reference Lengths
+image::reflen.svg[align="center"]
+
+`odp_packet_unshared_len()` returns the same value as `odp_packet_len()` when
+`odp_packet_has_ref()` returns 0, but for packets for which
+`odp_packet_has_ref()` returns 1, only returns the number of unshared bytes
+prefixed to them. To ensure portability and reliability, only offsets
+0..`odp_packet_unshared_len()`-1 should be modified by the caller.
+
+===== Compound References
+Note that architecturally ODP does not limit referencing and so it is possible
+that a reference may be used as a basis for creating another reference. The
+result is a _compound reference_ that should still behave as any other
+reference.
+
+As noted earlier, the intent behind references is that they are lightweight
+objects that can be implemented without requiring data copies. The existence
+of compound references may complicate this goal for some implementations. As a
+result, implementations are always free to perform partial or full copies of
+packets as part of any reference creation call. The
+`odp_packet_unshared_len()` API will always provide an authoritative answer to
+the question of how many bytes of a packet may safely be modified in any
+context, so whether or not copies have been performed applications can be
+assured of portability across all conforming ODP implementations.
+
+Note also that a packet may not reference itself, nor may circular reference
+relationships be formed, _e.g.,_ packet A is used as a header for a reference
+to packet B and B is used as a header for a reference to packet A. Results
+are undefined if such circular references are attempted.
diff --git a/doc/users-guide/users-guide.adoc b/doc/users-guide/users-guide.adoc
index 41c57d1ca..ead8da5e6 100755
--- a/doc/users-guide/users-guide.adoc
+++ b/doc/users-guide/users-guide.adoc
@@ -589,6 +589,126 @@ lookup. The lookup function is particularly useful to allow an ODP application
that is divided into multiple processes to obtain the handle for the common
resource.
+== Application Portability Considerations
+ODP is designed to support the creation of portable data plane applications
+that can easily be run on multiple target platforms while at the same time
+fully exploit hardware acceleration capabilities native to whatever platform
+it is running on. This section discusses tradeoffs that application writers
+should consider when using ODP.
+
+First, it should be noted that portability is not an absolute good nor is it a
+single-valued attribute (application is portable or is not portable). While
+any application can be ported from one platform to another the real question
+is: _at what cost?_ Costs can be measured in two dimensions: The level of
+effort needed to port, and the resulting performance differences seen due to
+the port. Ideally an application should be portable between platforms with
+minimal effort and equally minimal performance impact. While ODP is designed
+to support this ideal, each application must assess what its goals are in this
+area and how best to use ODP to achieve these goals.
+
+=== Portability and Coexistence
+Because ODP offers a programming _framework_ rather than a programming
+_environment_, it is designed to be able to work alongside APIs offered by
+other frameworks with minimual interference. Therefore when we speak of
+portability in an ODP context, we of necessity speak of portability of those
+portions of the application that make use of ODP APIs. If an application uses
+non-ODP APIs then those must be taken into consideration as well when
+assessing the portability of the entire application. For many applications, it
+suffices to isolate certain non-portable code to a few areas of the application
+with the result that the application is significantly more portable than it
+would be without using ODP. Especially when dealing with existing applications
+that run in production environments, ODP may well be introduced in an
+incremental manner with the result being that the application becomes more
+portable only over time.
+
+=== Source vs. Binary Portability
+ODP has been designed to support both source and binary portability. Source
+portability is intrinsic to the ODP API specification itself. Any application
+written to the ODP API specification will be source portable between any
+conforming ODP implementation with at most a recompile. This is because ODP
+APIs do not expose implementation details or internal structures that may vary
+from platform to platform.
+
+For platforms that share a common Instruction Set Architecture (ISA), ODP can
+also offer binary portability via the specification of an Application Binary
+Interface (ABI). This is especially useful in a Network Function
+Virtualization (NFV) environment where a data plane application may be
+developed and compiled on one platform for distribution and then deployed on
+many different platforms by an NFV Orchestrator function.
+
+=== ODP Application Profiles
+To assist in meeting these needs, ODP offers two distinct _application
+profiles_ that are designed to characterize the needs of different types of
+data plane applications: the _Embedded Profile_ and the _Cloud Profile_.
+
+==== Embedded Profile
+The ODP Embedded Profile is designed to support applications that wish to
+target a specific platform and achieve optimal performance on that platform
+and where source code portability is sufficient. If such applications need to
+support more than one platform then they simply need to be recompiled against
+the ODP implementation for that platform.
+
+Embedded applications will typically work with a copy of ODP downloaded from
+a git repository so that it can be configured for the application's precise
+needs. To specify that the application wishes to use the embedded profile:
+
+`./configure --enable-abi-compat=no ...`
+
+should be used as part of the ODP configuration options. This allows
+applications to use inline forms of ODP APIs to give optimal performance
+on this platform, and may include additional optimizations that preclude
+binary portability to other platforms. The result is a binary that will achieve
+maximum performance on a given target platform and that can be ported to
+other platforms with a recompile.
+
+==== Cloud Profile
+By contrast, the ODP Cloud Profile is designed to support applications that
+wish to be platform-agnostic and be binary compatible across all platforms
+sharing this ABI. Any ODP implementation included in a Linux distribution will
+be configured for the cloud profile, so no additional action is required on
+the part of applications when compiling against a distributed copy of ODP (one
+that is installed via `sudo apt-get install` or equivalent command).
+
+When using a copy of ODP downloaded from a repository, the cloud profile is
+selected at configure time:
+
+`./configure --enable-abi-compat=yes ...`
+
+Note that `--enable-abi-compat=yes` is the default, so this need not be
+specified. Unless `no` is specified for this option, the result will be
+applications designed to run in the cloud profile.
+
+=== ABI Characteristics
+An ABI consists of several conventions that ensure that a program compiled
+against one ODP implementation can run unchanged on another platform that
+has a possibly very different ODP implementation without requiring
+recompilation. These include:
+
+* A set of function calling conventions that define how functions call other
+functions, pass parameters, and receive returned results. These are typically
+specified by the Operating System (_e.g.,_ Linux) and are independent of ODP.
+
+* Avoiding the use of inline expansions for any ODP API. This ensures that
+differing ODP implementations can maintain their different internals without
+these differences being visible to the application.
+
+* Agreement as to the size and alignment of ODP abstract datatypes used by all
+ODP implementations sharing this ABI definition. This means that, for example,
+the size of an `odp_packet_t` handle is the same across all members of the
+ABI. Since these handles are opaque, it doesn't matter if their structure
+differs between ODP implementations since applications never reference these
+possibly different internals.
+
+Note that an ABI definition exists within a specific Instruction Set
+Architecture (ISA), such as x86-64 or AArch64. Binaries cannot directly port
+between ISAs--that requires a recompilation.
+
+Each ODP implementation will identify which ABI definition it supports, if any.
+When compiling against an ODP implementation in ABI compabitilty mode, the
+resulting binary is automatically binary compatible with all other ODP
+implementations that share this ABI. For example, for the x86-64 ISA, both
+the `odp-linux` and `odp-dpdk` implemtations are a common ABI.
+
== Shared memory
=== Allocating shared memory
Blocks of shared memory can be created using the `odp_shm_reserve()` API
diff --git a/example/Makefile.inc b/example/Makefile.inc
index c7de6db64..d492a8f71 100644
--- a/example/Makefile.inc
+++ b/example/Makefile.inc
@@ -6,6 +6,7 @@ AM_CFLAGS += \
-I$(top_srcdir)/example \
-I$(top_srcdir)/platform/@with_platform@/include \
-I$(top_srcdir)/include/ \
+ -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \
-I$(top_srcdir)/helper/include \
-I$(top_builddir)/platform/@with_platform@/include \
-I$(top_builddir)/include
diff --git a/example/classifier/odp_classifier.c b/example/classifier/odp_classifier.c
index 1bd241418..d67fe5ace 100644
--- a/example/classifier/odp_classifier.c
+++ b/example/classifier/odp_classifier.c
@@ -12,9 +12,7 @@
#include <example_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
#include <strings.h>
#include <errno.h>
#include <stdio.h>
diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
index ccd47f628..8062d8733 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -20,16 +20,12 @@
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/icmp.h>
+#include <odp/helper/odph_api.h>
-#define MAX_WORKERS 32 /**< max number of works */
-#define SHM_PKT_POOL_SIZE (512*2048) /**< pkt pool size */
-#define SHM_PKT_POOL_BUF_SIZE 1856 /**< pkt pool buf size */
-#define DEFAULT_PKT_INTERVAL 1000 /**< interval btw each pkt */
+#define MAX_WORKERS 32 /* Max number of workers */
+#define POOL_NUM_PKT 2048 /* Number of packets in packet pool */
+#define POOL_PKT_LEN 1856 /* Max packet length */
+#define DEFAULT_PKT_INTERVAL 1000 /* Interval between each packet */
#define APPL_MODE_UDP 0 /**< UDP mode */
#define APPL_MODE_PING 1 /**< ping mode */
@@ -45,7 +41,7 @@
* Parsed command line application arguments
*/
typedef struct {
- int cpu_count; /**< system CPU count */
+ int num_workers; /**< Number of worker thread */
const char *mask; /**< CPU mask */
int if_count; /**< Number of interfaces to be used */
char **if_names; /**< Array of pointers to interface names */
@@ -387,14 +383,17 @@ static int gen_send_thread(void *arg)
(unsigned int)args->appl.number)
break;
+ pkt = ODP_PACKET_INVALID;
+
if (args->appl.mode == APPL_MODE_UDP)
pkt = pack_udp_pkt(thr_args->pool);
else if (args->appl.mode == APPL_MODE_PING)
pkt = pack_icmp_pkt(thr_args->pool);
- else
- pkt = ODP_PACKET_INVALID;
- if (!odp_packet_is_valid(pkt)) {
+ if (pkt == ODP_PACKET_INVALID) {
+ /* Thread gives up as soon as it sees the pool empty.
+ * Depending on pool size and transmit latency, it may
+ * be normal that pool gets empty sometimes. */
EXAMPLE_ERR(" [%2i] alloc_single failed\n", thr);
break;
}
@@ -675,13 +674,17 @@ int main(int argc, char *argv[])
/* Print both system and application information */
print_info(NO_PATH(argv[0]), &args->appl);
- /* Default to system CPU count unless user specified */
+ /* Default to max number of workers, unless user specified number of
+ * workers or cpumask */
num_workers = MAX_WORKERS;
- if (args->appl.cpu_count)
- num_workers = args->appl.cpu_count;
-
num_workers = odp_cpumask_default_worker(&cpumask, num_workers);
- if (args->appl.mask) {
+
+ if (args->appl.num_workers) {
+ /* -w option: number of workers */
+ num_workers = args->appl.num_workers;
+ num_workers = odp_cpumask_default_worker(&cpumask, num_workers);
+ } else if (args->appl.mask) {
+ /* -c option: cpumask */
odp_cpumask_from_str(&cpumask, args->appl.mask);
num_workers = odp_cpumask_count(&cpumask);
}
@@ -704,9 +707,9 @@ int main(int argc, char *argv[])
/* Create packet pool */
odp_pool_param_init(&params);
- params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
- params.pkt.len = SHM_PKT_POOL_BUF_SIZE;
- params.pkt.num = SHM_PKT_POOL_SIZE/SHM_PKT_POOL_BUF_SIZE;
+ params.pkt.seg_len = POOL_PKT_LEN;
+ params.pkt.len = POOL_PKT_LEN;
+ params.pkt.num = POOL_NUM_PKT;
params.type = ODP_POOL_PACKET;
pool = odp_pool_create("packet_pool", &params);
@@ -767,18 +770,24 @@ int main(int argc, char *argv[])
odp_cpumask_set(&cpu_mask, cpu_first);
tq = odp_queue_create("", NULL);
- if (tq == ODP_QUEUE_INVALID)
+ if (tq == ODP_QUEUE_INVALID) {
+ EXAMPLE_ERR("queue_create failed\n");
abort();
+ }
args->thread[1].pktio_dev = args->appl.if_names[0];
args->thread[1].pool = pool;
args->thread[1].tp = tp;
args->thread[1].tq = tq;
args->thread[1].tim = odp_timer_alloc(tp, tq, NULL);
- if (args->thread[1].tim == ODP_TIMER_INVALID)
+ if (args->thread[1].tim == ODP_TIMER_INVALID) {
+ EXAMPLE_ERR("timer_alloc failed\n");
abort();
+ }
args->thread[1].tmo_ev = odp_timeout_alloc(tmop);
- if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID)
+ if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID) {
+ EXAMPLE_ERR("timeout_alloc failed\n");
abort();
+ }
args->thread[1].mode = args->appl.mode;
memset(&thr_params, 0, sizeof(thr_params));
@@ -790,18 +799,24 @@ int main(int argc, char *argv[])
odph_odpthreads_create(&thread_tbl[1], &cpu_mask, &thr_params);
tq = odp_queue_create("", NULL);
- if (tq == ODP_QUEUE_INVALID)
+ if (tq == ODP_QUEUE_INVALID) {
+ EXAMPLE_ERR("queue_create failed\n");
abort();
+ }
args->thread[0].pktio_dev = args->appl.if_names[0];
args->thread[0].pool = pool;
args->thread[0].tp = tp;
args->thread[0].tq = tq;
args->thread[0].tim = odp_timer_alloc(tp, tq, NULL);
- if (args->thread[0].tim == ODP_TIMER_INVALID)
+ if (args->thread[0].tim == ODP_TIMER_INVALID) {
+ EXAMPLE_ERR("timer_alloc failed\n");
abort();
+ }
args->thread[0].tmo_ev = odp_timeout_alloc(tmop);
- if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID)
+ if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID) {
+ EXAMPLE_ERR("timeout_alloc failed\n");
abort();
+ }
args->thread[0].mode = args->appl.mode;
cpu_next = odp_cpumask_next(&cpumask, cpu_first);
odp_cpumask_zero(&cpu_mask);
@@ -823,17 +838,23 @@ int main(int argc, char *argv[])
args->thread[i].pktio_dev = args->appl.if_names[if_idx];
tq = odp_queue_create("", NULL);
- if (tq == ODP_QUEUE_INVALID)
+ if (tq == ODP_QUEUE_INVALID) {
+ EXAMPLE_ERR("queue_create failed\n");
abort();
+ }
args->thread[i].pool = pool;
args->thread[i].tp = tp;
args->thread[i].tq = tq;
args->thread[i].tim = odp_timer_alloc(tp, tq, NULL);
- if (args->thread[i].tim == ODP_TIMER_INVALID)
+ if (args->thread[i].tim == ODP_TIMER_INVALID) {
+ EXAMPLE_ERR("timer_alloc failed\n");
abort();
+ }
args->thread[i].tmo_ev = odp_timeout_alloc(tmop);
- if (args->thread[i].tmo_ev == ODP_TIMEOUT_INVALID)
+ if (args->thread[i].tmo_ev == ODP_TIMEOUT_INVALID) {
+ EXAMPLE_ERR("timeout_alloc failed\n");
abort();
+ }
args->thread[i].mode = args->appl.mode;
if (args->appl.mode == APPL_MODE_UDP) {
@@ -959,7 +980,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
switch (opt) {
case 'w':
- appl_args->cpu_count = atoi(optarg);
+ appl_args->num_workers = atoi(optarg);
break;
case 'c':
appl_args->mask = optarg;
diff --git a/example/hello/odp_hello.c b/example/hello/odp_hello.c
index 6d114eea6..dba349548 100644
--- a/example/hello/odp_hello.c
+++ b/example/hello/odp_hello.c
@@ -61,6 +61,7 @@ int main(int argc, char *argv[])
pid_t pid;
cpu_set_t cpu_set;
int i;
+ odp_cpumask_t mask;
memset(&opt, 0, sizeof(opt));
opt.cpu = 0;
@@ -70,6 +71,15 @@ int main(int argc, char *argv[])
return -1;
pid = getpid();
+
+ if (odp_init_global(&inst, NULL, NULL)) {
+ printf("Global init failed.\n");
+ return -1;
+ }
+
+ odp_cpumask_default_control(&mask, 0);
+ opt.cpu = odp_cpumask_first(&mask);
+
CPU_ZERO(&cpu_set);
CPU_SET(opt.cpu, &cpu_set);
@@ -78,11 +88,6 @@ int main(int argc, char *argv[])
return -1;
}
- if (odp_init_global(&inst, NULL, NULL)) {
- printf("Global init failed.\n");
- return -1;
- }
-
if (odp_init_local(inst, ODP_THREAD_CONTROL)) {
printf("Local init failed.\n");
return -1;
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 7e34d062d..9ed3aa201 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -24,11 +24,7 @@
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/icmp.h>
-#include <odp/helper/ipsec.h>
+#include <odp/helper/odph_api.h>
#include <stdbool.h>
#include <sys/socket.h>
diff --git a/example/ipsec/odp_ipsec_fwd_db.h b/example/ipsec/odp_ipsec_fwd_db.h
index 748ae048e..152bdfbde 100644
--- a/example/ipsec/odp_ipsec_fwd_db.h
+++ b/example/ipsec/odp_ipsec_fwd_db.h
@@ -12,7 +12,6 @@ extern "C" {
#endif
#include <odp_api.h>
-#include <odp/helper/eth.h>
#include <odp_ipsec_misc.h>
#define OIF_LEN 32
diff --git a/example/ipsec/odp_ipsec_loop_db.h b/example/ipsec/odp_ipsec_loop_db.h
index 0778186fa..1f9ade6d3 100644
--- a/example/ipsec/odp_ipsec_loop_db.h
+++ b/example/ipsec/odp_ipsec_loop_db.h
@@ -12,7 +12,6 @@ extern "C" {
#endif
#include <odp_api.h>
-#include <odp/helper/eth.h>
#include <odp_ipsec_misc.h>
/**
diff --git a/example/ipsec/odp_ipsec_misc.h b/example/ipsec/odp_ipsec_misc.h
index 6a49dcb66..e0320eb4e 100644
--- a/example/ipsec/odp_ipsec_misc.h
+++ b/example/ipsec/odp_ipsec_misc.h
@@ -12,9 +12,7 @@ extern "C" {
#endif
#include <odp_api.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/ipsec.h>
+#include <odp/helper/odph_api.h>
#ifndef TRUE
#define TRUE 1
diff --git a/example/ipsec/odp_ipsec_stream.c b/example/ipsec/odp_ipsec_stream.c
index 4dc9acfee..428ec04da 100644
--- a/example/ipsec/odp_ipsec_stream.c
+++ b/example/ipsec/odp_ipsec_stream.c
@@ -21,9 +21,7 @@
#include <odp_api.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/icmp.h>
+#include <odp/helper/odph_api.h>
#include <odp_ipsec_stream.h>
#include <odp_ipsec_loop_db.h>
diff --git a/example/l2fwd_simple/odp_l2fwd_simple.c b/example/l2fwd_simple/odp_l2fwd_simple.c
index 0682d2dd5..b97808f4b 100644
--- a/example/l2fwd_simple/odp_l2fwd_simple.c
+++ b/example/l2fwd_simple/odp_l2fwd_simple.c
@@ -10,9 +10,7 @@
#include <signal.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
#define POOL_NUM_PKT 8192
#define POOL_SEG_LEN 1856
diff --git a/example/l3fwd/odp_l3fwd.c b/example/l3fwd/odp_l3fwd.c
index 441e812a7..ba0697201 100644
--- a/example/l3fwd/odp_l3fwd.c
+++ b/example/l3fwd/odp_l3fwd.c
@@ -14,11 +14,7 @@
#include <test_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/tcp.h>
+#include <odp/helper/odph_api.h>
#include "odp_l3fwd_db.h"
#include "odp_l3fwd_lpm.h"
diff --git a/example/l3fwd/odp_l3fwd_db.h b/example/l3fwd/odp_l3fwd_db.h
index 1b24f1a7a..8df2999df 100644
--- a/example/l3fwd/odp_l3fwd_db.h
+++ b/example/l3fwd/odp_l3fwd_db.h
@@ -12,7 +12,7 @@ extern "C" {
#endif
#include <odp_api.h>
-#include <odp/helper/eth.h>
+#include <odp/helper/odph_api.h>
#define OIF_LEN 32
#define MAX_DB 32
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index d1135cb21..ea8428259 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -13,9 +13,7 @@
#include <example_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
/** @def MAX_WORKERS
* @brief Maximum number of worker threads
diff --git a/example/switch/odp_switch.c b/example/switch/odp_switch.c
index f9c717601..561c2934b 100644
--- a/example/switch/odp_switch.c
+++ b/example/switch/odp_switch.c
@@ -11,9 +11,7 @@
#include <inttypes.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
/** Maximum number of worker threads */
#define MAX_WORKERS 32
diff --git a/example/time/time_global_test.c b/example/time/time_global_test.c
index 380ec5200..e24e9f434 100644
--- a/example/time/time_global_test.c
+++ b/example/time/time_global_test.c
@@ -4,10 +4,11 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <inttypes.h>
+
#include <odp_api.h>
#include <example_debug.h>
-#include <odp/helper/linux.h>
-#include <inttypes.h>
+#include <odp/helper/odph_api.h>
#define MAX_WORKERS 32
#define ITERATION_NUM 2048
diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
index 035ab2e0e..2196b8c1f 100644
--- a/example/timer/odp_timer_test.c
+++ b/example/timer/odp_timer_test.c
@@ -14,7 +14,7 @@
#include <odp_api.h>
/* ODP helper for Linux apps */
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
/* GNU lib C */
#include <getopt.h>
@@ -520,7 +520,7 @@ err:
if (gbls != NULL && gbls->tp != ODP_TIMER_POOL_INVALID)
odp_timer_pool_destroy(gbls->tp);
- if (gbls != NULL && gbls->pool != ODP_TIMER_POOL_INVALID)
+ if (gbls != NULL && gbls->pool != ODP_POOL_INVALID)
if (odp_pool_destroy(gbls->pool))
err = 1;
diff --git a/helper/Makefile.am b/helper/Makefile.am
index 9d0036de0..5757c7c81 100644
--- a/helper/Makefile.am
+++ b/helper/Makefile.am
@@ -1,12 +1,13 @@
include $(top_srcdir)/platform/@with_platform@/Makefile.inc
pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = $(top_builddir)/pkgconfig/libodphelper-linux.pc
+pkgconfig_DATA = $(top_builddir)/pkgconfig/libodphelper-linux-generic.pc
LIB = $(top_builddir)/lib
-AM_CFLAGS = -I$(srcdir)/include
+AM_CFLAGS += -I$(srcdir)/include
AM_CFLAGS += -I$(top_srcdir)/platform/@with_platform@/include
AM_CFLAGS += -I$(top_srcdir)/include
+AM_CFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@
AM_CFLAGS += -I$(top_builddir)/platform/@with_platform@/include
AM_CFLAGS += -I$(top_builddir)/include
@@ -14,33 +15,46 @@ AM_LDFLAGS += -version-number '$(ODPHELPER_LIBSO_VERSION)'
helperincludedir = $(includedir)/odp/helper/
helperinclude_HEADERS = \
- $(srcdir)/include/odp/helper/linux.h \
$(srcdir)/include/odp/helper/chksum.h\
$(srcdir)/include/odp/helper/eth.h\
$(srcdir)/include/odp/helper/icmp.h\
$(srcdir)/include/odp/helper/ip.h\
$(srcdir)/include/odp/helper/ipsec.h\
+ $(srcdir)/include/odp/helper/odph_api.h\
+ $(srcdir)/include/odp/helper/odph_cuckootable.h\
+ $(srcdir)/include/odp/helper/odph_hashtable.h\
+ $(srcdir)/include/odp/helper/odph_iplookuptable.h\
+ $(srcdir)/include/odp/helper/odph_lineartable.h\
$(srcdir)/include/odp/helper/strong_types.h\
$(srcdir)/include/odp/helper/tcp.h\
$(srcdir)/include/odp/helper/table.h\
+ $(srcdir)/include/odp/helper/threads.h \
$(srcdir)/include/odp/helper/udp.h
+if helper_linux
+helperlinuxincludedir = $(includedir)/odp/helper/linux
+helperlinuxinclude_HEADERS = \
+ $(srcdir)/include/odp/helper/linux/pthread.h \
+ $(srcdir)/include/odp/helper/linux/process.h
+endif
+
noinst_HEADERS = \
$(srcdir)/odph_debug.h \
- $(srcdir)/odph_hashtable.h \
- $(srcdir)/odph_lineartable.h \
- $(srcdir)/odph_cuckootable.h \
- $(srcdir)/odph_list_internal.h \
- $(srcdir)/odph_iplookuptable.h
+ $(srcdir)/odph_list_internal.h
-__LIB__libodphelper_linux_la_SOURCES = \
+__LIB__libodphelper_la_SOURCES = \
eth.c \
ip.c \
chksum.c \
- linux.c \
hashtable.c \
lineartable.c \
cuckootable.c \
- iplookuptable.c
+ iplookuptable.c \
+ threads.c
+
+if helper_linux
+__LIB__libodphelper_la_SOURCES += \
+ linux/thread.c
+endif
-lib_LTLIBRARIES = $(LIB)/libodphelper-linux.la
+lib_LTLIBRARIES = $(LIB)/libodphelper.la
diff --git a/helper/chksum.c b/helper/chksum.c
index b7eef67e0..f740618d3 100644
--- a/helper/chksum.c
+++ b/helper/chksum.c
@@ -49,7 +49,7 @@ static uint32_t data_seg_sum(uint8_t *data8_ptr,
data_len--;
}
- data16_ptr = (uint16_t *)data8_ptr;
+ data16_ptr = (uint16_t *)(void *)data8_ptr;
/* The following code tries to gain a modest performance enhancement by
* unrolling the normal 16 bits at a time loop eight times. Even
@@ -216,7 +216,7 @@ static inline int odph_process_l3_hdr(odp_packet_t odp_pkt,
ipv6_hdr_ptr = &ipv6_hdr;
}
- addrs_ptr = (uint16_t *)&ipv6_hdr_ptr->src_addr;
+ addrs_ptr = (uint16_t *)(void *)&ipv6_hdr_ptr->src_addr;
addrs_len = 2 * ODPH_IPV6ADDR_LEN;
protocol = ipv6_hdr_ptr->next_hdr;
ipv6_payload_len = odp_be_to_cpu_16(ipv6_hdr_ptr->payload_len);
diff --git a/helper/cuckootable.c b/helper/cuckootable.c
index b4fce6c5b..80ff49893 100644
--- a/helper/cuckootable.c
+++ b/helper/cuckootable.c
@@ -42,7 +42,7 @@
#include <errno.h>
#include <stdio.h>
-#include "odph_cuckootable.h"
+#include "odp/helper/odph_cuckootable.h"
#include "odph_debug.h"
#include <odp_api.h>
@@ -148,27 +148,18 @@ align32pow2(uint32_t x)
return x + 1;
}
-/**
- * Returns true if n is a power of 2
- * @param n
- * Number to check
- * @return 1 if true, 0 otherwise
- */
-static inline int
-is_power_of_2(uint32_t n)
-{
- return n && !(n & (n - 1));
-}
-
odph_table_t
odph_cuckoo_table_lookup(const char *name)
{
- odph_cuckoo_table_impl *tbl;
+ odph_cuckoo_table_impl *tbl = NULL;
+ odp_shm_t shm;
if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
return NULL;
- tbl = (odph_cuckoo_table_impl *)odp_shm_addr(odp_shm_lookup(name));
+ shm = odp_shm_lookup(name);
+ if (shm != ODP_SHM_INVALID)
+ tbl = (odph_cuckoo_table_impl *)odp_shm_addr(shm);
if (!tbl || tbl->magicword != ODPH_CUCKOO_TABLE_MAGIC_WORD)
return NULL;
@@ -209,7 +200,7 @@ odph_cuckoo_table_create(
}
/* Guarantee there's no existing */
- tbl = (odph_cuckoo_table_impl *)odph_cuckoo_table_lookup(name);
+ tbl = (odph_cuckoo_table_impl *)(void *)odph_cuckoo_table_lookup(name);
if (tbl != NULL) {
ODPH_DBG("cuckoo hash table %s already exists\n", name);
return NULL;
@@ -240,8 +231,7 @@ odph_cuckoo_table_create(
/* header of this mem block is the table impl struct,
* then the bucket pool.
*/
- tbl->buckets = (struct cuckoo_table_bucket *)(
- (char *)tbl + impl_size);
+ tbl->buckets = (void *)((char *)tbl + impl_size);
/* initialize key-value buffer pool */
snprintf(pool_name, sizeof(pool_name), "kv_%s", name);
@@ -309,17 +299,18 @@ odph_cuckoo_table_create(
int
odph_cuckoo_table_destroy(odph_table_t tbl)
{
- int ret, i, j;
+ int ret;
odph_cuckoo_table_impl *impl = NULL;
char pool_name[ODPH_TABLE_NAME_LEN + 3];
odp_event_t ev;
odp_shm_t shm;
odp_pool_t pool;
+ uint32_t i, j;
if (tbl == NULL)
return -1;
- impl = (odph_cuckoo_table_impl *)tbl;
+ impl = (odph_cuckoo_table_impl *)(void *)tbl;
/* check magic word */
if (impl->magicword != ODPH_CUCKOO_TABLE_MAGIC_WORD) {
@@ -578,11 +569,14 @@ cuckoo_table_add_key_with_hash(
int
odph_cuckoo_table_put_value(odph_table_t tbl, void *key, void *value)
{
+ odph_cuckoo_table_impl *impl;
+ int ret;
+
if ((tbl == NULL) || (key == NULL))
return -EINVAL;
- odph_cuckoo_table_impl *impl = (odph_cuckoo_table_impl *)tbl;
- int ret = cuckoo_table_add_key_with_hash(
+ impl = (odph_cuckoo_table_impl *)(void *)tbl;
+ ret = cuckoo_table_add_key_with_hash(
impl, key, hash(impl, key), value);
if (ret < 0)
@@ -651,17 +645,16 @@ cuckoo_table_lookup_with_hash(
return -ENOENT;
}
-int
-odph_cuckoo_table_get_value(
- odph_table_t tbl, void *key, void *buffer, uint32_t buffer_size)
+int odph_cuckoo_table_get_value(odph_table_t tbl, void *key,
+ void *buffer, uint32_t buffer_size ODP_UNUSED)
{
- if ((tbl == NULL) || (key == NULL))
- return -EINVAL;
-
- odph_cuckoo_table_impl *impl = (odph_cuckoo_table_impl *)tbl;
+ odph_cuckoo_table_impl *impl = (odph_cuckoo_table_impl *)(void *)tbl;
void *tmp = NULL;
int ret;
+ if ((tbl == NULL) || (key == NULL))
+ return -EINVAL;
+
ret = cuckoo_table_lookup_with_hash(impl, key, hash(impl, key), &tmp);
if (ret < 0)
@@ -734,13 +727,13 @@ cuckoo_table_del_key_with_hash(
int
odph_cuckoo_table_remove_value(odph_table_t tbl, void *key)
{
+ odph_cuckoo_table_impl *impl = (void *)tbl;
+ int ret;
+
if ((tbl == NULL) || (key == NULL))
return -EINVAL;
- odph_cuckoo_table_impl *impl = (odph_cuckoo_table_impl *)tbl;
- int ret = cuckoo_table_del_key_with_hash(
- impl, key, hash(impl, key));
-
+ ret = cuckoo_table_del_key_with_hash(impl, key, hash(impl, key));
if (ret < 0)
return -1;
diff --git a/helper/hashtable.c b/helper/hashtable.c
index 8bb1ae57c..9d4114445 100644
--- a/helper/hashtable.c
+++ b/helper/hashtable.c
@@ -7,7 +7,7 @@
#include <string.h>
#include <malloc.h>
-#include "odph_hashtable.h"
+#include "odp/helper/odph_hashtable.h"
#include "odph_list_internal.h"
#include "odph_debug.h"
#include <odp_api.h>
@@ -101,9 +101,9 @@ odph_table_t odph_hash_table_create(const char *name, uint32_t capacity,
* the last part is the element node pool
*/
- tbl->lock_pool = (odp_rwlock_t *)((char *)tbl
+ tbl->lock_pool = (odp_rwlock_t *)(void *)((char *)tbl
+ sizeof(odph_hash_table_imp));
- tbl->list_head_pool = (odph_list_head *)((char *)tbl->lock_pool
+ tbl->list_head_pool = (odph_list_head *)(void *)((char *)tbl->lock_pool
+ ODPH_MAX_BUCKET_NUM * sizeof(odp_rwlock_t));
node_mem = tbl->init_cap - sizeof(odph_hash_table_imp)
@@ -112,8 +112,9 @@ odph_table_t odph_hash_table_create(const char *name, uint32_t capacity,
node_num = node_mem / (sizeof(odph_hash_node) + key_size + value_size);
tbl->hash_node_num = node_num;
- tbl->hash_node_pool = (odph_hash_node *)((char *)tbl->list_head_pool
- + ODPH_MAX_BUCKET_NUM * sizeof(odph_list_head));
+ tbl->hash_node_pool =
+ (odph_hash_node *)(void *)((char *)tbl->list_head_pool
+ + ODPH_MAX_BUCKET_NUM * sizeof(odph_list_head));
/* init every list head and rw lock */
for (i = 0; i < ODPH_MAX_BUCKET_NUM; i++) {
@@ -130,8 +131,9 @@ int odph_hash_table_destroy(odph_table_t table)
int ret;
if (table != NULL) {
- odph_hash_table_imp *hash_tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *hash_tbl;
+ hash_tbl = (odph_hash_table_imp *)(void *)table;
if (hash_tbl->magicword != ODPH_HASH_TABLE_MAGIC_WORD)
return ODPH_FAIL;
@@ -148,12 +150,15 @@ int odph_hash_table_destroy(odph_table_t table)
odph_table_t odph_hash_table_lookup(const char *name)
{
- odph_hash_table_imp *hash_tbl;
+ odph_hash_table_imp *hash_tbl = NULL;
+ odp_shm_t shm;
if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
return NULL;
- hash_tbl = (odph_hash_table_imp *)odp_shm_addr(odp_shm_lookup(name));
+ shm = odp_shm_lookup(name);
+ if (shm != ODP_SHM_INVALID)
+ hash_tbl = (odph_hash_table_imp *)odp_shm_addr(shm);
if (hash_tbl != NULL && strcmp(hash_tbl->name, name) == 0)
return (odph_table_t)hash_tbl;
return NULL;
@@ -164,7 +169,7 @@ odph_table_t odph_hash_table_lookup(const char *name)
* This hash algorithm is the most simple one, so we choose it as an DEMO
* User can use any other algorithm, like CRC...
*/
-uint16_t odp_key_hash(void *key, uint32_t key_size)
+static uint16_t odp_key_hash(void *key, uint32_t key_size)
{
register uint32_t hash = 0;
uint32_t idx = (key_size == 0 ? 1 : key_size);
@@ -181,18 +186,19 @@ uint16_t odp_key_hash(void *key, uint32_t key_size)
/**
* Get an available node from pool
*/
-odph_hash_node *odp_hashnode_take(odph_table_t table)
+static odph_hash_node *hashnode_take(odph_table_t table)
{
- odph_hash_table_imp *tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *tbl;
uint32_t idx;
odph_hash_node *node;
+ tbl = (odph_hash_table_imp *)(void *)table;
for (idx = 0; idx < tbl->hash_node_num; idx++) {
/** notice: memory of one hash_node is
* not only sizeof(odph_hash_node)
* should add the size of Flexible Array
*/
- node = (odph_hash_node *)((char *)tbl->hash_node_pool
+ node = (odph_hash_node *)(void *)((char *)tbl->hash_node_pool
+ idx * (sizeof(odph_hash_node)
+ tbl->key_size
+ tbl->value_size));
@@ -208,13 +214,15 @@ odph_hash_node *odp_hashnode_take(odph_table_t table)
/**
* Release an node to the pool
*/
-void odp_hashnode_give(odph_table_t table, odph_hash_node *node)
+static void hashnode_give(odph_table_t table, odph_hash_node *node)
{
- odph_hash_table_imp *tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *tbl;
if (node == NULL)
return;
+ tbl = (odph_hash_table_imp *)(void *)table;
+
odph_list_del(&node->list_node);
memset(node, 0,
(sizeof(odph_hash_node) + tbl->key_size + tbl->value_size));
@@ -223,7 +231,7 @@ void odp_hashnode_give(odph_table_t table, odph_hash_node *node)
/* should make sure the input table exists and is available */
int odph_hash_put_value(odph_table_t table, void *key, void *value)
{
- odph_hash_table_imp *tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *tbl;
uint16_t hash = 0;
odph_hash_node *node = NULL;
char *tmp = NULL;
@@ -231,6 +239,7 @@ int odph_hash_put_value(odph_table_t table, void *key, void *value)
if (table == NULL || key == NULL || value == NULL)
return ODPH_FAIL;
+ tbl = (odph_hash_table_imp *)(void *)table;
/* hash value is just the index of the list head in pool */
hash = odp_key_hash(key, tbl->key_size);
@@ -249,7 +258,7 @@ int odph_hash_put_value(odph_table_t table, void *key, void *value)
}
/*if the key is a new one, get a new hash node form the pool */
- node = odp_hashnode_take(table);
+ node = hashnode_take(table);
if (node == NULL) {
odp_rwlock_write_unlock(&tbl->lock_pool[hash]);
return ODPH_FAIL;
@@ -271,11 +280,13 @@ int odph_hash_put_value(odph_table_t table, void *key, void *value)
int odph_hash_get_value(odph_table_t table, void *key, void *buffer,
uint32_t buffer_size)
{
- odph_hash_table_imp *tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *tbl;
uint16_t hash = 0;
odph_hash_node *node;
char *tmp = NULL;
+ tbl = (odph_hash_table_imp *)(void *)table;
+
if (table == NULL || key == NULL || buffer == NULL ||
buffer_size < tbl->value_size)
return ODPH_FAIL;
@@ -308,13 +319,15 @@ int odph_hash_get_value(odph_table_t table, void *key, void *buffer,
/* should make sure the input table exists and is available */
int odph_hash_remove_value(odph_table_t table, void *key)
{
- odph_hash_table_imp *tbl = (odph_hash_table_imp *)table;
+ odph_hash_table_imp *tbl;
uint16_t hash = 0;
odph_hash_node *node;
if (table == NULL || key == NULL)
return ODPH_FAIL;
+ tbl = (odph_hash_table_imp *)(void *)table;
+
/* hash value is just the index of the list head in pool */
hash = odp_key_hash(key, tbl->key_size);
@@ -324,7 +337,7 @@ int odph_hash_remove_value(odph_table_t table, void *key)
list_node)
{
if (memcmp(node->content, key, tbl->key_size) == 0) {
- odp_hashnode_give(table, node);
+ hashnode_give(table, node);
odp_rwlock_write_unlock(&tbl->lock_pool[hash]);
return ODPH_SUCCESS;
}
diff --git a/helper/include/odp/helper/linux/process.h b/helper/include/odp/helper/linux/process.h
new file mode 100644
index 000000000..9d74146b0
--- /dev/null
+++ b/helper/include/odp/helper/linux/process.h
@@ -0,0 +1,84 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Linux helper for processes
+ *
+ * This file is not part of ODP APIs, but can be optionally used to ease common
+ * setups in a Linux system. User is free to implement the same setups in
+ * otherways (not via this file).
+ */
+
+#ifndef ODPH_LINUX_PROCESS_H_
+#define ODPH_LINUX_PROCESS_H_
+
+#include <odp/helper/threads.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @ingroup odph_linux
+ * @{
+ */
+
+/**
+ * Fork a process
+ *
+ * Forks and sets CPU affinity for the child process. Ignores 'start' and 'arg'
+ * thread parameters.
+ *
+ * @param[out] proc Pointer to process state info (for output)
+ * @param cpu Destination CPU for the child process
+ * @param thr_params Linux helper thread parameters
+ *
+ * @return On success: 1 for the parent, 0 for the child
+ * On failure: -1 for the parent, -2 for the child
+ */
+int odph_linux_process_fork(odph_linux_process_t *proc, int cpu,
+ const odph_linux_thr_params_t *thr_params);
+
+/**
+ * Fork a number of processes
+ *
+ * Forks and sets CPU affinity for child processes. Ignores 'start' and 'arg'
+ * thread parameters.
+ *
+ * @param[out] proc_tbl Process state info table (for output)
+ * @param mask CPU mask of processes to create
+ * @param thr_params Linux helper thread parameters
+ *
+ * @return On success: 1 for the parent, 0 for the child
+ * On failure: -1 for the parent, -2 for the child
+ */
+int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl,
+ const odp_cpumask_t *mask,
+ const odph_linux_thr_params_t *thr_params);
+
+/**
+ * Wait for a number of processes
+ *
+ * Waits for a number of child processes to terminate. Records process state
+ * change status into the process state info structure.
+ *
+ * @param proc_tbl Process state info table (previously filled by fork)
+ * @param num Number of processes to wait
+ *
+ * @return 0 on success, -1 on failure
+ */
+int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/helper/include/odp/helper/linux/pthread.h b/helper/include/odp/helper/linux/pthread.h
new file mode 100644
index 000000000..feeda5e28
--- /dev/null
+++ b/helper/include/odp/helper/linux/pthread.h
@@ -0,0 +1,66 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Linux helper for pthreads
+ *
+ * This file is not part of ODP APIs, but can be optionally used to ease common
+ * setups in a Linux system. User is free to implement the same setups in
+ * otherways (not via this file).
+ */
+
+#ifndef ODPH_LINUX_PTHREAD_H_
+#define ODPH_LINUX_PTHREAD_H_
+
+#include <odp/helper/threads.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @ingroup odph_linux
+ * @{
+ */
+
+/**
+ * Creates and launches pthreads
+ *
+ * Creates, pins and launches threads to separate CPU's based on the cpumask.
+ *
+ * @param[out] pthread_tbl Table of pthread state information records. Table
+ * must have at least as many entries as there are
+ * CPUs in the CPU mask.
+ * @param mask CPU mask
+ * @param thr_params Linux helper thread parameters
+ *
+ * @return Number of threads created
+ */
+int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl,
+ const odp_cpumask_t *mask,
+ const odph_linux_thr_params_t *thr_params);
+
+/**
+ * Waits pthreads to exit
+ *
+ * Returns when all threads have been exit.
+ *
+ * @param thread_tbl Thread table
+ * @param num Number of threads to create
+ *
+ */
+void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/helper/include/odp/helper/odph_api.h b/helper/include/odp/helper/odph_api.h
new file mode 100644
index 000000000..7ed0e7786
--- /dev/null
+++ b/helper/include/odp/helper/odph_api.h
@@ -0,0 +1,39 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * The OpenDataPlane helper API
+ *
+ */
+
+#ifndef ODP_HELPER_H_
+#define ODP_HELPER_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/helper/chksum.h>
+#include <odp/helper/odph_cuckootable.h>
+#include <odp/helper/eth.h>
+#include <odp/helper/odph_hashtable.h>
+#include <odp/helper/icmp.h>
+#include <odp/helper/ip.h>
+#include <odp/helper/ipsec.h>
+#include <odp/helper/odph_lineartable.h>
+#include <odp/helper/odph_iplookuptable.h>
+#include <odp/helper/strong_types.h>
+#include <odp/helper/tcp.h>
+#include <odp/helper/table.h>
+#include <odp/helper/threads.h>
+#include <odp/helper/udp.h>
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/helper/odph_cuckootable.h b/helper/include/odp/helper/odph_cuckootable.h
index d56998078..55f43fed0 100644
--- a/helper/odph_cuckootable.h
+++ b/helper/include/odp/helper/odph_cuckootable.h
@@ -52,28 +52,92 @@
extern "C" {
#endif
+/**
+ * @addtogroup odph_cuckootable ODPH CUCKOO TABLE
+ * @{
+ */
+
+/**
+ * Create a cuckoo table
+ *
+ * @param name Name of the cuckoo table to be created
+ * @param capacity Number of elements table may store
+ * @param key_size Size of the key for each element
+ * @param value_size Size of the value stored for each element
+ *
+ * @return Handle of created cuckoo table
+ * @retval NULL Create failed
+ */
odph_table_t odph_cuckoo_table_create(
const char *name,
uint32_t capacity,
uint32_t key_size,
uint32_t value_size);
+/**
+ * Lookup a cuckoo table by name
+ *
+ * @param name Name of the table to be located
+ *
+ * @return Handle of the located cuckoo table
+ * @retval NULL No table matching supplied name found
+ */
odph_table_t odph_cuckoo_table_lookup(const char *name);
+/**
+ * Destroy a cuckoo table
+ *
+ * @param table Handle of the cuckoo table to be destroyed
+ *
+ * @retval 0 Success
+ * @retval < 0 Failure
+ */
int odph_cuckoo_table_destroy(odph_table_t table);
-int odph_cuckoo_table_put_value(
- odph_table_t table,
- void *key, void *value);
+/**
+ * Insert a key/value pair into a cuckoo table
+ *
+ * @param table Table into which value is to be stored
+ * @param key Address of an odph_table_t to be used as key
+ * @param value Value to be associated with specified key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
+int odph_cuckoo_table_put_value(odph_table_t table, void *key, void *value);
-int odph_cuckoo_table_get_value(
- odph_table_t table,
- void *key, void *buffer,
- uint32_t buffer_size);
+/**
+ * Retrieve a value from a cuckoo table
+ *
+ * @param table Table from which value is to be retrieved
+ * @param key Address of an odph_table_t to be used as key
+ * @param[out] buffer Address of buffer to receive resulting value
+ * @param buffer_size Size of supplied buffer
+ *
+ * @retval 0 Success
+ * @retval 1 Success
+ * @retval < 0 Failure
+ */
+int odph_cuckoo_table_get_value(odph_table_t table,
+ void *key, void *buffer,
+ uint32_t buffer_size);
+/**
+ * Remove a value from a cuckoo table
+ *
+ * @param table Table from which value is to be removed
+ * @param key Address of odph_table_t to be used as key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
int odph_cuckoo_table_remove_value(odph_table_t table, void *key);
-extern odph_table_ops_t odph_cuckoo_table_ops;
+extern odph_table_ops_t odph_cuckoo_table_ops; /**< @internal */
+
+/**
+ * @}
+ */
#ifdef __cplusplus
}
diff --git a/helper/include/odp/helper/odph_hashtable.h b/helper/include/odp/helper/odph_hashtable.h
new file mode 100644
index 000000000..1f91f31ec
--- /dev/null
+++ b/helper/include/odp/helper/odph_hashtable.h
@@ -0,0 +1,111 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Hash Table
+ */
+
+#ifndef ODPH_HASH_TABLE_H_
+#define ODPH_HASH_TABLE_H_
+
+#include <odp/helper/table.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup odph_hash_table ODPH HASH TABLE
+ * @{
+ */
+
+/**
+ * Create a hash table
+ *
+ * @param name Name of the hash table to be created.
+ * @param capacity Number of elements table may store
+ * @param key_size Size of the key for each element
+ * @param value_size Size of the value stored for each element
+ *
+ * @return Handle of created hash table
+ * @retval NULL Create failed
+ */
+odph_table_t odph_hash_table_create(const char *name,
+ uint32_t capacity,
+ uint32_t key_size,
+ uint32_t value_size);
+
+/**
+ * Lookup a hash table by name
+ *
+ * @param name Name of the table to be located
+ *
+ * @return Handle of the located hash table
+ * @return NULL No table matching supplied name found
+ */
+odph_table_t odph_hash_table_lookup(const char *name);
+
+/**
+ * Destroy a hash table
+ *
+ * @param table Handle of the hash table to be destroyed
+ *
+ * @retval 0 Success
+ * @retval < 0 Failure
+ */
+int odph_hash_table_destroy(odph_table_t table);
+
+/**
+ * Insert a key/value pair into a hash table
+ *
+ * @param table Table into which value is to be stored
+ * @param key Address of an odph_table_t to be used as key
+ * @param value Value to be associated with specified key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
+int odph_hash_put_value(odph_table_t table, void *key, void *value);
+
+/**
+ * Retrieve a value from a hash table
+ *
+ * @param table Table from which value is to be retrieved
+ * @param key Address of an odph_table_t to be used as key
+ * @param[out] buffer Address of buffer to receive resulting value
+ * @param buffer_size Size of supplied buffer
+ *
+ * @retval 0 Success
+ * @retval 1 Success
+ * @retval < 0 Failure
+ */
+int odph_hash_get_value(odph_table_t table, void *key, void *buffer,
+ uint32_t buffer_size);
+
+/**
+ * Remove a value from a hash table
+ *
+ * @param table Table from which value is to be removed
+ * @param key Address of odph_table_t to be used as key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
+int odph_hash_remove_value(odph_table_t table, void *key);
+
+extern odph_table_ops_t odph_hash_table_ops; /**< @internal */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/helper/include/odp/helper/odph_iplookuptable.h b/helper/include/odp/helper/odph_iplookuptable.h
new file mode 100644
index 000000000..84c2cfdd6
--- /dev/null
+++ b/helper/include/odp/helper/odph_iplookuptable.h
@@ -0,0 +1,125 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP IP Lookup Table
+ *
+ * This is an implementation of the IP lookup table. The key of
+ * this table is IPv4 address (32 bits), and the value can be
+ * defined by user. This table uses the 16,8,8 ip lookup (longest
+ * prefix matching) algorithm.
+ */
+
+#ifndef ODPH_IPLOOKUP_TABLE_H_
+#define ODPH_IPLOOKUP_TABLE_H_
+
+#include <odp/helper/table.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup odph_iplookuptable ODPH IP LOOKUP TABLE
+ * @{
+ */
+
+/**
+ * IP Lookup Prefix
+ */
+typedef struct {
+ uint32_t ip; /**< IPv4 address */
+ uint8_t cidr; /**< CIDR value for prefix matching */
+} odph_iplookup_prefix_t;
+
+/**
+ * Create an IP lookup table
+ *
+ * @param name Name of the table to be created
+ * @param ODP_IGNORED_1 Unused
+ * @param ODP_IGNORED_2 Unused
+ * @param value_size Byte size of each entry in the table
+ *
+ * @return Handle of the created ip lookup table
+ * @retval NULL If table create failed
+ */
+odph_table_t odph_iplookup_table_create(const char *name,
+ uint32_t ODP_IGNORED_1,
+ uint32_t ODP_IGNORED_2,
+ uint32_t value_size);
+
+/**
+ * Lookup an IP lookup table by name
+ *
+ * @param name Name of the table to be located
+ *
+ * @return Handle of the located ip lookup table
+ * @retval NULL No table matching supplied name found
+ */
+odph_table_t odph_iplookup_table_lookup(const char *name);
+
+/**
+ * Destroy an IP lookup table
+ *
+ * @param table Handle of the ip lookup table to be destroyed
+ *
+ * @retval 0 Success
+ * @retval < 0 Failure
+ */
+int odph_iplookup_table_destroy(odph_table_t table);
+
+/**
+ * Insert a key/value pair into an ip lookup table
+ *
+ * @param table Table into which value is to be stored
+ * @param key Address of an odph_iplookup_prefix_t to be used as key
+ * @param value Value to be associated with specified key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
+int odph_iplookup_table_put_value(odph_table_t table, void *key, void *value);
+
+/**
+ * Retrieve a value from an iplookup table
+ *
+ * @param table Table from which value is to be retrieved
+ * @param key Address of an odph_iplookup_prefix_t to be used as key
+ * @param[out] buffer Address of buffer to receive resulting value
+ * @param buffer_size Size of supplied buffer
+ *
+ * @retval 0 Success
+ * @retval 1 Success
+ * @retval < 0 Failure
+ */
+int odph_iplookup_table_get_value(odph_table_t table, void *key,
+ void *buffer, uint32_t buffer_size);
+
+/**
+ * Remove a value from an iplookup table
+ *
+ * @param table Table from which value is to be removed
+ * @param key Address of odph_iplookup_prefix_t to be used as key
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ *
+ */
+int odph_iplookup_table_remove_value(odph_table_t table, void *key);
+
+extern odph_table_ops_t odph_iplookup_table_ops; /**< @internal */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ODPH_IPLOOKUP_TABLE_H_ */
diff --git a/helper/include/odp/helper/odph_lineartable.h b/helper/include/odp/helper/odph_lineartable.h
new file mode 100644
index 000000000..cd9fda39e
--- /dev/null
+++ b/helper/include/odp/helper/odph_lineartable.h
@@ -0,0 +1,101 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Linear Table
+ */
+
+#ifndef ODPH_LINEAR_TABLE_H_
+#define ODPH_LINEAR_TABLE_H_
+
+#include <stdint.h>
+#include <odp/helper/table.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup odph_lineartable ODPH LINEAR TABLE
+ * @{
+ */
+
+/**
+ * Create a linear table
+ *
+ * @param name Name of the linear table to be created
+ * @param capacity Number of elements table may store
+ * @param ODP_IGNORED Ignored parameter
+ * @param value_size Size of the value stored for each element
+ *
+ * @return Handle of created linear table
+ * @return NULL Create failed
+ */
+odph_table_t odph_linear_table_create(const char *name,
+ uint32_t capacity,
+ uint32_t ODP_IGNORED,
+ uint32_t value_size);
+
+/**
+ * Lookup a linear table
+ *
+ * @param name Name of the table to be located
+ *
+ * @return Handle of the located linear table
+ * @retval NULL No table matching supplied name found
+ */
+odph_table_t odph_linear_table_lookup(const char *name);
+
+/**
+ * Destroy a linear table
+ *
+ * @param table Handle of linear table to be destroyed
+ *
+ * @retval 0 Success
+ * @retval < 0 Failure
+ */
+int odph_linear_table_destroy(odph_table_t table);
+
+/**
+ * Insert a value into a linear table
+ *
+ * @param table Table into which value is to be stored
+ * @param key Index value used as key
+ * @param value Value to be assoceiated with specified key index
+ *
+ * @retval >= 0 Success
+ * @retval < 0 Failure
+ */
+int odph_linear_put_value(odph_table_t table, void *key, void *value);
+
+/**
+ * Retrieve a value from a linear table
+ *
+ * @param table Table from which value is to be retrieved
+ * @param key Index value used as key
+ * @param[out] buffer Address of buffer to receive resulting value
+ * @param buffer_size Size of supplied buffer
+ *
+ * @retval 0 Success
+ * @retval 1 Success
+ * @retval < 0 Failure
+ */
+int odph_linear_get_value(odph_table_t table, void *key, void *buffer,
+ uint32_t buffer_size);
+
+extern odph_table_ops_t odph_linear_table_ops; /**< @internal */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/helper/include/odp/helper/table.h b/helper/include/odp/helper/table.h
index 81022e55b..b3440ef53 100644
--- a/helper/include/odp/helper/table.h
+++ b/helper/include/odp/helper/table.h
@@ -80,6 +80,11 @@
extern "C" {
#endif
+/**
+ * @addtogroup odph_tables ODPH TABLES
+ * @{
+ */
+
#include <stdint.h>
/**
@@ -228,9 +233,12 @@ typedef struct odph_table_ops_t {
odph_table_remove_value f_remove;
} odph_table_ops_t;
+/**
+ * @}
+ */
+
#ifdef __cplusplus
}
#endif
#endif
-
diff --git a/helper/include/odp/helper/linux.h b/helper/include/odp/helper/threads.h
index 238bcf8cb..5682bab99 100644
--- a/helper/include/odp/helper/linux.h
+++ b/helper/include/odp/helper/threads.h
@@ -22,8 +22,6 @@
extern "C" {
#endif
-#include <odp_api.h>
-
#include <pthread.h>
#include <getopt.h>
#include <sys/types.h>
@@ -95,82 +93,6 @@ typedef struct {
} odph_odpthread_t;
/**
- * Creates and launches pthreads
- *
- * Creates, pins and launches threads to separate CPU's based on the cpumask.
- *
- * @param[out] pthread_tbl Table of pthread state information records. Table
- * must have at least as many entries as there are
- * CPUs in the CPU mask.
- * @param mask CPU mask
- * @param thr_params Linux helper thread parameters
- *
- * @return Number of threads created
- */
-int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl,
- const odp_cpumask_t *mask,
- const odph_linux_thr_params_t *thr_params);
-
-/**
- * Waits pthreads to exit
- *
- * Returns when all threads have been exit.
- *
- * @param thread_tbl Thread table
- * @param num Number of threads to create
- *
- */
-void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num);
-
-/**
- * Fork a process
- *
- * Forks and sets CPU affinity for the child process. Ignores 'start' and 'arg'
- * thread parameters.
- *
- * @param[out] proc Pointer to process state info (for output)
- * @param cpu Destination CPU for the child process
- * @param thr_params Linux helper thread parameters
- *
- * @return On success: 1 for the parent, 0 for the child
- * On failure: -1 for the parent, -2 for the child
- */
-int odph_linux_process_fork(odph_linux_process_t *proc, int cpu,
- const odph_linux_thr_params_t *thr_params);
-
-
-/**
- * Fork a number of processes
- *
- * Forks and sets CPU affinity for child processes. Ignores 'start' and 'arg'
- * thread parameters.
- *
- * @param[out] proc_tbl Process state info table (for output)
- * @param mask CPU mask of processes to create
- * @param thr_params Linux helper thread parameters
- *
- * @return On success: 1 for the parent, 0 for the child
- * On failure: -1 for the parent, -2 for the child
- */
-int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl,
- const odp_cpumask_t *mask,
- const odph_linux_thr_params_t *thr_params);
-
-
-/**
- * Wait for a number of processes
- *
- * Waits for a number of child processes to terminate. Records process state
- * change status into the process state info structure.
- *
- * @param proc_tbl Process state info table (previously filled by fork)
- * @param num Number of processes to wait
- *
- * @return 0 on success, -1 on failure
- */
-int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num);
-
-/**
* Creates and launches odpthreads (as linux threads or processes)
*
* Creates, pins and launches threads to separate CPU's based on the cpumask.
diff --git a/helper/iplookuptable.c b/helper/iplookuptable.c
index 5f80743b3..aae219945 100644
--- a/helper/iplookuptable.c
+++ b/helper/iplookuptable.c
@@ -9,7 +9,7 @@
#include <errno.h>
#include <stdio.h>
-#include "odph_iplookuptable.h"
+#include <odp/helper/odph_iplookuptable.h>
#include "odph_list_internal.h"
#include "odph_debug.h"
#include <odp_api.h>
@@ -60,7 +60,7 @@ typedef struct {
} prefix_entry_t;
#define ENTRY_SIZE (sizeof(prefix_entry_t) + sizeof(odp_buffer_t))
-#define ENTRY_BUFF_ARR(x) ((odp_buffer_t *)((char *)x \
+#define ENTRY_BUFF_ARR(x) ((odp_buffer_t *)(void *)((char *)x \
+ sizeof(prefix_entry_t) * ENTRY_NUM_SUBTREE))
/** @internal trie node struct
@@ -419,11 +419,14 @@ odph_table_t
odph_iplookup_table_lookup(const char *name)
{
odph_iplookup_table_impl *tbl = NULL;
+ odp_shm_t shm;
if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
return NULL;
- tbl = (odph_iplookup_table_impl *)odp_shm_addr(odp_shm_lookup(name));
+ shm = odp_shm_lookup(name);
+ if (shm != ODP_SHM_INVALID)
+ tbl = (odph_iplookup_table_impl *)odp_shm_addr(shm);
if (
tbl != NULL &&
@@ -434,16 +437,15 @@ odph_iplookup_table_lookup(const char *name)
return NULL;
}
-odph_table_t
-odph_iplookup_table_create(
- const char *name, uint32_t ODP_IGNORED_1,
- uint32_t ODP_IGNORED_2, uint32_t value_size)
+odph_table_t odph_iplookup_table_create(const char *name,
+ uint32_t p1 ODP_UNUSED,
+ uint32_t p2 ODP_UNUSED,
+ uint32_t value_size)
{
odph_iplookup_table_impl *tbl;
odp_shm_t shm_tbl;
odp_queue_t queue;
odp_queue_param_t qparam;
-
unsigned i;
uint32_t impl_size, l1_size;
char queue_name[ODPH_TABLE_NAME_LEN + 2];
@@ -455,7 +457,7 @@ odph_iplookup_table_create(
}
/* Guarantee there's no existing */
- tbl = (odph_iplookup_table_impl *)odph_iplookup_table_lookup(name);
+ tbl = (void *)odph_iplookup_table_lookup(name);
if (tbl != NULL) {
ODPH_DBG("IP prefix table %s already exists\n", name);
return NULL;
@@ -482,7 +484,7 @@ odph_iplookup_table_create(
/* header of this mem block is the table impl struct,
* then the l1 entries array.
*/
- tbl->l1e = (prefix_entry_t *)((char *)tbl + impl_size);
+ tbl->l1e = (prefix_entry_t *)(void *)((char *)tbl + impl_size);
for (i = 0; i < ENTRY_NUM_L1; i++)
tbl->l1e[i].nexthop = ODP_BUFFER_INVALID;
@@ -528,7 +530,7 @@ odph_iplookup_table_destroy(odph_table_t tbl)
if (tbl == NULL)
return -1;
- impl = (odph_iplookup_table_impl *)tbl;
+ impl = (odph_iplookup_table_impl *)(void *)tbl;
/* check magic word */
if (impl->magicword != ODPH_IP_LOOKUP_TABLE_MAGIC_WORD) {
@@ -640,11 +642,9 @@ prefix_insert_iter(
/* If this entry contains a nexthop and a small cidr,
* push it to the next level.
*/
- if (entry->cidr > 0) {
- state = prefix_insert_into_lx(
- tbl, ne, entry->cidr,
- push, entry->cidr + 8);
- }
+ if (entry->cidr > 0)
+ (void)prefix_insert_into_lx(tbl, ne, entry->cidr,
+ push, entry->cidr + 8);
}
ne += (ip >> 24);
@@ -664,15 +664,17 @@ prefix_insert_iter(
int
odph_iplookup_table_put_value(odph_table_t tbl, void *key, void *value)
{
- if ((tbl == NULL) || (key == NULL) || (value == NULL))
- return -1;
-
- odph_iplookup_table_impl *impl = (odph_iplookup_table_impl *)tbl;
+ odph_iplookup_table_impl *impl = (void *)tbl;
odph_iplookup_prefix_t *prefix = (odph_iplookup_prefix_t *)key;
prefix_entry_t *l1e = NULL;
- odp_buffer_t nexthop = *((odp_buffer_t *)value);
+ odp_buffer_t nexthop;
int ret = 0;
+ if ((tbl == NULL) || (key == NULL) || (value == NULL))
+ return -1;
+
+ nexthop = *((odp_buffer_t *)value);
+
if (prefix->cidr == 0)
return -1;
prefix->ip = prefix->ip & (0xffffffff << (IP_LENGTH - prefix->cidr));
@@ -704,17 +706,20 @@ odph_iplookup_table_put_value(odph_table_t tbl, void *key, void *value)
return ret;
}
-int
-odph_iplookup_table_get_value(
- odph_table_t tbl, void *key, void *buffer, uint32_t buffer_size)
+int odph_iplookup_table_get_value(odph_table_t tbl, void *key,
+ void *buffer ODP_UNUSED,
+ uint32_t buffer_size ODP_UNUSED)
{
+ odph_iplookup_table_impl *impl = (void *)tbl;
+ uint32_t ip;
+ prefix_entry_t *entry;
+ odp_buffer_t *buff = (odp_buffer_t *)buffer;
+
if ((tbl == NULL) || (key == NULL) || (buffer == NULL))
return -EINVAL;
- odph_iplookup_table_impl *impl = (odph_iplookup_table_impl *)tbl;
- uint32_t ip = *((uint32_t *)key);
- prefix_entry_t *entry = &impl->l1e[ip >> 16];
- odp_buffer_t *buff = (odp_buffer_t *)buffer;
+ ip = *((uint32_t *)key);
+ entry = &impl->l1e[ip >> 16];
if (entry == NULL) {
ODPH_DBG("failed to get L1 entry.\n");
@@ -880,15 +885,18 @@ prefix_delete_iter(
int
odph_iplookup_table_remove_value(odph_table_t tbl, void *key)
{
+ odph_iplookup_table_impl *impl = (void *)tbl;
+ odph_iplookup_prefix_t *prefix = (odph_iplookup_prefix_t *)key;
+ uint32_t ip;
+ uint8_t cidr;
+
if ((tbl == NULL) || (key == NULL))
return -EINVAL;
- odph_iplookup_table_impl *impl = (odph_iplookup_table_impl *)tbl;
- odph_iplookup_prefix_t *prefix = (odph_iplookup_prefix_t *)key;
- uint32_t ip = prefix->ip;
- uint8_t cidr = prefix->cidr;
+ ip = prefix->ip;
+ cidr = prefix->cidr;
- if (prefix->cidr < 0)
+ if (cidr == 0)
return -EINVAL;
prefix_entry_t *entry = &impl->l1e[ip >> 16];
diff --git a/helper/lineartable.c b/helper/lineartable.c
index e82c1651c..32c4956ee 100644
--- a/helper/lineartable.c
+++ b/helper/lineartable.c
@@ -8,7 +8,7 @@
#include <string.h>
#include <malloc.h>
-#include "odph_lineartable.h"
+#include "odp/helper/odph_lineartable.h"
#include "odph_debug.h"
#include <odp_api.h>
@@ -41,9 +41,10 @@ typedef struct {
*/
odph_table_t odph_linear_table_create(const char *name, uint32_t capacity,
- uint32_t ODP_IGNORED, uint32_t value_size)
+ uint32_t un ODPH_UNUSED,
+ uint32_t value_size)
{
- int idx;
+ uint32_t idx;
uint32_t node_num;
odp_shm_t shmem;
odph_linear_table_imp *tbl;
@@ -90,8 +91,10 @@ odph_table_t odph_linear_table_create(const char *name, uint32_t capacity,
/* initialize rwlock*/
for (idx = 0; idx < tbl->node_sum; idx++) {
- odp_rwlock_t *lock = (odp_rwlock_t *)((char *)tbl->value_array
- + idx * tbl->value_size);
+ odp_rwlock_t *lock;
+
+ lock = (odp_rwlock_t *)(void *)((char *)tbl->value_array
+ + idx * tbl->value_size);
odp_rwlock_init(lock);
}
@@ -106,7 +109,7 @@ int odph_linear_table_destroy(odph_table_t table)
odph_linear_table_imp *linear_tbl = NULL;
if (table != NULL) {
- linear_tbl = (odph_linear_table_imp *)table;
+ linear_tbl = (odph_linear_table_imp *)(void *)table;
/* check magicword, make sure the memory is used by a table */
if (linear_tbl->magicword != ODPH_LINEAR_TABLE_MAGIC_WORD)
@@ -125,12 +128,15 @@ int odph_linear_table_destroy(odph_table_t table)
odph_table_t odph_linear_table_lookup(const char *name)
{
- odph_linear_table_imp *tbl;
+ odph_linear_table_imp *tbl = NULL;
+ odp_shm_t shm;
if (name == NULL || strlen(name) >= ODPH_TABLE_NAME_LEN)
return NULL;
- tbl = (odph_linear_table_imp *)odp_shm_addr(odp_shm_lookup(name));
+ shm = odp_shm_lookup(name);
+ if (shm != ODP_SHM_INVALID)
+ tbl = (odph_linear_table_imp *)odp_shm_addr(shm);
/* check magicword to make sure the memory block is used by a table */
if (tbl != NULL &&
@@ -142,9 +148,10 @@ odph_table_t odph_linear_table_lookup(const char *name)
}
/* should make sure the input table exists and is available */
-int odph_lineartable_put_value(odph_table_t table, void *key, void *value)
+static int odph_lineartable_put_value(odph_table_t table,
+ void *key, void *value)
{
- odph_linear_table_imp *tbl = (odph_linear_table_imp *)table;
+ odph_linear_table_imp *tbl;
uint32_t ikey = 0;
void *entry = NULL;
odp_rwlock_t *lock = NULL;
@@ -152,6 +159,7 @@ int odph_lineartable_put_value(odph_table_t table, void *key, void *value)
if (table == NULL || key == NULL || value == NULL)
return ODPH_FAIL;
+ tbl = (odph_linear_table_imp *)(void *)table;
ikey = *(uint32_t *)key;
if (ikey >= tbl->node_sum)
return ODPH_FAIL;
@@ -170,10 +178,11 @@ int odph_lineartable_put_value(odph_table_t table, void *key, void *value)
}
/* should make sure the input table exists and is available */
-int odph_lineartable_get_value(odph_table_t table, void *key, void *buffer,
- uint32_t buffer_size)
+static int odph_lineartable_get_value(odph_table_t table,
+ void *key, void *buffer,
+ uint32_t buffer_size ODPH_UNUSED)
{
- odph_linear_table_imp *tbl = (odph_linear_table_imp *)table;
+ odph_linear_table_imp *tbl;
uint32_t ikey = 0;
void *entry = NULL;
odp_rwlock_t *lock = NULL;
@@ -181,6 +190,7 @@ int odph_lineartable_get_value(odph_table_t table, void *key, void *buffer,
if (table == NULL || key == NULL || buffer == NULL)
return ODPH_FAIL;
+ tbl = (odph_linear_table_imp *)(void *)table;
ikey = *(uint32_t *)key;
if (ikey >= tbl->node_sum)
return ODPH_FAIL;
diff --git a/helper/linux/thread.c b/helper/linux/thread.c
new file mode 100644
index 000000000..52d4efc5e
--- /dev/null
+++ b/helper/linux/thread.c
@@ -0,0 +1,239 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <sched.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/prctl.h>
+#include <sys/syscall.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#include <odp_api.h>
+#include <odp/helper/linux/pthread.h>
+#include <odp/helper/linux/process.h>
+#include "odph_debug.h"
+
+static void *_odph_run_start_routine(void *arg)
+{
+ odph_linux_thr_params_t *thr_params = arg;
+
+ /* ODP thread local init */
+ if (odp_init_local(thr_params->instance, thr_params->thr_type)) {
+ ODPH_ERR("Local init failed\n");
+ return NULL;
+ }
+
+ void *ret_ptr = thr_params->start(thr_params->arg);
+ int ret = odp_term_local();
+
+ if (ret < 0)
+ ODPH_ERR("Local term failed\n");
+
+ return ret_ptr;
+}
+
+int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl,
+ const odp_cpumask_t *mask,
+ const odph_linux_thr_params_t *thr_params)
+{
+ int i;
+ int num;
+ int cpu_count;
+ int cpu;
+ int ret;
+
+ num = odp_cpumask_count(mask);
+
+ memset(pthread_tbl, 0, num * sizeof(odph_linux_pthread_t));
+
+ cpu_count = odp_cpu_count();
+
+ if (num < 1 || num > cpu_count) {
+ ODPH_ERR("Invalid number of threads:%d (%d cores available)\n",
+ num, cpu_count);
+ return 0;
+ }
+
+ cpu = odp_cpumask_first(mask);
+ for (i = 0; i < num; i++) {
+ cpu_set_t cpu_set;
+
+ CPU_ZERO(&cpu_set);
+ CPU_SET(cpu, &cpu_set);
+
+ pthread_attr_init(&pthread_tbl[i].attr);
+
+ pthread_tbl[i].cpu = cpu;
+
+ pthread_attr_setaffinity_np(&pthread_tbl[i].attr,
+ sizeof(cpu_set_t), &cpu_set);
+
+ pthread_tbl[i].thr_params.start = thr_params->start;
+ pthread_tbl[i].thr_params.arg = thr_params->arg;
+ pthread_tbl[i].thr_params.thr_type = thr_params->thr_type;
+ pthread_tbl[i].thr_params.instance = thr_params->instance;
+
+ ret = pthread_create(&pthread_tbl[i].thread,
+ &pthread_tbl[i].attr,
+ _odph_run_start_routine,
+ &pthread_tbl[i].thr_params);
+ if (ret != 0) {
+ ODPH_ERR("Failed to start thread on cpu #%d\n", cpu);
+ break;
+ }
+
+ cpu = odp_cpumask_next(mask, cpu);
+ }
+
+ return i;
+}
+
+void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num)
+{
+ int i;
+ int ret;
+
+ for (i = 0; i < num; i++) {
+ /* Wait thread to exit */
+ ret = pthread_join(thread_tbl[i].thread, NULL);
+ if (ret != 0) {
+ ODPH_ERR("Failed to join thread from cpu #%d\n",
+ thread_tbl[i].cpu);
+ }
+ pthread_attr_destroy(&thread_tbl[i].attr);
+ }
+}
+
+int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl,
+ const odp_cpumask_t *mask,
+ const odph_linux_thr_params_t *thr_params)
+{
+ pid_t pid;
+ int num;
+ int cpu_count;
+ int cpu;
+ int i;
+
+ num = odp_cpumask_count(mask);
+
+ memset(proc_tbl, 0, num * sizeof(odph_linux_process_t));
+
+ cpu_count = odp_cpu_count();
+
+ if (num < 1 || num > cpu_count) {
+ ODPH_ERR("Bad num\n");
+ return -1;
+ }
+
+ cpu = odp_cpumask_first(mask);
+ for (i = 0; i < num; i++) {
+ cpu_set_t cpu_set;
+
+ CPU_ZERO(&cpu_set);
+ CPU_SET(cpu, &cpu_set);
+
+ pid = fork();
+
+ if (pid < 0) {
+ ODPH_ERR("fork() failed\n");
+ return -1;
+ }
+
+ /* Parent continues to fork */
+ if (pid > 0) {
+ proc_tbl[i].pid = pid;
+ proc_tbl[i].cpu = cpu;
+
+ cpu = odp_cpumask_next(mask, cpu);
+ continue;
+ }
+
+ /* Child process */
+
+ /* Request SIGTERM if parent dies */
+ prctl(PR_SET_PDEATHSIG, SIGTERM);
+ /* Parent died already? */
+ if (getppid() == 1)
+ kill(getpid(), SIGTERM);
+
+ if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set)) {
+ ODPH_ERR("sched_setaffinity() failed\n");
+ return -2;
+ }
+
+ if (odp_init_local(thr_params->instance,
+ thr_params->thr_type)) {
+ ODPH_ERR("Local init failed\n");
+ return -2;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
+
+int odph_linux_process_fork(odph_linux_process_t *proc, int cpu,
+ const odph_linux_thr_params_t *thr_params)
+{
+ odp_cpumask_t mask;
+
+ odp_cpumask_zero(&mask);
+ odp_cpumask_set(&mask, cpu);
+ return odph_linux_process_fork_n(proc, &mask, thr_params);
+}
+
+int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num)
+{
+ pid_t pid;
+ int i, j;
+ int status = 0;
+
+ for (i = 0; i < num; i++) {
+ pid = wait(&status);
+
+ if (pid < 0) {
+ ODPH_ERR("wait() failed\n");
+ return -1;
+ }
+
+ for (j = 0; j < num; j++) {
+ if (proc_tbl[j].pid == pid) {
+ proc_tbl[j].status = status;
+ break;
+ }
+ }
+
+ if (j == num) {
+ ODPH_ERR("Bad pid:%d\n", (int)pid);
+ return -1;
+ }
+
+ /* Examine the child process' termination status */
+ if (WIFEXITED(status) && WEXITSTATUS(status) != EXIT_SUCCESS) {
+ ODPH_ERR("Child exit status:%d (pid:%d)\n",
+ WEXITSTATUS(status), (int)pid);
+ return -1;
+ }
+ if (WIFSIGNALED(status)) {
+ int signo = WTERMSIG(status);
+
+ ODPH_ERR("Child term signo:%d - %s (pid:%d)\n",
+ signo, strsignal(signo), (int)pid);
+ return -1;
+ }
+ }
+
+ return 0;
+}
diff --git a/helper/m4/configure.m4 b/helper/m4/configure.m4
index 480f79b58..343f5e3cf 100644
--- a/helper/m4/configure.m4
+++ b/helper/m4/configure.m4
@@ -7,3 +7,17 @@ AC_ARG_ENABLE([test-helper],
[if test "x$enableval" = "xyes"; then
test_helper=yes
fi])
+
+##########################################################################
+# Enable/disable helper-ext
+# platform specific non portable extensions
+##########################################################################
+helper_linux=no
+AC_ARG_ENABLE([helper-linux],
+ [ --enable-helper-linux build helper platform extensions (not portable)],
+ [if test "x$enableval" = "xyes"; then
+ helper_linux=yes
+ fi])
+
+AC_CONFIG_FILES([helper/Makefile
+ helper/test/Makefile])
diff --git a/helper/odph_debug.h b/helper/odph_debug.h
index 9c216cd18..36c743c2e 100644
--- a/helper/odph_debug.h
+++ b/helper/odph_debug.h
@@ -19,10 +19,6 @@
extern "C" {
#endif
-#ifndef ODPH_DEBUG_PRINT
-#define ODPH_DEBUG_PRINT 1
-#endif
-
/**
* log level.
*/
diff --git a/helper/odph_hashtable.h b/helper/odph_hashtable.h
deleted file mode 100644
index bb75cb9fa..000000000
--- a/helper/odph_hashtable.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (c) 2015, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP Hash Table
- */
-
-#ifndef ODPH_HASH_TABLE_H_
-#define ODPH_HASH_TABLE_H_
-
-#include <odp/helper/table.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-odph_table_t odph_hash_table_create(const char *name,
- uint32_t capacity,
- uint32_t key_size,
- uint32_t value_size);
-odph_table_t odph_hash_table_lookup(const char *name);
-int odph_hash_table_destroy(odph_table_t table);
-int odph_hash_put_value(odph_table_t table, void *key, void *value);
-int odph_hash_get_value(odph_table_t table, void *key, void *buffer,
- uint32_t buffer_size);
-int odph_hash_remove_value(odph_table_t table, void *key);
-
-extern odph_table_ops_t odph_hash_table_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/helper/odph_iplookuptable.h b/helper/odph_iplookuptable.h
deleted file mode 100644
index 0ae6b3762..000000000
--- a/helper/odph_iplookuptable.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (c) 2016, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP IP Lookup Table
- *
- * This is an implementation of the IP lookup table. The key of
- * this table is IPv4 address (32 bits), and the value can be
- * defined by user. This table uses the 16,8,8 ip lookup (longest
- * prefix matching) algorithm.
- */
-
-#ifndef ODPH_IPLOOKUP_TABLE_H_
-#define ODPH_IPLOOKUP_TABLE_H_
-
-#include <odp/helper/table.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct {
- uint32_t ip;
- uint8_t cidr;
-} odph_iplookup_prefix_t;
-
-odph_table_t odph_iplookup_table_create(
- const char *name,
- uint32_t ODP_IGNORED_1,
- uint32_t ODP_IGNORED_2,
- uint32_t value_size);
-
-odph_table_t odph_iplookup_table_lookup(const char *name);
-
-int odph_iplookup_table_destroy(odph_table_t table);
-
-int odph_iplookup_table_put_value(
- odph_table_t table, void *key, void *value);
-
-int odph_iplookup_table_get_value(
- odph_table_t table, void *key,
- void *buffer, uint32_t buffer_size);
-
-int odph_iplookup_table_remove_value(
- odph_table_t table, void *key);
-
-extern odph_table_ops_t odph_iplookup_table_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ODPH_IPLOOKUP_TABLE_H_ */
diff --git a/helper/odph_lineartable.h b/helper/odph_lineartable.h
deleted file mode 100644
index 0b56b7fab..000000000
--- a/helper/odph_lineartable.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (c) 2015, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP Linear Table
- */
-
-#ifndef ODPH_LINEAR_TABLE_H_
-#define ODPH_LINEAR_TABLE_H_
-
-#include <stdint.h>
-#include <odp/helper/table.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-odph_table_t odph_linear_table_create(const char *name,
- uint32_t capacity,
- uint32_t ODP_IGNORED,
- uint32_t value_size);
-odph_table_t odph_linear_table_lookup(const char *name);
-int odph_linear_table_destroy(odph_table_t table);
-int odph_linear_put_value(odph_table_t table, void *key, void *value);
-int odph_linear_get_value(odph_table_t table, void *key, void *buffer,
- uint32_t buffer_size);
-
-extern odph_table_ops_t odph_linear_table_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/helper/test/.gitignore b/helper/test/.gitignore
index e5b6a0f21..1a81e0047 100644
--- a/helper/test/.gitignore
+++ b/helper/test/.gitignore
@@ -8,3 +8,4 @@ parse
process
table
thread
+pthread
diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am
index 8b1aa765e..beef91913 100644
--- a/helper/test/Makefile.am
+++ b/helper/test/Makefile.am
@@ -1,18 +1,41 @@
-include $(top_srcdir)/test/Makefile.inc
+include $(top_srcdir)/platform/@with_platform@/Makefile.inc
-AM_CFLAGS += -I$(srcdir)/common
-AM_LDFLAGS += -static
+LIB = $(top_builddir)/lib
+
+#in the following line, the libs using the symbols should come before
+#the libs containing them! The includer is given a chance to add things
+#before libodp by setting PRE_LDADD before the inclusion.
+LDADD = $(PRE_LDADD) $(LIB)/libodphelper.la $(LIB)/libodp-linux.la
+
+INCFLAGS = \
+ -I$(top_builddir)/platform/@with_platform@/include \
+ -I$(top_srcdir)/helper/include \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \
+ -I$(top_srcdir)/platform/@with_platform@/include \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/helper
-TESTS_ENVIRONMENT += TEST_DIR=${builddir}
+ODP_PLATFORM=${with_platform}
+
+AM_CFLAGS += $(INCFLAGS)
+AM_LDFLAGS += -static
EXECUTABLES = chksum$(EXEEXT) \
cuckootable$(EXEEXT) \
- table$(EXEEXT) \
- thread$(EXEEXT) \
parse$(EXEEXT)\
- process$(EXEEXT) \
+ table$(EXEEXT) \
iplookuptable$(EXEEXT)
+#These are platform specific extensions that are not portable
+#They are a convenience to app writers who have chosen to
+#restrict their application to Linux.
+
+if helper_linux
+EXECUTABLES += linux/pthread$(EXEEXT) \
+ linux/process$(EXEEXT)
+endif
+
COMPILE_ONLY = odpthreads
TESTSCRIPTS = odpthreads_as_processes \
@@ -31,11 +54,6 @@ EXTRA_DIST = odpthreads_as_processes odpthreads_as_pthreads
dist_chksum_SOURCES = chksum.c
dist_cuckootable_SOURCES = cuckootable.c
dist_odpthreads_SOURCES = odpthreads.c
-odpthreads_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-dpdk.la
-dist_thread_SOURCES = thread.c
-thread_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-dpdk.la
-dist_process_SOURCES = process.c
dist_parse_SOURCES = parse.c
-process_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-dpdk.la
dist_table_SOURCES = table.c
dist_iplookuptable_SOURCES = iplookuptable.c
diff --git a/helper/test/chksum.c b/helper/test/chksum.c
index 749d4959d..1beae47f1 100644
--- a/helper/test/chksum.c
+++ b/helper/test/chksum.c
@@ -4,11 +4,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include <test_debug.h>
+#include "odph_debug.h"
#include <odp_api.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
+#include <odp/helper/odph_api.h>
struct udata_struct {
uint64_t u64;
@@ -21,7 +19,7 @@ struct udata_struct {
};
/* Create additional dataplane threads */
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odp_instance_t instance;
int status = 0;
@@ -41,17 +39,17 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
odp_pool_capability_t capa;
if (odp_init_global(&instance, NULL, NULL)) {
- LOG_ERR("Error: ODP global init failed.\n");
+ ODPH_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
if (odp_init_local(instance, ODP_THREAD_WORKER)) {
- LOG_ERR("Error: ODP local init failed.\n");
+ ODPH_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
if (odp_pool_capability(&capa) < 0) {
- LOG_ERR("Error: ODP global init failed.\n");
+ ODPH_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
@@ -91,12 +89,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
eth->type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
if (odph_ipv4_addr_parse(&dstip, "192.168.0.1")) {
- LOG_ERR("Error: parse ip\n");
+ ODPH_ERR("Error: parse ip\n");
return -1;
}
if (odph_ipv4_addr_parse(&srcip, "192.168.0.2")) {
- LOG_ERR("Error: parse ip\n");
+ ODPH_ERR("Error: parse ip\n");
return -1;
}
@@ -139,12 +137,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
return -1;
if (odp_term_local()) {
- LOG_ERR("Error: ODP local term failed.\n");
+ ODPH_ERR("Error: ODP local term failed.\n");
exit(EXIT_FAILURE);
}
if (odp_term_global(instance)) {
- LOG_ERR("Error: ODP global term failed.\n");
+ ODPH_ERR("Error: ODP global term failed.\n");
exit(EXIT_FAILURE);
}
diff --git a/helper/test/cuckootable.c b/helper/test/cuckootable.c
index 5b4333b56..be655911f 100644
--- a/helper/test/cuckootable.c
+++ b/helper/test/cuckootable.c
@@ -48,8 +48,8 @@
#include <time.h>
#include <odp_api.h>
-#include <test_debug.h>
-#include <../odph_cuckootable.h>
+#include <odph_debug.h>
+#include <odp/helper/odph_api.h>
/*******************************************************************************
* Hash function performance test configuration section.
@@ -453,10 +453,15 @@ static int test_performance(int number)
unsigned key_num = key_len * elem_num;
key_space = (uint8_t *)malloc(key_num);
- key_ptr = (const void **)malloc(sizeof(void *) * elem_num);
if (key_space == NULL)
return -ENOENT;
+ key_ptr = (const void **)malloc(sizeof(void *) * elem_num);
+ if (key_ptr == NULL) {
+ free(key_space);
+ return -ENOENT;
+ }
+
for (j = 0; j < key_num; j++) {
key_space[j] = rand() % 255;
if (j % key_len == 0)
@@ -473,6 +478,8 @@ static int test_performance(int number)
"performance_test", PERFORMANCE_CAPACITY, key_len, 0);
if (table == NULL) {
printf("cuckoo table creation failed\n");
+ free(key_ptr);
+ free(key_space);
return -ENOENT;
}
@@ -534,7 +541,7 @@ test_cuckoo_hash_table(void)
return 0;
}
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odp_instance_t instance;
int ret = 0;
diff --git a/helper/test/iplookuptable.c b/helper/test/iplookuptable.c
index e1d28207b..b5d774cbc 100644
--- a/helper/test/iplookuptable.c
+++ b/helper/test/iplookuptable.c
@@ -11,8 +11,8 @@
#include <errno.h>
#include <odp_api.h>
-#include <test_debug.h>
-#include <../odph_iplookuptable.h>
+#include <odph_debug.h>
+#include <odp/helper/odph_api.h>
#include <odp/helper/ip.h>
static void print_prefix_info(
@@ -138,7 +138,7 @@ static int test_ip_lookup_table(void)
return 0;
}
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odp_instance_t instance;
int ret = 0;
diff --git a/helper/test/linux/Makefile.am b/helper/test/linux/Makefile.am
new file mode 100644
index 000000000..f95e04d51
--- /dev/null
+++ b/helper/test/linux/Makefile.am
@@ -0,0 +1,5 @@
+
+thread_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la
+dist_thread_SOURCES = pthread.c
+dist_process_SOURCES = process.c
+process_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la
diff --git a/helper/test/process.c b/helper/test/linux/process.c
index 0e042249d..e08ef8686 100644
--- a/helper/test/process.c
+++ b/helper/test/linux/process.c
@@ -4,13 +4,14 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include <test_debug.h>
+#include <odph_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/linux/pthread.h>
+#include <odp/helper/linux/process.h>
#define NUMBER_WORKERS 16 /* 0 = max */
-static void *worker_fn(void *arg TEST_UNUSED)
+static void *worker_fn(void *arg ODPH_UNUSED)
{
/* depend on the odp helper to call odp_init_local */
printf("Worker thread on CPU %d\n", odp_cpu_id());
@@ -19,7 +20,7 @@ static void *worker_fn(void *arg TEST_UNUSED)
}
/* Create additional dataplane processes */
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odp_cpumask_t cpu_mask;
int num_workers;
@@ -31,12 +32,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
odph_linux_thr_params_t thr_params;
if (odp_init_global(&instance, NULL, NULL)) {
- LOG_ERR("Error: ODP global init failed.\n");
+ ODPH_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
- LOG_ERR("Error: ODP local init failed.\n");
+ ODPH_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
@@ -71,7 +72,7 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
ret = odph_linux_process_fork_n(proc, &cpu_mask, &thr_params);
if (ret < 0) {
- LOG_ERR("Fork workers failed %i\n", ret);
+ ODPH_ERR("Fork workers failed %i\n", ret);
return -1;
}
@@ -83,7 +84,7 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
odph_linux_process_wait_n(proc, num_workers);
if (odp_term_global(instance)) {
- LOG_ERR("Error: ODP global term failed.\n");
+ ODPH_ERR("Error: ODP global term failed.\n");
exit(EXIT_FAILURE);
}
}
diff --git a/helper/test/thread.c b/helper/test/linux/pthread.c
index 8268d9fee..2bec0d178 100644
--- a/helper/test/thread.c
+++ b/helper/test/linux/pthread.c
@@ -4,12 +4,12 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include <test_debug.h>
+#include <odph_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/linux/pthread.h>
#define NUMBER_WORKERS 16
-static void *worker_fn(void *arg TEST_UNUSED)
+static void *worker_fn(void *arg ODPH_UNUSED)
{
/* depend on the odp helper to call odp_init_local */
@@ -21,7 +21,7 @@ static void *worker_fn(void *arg TEST_UNUSED)
}
/* Create additional dataplane threads */
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odph_linux_pthread_t thread_tbl[NUMBER_WORKERS];
odp_cpumask_t cpu_mask;
@@ -32,12 +32,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
odph_linux_thr_params_t thr_params;
if (odp_init_global(&instance, NULL, NULL)) {
- LOG_ERR("Error: ODP global init failed.\n");
+ ODPH_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
- LOG_ERR("Error: ODP local init failed.\n");
+ ODPH_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
@@ -74,12 +74,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
odph_linux_pthread_join(thread_tbl, num_workers);
if (odp_term_local()) {
- LOG_ERR("Error: ODP local term failed.\n");
+ ODPH_ERR("Error: ODP local term failed.\n");
exit(EXIT_FAILURE);
}
if (odp_term_global(instance)) {
- LOG_ERR("Error: ODP global term failed.\n");
+ ODPH_ERR("Error: ODP global term failed.\n");
exit(EXIT_FAILURE);
}
diff --git a/helper/test/odpthreads.c b/helper/test/odpthreads.c
index 3d20eaada..219e1b65b 100644
--- a/helper/test/odpthreads.c
+++ b/helper/test/odpthreads.c
@@ -13,9 +13,9 @@
#include <unistd.h>
#include <stdlib.h>
-#include <test_debug.h>
+#include <odph_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
#define NUMBER_WORKERS 16
@@ -25,7 +25,7 @@ static void main_exit(void);
/* ODP application instance */
static odp_instance_t odp_instance;
-static int worker_fn(void *arg TEST_UNUSED)
+static int worker_fn(void *arg ODPH_UNUSED)
{
int cpu;
odp_cpumask_t workers;
@@ -74,12 +74,12 @@ int main(int argc, char *argv[])
odph_parse_options(argc, argv, NULL, NULL);
if (odp_init_global(&odp_instance, NULL, NULL)) {
- LOG_ERR("Error: ODP global init failed.\n");
+ ODPH_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
if (odp_init_local(odp_instance, ODP_THREAD_CONTROL)) {
- LOG_ERR("Error: ODP local init failed.\n");
+ ODPH_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
@@ -89,13 +89,13 @@ int main(int argc, char *argv[])
odp_cpumask_zero(&cpu_mask);
/* allocate the 1st available control cpu to main process */
if (odp_cpumask_default_control(&cpu_mask, 1) != 1) {
- LOG_ERR("Allocate main process CPU core failed.\n");
+ ODPH_ERR("Allocate main process CPU core failed.\n");
exit(EXIT_FAILURE);
}
cpu = odp_cpumask_first(&cpu_mask);
if (odph_odpthread_setaffinity(cpu) != 0) {
- LOG_ERR("Set main process affinify to "
+ ODPH_ERR("Set main process affinify to "
"cpu(%d) failed.\n", cpu);
exit(EXIT_FAILURE);
}
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
/* read back affinity to verify */
affinity = odph_odpthread_getaffinity();
if ((affinity < 0) || (cpu != affinity)) {
- LOG_ERR("Verify main process affinity failed: "
+ ODPH_ERR("Verify main process affinity failed: "
"set(%d) read(%d).\n", cpu, affinity);
exit(EXIT_FAILURE);
}
@@ -152,12 +152,12 @@ int main(int argc, char *argv[])
static void main_exit(void)
{
if (odp_term_local()) {
- LOG_ERR("Error: ODP local term failed.\n");
+ ODPH_ERR("Error: ODP local term failed.\n");
_exit(EXIT_FAILURE);
}
if (odp_term_global(odp_instance)) {
- LOG_ERR("Error: ODP global term failed.\n");
+ ODPH_ERR("Error: ODP global term failed.\n");
_exit(EXIT_FAILURE);
}
}
diff --git a/helper/test/parse.c b/helper/test/parse.c
index b5a4ab4dc..0429f2cc3 100644
--- a/helper/test/parse.c
+++ b/helper/test/parse.c
@@ -4,11 +4,10 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include <test_debug.h>
+#include <odph_debug.h>
#include <odp_api.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
#include <stdio.h>
#include <string.h>
@@ -42,37 +41,37 @@ static int test_mac(void)
/* String must not start with other chars */
if (!odph_eth_addr_parse(&mac, "foo 01:02:03:04:05:06")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Missing digit */
if (!odph_eth_addr_parse(&mac, "01:02:03:04:05:")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Missing colon */
if (!odph_eth_addr_parse(&mac, "01:02:03:04:05 06")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Too large value */
if (!odph_eth_addr_parse(&mac, "01:02:03:04:05:1ff")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Negative value */
if (!odph_eth_addr_parse(&mac, "-1:02:03:04:05:06")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Failed function call must not store address */
if (different_mac(&mac, &ref)) {
- LOG_ERR("Modified address when failed\n");
+ ODPH_ERR("Modified address when failed\n");
return -1;
}
@@ -86,36 +85,36 @@ static int test_mac(void)
/* Zero pre-fixed */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "01:02:03:04:05:06")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
/* Not zero pre-fixed */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "1:2:3:4:5:6")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
/* String may continue with other chars */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "01:02:03:04:05:06 foobar")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -129,24 +128,24 @@ static int test_mac(void)
/* Zero pre-fixed */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "0a:0b:0c:0d:0e:0f")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
/* Not zero pre-fixed */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "a:b:c:d:e:f")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -160,12 +159,12 @@ static int test_mac(void)
/* Dual digits */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "1a:2b:3c:4d:5e:6f")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -174,12 +173,12 @@ static int test_mac(void)
/* All zeros */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "00:00:00:00:00:00")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -188,12 +187,12 @@ static int test_mac(void)
/* All ones */
memset(&mac, 0, sizeof(odph_ethaddr_t));
if (odph_eth_addr_parse(&mac, "ff:ff:ff:ff:ff:ff")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_mac(&mac, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -215,37 +214,37 @@ static int test_ipv4(void)
/* String must not start with other chars */
if (!odph_ipv4_addr_parse(&ip_addr, "foo 1.2.3.4")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Missing digit */
if (!odph_ipv4_addr_parse(&ip_addr, "1.2.3.")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Missing dot */
if (!odph_ipv4_addr_parse(&ip_addr, "1.2.3 4")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Too large value */
if (!odph_ipv4_addr_parse(&ip_addr, "1.2.3.256")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Negative value */
if (!odph_ipv4_addr_parse(&ip_addr, "-1.2.3.4")) {
- LOG_ERR("Accepted bad string\n");
+ ODPH_ERR("Accepted bad string\n");
return -1;
}
/* Failed function call must not store address */
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Modified address when failed\n");
+ ODPH_ERR("Modified address when failed\n");
return -1;
}
@@ -254,36 +253,36 @@ static int test_ipv4(void)
/* Zero pre-fixed */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "001.002.003.004")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
/* Not zero pre-fixed */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "1.2.3.4")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
/* String may continue with other chars */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "1.2.3.4 foobar")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -292,12 +291,12 @@ static int test_ipv4(void)
/* Dual digits */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "26.43.60.77")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -306,12 +305,12 @@ static int test_ipv4(void)
/* Triple digits */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "161.178.195.212")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -320,12 +319,12 @@ static int test_ipv4(void)
/* All zeros */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "0.0.0.0")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
@@ -334,12 +333,12 @@ static int test_ipv4(void)
/* All ones */
ip_addr = 0;
if (odph_ipv4_addr_parse(&ip_addr, "255.255.255.255")) {
- LOG_ERR("Parse call failed\n");
+ ODPH_ERR("Parse call failed\n");
return -1;
}
if (different_ipv4(&ip_addr, &ref)) {
- LOG_ERR("Bad parse result\n");
+ ODPH_ERR("Bad parse result\n");
return -1;
}
diff --git a/helper/test/table.c b/helper/test/table.c
index abb5b3b02..ac454da5e 100644
--- a/helper/test/table.c
+++ b/helper/test/table.c
@@ -4,9 +4,8 @@
* SPDX-License-Identifier:BSD-3-Clause
*/
-#include <test_debug.h>
-#include <../odph_hashtable.h>
-#include <../odph_lineartable.h>
+#include <odph_debug.h>
+#include <odp/helper/odph_api.h>
#include <odp_api.h>
/**
@@ -25,7 +24,7 @@
* value (data): MAC address of the next hop station (6 bytes).
*/
-int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+int main(int argc ODPH_UNUSED, char *argv[] ODPH_UNUSED)
{
odp_instance_t instance;
int ret = 0;
@@ -43,12 +42,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
ret = odp_init_global(&instance, NULL, NULL);
if (ret != 0) {
- LOG_ERR("odp_shm_init_global fail\n");
+ ODPH_ERR("odp_shm_init_global fail\n");
exit(EXIT_FAILURE);
}
ret = odp_init_local(instance, ODP_THREAD_WORKER);
if (ret != 0) {
- LOG_ERR("odp_shm_init_local fail\n");
+ ODPH_ERR("odp_shm_init_local fail\n");
exit(EXIT_FAILURE);
}
@@ -121,12 +120,12 @@ int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
printf("all test finished success!!\n");
if (odp_term_local()) {
- LOG_ERR("Error: ODP local term failed.\n");
+ ODPH_ERR("Error: ODP local term failed.\n");
exit(EXIT_FAILURE);
}
if (odp_term_global(instance)) {
- LOG_ERR("Error: ODP global term failed.\n");
+ ODPH_ERR("Error: ODP global term failed.\n");
exit(EXIT_FAILURE);
}
diff --git a/helper/linux.c b/helper/threads.c
index 1f009cdf3..cb747e5bf 100644
--- a/helper/linux.c
+++ b/helper/threads.c
@@ -9,243 +9,23 @@
#endif
#include <sched.h>
#include <unistd.h>
-#include <sys/types.h>
#include <sys/wait.h>
#include <sys/prctl.h>
#include <sys/syscall.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdbool.h>
-
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/threads.h>
#include "odph_debug.h"
static struct {
int proc; /* true when process mode is required, false otherwise */
} helper_options;
-static void *odp_run_start_routine(void *arg)
-{
- odph_linux_thr_params_t *thr_params = arg;
-
- /* ODP thread local init */
- if (odp_init_local(thr_params->instance, thr_params->thr_type)) {
- ODPH_ERR("Local init failed\n");
- return NULL;
- }
-
- void *ret_ptr = thr_params->start(thr_params->arg);
- int ret = odp_term_local();
-
- if (ret < 0)
- ODPH_ERR("Local term failed\n");
-
- return ret_ptr;
-}
-
-int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl,
- const odp_cpumask_t *mask,
- const odph_linux_thr_params_t *thr_params)
-{
- int i;
- int num;
- int cpu_count;
- int cpu;
- int ret;
-
- num = odp_cpumask_count(mask);
-
- memset(pthread_tbl, 0, num * sizeof(odph_linux_pthread_t));
-
- cpu_count = odp_cpu_count();
-
- if (num < 1 || num > cpu_count) {
- ODPH_ERR("Invalid number of threads:%d (%d cores available)\n",
- num, cpu_count);
- return 0;
- }
-
- cpu = odp_cpumask_first(mask);
- for (i = 0; i < num; i++) {
- cpu_set_t cpu_set;
-
- CPU_ZERO(&cpu_set);
- CPU_SET(cpu, &cpu_set);
-
- pthread_attr_init(&pthread_tbl[i].attr);
-
- pthread_tbl[i].cpu = cpu;
-
- pthread_attr_setaffinity_np(&pthread_tbl[i].attr,
- sizeof(cpu_set_t), &cpu_set);
-
- pthread_tbl[i].thr_params.start = thr_params->start;
- pthread_tbl[i].thr_params.arg = thr_params->arg;
- pthread_tbl[i].thr_params.thr_type = thr_params->thr_type;
- pthread_tbl[i].thr_params.instance = thr_params->instance;
-
- ret = pthread_create(&pthread_tbl[i].thread,
- &pthread_tbl[i].attr,
- odp_run_start_routine,
- &pthread_tbl[i].thr_params);
- if (ret != 0) {
- ODPH_ERR("Failed to start thread on cpu #%d\n", cpu);
- break;
- }
-
- cpu = odp_cpumask_next(mask, cpu);
- }
-
- return i;
-}
-
-void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num)
-{
- int i;
- int ret;
-
- for (i = 0; i < num; i++) {
- /* Wait thread to exit */
- ret = pthread_join(thread_tbl[i].thread, NULL);
- if (ret != 0) {
- ODPH_ERR("Failed to join thread from cpu #%d\n",
- thread_tbl[i].cpu);
- }
- pthread_attr_destroy(&thread_tbl[i].attr);
- }
-}
-
-int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl,
- const odp_cpumask_t *mask,
- const odph_linux_thr_params_t *thr_params)
-{
- pid_t pid;
- int num;
- int cpu_count;
- int cpu;
- int i;
-
- num = odp_cpumask_count(mask);
-
- memset(proc_tbl, 0, num * sizeof(odph_linux_process_t));
-
- cpu_count = odp_cpu_count();
-
- if (num < 1 || num > cpu_count) {
- ODPH_ERR("Bad num\n");
- return -1;
- }
-
- cpu = odp_cpumask_first(mask);
- for (i = 0; i < num; i++) {
- cpu_set_t cpu_set;
-
- CPU_ZERO(&cpu_set);
- CPU_SET(cpu, &cpu_set);
-
- pid = fork();
-
- if (pid < 0) {
- ODPH_ERR("fork() failed\n");
- return -1;
- }
-
- /* Parent continues to fork */
- if (pid > 0) {
- proc_tbl[i].pid = pid;
- proc_tbl[i].cpu = cpu;
-
- cpu = odp_cpumask_next(mask, cpu);
- continue;
- }
-
- /* Child process */
-
- /* Request SIGTERM if parent dies */
- prctl(PR_SET_PDEATHSIG, SIGTERM);
- /* Parent died already? */
- if (getppid() == 1)
- kill(getpid(), SIGTERM);
-
- if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set)) {
- ODPH_ERR("sched_setaffinity() failed\n");
- return -2;
- }
-
- if (odp_init_local(thr_params->instance,
- thr_params->thr_type)) {
- ODPH_ERR("Local init failed\n");
- return -2;
- }
-
- return 0;
- }
-
- return 1;
-}
-
-int odph_linux_process_fork(odph_linux_process_t *proc, int cpu,
- const odph_linux_thr_params_t *thr_params)
-{
- odp_cpumask_t mask;
-
- odp_cpumask_zero(&mask);
- odp_cpumask_set(&mask, cpu);
- return odph_linux_process_fork_n(proc, &mask, thr_params);
-}
-
-int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num)
-{
- pid_t pid;
- int i, j;
- int status = 0;
-
- for (i = 0; i < num; i++) {
- pid = wait(&status);
-
- if (pid < 0) {
- ODPH_ERR("wait() failed\n");
- return -1;
- }
-
- for (j = 0; j < num; j++) {
- if (proc_tbl[j].pid == pid) {
- proc_tbl[j].status = status;
- break;
- }
- }
-
- if (j == num) {
- ODPH_ERR("Bad pid:%d\n", (int)pid);
- return -1;
- }
-
- /* Examine the child process' termination status */
- if (WIFEXITED(status) && WEXITSTATUS(status) != EXIT_SUCCESS) {
- ODPH_ERR("Child exit status:%d (pid:%d)\n",
- WEXITSTATUS(status), (int)pid);
- return -1;
- }
- if (WIFSIGNALED(status)) {
- int signo = WTERMSIG(status);
-
- ODPH_ERR("Child term signo:%d - %s (pid:%d)\n",
- signo, strsignal(signo), (int)pid);
- return -1;
- }
- }
-
- return 0;
-}
-
/*
* wrapper for odpthreads, either implemented as linux threads or processes.
* (in process mode, if start_routine returns NULL, the process return FAILURE).
*/
-static void *odpthread_run_start_routine(void *arg)
+static void *_odph_thread_run_start_routine(void *arg)
{
int status;
int ret;
@@ -287,9 +67,9 @@ static void *odpthread_run_start_routine(void *arg)
/*
* Create a single ODPthread as a linux process
*/
-static int odph_linux_process_create(odph_odpthread_t *thread_tbl,
- int cpu,
- const odph_odpthread_params_t *thr_params)
+static int _odph_linux_process_create(odph_odpthread_t *thread_tbl,
+ int cpu,
+ const odph_odpthread_params_t *thr_params)
{
cpu_set_t cpu_set;
pid_t pid;
@@ -327,7 +107,7 @@ static int odph_linux_process_create(odph_odpthread_t *thread_tbl,
return -2;
}
- odpthread_run_start_routine(&thread_tbl->start_args);
+ _odph_thread_run_start_routine(&thread_tbl->start_args);
return 0; /* never reached */
}
@@ -357,7 +137,7 @@ static int odph_linux_thread_create(odph_odpthread_t *thread_tbl,
ret = pthread_create(&thread_tbl->thread.thread_id,
&thread_tbl->thread.attr,
- odpthread_run_start_routine,
+ _odph_thread_run_start_routine,
&thread_tbl->start_args);
if (ret != 0) {
ODPH_ERR("Failed to start thread on cpu #%d\n", cpu);
@@ -401,9 +181,9 @@ int odph_odpthreads_create(odph_odpthread_t *thread_tbl,
thr_params))
break;
} else {
- if (odph_linux_process_create(&thread_tbl[i],
- cpu,
- thr_params))
+ if (_odph_linux_process_create(&thread_tbl[i],
+ cpu,
+ thr_params))
break;
}
@@ -639,7 +419,7 @@ int odph_parse_options(int argc, char *argv[],
{0, 0, 0, 0}
};
- static char *helper_short_options = "";
+ static const char *helper_short_options = "";
/* defaults: */
helper_options.proc = false;
diff --git a/include/odp/api/spec/byteorder.h b/include/odp/api/spec/byteorder.h
index 2899adbea..38c0bdbf7 100644
--- a/include/odp/api/spec/byteorder.h
+++ b/include/odp/api/spec/byteorder.h
@@ -4,7 +4,6 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-
/**
* @file
*
@@ -95,7 +94,6 @@ uint32_t odp_be_to_cpu_32(odp_u32be_t be32);
*/
uint64_t odp_be_to_cpu_64(odp_u64be_t be64);
-
/*
* CPU byte order -> Big Endian:
*/
@@ -121,7 +119,6 @@ odp_u32be_t odp_cpu_to_be_32(uint32_t cpu32);
*/
odp_u64be_t odp_cpu_to_be_64(uint64_t cpu64);
-
/*
* Little Endian -> CPU byte order:
*/
@@ -147,7 +144,6 @@ uint32_t odp_le_to_cpu_32(odp_u32le_t le32);
*/
uint64_t odp_le_to_cpu_64(odp_u64le_t le64);
-
/*
* CPU byte order -> Little Endian:
*/
diff --git a/include/odp/api/spec/packet.h b/include/odp/api/spec/packet.h
index 4a86ebad0..92c35ae6d 100644
--- a/include/odp/api/spec/packet.h
+++ b/include/odp/api/spec/packet.h
@@ -795,7 +795,7 @@ uint32_t odp_packet_seg_data_len(odp_packet_t pkt, odp_packet_seg_t seg);
* data pointers. Otherwise, all old pointers remain valid.
*
* The resulting packet is always allocated from the same pool as
- * the destination packet. The source packet may have been allocate from
+ * the destination packet. The source packet may have been allocated from
* any pool.
*
* On failure, both handles remain valid and packets are not modified.
@@ -848,6 +848,144 @@ int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail);
/*
*
+ * References
+ * ********************************************************
+ *
+ */
+
+/**
+ * Create a static reference to a packet
+ *
+ * A static reference is used to obtain an additional handle for referring to
+ * the entire packet as it is. As long as a packet has multiple (static)
+ * references, any of the references (including 'pkt') must not be used to
+ * modify the packet in any way - both data and metadata must remain static.
+ * The packet may be modified again when there is a single reference left.
+ * Static and dynamic references must not be mixed. Results are undefined if
+ * these restrictions are not observed.
+ *
+ * While static references are inflexible they offer efficient way to do,
+ * e.g., packet retransmissions. Use odp_packet_ref() or odp_packet_ref_pkt()
+ * for more flexible, dynamic references.
+ *
+ * Packet is not modified on failure.
+ *
+ * @param pkt Handle of the packet for which a static reference is
+ * to be created.
+ *
+ * @return Static reference to the packet
+ * @retval ODP_PACKET_INVALID On failure
+ */
+odp_packet_t odp_packet_ref_static(odp_packet_t pkt);
+
+/**
+ * Create a reference to a packet
+ *
+ * Returns a new (dynamic) reference to a packet starting the shared part of
+ * the data at a specified byte offset. Metadata and data before the offset
+ * are not shared with other references of the packet. The rest of the data is
+ * shared and must be treated as read only. Initially the returned reference
+ * has metadata initialized to default values and does not contain unshared
+ * data. Packet (head) manipulation functions may be used normally to, e.g.,
+ * add a unique header onto the shared payload. The shared part of the packet
+ * may be modified again when there is a single reference left. Static and
+ * dynamic references must not be mixed. Results are undefined if these
+ * restrictions are not observed.
+ *
+ * The packet handle 'pkt' may itself by a (dynamic) reference to a packet.
+ *
+ * If the caller does not intend to modify either the packet or the new
+ * reference to it, odp_packet_ref_static() may be used to create
+ * a static reference that is more optimized for that use case.
+ *
+ * Packet is not modified on failure.
+ *
+ * @param pkt Handle of the packet for which a reference is to be
+ * created.
+ *
+ * @param offset Byte offset in the packet at which the shared part is to
+ * begin. This must be in the range 0 ... odp_packet_len(pkt)-1.
+ *
+ * @return New reference to the packet
+ * @retval ODP_PACKET_INVALID On failure
+ */
+odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset);
+
+/**
+ * Create a reference to a packet with a header packet
+ *
+ * This operation is otherwise identical to odp_packet_ref(), but it prepends
+ * a supplied 'hdr' packet as the head of the new reference. The resulting
+ * packet consists metadata and data of the 'hdr' packet, followed by the
+ * shared part of packet 'pkt'.
+ *
+ * The packet handle ('pkt') may itself by a (dynamic) reference to a packet,
+ * but the header packet handle ('hdr') must be unique. Both packets must be
+ * have been allocated from the same pool and the handles must not refer to
+ * the same packet. Results are undefined if these restrictions are not
+ * observed.
+ *
+ * Packets are not modified on failure. The header packet 'hdr' is consumed
+ * on success.
+ *
+ * @param pkt Handle of the packet for which a reference is to be
+ * created.
+ *
+ * @param offset Byte offset in 'pkt' at which the shared part is to
+ * begin. Must be in the range 0 ... odp_packet_len(pkt)-1.
+ *
+ * @param hdr Handle of the header packet to be prefixed onto the new
+ * reference. Must be a unique reference.
+ *
+ * @return New reference the reference packet
+ * @retval ODP_PACKET_INVALID On failure
+ */
+odp_packet_t odp_packet_ref_pkt(odp_packet_t pkt, uint32_t offset,
+ odp_packet_t hdr);
+
+/**
+ * Packet unshared data length
+ *
+ * When a packet has multiple references, packet data is divided into two
+ * parts: unshared and shared. The unshared part always precedes the shared
+ * part. This call returns number of bytes in the unshared part. When a
+ * packet has only a single reference (see odp_packet_has_ref()), all packet
+ * data is unshared and unshared length equals the packet length
+ * (odp_packet_len()).
+ *
+ * Application may modify only the unshared part, the rest of the packet data
+ * must be treated as read only.
+ *
+ * @param pkt Packet handle
+ *
+ * @return Packet unshared data length
+ */
+uint32_t odp_packet_unshared_len(odp_packet_t pkt);
+
+/**
+ * Test if packet has multiple references
+ *
+ * A packet that has multiple references share data with other packets. In case
+ * of a static reference it also shares metadata. Shared parts must be treated
+ * as read only.
+ *
+ * New references are created with odp_packet_ref_static(), odp_packet_ref() and
+ * odp_packet_ref_pkt() calls. The intent of multiple references is to avoid
+ * packet copies, however some implementations may do a packet copy for some of
+ * the calls. If a copy is done, the new reference is actually a new, unique
+ * packet and this function returns '0' for it. When a real reference is
+ * created (instead of a copy), this function returns '1' for both packets
+ * (the original packet and the new reference).
+ *
+ * @param pkt Packet handle
+ *
+ * @retval 0 This is the single reference to the packet
+ * @retval 1 Packet has multiple references
+ */
+int odp_packet_has_ref(odp_packet_t pkt);
+
+/*
+ *
* Copy
* ********************************************************
*
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/buffer.h b/include/odp/arch/arm32-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/classification.h b/include/odp/arch/arm32-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/crypto.h b/include/odp/arch/arm32-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/event.h b/include/odp/arch/arm32-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/packet.h b/include/odp/arch/arm32-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/pool.h b/include/odp/arch/arm32-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/queue.h b/include/odp/arch/arm32-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/arm32-linux/odp/api/abi/shared_memory.h b/include/odp/arch/arm32-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/arm32-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/buffer.h b/include/odp/arch/arm64-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/classification.h b/include/odp/arch/arm64-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/crypto.h b/include/odp/arch/arm64-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/event.h b/include/odp/arch/arm64-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/packet.h b/include/odp/arch/arm64-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/pool.h b/include/odp/arch/arm64-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/queue.h b/include/odp/arch/arm64-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/arm64-linux/odp/api/abi/shared_memory.h b/include/odp/arch/arm64-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/arm64-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/include/odp/arch/default/api/abi/buffer.h b/include/odp/arch/default/api/abi/buffer.h
new file mode 100644
index 000000000..eec6f01f2
--- /dev/null
+++ b/include/odp/arch/default/api/abi/buffer.h
@@ -0,0 +1,38 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_BUFFER_H_
+#define ODP_ABI_BUFFER_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_buffer_t;
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_buffer_seg_t;
+
+/** @ingroup odp_buffer
+ * @{
+ */
+
+typedef _odp_abi_buffer_t *odp_buffer_t;
+typedef _odp_abi_buffer_seg_t *odp_buffer_seg_t;
+
+#define ODP_BUFFER_INVALID ((odp_buffer_t)0xffffffff)
+#define ODP_SEGMENT_INVALID ((odp_buffer_seg_t)0xffffffff)
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/classification.h b/include/odp/arch/default/api/abi/classification.h
new file mode 100644
index 000000000..771907aec
--- /dev/null
+++ b/include/odp/arch/default/api/abi/classification.h
@@ -0,0 +1,40 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_CLASSIFICATION_H_
+#define ODP_ABI_CLASSIFICATION_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_cos_t;
+
+/** Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_pmr_t;
+
+/** @ingroup odp_classification
+ * @{
+ */
+
+typedef _odp_abi_cos_t *odp_cos_t;
+typedef _odp_abi_pmr_t *odp_pmr_t;
+
+#define ODP_COS_INVALID ((odp_cos_t)~0)
+#define ODP_PMR_INVAL ((odp_pmr_t)~0)
+
+#define ODP_COS_NAME_LEN 32
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/crypto.h b/include/odp/arch/default/api/abi/crypto.h
new file mode 100644
index 000000000..f0793a198
--- /dev/null
+++ b/include/odp/arch/default/api/abi/crypto.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_CRYPTO_H_
+#define ODP_ABI_CRYPTO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_crypto_compl_t;
+
+/** @ingroup odp_crypto
+ * @{
+ */
+
+#define ODP_CRYPTO_SESSION_INVALID (0xffffffffffffffffULL)
+
+typedef uint64_t odp_crypto_session_t;
+typedef _odp_abi_crypto_compl_t *odp_crypto_compl_t;
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/event.h b/include/odp/arch/default/api/abi/event.h
new file mode 100644
index 000000000..4f6596b1b
--- /dev/null
+++ b/include/odp/arch/default/api/abi/event.h
@@ -0,0 +1,42 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_EVENT_H_
+#define ODP_ABI_EVENT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_event_t;
+
+/** @ingroup odp_event
+ * @{
+ */
+
+typedef _odp_abi_event_t *odp_event_t;
+
+#define ODP_EVENT_INVALID ((odp_event_t)0xffffffff)
+
+typedef enum odp_event_type_t {
+ ODP_EVENT_BUFFER = 1,
+ ODP_EVENT_PACKET = 2,
+ ODP_EVENT_TIMEOUT = 3,
+ ODP_EVENT_CRYPTO_COMPL = 4
+} odp_event_type_t;
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/packet.h b/include/odp/arch/default/api/abi/packet.h
new file mode 100644
index 000000000..60a41b80b
--- /dev/null
+++ b/include/odp/arch/default/api/abi/packet.h
@@ -0,0 +1,47 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_PACKET_H_
+#define ODP_ABI_PACKET_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_packet_t;
+
+/** @ingroup odp_packet
+ * @{
+ */
+
+typedef _odp_abi_packet_t *odp_packet_t;
+typedef uint8_t odp_packet_seg_t;
+
+#define ODP_PACKET_INVALID ((odp_packet_t)0xffffffff)
+#define ODP_PACKET_SEG_INVALID ((odp_packet_seg_t)-1)
+#define ODP_PACKET_OFFSET_INVALID (0x0fffffff)
+
+typedef enum {
+ ODP_PACKET_GREEN = 0,
+ ODP_PACKET_YELLOW = 1,
+ ODP_PACKET_RED = 2,
+ ODP_PACKET_ALL_COLORS = 3,
+} odp_packet_color_t;
+
+#define ODP_NUM_PACKET_COLORS 3
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/pool.h b/include/odp/arch/default/api/abi/pool.h
new file mode 100644
index 000000000..4637d19fe
--- /dev/null
+++ b/include/odp/arch/default/api/abi/pool.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_POOL_H_
+#define ODP_ABI_POOL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/api/abi/event.h>
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_pool_t;
+
+/** @ingroup odp_pool
+ * @{
+ */
+
+typedef _odp_abi_pool_t *odp_pool_t;
+
+#define ODP_POOL_INVALID ((odp_pool_t)0xffffffff)
+
+#define ODP_POOL_NAME_LEN 32
+
+typedef enum odp_pool_type_t {
+ ODP_POOL_BUFFER = ODP_EVENT_BUFFER,
+ ODP_POOL_PACKET = ODP_EVENT_PACKET,
+ ODP_POOL_TIMEOUT = ODP_EVENT_TIMEOUT
+} odp_pool_type_t;
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/queue.h b/include/odp/arch/default/api/abi/queue.h
new file mode 100644
index 000000000..378b069ce
--- /dev/null
+++ b/include/odp/arch/default/api/abi/queue.h
@@ -0,0 +1,35 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_QUEUE_H_
+#define ODP_ABI_QUEUE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_queue_t;
+
+/** @ingroup odp_queue
+ * @{
+ */
+
+typedef _odp_abi_queue_t *odp_queue_t;
+
+#define ODP_QUEUE_INVALID ((odp_queue_t)0)
+
+#define ODP_QUEUE_NAME_LEN 32
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/default/api/abi/shared_memory.h b/include/odp/arch/default/api/abi/shared_memory.h
new file mode 100644
index 000000000..5805f957f
--- /dev/null
+++ b/include/odp/arch/default/api/abi/shared_memory.h
@@ -0,0 +1,35 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_ABI_SHM_H_
+#define ODP_ABI_SHM_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @internal Dummy type for strong typing */
+typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_shm_t;
+
+/** @ingroup odp_shared_memory
+ * @{
+ */
+
+typedef _odp_abi_shm_t *odp_shm_t;
+
+#define ODP_SHM_INVALID ((odp_shm_t)0)
+#define ODP_SHM_NULL ODP_SHM_INVALID
+#define ODP_SHM_NAME_LEN 32
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/buffer.h b/include/odp/arch/mips64-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/classification.h b/include/odp/arch/mips64-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/crypto.h b/include/odp/arch/mips64-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/event.h b/include/odp/arch/mips64-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/packet.h b/include/odp/arch/mips64-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/pool.h b/include/odp/arch/mips64-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/queue.h b/include/odp/arch/mips64-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/mips64-linux/odp/api/abi/shared_memory.h b/include/odp/arch/mips64-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/mips64-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/buffer.h b/include/odp/arch/power64-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/classification.h b/include/odp/arch/power64-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/crypto.h b/include/odp/arch/power64-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/event.h b/include/odp/arch/power64-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/packet.h b/include/odp/arch/power64-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/pool.h b/include/odp/arch/power64-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/queue.h b/include/odp/arch/power64-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/power64-linux/odp/api/abi/shared_memory.h b/include/odp/arch/power64-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/power64-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/buffer.h b/include/odp/arch/x86_32-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/classification.h b/include/odp/arch/x86_32-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/crypto.h b/include/odp/arch/x86_32-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/event.h b/include/odp/arch/x86_32-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/packet.h b/include/odp/arch/x86_32-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/pool.h b/include/odp/arch/x86_32-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/queue.h b/include/odp/arch/x86_32-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/x86_32-linux/odp/api/abi/shared_memory.h b/include/odp/arch/x86_32-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/x86_32-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/buffer.h b/include/odp/arch/x86_64-linux/odp/api/abi/buffer.h
new file mode 100644
index 000000000..d9c31930d
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/buffer.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/buffer.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/classification.h b/include/odp/arch/x86_64-linux/odp/api/abi/classification.h
new file mode 100644
index 000000000..d48a4733f
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/classification.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/classification.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/crypto.h b/include/odp/arch/x86_64-linux/odp/api/abi/crypto.h
new file mode 100644
index 000000000..9a9d2dc1b
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/crypto.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/crypto.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/event.h b/include/odp/arch/x86_64-linux/odp/api/abi/event.h
new file mode 100644
index 000000000..5d2ac75e7
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/event.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/event.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/packet.h b/include/odp/arch/x86_64-linux/odp/api/abi/packet.h
new file mode 100644
index 000000000..f44cb5365
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/packet.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/packet.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/pool.h b/include/odp/arch/x86_64-linux/odp/api/abi/pool.h
new file mode 100644
index 000000000..b354afbf7
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/pool.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/pool.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/queue.h b/include/odp/arch/x86_64-linux/odp/api/abi/queue.h
new file mode 100644
index 000000000..6027cee2f
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/queue.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/queue.h>
diff --git a/include/odp/arch/x86_64-linux/odp/api/abi/shared_memory.h b/include/odp/arch/x86_64-linux/odp/api/abi/shared_memory.h
new file mode 100644
index 000000000..d20367859
--- /dev/null
+++ b/include/odp/arch/x86_64-linux/odp/api/abi/shared_memory.h
@@ -0,0 +1,7 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/arch/default/api/abi/shared_memory.h>
diff --git a/pkgconfig/libodphelper-linux.pc.in b/pkgconfig/libodphelper-linux-generic.pc.in
index 3987f4ce4..cab7be2dd 100644
--- a/pkgconfig/libodphelper-linux.pc.in
+++ b/pkgconfig/libodphelper-linux-generic.pc.in
@@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
-Name: libodphelper-linux
+Name: libodphelper-linux-generic
Description: Helper for the ODP packet processing engine
Version: @PKGCONFIG_VERSION@
-Libs: -L${libdir} -lodphelper-linux
+Libs: -L${libdir} -lodphelper-linux-generic
Libs.private:
Cflags: -I${includedir}
diff --git a/platform/Makefile.inc b/platform/Makefile.inc
index de94dc4d3..e40a14f04 100644
--- a/platform/Makefile.inc
+++ b/platform/Makefile.inc
@@ -60,6 +60,28 @@ odpapispecinclude_HEADERS = \
$(top_builddir)/include/odp/api/spec/version.h \
$(top_srcdir)/include/odp/api/spec/traffic_mngr.h
+odpapiabidefaultincludedir= $(includedir)/odp/arch/default/api/abi
+odpapiabidefaultinclude_HEADERS = \
+ $(top_srcdir)/include/odp/arch/default/api/abi/buffer.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/classification.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/crypto.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/event.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/packet.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/pool.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/queue.h \
+ $(top_srcdir)/include/odp/arch/default/api/abi/shared_memory.h
+
+odpapiabiarchincludedir= $(includedir)/odp/arch/@ARCH_ABI@/odp/api/abi
+odpapiabiarchinclude_HEADERS = \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/buffer.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/classification.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/crypto.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/event.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/packet.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/pool.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/queue.h \
+ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/shared_memory.h
+
EXTRA_DIST = \
arch/arm/odp/api/cpu_arch.h \
arch/arm/odp_cpu_arch.c \
diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index 0bc98427c..682bac6c1 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -6,6 +6,7 @@ include $(top_srcdir)/platform/@with_platform@/Makefile.inc
AM_CFLAGS += -I$(srcdir)/include
AM_CFLAGS += -I$(top_srcdir)/include
+AM_CFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@
AM_CFLAGS += -I$(top_builddir)/include
AM_CFLAGS += -Iinclude
@@ -77,6 +78,10 @@ odpapiplatinclude_HEADERS = \
$(srcdir)/include/odp/api/plat/crypto_types.h \
$(srcdir)/include/odp/api/plat/event_types.h \
$(srcdir)/include/odp/api/plat/init_types.h \
+ $(srcdir)/include/odp/api/plat/packet_flag_inlines.h \
+ $(srcdir)/include/odp/api/plat/packet_flag_inlines_api.h \
+ $(srcdir)/include/odp/api/plat/packet_inlines.h \
+ $(srcdir)/include/odp/api/plat/packet_inlines_api.h \
$(srcdir)/include/odp/api/plat/packet_types.h \
$(srcdir)/include/odp/api/plat/packet_io_types.h \
$(srcdir)/include/odp/api/plat/pool_types.h \
@@ -93,6 +98,7 @@ odpapiplatinclude_HEADERS = \
$(srcdir)/include/odp/api/plat/thread_types.h \
$(srcdir)/include/odp/api/plat/thrmask_types.h \
$(srcdir)/include/odp/api/plat/ticketlock_inlines.h \
+ $(srcdir)/include/odp/api/plat/ticketlock_inlines_api.h \
$(srcdir)/include/odp/api/plat/ticketlock_types.h \
$(srcdir)/include/odp/api/plat/time_types.h \
$(srcdir)/include/odp/api/plat/timer_types.h \
@@ -110,6 +116,7 @@ noinst_HEADERS = \
${srcdir}/include/odp_align_internal.h \
${srcdir}/include/odp_atomic_internal.h \
${srcdir}/include/odp_buffer_inlines.h \
+ ${srcdir}/include/odp_bitmap_internal.h \
${srcdir}/include/odp_buffer_internal.h \
${srcdir}/include/odp_classification_datamodel.h \
${srcdir}/include/odp_classification_inlines.h \
@@ -153,6 +160,7 @@ __LIB__libodp_linux_la_SOURCES = \
_ishmphy.c \
odp_atomic.c \
odp_barrier.c \
+ odp_bitmap.c \
odp_buffer.c \
odp_byteorder.c \
odp_classification.c \
@@ -189,6 +197,7 @@ __LIB__libodp_linux_la_SOURCES = \
odp_schedule.c \
odp_schedule_if.c \
odp_schedule_sp.c \
+ odp_schedule_iquery.c \
odp_shared_memory.c \
odp_sorted_list.c \
odp_spinlock.c \
@@ -211,3 +220,13 @@ __LIB__libodp_linux_la_SOURCES = \
if HAVE_PCAP
__LIB__libodp_linux_la_SOURCES += pktio/pcap.c
endif
+
+# Create symlink for ABI header files. Application does not need to use the arch
+# specific include path for installed files.
+install-data-hook:
+ if [ -h $(prefix)/include/odp/api/abi ]; then \
+ : \
+ else \
+ $(LN_S) -rf $(prefix)/include/odp/arch/@ARCH_ABI@/odp/api/abi \
+ $(prefix)/include/odp/api/abi; \
+ fi
diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_ishm.c
index 3797f20e3..c1efd7d23 100644
--- a/platform/linux-generic/_ishm.c
+++ b/platform/linux-generic/_ishm.c
@@ -818,7 +818,14 @@ int _odp_ishm_reserve(const char *name, uint64_t size, int fd,
/* If a file descriptor is provided, get the real size and map: */
if (fd >= 0) {
- fstat(fd, &statbuf);
+ if (fstat(fd, &statbuf) < 0) {
+ close(fd);
+ odp_spinlock_unlock(&ishm_tbl->lock);
+ ODP_ERR("_ishm_reserve failed (fstat failed: %s).\n",
+ strerror(errno));
+ __odp_errno = errno;
+ return -1;
+ }
len = statbuf.st_size;
/* note that the huge page flag is meningless here as huge
* page is determined by the provided file descriptor: */
diff --git a/platform/linux-generic/_ishmphy.c b/platform/linux-generic/_ishmphy.c
index 2b2d10073..d519af60c 100644
--- a/platform/linux-generic/_ishmphy.c
+++ b/platform/linux-generic/_ishmphy.c
@@ -94,7 +94,7 @@ int _odp_ishmphy_unbook_va(void)
void *_odp_ishmphy_map(int fd, void *start, uint64_t size,
int flags)
{
- void *mapped_addr;
+ void *mapped_addr_tmp, *mapped_addr;
int mmap_flags = 0;
if (flags & _ODP_ISHM_SINGLE_VA) {
@@ -103,15 +103,37 @@ void *_odp_ishmphy_map(int fd, void *start, uint64_t size,
return NULL;
}
/* maps over fragment of reserved VA: */
- mapped_addr = mmap(start, size, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FIXED | mmap_flags, fd, 0);
- /* if mapping fails, re-block the space we tried to take
- * as it seems a mapping failure still affect what was there??*/
- if (mapped_addr == MAP_FAILED) {
- mmap_flags = MAP_SHARED | MAP_FIXED |
- MAP_ANONYMOUS | MAP_NORESERVE;
- mmap(start, size, PROT_NONE, mmap_flags, -1, 0);
- mprotect(start, size, PROT_NONE);
+ /* first, try a normal map. If that works, remap it where it
+ * should (on the prereverved space), and remove the initial
+ * normal mapping:
+ * This is because it turned out that if a mapping fails
+ * on a the prereserved virtual address space, then
+ * the prereserved address space which was tried to be mapped
+ * on becomes available to the kernel again! This was not
+ * according to expectations: the assumption was that if a
+ * mapping fails, the system should remain unchanged, but this
+ * is obvioulsy not true (at least for huge pages when
+ * exhausted).
+ * So the strategy is to first map at a non reserved place
+ * (which can then be freed and returned to the kernel on
+ * failure) and peform a new map to the prereserved space on
+ * success (which is then guaranteed to work).
+ * The initial free maping can then be removed.
+ */
+ mapped_addr = MAP_FAILED;
+ mapped_addr_tmp = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED | mmap_flags, fd, 0);
+ if (mapped_addr_tmp != MAP_FAILED) {
+ /* If OK, do new map at right fixed location... */
+ mapped_addr = mmap(start,
+ size, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_FIXED | mmap_flags,
+ fd, 0);
+ if (mapped_addr != start)
+ ODP_ERR("new map failed:%s\n", strerror(errno));
+ /* ... and remove initial mapping: */
+ if (munmap(mapped_addr_tmp, size))
+ ODP_ERR("munmap failed:%s\n", strerror(errno));
}
} else {
/* just do a new mapping in the VA space: */
diff --git a/platform/linux-generic/arch/arm/odp/api/cpu_arch.h b/platform/linux-generic/arch/arm/odp/api/cpu_arch.h
index 22b1da2dd..7c75a690e 100644
--- a/platform/linux-generic/arch/arm/odp/api/cpu_arch.h
+++ b/platform/linux-generic/arch/arm/odp/api/cpu_arch.h
@@ -15,6 +15,12 @@ extern "C" {
static inline void odp_cpu_pause(void)
{
+ /* YIELD hints the CPU to switch to another thread if possible
+ * and executes as a NOP otherwise.
+ * ISB flushes the pipeline, then restarts. This is guaranteed to
+ * stall the CPU a number of cycles.
+ */
+ __asm volatile("isb" ::: "memory");
}
#ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp/api/classification.h b/platform/linux-generic/include/odp/api/classification.h
index 0bec38be8..2ba6eb0eb 100644
--- a/platform/linux-generic/include/odp/api/classification.h
+++ b/platform/linux-generic/include/odp/api/classification.h
@@ -10,8 +10,8 @@
* ODP classification descriptor
*/
-#ifndef ODP_PLAT_CLASSIFY_H_
-#define ODP_PLAT_CLASSIFY_H_
+#ifndef ODP_PLAT_CLASSIFICATION_H_
+#define ODP_PLAT_CLASSIFICATION_H_
#ifdef __cplusplus
extern "C" {
@@ -28,6 +28,11 @@ extern "C" {
* @{
*/
+/* REMOVE THESE FROM API SPEC. Typedefs needed only for suppressing Doxygen
+ * warning. */
+typedef void odp_flowsig_t;
+typedef void odp_cos_flow_set_t;
+
/**
* @}
*/
diff --git a/platform/linux-generic/include/odp/api/packet.h b/platform/linux-generic/include/odp/api/packet.h
index ebbeaf1b9..eff408035 100644
--- a/platform/linux-generic/include/odp/api/packet.h
+++ b/platform/linux-generic/include/odp/api/packet.h
@@ -24,13 +24,10 @@ extern "C" {
#include <odp/api/plat/buffer_types.h>
#include <odp/api/plat/pool_types.h>
-/** @ingroup odp_packet
- * @{
- */
-
-/**
- * @}
- */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+#include <odp/api/plat/packet_inlines.h>
+#endif
#include <odp/api/spec/packet.h>
diff --git a/platform/linux-generic/include/odp/api/packet_flags.h b/platform/linux-generic/include/odp/api/packet_flags.h
index 467f5b1d7..1e55af823 100644
--- a/platform/linux-generic/include/odp/api/packet_flags.h
+++ b/platform/linux-generic/include/odp/api/packet_flags.h
@@ -17,13 +17,10 @@
extern "C" {
#endif
-/** @ingroup odp_packet
- * @{
- */
-
-/**
- * @}
- */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+#include <odp/api/plat/packet_flag_inlines.h>
+#endif
#include <odp/api/spec/packet_flags.h>
diff --git a/platform/linux-generic/include/odp/api/plat/atomic_inlines.h b/platform/linux-generic/include/odp/api/plat/atomic_inlines.h
index 4471f2ecb..03b2884fd 100644
--- a/platform/linux-generic/include/odp/api/plat/atomic_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/atomic_inlines.h
@@ -13,63 +13,65 @@
#ifndef _ODP_PLAT_ATOMIC_INLINES_H_
#define _ODP_PLAT_ATOMIC_INLINES_H_
-_STATIC void odp_atomic_init_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_init_u32(odp_atomic_u32_t *atom, uint32_t val)
{
__atomic_store_n(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_load_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE uint32_t odp_atomic_load_u32(odp_atomic_u32_t *atom)
{
return __atomic_load_n(&atom->v, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_store_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_store_u32(odp_atomic_u32_t *atom, uint32_t val)
{
__atomic_store_n(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_fetch_add_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE uint32_t odp_atomic_fetch_add_u32(odp_atomic_u32_t *atom,
+ uint32_t val)
{
return __atomic_fetch_add(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_add_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_add_u32(odp_atomic_u32_t *atom, uint32_t val)
{
(void)__atomic_fetch_add(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_fetch_sub_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE uint32_t odp_atomic_fetch_sub_u32(odp_atomic_u32_t *atom,
+ uint32_t val)
{
return __atomic_fetch_sub(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_sub_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_sub_u32(odp_atomic_u32_t *atom, uint32_t val)
{
(void)__atomic_fetch_sub(&atom->v, val, __ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_fetch_inc_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE uint32_t odp_atomic_fetch_inc_u32(odp_atomic_u32_t *atom)
{
return __atomic_fetch_add(&atom->v, 1, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_inc_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE void odp_atomic_inc_u32(odp_atomic_u32_t *atom)
{
(void)__atomic_fetch_add(&atom->v, 1, __ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_fetch_dec_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE uint32_t odp_atomic_fetch_dec_u32(odp_atomic_u32_t *atom)
{
return __atomic_fetch_sub(&atom->v, 1, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_dec_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE void odp_atomic_dec_u32(odp_atomic_u32_t *atom)
{
(void)__atomic_fetch_sub(&atom->v, 1, __ATOMIC_RELAXED);
}
-_STATIC int odp_atomic_cas_u32(odp_atomic_u32_t *atom, uint32_t *old_val,
- uint32_t new_val)
+_ODP_INLINE int odp_atomic_cas_u32(odp_atomic_u32_t *atom, uint32_t *old_val,
+ uint32_t new_val)
{
return __atomic_compare_exchange_n(&atom->v, old_val, new_val,
0 /* strong */,
@@ -77,12 +79,13 @@ _STATIC int odp_atomic_cas_u32(odp_atomic_u32_t *atom, uint32_t *old_val,
__ATOMIC_RELAXED);
}
-_STATIC uint32_t odp_atomic_xchg_u32(odp_atomic_u32_t *atom, uint32_t new_val)
+_ODP_INLINE uint32_t odp_atomic_xchg_u32(odp_atomic_u32_t *atom,
+ uint32_t new_val)
{
return __atomic_exchange_n(&atom->v, new_val, __ATOMIC_RELAXED);
}
-_STATIC void odp_atomic_max_u32(odp_atomic_u32_t *atom, uint32_t new_max)
+_ODP_INLINE void odp_atomic_max_u32(odp_atomic_u32_t *atom, uint32_t new_max)
{
uint32_t old_val;
@@ -94,7 +97,7 @@ _STATIC void odp_atomic_max_u32(odp_atomic_u32_t *atom, uint32_t new_max)
}
}
-_STATIC void odp_atomic_min_u32(odp_atomic_u32_t *atom, uint32_t new_min)
+_ODP_INLINE void odp_atomic_min_u32(odp_atomic_u32_t *atom, uint32_t new_min)
{
uint32_t old_val;
@@ -106,7 +109,7 @@ _STATIC void odp_atomic_min_u32(odp_atomic_u32_t *atom, uint32_t new_min)
}
}
-_STATIC void odp_atomic_init_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_init_u64(odp_atomic_u64_t *atom, uint64_t val)
{
atom->v = val;
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
@@ -114,7 +117,7 @@ _STATIC void odp_atomic_init_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC uint64_t odp_atomic_load_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE uint64_t odp_atomic_load_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, (void)0);
@@ -123,7 +126,7 @@ _STATIC uint64_t odp_atomic_load_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC void odp_atomic_store_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_store_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v = val);
@@ -132,7 +135,8 @@ _STATIC void odp_atomic_store_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC uint64_t odp_atomic_fetch_add_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE uint64_t odp_atomic_fetch_add_u64(odp_atomic_u64_t *atom,
+ uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, atom->v += val);
@@ -141,7 +145,7 @@ _STATIC uint64_t odp_atomic_fetch_add_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC void odp_atomic_add_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_add_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v += val);
@@ -150,7 +154,8 @@ _STATIC void odp_atomic_add_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC uint64_t odp_atomic_fetch_sub_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE uint64_t odp_atomic_fetch_sub_u64(odp_atomic_u64_t *atom,
+ uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, atom->v -= val);
@@ -159,7 +164,7 @@ _STATIC uint64_t odp_atomic_fetch_sub_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC void odp_atomic_sub_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_sub_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v -= val);
@@ -168,7 +173,7 @@ _STATIC void odp_atomic_sub_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC uint64_t odp_atomic_fetch_inc_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE uint64_t odp_atomic_fetch_inc_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, atom->v++);
@@ -177,7 +182,7 @@ _STATIC uint64_t odp_atomic_fetch_inc_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC void odp_atomic_inc_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE void odp_atomic_inc_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v++);
@@ -186,7 +191,7 @@ _STATIC void odp_atomic_inc_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC uint64_t odp_atomic_fetch_dec_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE uint64_t odp_atomic_fetch_dec_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, atom->v--);
@@ -195,7 +200,7 @@ _STATIC uint64_t odp_atomic_fetch_dec_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC void odp_atomic_dec_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE void odp_atomic_dec_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v--);
@@ -204,8 +209,8 @@ _STATIC void odp_atomic_dec_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC int odp_atomic_cas_u64(odp_atomic_u64_t *atom, uint64_t *old_val,
- uint64_t new_val)
+_ODP_INLINE int odp_atomic_cas_u64(odp_atomic_u64_t *atom, uint64_t *old_val,
+ uint64_t new_val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
int ret;
@@ -219,7 +224,8 @@ _STATIC int odp_atomic_cas_u64(odp_atomic_u64_t *atom, uint64_t *old_val,
#endif
}
-_STATIC uint64_t odp_atomic_xchg_u64(odp_atomic_u64_t *atom, uint64_t new_val)
+_ODP_INLINE uint64_t odp_atomic_xchg_u64(odp_atomic_u64_t *atom,
+ uint64_t new_val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, atom->v = new_val);
@@ -228,7 +234,7 @@ _STATIC uint64_t odp_atomic_xchg_u64(odp_atomic_u64_t *atom, uint64_t new_val)
#endif
}
-_STATIC void odp_atomic_max_u64(odp_atomic_u64_t *atom, uint64_t new_max)
+_ODP_INLINE void odp_atomic_max_u64(odp_atomic_u64_t *atom, uint64_t new_max)
{
uint64_t old_val;
@@ -240,7 +246,7 @@ _STATIC void odp_atomic_max_u64(odp_atomic_u64_t *atom, uint64_t new_max)
}
}
-_STATIC void odp_atomic_min_u64(odp_atomic_u64_t *atom, uint64_t new_min)
+_ODP_INLINE void odp_atomic_min_u64(odp_atomic_u64_t *atom, uint64_t new_min)
{
uint64_t old_val;
@@ -252,28 +258,28 @@ _STATIC void odp_atomic_min_u64(odp_atomic_u64_t *atom, uint64_t new_min)
}
}
-_STATIC uint32_t odp_atomic_load_acq_u32(odp_atomic_u32_t *atom)
+_ODP_INLINE uint32_t odp_atomic_load_acq_u32(odp_atomic_u32_t *atom)
{
return __atomic_load_n(&atom->v, __ATOMIC_ACQUIRE);
}
-_STATIC void odp_atomic_store_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_store_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
{
__atomic_store_n(&atom->v, val, __ATOMIC_RELEASE);
}
-_STATIC void odp_atomic_add_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_add_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
{
(void)__atomic_fetch_add(&atom->v, val, __ATOMIC_RELEASE);
}
-_STATIC void odp_atomic_sub_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
+_ODP_INLINE void odp_atomic_sub_rel_u32(odp_atomic_u32_t *atom, uint32_t val)
{
(void)__atomic_fetch_sub(&atom->v, val, __ATOMIC_RELEASE);
}
-_STATIC int odp_atomic_cas_acq_u32(odp_atomic_u32_t *atom,
- uint32_t *old_val, uint32_t new_val)
+_ODP_INLINE int odp_atomic_cas_acq_u32(odp_atomic_u32_t *atom,
+ uint32_t *old_val, uint32_t new_val)
{
return __atomic_compare_exchange_n(&atom->v, old_val, new_val,
0 /* strong */,
@@ -281,8 +287,8 @@ _STATIC int odp_atomic_cas_acq_u32(odp_atomic_u32_t *atom,
__ATOMIC_RELAXED);
}
-_STATIC int odp_atomic_cas_rel_u32(odp_atomic_u32_t *atom,
- uint32_t *old_val, uint32_t new_val)
+_ODP_INLINE int odp_atomic_cas_rel_u32(odp_atomic_u32_t *atom,
+ uint32_t *old_val, uint32_t new_val)
{
return __atomic_compare_exchange_n(&atom->v, old_val, new_val,
0 /* strong */,
@@ -290,9 +296,9 @@ _STATIC int odp_atomic_cas_rel_u32(odp_atomic_u32_t *atom,
__ATOMIC_RELAXED);
}
-_STATIC int odp_atomic_cas_acq_rel_u32(odp_atomic_u32_t *atom,
- uint32_t *old_val,
- uint32_t new_val)
+_ODP_INLINE int odp_atomic_cas_acq_rel_u32(odp_atomic_u32_t *atom,
+ uint32_t *old_val,
+ uint32_t new_val)
{
return __atomic_compare_exchange_n(&atom->v, old_val, new_val,
0 /* strong */,
@@ -300,7 +306,7 @@ _STATIC int odp_atomic_cas_acq_rel_u32(odp_atomic_u32_t *atom,
__ATOMIC_RELAXED);
}
-_STATIC uint64_t odp_atomic_load_acq_u64(odp_atomic_u64_t *atom)
+_ODP_INLINE uint64_t odp_atomic_load_acq_u64(odp_atomic_u64_t *atom)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
return ATOMIC_OP(atom, (void)0);
@@ -309,7 +315,7 @@ _STATIC uint64_t odp_atomic_load_acq_u64(odp_atomic_u64_t *atom)
#endif
}
-_STATIC void odp_atomic_store_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_store_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v = val);
@@ -318,7 +324,7 @@ _STATIC void odp_atomic_store_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC void odp_atomic_add_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_add_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v += val);
@@ -327,7 +333,7 @@ _STATIC void odp_atomic_add_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC void odp_atomic_sub_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
+_ODP_INLINE void odp_atomic_sub_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
(void)ATOMIC_OP(atom, atom->v -= val);
@@ -336,8 +342,8 @@ _STATIC void odp_atomic_sub_rel_u64(odp_atomic_u64_t *atom, uint64_t val)
#endif
}
-_STATIC int odp_atomic_cas_acq_u64(odp_atomic_u64_t *atom,
- uint64_t *old_val, uint64_t new_val)
+_ODP_INLINE int odp_atomic_cas_acq_u64(odp_atomic_u64_t *atom,
+ uint64_t *old_val, uint64_t new_val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
int ret;
@@ -351,8 +357,8 @@ _STATIC int odp_atomic_cas_acq_u64(odp_atomic_u64_t *atom,
#endif
}
-_STATIC int odp_atomic_cas_rel_u64(odp_atomic_u64_t *atom,
- uint64_t *old_val, uint64_t new_val)
+_ODP_INLINE int odp_atomic_cas_rel_u64(odp_atomic_u64_t *atom,
+ uint64_t *old_val, uint64_t new_val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
int ret;
@@ -366,9 +372,9 @@ _STATIC int odp_atomic_cas_rel_u64(odp_atomic_u64_t *atom,
#endif
}
-_STATIC int odp_atomic_cas_acq_rel_u64(odp_atomic_u64_t *atom,
- uint64_t *old_val,
- uint64_t new_val)
+_ODP_INLINE int odp_atomic_cas_acq_rel_u64(odp_atomic_u64_t *atom,
+ uint64_t *old_val,
+ uint64_t new_val)
{
#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
int ret;
diff --git a/platform/linux-generic/include/odp/api/plat/buffer_types.h b/platform/linux-generic/include/odp/api/plat/buffer_types.h
index 344121b61..809768f3d 100644
--- a/platform/linux-generic/include/odp/api/plat/buffer_types.h
+++ b/platform/linux-generic/include/odp/api/plat/buffer_types.h
@@ -17,26 +17,31 @@
extern "C" {
#endif
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/buffer.h>
+#else
+
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** ODP buffer */
+/** @ingroup odp_buffer
+ * @{
+ */
+
typedef ODP_HANDLE_T(odp_buffer_t);
-/** Invalid buffer */
#define ODP_BUFFER_INVALID _odp_cast_scalar(odp_buffer_t, 0xffffffff)
-/** ODP buffer segment */
typedef ODP_HANDLE_T(odp_buffer_seg_t);
-/** Invalid segment */
#define ODP_SEGMENT_INVALID ((odp_buffer_seg_t)ODP_BUFFER_INVALID)
-/** Get printable format of odp_buffer_t */
-static inline uint64_t odp_buffer_to_u64(odp_buffer_t hdl)
-{
- return _odp_pri(hdl);
-}
+/**
+ * @}
+ */
+
+#endif
#ifdef __cplusplus
}
diff --git a/platform/linux-generic/include/odp/api/plat/byteorder_inlines.h b/platform/linux-generic/include/odp/api/plat/byteorder_inlines.h
index c91a3b189..e7818904b 100644
--- a/platform/linux-generic/include/odp/api/plat/byteorder_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/byteorder_inlines.h
@@ -21,7 +21,7 @@ extern "C" {
* @{
*/
-_STATIC uint16_t odp_be_to_cpu_16(odp_u16be_t be16)
+_ODP_INLINE uint16_t odp_be_to_cpu_16(odp_u16be_t be16)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return __odp_builtin_bswap16((__odp_force uint16_t)be16);
@@ -30,7 +30,7 @@ _STATIC uint16_t odp_be_to_cpu_16(odp_u16be_t be16)
#endif
}
-_STATIC uint32_t odp_be_to_cpu_32(odp_u32be_t be32)
+_ODP_INLINE uint32_t odp_be_to_cpu_32(odp_u32be_t be32)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return __builtin_bswap32((__odp_force uint32_t)be32);
@@ -39,7 +39,7 @@ _STATIC uint32_t odp_be_to_cpu_32(odp_u32be_t be32)
#endif
}
-_STATIC uint64_t odp_be_to_cpu_64(odp_u64be_t be64)
+_ODP_INLINE uint64_t odp_be_to_cpu_64(odp_u64be_t be64)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return __builtin_bswap64((__odp_force uint64_t)be64);
@@ -48,7 +48,7 @@ _STATIC uint64_t odp_be_to_cpu_64(odp_u64be_t be64)
#endif
}
-_STATIC odp_u16be_t odp_cpu_to_be_16(uint16_t cpu16)
+_ODP_INLINE odp_u16be_t odp_cpu_to_be_16(uint16_t cpu16)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u16be_t)__odp_builtin_bswap16(cpu16);
@@ -57,7 +57,7 @@ _STATIC odp_u16be_t odp_cpu_to_be_16(uint16_t cpu16)
#endif
}
-_STATIC odp_u32be_t odp_cpu_to_be_32(uint32_t cpu32)
+_ODP_INLINE odp_u32be_t odp_cpu_to_be_32(uint32_t cpu32)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u32be_t)__builtin_bswap32(cpu32);
@@ -66,7 +66,7 @@ _STATIC odp_u32be_t odp_cpu_to_be_32(uint32_t cpu32)
#endif
}
-_STATIC odp_u64be_t odp_cpu_to_be_64(uint64_t cpu64)
+_ODP_INLINE odp_u64be_t odp_cpu_to_be_64(uint64_t cpu64)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u64be_t)__builtin_bswap64(cpu64);
@@ -75,7 +75,7 @@ _STATIC odp_u64be_t odp_cpu_to_be_64(uint64_t cpu64)
#endif
}
-_STATIC uint16_t odp_le_to_cpu_16(odp_u16le_t le16)
+_ODP_INLINE uint16_t odp_le_to_cpu_16(odp_u16le_t le16)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force uint16_t)le16;
@@ -84,7 +84,7 @@ _STATIC uint16_t odp_le_to_cpu_16(odp_u16le_t le16)
#endif
}
-_STATIC uint32_t odp_le_to_cpu_32(odp_u32le_t le32)
+_ODP_INLINE uint32_t odp_le_to_cpu_32(odp_u32le_t le32)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force uint32_t)le32;
@@ -93,7 +93,7 @@ _STATIC uint32_t odp_le_to_cpu_32(odp_u32le_t le32)
#endif
}
-_STATIC uint64_t odp_le_to_cpu_64(odp_u64le_t le64)
+_ODP_INLINE uint64_t odp_le_to_cpu_64(odp_u64le_t le64)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force uint64_t)le64;
@@ -102,7 +102,7 @@ _STATIC uint64_t odp_le_to_cpu_64(odp_u64le_t le64)
#endif
}
-_STATIC odp_u16le_t odp_cpu_to_le_16(uint16_t cpu16)
+_ODP_INLINE odp_u16le_t odp_cpu_to_le_16(uint16_t cpu16)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u16le_t)cpu16;
@@ -111,7 +111,7 @@ _STATIC odp_u16le_t odp_cpu_to_le_16(uint16_t cpu16)
#endif
}
-_STATIC odp_u32le_t odp_cpu_to_le_32(uint32_t cpu32)
+_ODP_INLINE odp_u32le_t odp_cpu_to_le_32(uint32_t cpu32)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u32le_t)cpu32;
@@ -120,7 +120,7 @@ _STATIC odp_u32le_t odp_cpu_to_le_32(uint32_t cpu32)
#endif
}
-_STATIC odp_u64le_t odp_cpu_to_le_64(uint64_t cpu64)
+_ODP_INLINE odp_u64le_t odp_cpu_to_le_64(uint64_t cpu64)
{
#if ODP_BYTE_ORDER == ODP_LITTLE_ENDIAN
return (__odp_force odp_u64le_t)cpu64;
diff --git a/platform/linux-generic/include/odp/api/plat/byteorder_types.h b/platform/linux-generic/include/odp/api/plat/byteorder_types.h
index 09235b539..20d52bf8f 100644
--- a/platform/linux-generic/include/odp/api/plat/byteorder_types.h
+++ b/platform/linux-generic/include/odp/api/plat/byteorder_types.h
@@ -4,7 +4,6 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-
/**
* @file
*
@@ -30,7 +29,6 @@ extern "C" {
#error __LITTLE_ENDIAN not defined!
#endif
-
/* for use with type checkers such as sparse */
#ifdef __CHECKER__
/** @internal bitwise attribute */
@@ -44,7 +42,6 @@ extern "C" {
#define __odp_force
#endif
-
/** @addtogroup odp_compiler_optim
* @{
*/
diff --git a/platform/linux-generic/include/odp/api/plat/classification_types.h b/platform/linux-generic/include/odp/api/plat/classification_types.h
index 2093f54ac..d210feb0c 100644
--- a/platform/linux-generic/include/odp/api/plat/classification_types.h
+++ b/platform/linux-generic/include/odp/api/plat/classification_types.h
@@ -10,46 +10,38 @@
* ODP classification descriptor
*/
-#ifndef ODP_CLASSIFY_TYPES_H_
-#define ODP_CLASSIFY_TYPES_H_
+#ifndef ODP_CLASSIFICATION_TYPES_H_
+#define ODP_CLASSIFICATION_TYPES_H_
#ifdef __cplusplus
extern "C" {
#endif
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/classification.h>
+#else
+
#include <odp/api/plat/strong_types.h>
-/** @addtogroup odp_classification
+/** @ingroup odp_classification
* @{
*/
typedef ODP_HANDLE_T(odp_cos_t);
-typedef ODP_HANDLE_T(odp_flowsig_t);
-
-#define ODP_COS_INVALID _odp_cast_scalar(odp_cos_t, ~0)
-#define ODP_COS_NAME_LEN 32
-
-typedef uint16_t odp_cos_flow_set_t;
+#define ODP_COS_INVALID _odp_cast_scalar(odp_cos_t, ~0)
typedef ODP_HANDLE_T(odp_pmr_t);
-#define ODP_PMR_INVAL _odp_cast_scalar(odp_pmr_t, ~0)
-
-/** Get printable format of odp_cos_t */
-static inline uint64_t odp_cos_to_u64(odp_cos_t hdl)
-{
- return _odp_pri(hdl);
-}
+#define ODP_PMR_INVAL _odp_cast_scalar(odp_pmr_t, ~0)
-/** Get printable format of odp_pmr_t */
-static inline uint64_t odp_pmr_to_u64(odp_pmr_t hdl)
-{
- return _odp_pri(hdl);
-}
+#define ODP_COS_NAME_LEN 32
/**
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/crypto_types.h b/platform/linux-generic/include/odp/api/plat/crypto_types.h
index 0cbbce8bd..2cc747eb2 100644
--- a/platform/linux-generic/include/odp/api/plat/crypto_types.h
+++ b/platform/linux-generic/include/odp/api/plat/crypto_types.h
@@ -18,7 +18,12 @@
extern "C" {
#endif
-/** @addtogroup odp_crypto
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/crypto.h>
+#else
+
+/** @ingroup odp_crypto
* @{
*/
@@ -27,22 +32,12 @@ extern "C" {
typedef uint64_t odp_crypto_session_t;
typedef ODP_HANDLE_T(odp_crypto_compl_t);
-/** Get printable format of odp_crypto_session_t */
-static inline uint64_t odp_crypto_session_to_u64(odp_crypto_session_t hdl)
-{
- return (uint64_t)hdl;
-}
-
-/** Get printable format of odp_crypto_compl_t_t */
-static inline uint64_t odp_crypto_compl_to_u64(odp_crypto_compl_t hdl)
-{
- return _odp_pri(hdl);
-}
-
/**
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/event_types.h b/platform/linux-generic/include/odp/api/plat/event_types.h
index 9ca0fb80f..a1aa0e452 100644
--- a/platform/linux-generic/include/odp/api/plat/event_types.h
+++ b/platform/linux-generic/include/odp/api/plat/event_types.h
@@ -18,11 +18,15 @@
extern "C" {
#endif
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/event.h>
+#else
+
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** @defgroup odp_event ODP EVENT
- * Operations on an event.
+/** @ingroup odp_event
* @{
*/
@@ -30,9 +34,6 @@ typedef ODP_HANDLE_T(odp_event_t);
#define ODP_EVENT_INVALID _odp_cast_scalar(odp_event_t, 0xffffffff)
-/**
- * Event types
- */
typedef enum odp_event_type_t {
ODP_EVENT_BUFFER = 1,
ODP_EVENT_PACKET = 2,
@@ -40,16 +41,12 @@ typedef enum odp_event_type_t {
ODP_EVENT_CRYPTO_COMPL = 4,
} odp_event_type_t;
-/** Get printable format of odp_event_t */
-static inline uint64_t odp_event_to_u64(odp_event_t hdl)
-{
- return _odp_pri(hdl);
-}
-
/**
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h
new file mode 100644
index 000000000..2de04c814
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h
@@ -0,0 +1,90 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_FLAG_INLINES_H_
+#define _ODP_PLAT_PACKET_FLAG_INLINES_H_
+
+#include <odp/api/plat/packet_types.h>
+#include <odp/api/hints.h>
+
+/** @internal Inline function offsets */
+extern const _odp_packet_inline_offset_t _odp_packet_inline;
+
+/** @internal Inline function @param pkt @return */
+static inline uint64_t _odp_packet_input_flags(odp_packet_t pkt)
+{
+ return *(uint64_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.input_flags);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_l2(odp_packet_t pkt)
+{
+ _odp_packet_input_flags_t flags;
+
+ flags.all = _odp_packet_input_flags(pkt);
+ return flags.l2;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_eth(odp_packet_t pkt)
+{
+ _odp_packet_input_flags_t flags;
+
+ flags.all = _odp_packet_input_flags(pkt);
+ return flags.eth;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_jumbo(odp_packet_t pkt)
+{
+ _odp_packet_input_flags_t flags;
+
+ flags.all = _odp_packet_input_flags(pkt);
+ return flags.jumbo;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_flow_hash(odp_packet_t pkt)
+{
+ _odp_packet_input_flags_t flags;
+
+ flags.all = _odp_packet_input_flags(pkt);
+ return flags.flow_hash;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_ts(odp_packet_t pkt)
+{
+ _odp_packet_input_flags_t flags;
+
+ flags.all = _odp_packet_input_flags(pkt);
+ return flags.timestamp;
+}
+
+/* Include inlined versions of API functions */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+
+/** @ingroup odp_packet
+ * @{
+ */
+
+#include <odp/api/plat/packet_flag_inlines_api.h>
+
+/**
+ * @}
+ */
+
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h
new file mode 100644
index 000000000..f4e143aa0
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h
@@ -0,0 +1,41 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_FLAG_INLINES_API_H_
+#define _ODP_PLAT_PACKET_FLAG_INLINES_API_H_
+
+_ODP_INLINE int odp_packet_has_l2(odp_packet_t pkt)
+{
+ return _odp_packet_has_l2(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_eth(odp_packet_t pkt)
+{
+ return _odp_packet_has_eth(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_jumbo(odp_packet_t pkt)
+{
+ return _odp_packet_has_jumbo(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_flow_hash(odp_packet_t pkt)
+{
+ return _odp_packet_has_flow_hash(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_ts(odp_packet_t pkt)
+{
+ return _odp_packet_has_ts(pkt);
+}
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_inlines.h b/platform/linux-generic/include/odp/api/plat/packet_inlines.h
new file mode 100644
index 000000000..eb36aa96d
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_inlines.h
@@ -0,0 +1,173 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_INLINES_H_
+#define _ODP_PLAT_PACKET_INLINES_H_
+
+#include <odp/api/plat/packet_types.h>
+#include <odp/api/pool.h>
+#include <odp/api/packet_io.h>
+#include <odp/api/hints.h>
+
+/** @internal Inline function offsets */
+extern const _odp_packet_inline_offset_t _odp_packet_inline;
+
+/** @internal Inline function @param pkt @return */
+static inline void *_odp_packet_data(odp_packet_t pkt)
+{
+ return *(void **)(uintptr_t)((uint8_t *)pkt + _odp_packet_inline.data);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_seg_len(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.seg_len);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_len(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.frame_len);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_headroom(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.headroom);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_tailroom(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.tailroom);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline odp_pool_t _odp_packet_pool(odp_packet_t pkt)
+{
+ return *(odp_pool_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.pool);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline odp_pktio_t _odp_packet_input(odp_packet_t pkt)
+{
+ return *(odp_pktio_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.input);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_num_segs(odp_packet_t pkt)
+{
+ return *(uint8_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.segcount);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline void *_odp_packet_user_ptr(odp_packet_t pkt)
+{
+ return *(void **)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.user_ptr);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline void *_odp_packet_user_area(odp_packet_t pkt)
+{
+ return *(void **)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.user_area);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_user_area_size(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.user_area_size);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline uint32_t _odp_packet_flow_hash(odp_packet_t pkt)
+{
+ return *(uint32_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.flow_hash);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline odp_time_t _odp_packet_ts(odp_packet_t pkt)
+{
+ return *(odp_time_t *)(uintptr_t)((uint8_t *)pkt +
+ _odp_packet_inline.timestamp);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline void *_odp_packet_head(odp_packet_t pkt)
+{
+ return (uint8_t *)_odp_packet_data(pkt) - _odp_packet_headroom(pkt);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_is_segmented(odp_packet_t pkt)
+{
+ return _odp_packet_num_segs(pkt) > 1;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline odp_packet_seg_t _odp_packet_first_seg(odp_packet_t pkt)
+{
+ (void)pkt;
+
+ return 0;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline odp_packet_seg_t _odp_packet_last_seg(odp_packet_t pkt)
+{
+ return _odp_packet_num_segs(pkt) - 1;
+}
+
+/** @internal Inline function @param pkt @param seg @return */
+static inline odp_packet_seg_t _odp_packet_next_seg(odp_packet_t pkt,
+ odp_packet_seg_t seg)
+{
+ if (odp_unlikely(seg >= _odp_packet_last_seg(pkt)))
+ return ODP_PACKET_SEG_INVALID;
+
+ return seg + 1;
+}
+
+/** @internal Inline function @param pkt @param offset @param len */
+static inline void _odp_packet_prefetch(odp_packet_t pkt, uint32_t offset,
+ uint32_t len)
+{
+ (void)pkt; (void)offset; (void)len;
+}
+
+/* Include inlined versions of API functions */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+
+/** @ingroup odp_packet
+ * @{
+ */
+
+#include <odp/api/plat/packet_inlines_api.h>
+
+/**
+ * @}
+ */
+
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h b/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h
new file mode 100644
index 000000000..233bc8761
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h
@@ -0,0 +1,113 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_INLINES_API_H_
+#define _ODP_PLAT_PACKET_INLINES_API_H_
+
+_ODP_INLINE void *odp_packet_data(odp_packet_t pkt)
+{
+ return _odp_packet_data(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_seg_len(odp_packet_t pkt)
+{
+ return _odp_packet_seg_len(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_len(odp_packet_t pkt)
+{
+ return _odp_packet_len(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_headroom(odp_packet_t pkt)
+{
+ return _odp_packet_headroom(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_tailroom(odp_packet_t pkt)
+{
+ return _odp_packet_tailroom(pkt);
+}
+
+_ODP_INLINE odp_pool_t odp_packet_pool(odp_packet_t pkt)
+{
+ return _odp_packet_pool(pkt);
+}
+
+_ODP_INLINE odp_pktio_t odp_packet_input(odp_packet_t pkt)
+{
+ return _odp_packet_input(pkt);
+}
+
+_ODP_INLINE int odp_packet_num_segs(odp_packet_t pkt)
+{
+ return _odp_packet_num_segs(pkt);
+}
+
+_ODP_INLINE void *odp_packet_user_ptr(odp_packet_t pkt)
+{
+ return _odp_packet_user_ptr(pkt);
+}
+
+_ODP_INLINE void *odp_packet_user_area(odp_packet_t pkt)
+{
+ return _odp_packet_user_area(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_user_area_size(odp_packet_t pkt)
+{
+ return _odp_packet_user_area_size(pkt);
+}
+
+_ODP_INLINE uint32_t odp_packet_flow_hash(odp_packet_t pkt)
+{
+ return _odp_packet_flow_hash(pkt);
+}
+
+_ODP_INLINE odp_time_t odp_packet_ts(odp_packet_t pkt)
+{
+ return _odp_packet_ts(pkt);
+}
+
+_ODP_INLINE void *odp_packet_head(odp_packet_t pkt)
+{
+ return _odp_packet_head(pkt);
+}
+
+_ODP_INLINE int odp_packet_is_segmented(odp_packet_t pkt)
+{
+ return _odp_packet_is_segmented(pkt);
+}
+
+_ODP_INLINE odp_packet_seg_t odp_packet_first_seg(odp_packet_t pkt)
+{
+ return _odp_packet_first_seg(pkt);
+}
+
+_ODP_INLINE odp_packet_seg_t odp_packet_last_seg(odp_packet_t pkt)
+{
+ return _odp_packet_last_seg(pkt);
+}
+
+_ODP_INLINE odp_packet_seg_t odp_packet_next_seg(odp_packet_t pkt,
+ odp_packet_seg_t seg)
+{
+ return _odp_packet_next_seg(pkt, seg);
+}
+
+_ODP_INLINE void odp_packet_prefetch(odp_packet_t pkt, uint32_t offset,
+ uint32_t len)
+{
+ return _odp_packet_prefetch(pkt, offset, len);
+}
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_types.h b/platform/linux-generic/include/odp/api/plat/packet_types.h
index 864494d43..b8f665d28 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_types.h
@@ -18,27 +18,30 @@
extern "C" {
#endif
+#include <stddef.h>
+
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/packet.h>
+#else
+
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** @addtogroup odp_packet ODP PACKET
- * Operations on a packet.
+/** @ingroup odp_packet
* @{
*/
typedef ODP_HANDLE_T(odp_packet_t);
-#define ODP_PACKET_INVALID _odp_cast_scalar(odp_packet_t, 0xffffffff)
+#define ODP_PACKET_INVALID _odp_cast_scalar(odp_packet_t, 0)
#define ODP_PACKET_OFFSET_INVALID (0x0fffffff)
-/* A packet segment handle stores a small index. Strong type handles are
- * pointers, which would be wasteful in this case. */
typedef uint8_t odp_packet_seg_t;
#define ODP_PACKET_SEG_INVALID ((odp_packet_seg_t)-1)
-/** odp_packet_color_t assigns names to the various pkt "colors" */
typedef enum {
ODP_PACKET_GREEN = 0,
ODP_PACKET_YELLOW = 1,
@@ -46,25 +49,97 @@ typedef enum {
ODP_PACKET_ALL_COLORS = 3,
} odp_packet_color_t;
-/** Sets the maximum number of pkt "colors" */
#define ODP_NUM_PACKET_COLORS 3
-/** Get printable format of odp_packet_t */
-static inline uint64_t odp_packet_to_u64(odp_packet_t hdl)
-{
- return _odp_pri(hdl);
-}
-
-/** Get printable format of odp_packet_seg_t */
-static inline uint64_t odp_packet_seg_to_u64(odp_packet_seg_t hdl)
-{
- return _odp_pri(hdl);
-}
-
/**
* @}
*/
+#endif
+
+/** @internal Packet header field offsets for inline functions */
+typedef struct _odp_packet_inline_offset_t {
+ /** @internal field offset */
+ size_t data;
+ /** @internal field offset */
+ size_t seg_len;
+ /** @internal field offset */
+ size_t frame_len;
+ /** @internal field offset */
+ size_t headroom;
+ /** @internal field offset */
+ size_t tailroom;
+ /** @internal field offset */
+ size_t pool;
+ /** @internal field offset */
+ size_t input;
+ /** @internal field offset */
+ size_t segcount;
+ /** @internal field offset */
+ size_t user_ptr;
+ /** @internal field offset */
+ size_t user_area;
+ /** @internal field offset */
+ size_t user_area_size;
+ /** @internal field offset */
+ size_t flow_hash;
+ /** @internal field offset */
+ size_t timestamp;
+ /** @internal field offset */
+ size_t input_flags;
+
+} _odp_packet_inline_offset_t;
+
+/** @internal Packet input & protocol flags */
+typedef union {
+ /** All input flags */
+ uint64_t all;
+
+ struct {
+ uint64_t parsed_l2:1; /**< L2 parsed */
+ uint64_t dst_queue:1; /**< Dst queue present */
+
+ uint64_t flow_hash:1; /**< Flow hash present */
+ uint64_t timestamp:1; /**< Timestamp present */
+
+ uint64_t l2:1; /**< known L2 protocol present */
+ uint64_t l3:1; /**< known L3 protocol present */
+ uint64_t l4:1; /**< known L4 protocol present */
+
+ uint64_t eth:1; /**< Ethernet */
+ uint64_t eth_bcast:1; /**< Ethernet broadcast */
+ uint64_t eth_mcast:1; /**< Ethernet multicast */
+ uint64_t jumbo:1; /**< Jumbo frame */
+ uint64_t vlan:1; /**< VLAN hdr found */
+ uint64_t vlan_qinq:1; /**< Stacked VLAN found, QinQ */
+
+ uint64_t snap:1; /**< SNAP */
+ uint64_t arp:1; /**< ARP */
+
+ uint64_t ipv4:1; /**< IPv4 */
+ uint64_t ipv6:1; /**< IPv6 */
+ uint64_t ip_bcast:1; /**< IP broadcast */
+ uint64_t ip_mcast:1; /**< IP multicast */
+ uint64_t ipfrag:1; /**< IP fragment */
+ uint64_t ipopt:1; /**< IP optional headers */
+
+ uint64_t ipsec:1; /**< IPSec packet. Required by the
+ odp_packet_has_ipsec_set() func. */
+ uint64_t ipsec_ah:1; /**< IPSec authentication header */
+ uint64_t ipsec_esp:1; /**< IPSec encapsulating security
+ payload */
+ uint64_t udp:1; /**< UDP */
+ uint64_t tcp:1; /**< TCP */
+ uint64_t tcpopt:1; /**< TCP options present */
+ uint64_t sctp:1; /**< SCTP */
+ uint64_t icmp:1; /**< ICMP */
+
+ uint64_t color:2; /**< Packet color for traffic mgmt */
+ uint64_t nodrop:1; /**< Drop eligibility status */
+ };
+
+} _odp_packet_input_flags_t;
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/pool_types.h b/platform/linux-generic/include/odp/api/plat/pool_types.h
index 6baff0923..8bc816d4e 100644
--- a/platform/linux-generic/include/odp/api/plat/pool_types.h
+++ b/platform/linux-generic/include/odp/api/plat/pool_types.h
@@ -13,16 +13,20 @@
#ifndef ODP_POOL_TYPES_H_
#define ODP_POOL_TYPES_H_
-#include <odp/api/std_types.h>
-#include <odp/api/plat/strong_types.h>
-#include <odp/api/plat/event_types.h>
-
#ifdef __cplusplus
extern "C" {
#endif
-/** @addtogroup odp_buffer
- * Operations on a pool.
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/pool.h>
+#else
+
+#include <odp/api/std_types.h>
+#include <odp/api/plat/strong_types.h>
+#include <odp/api/plat/event_types.h>
+
+/** @ingroup odp_pool
* @{
*/
@@ -32,9 +36,6 @@ typedef ODP_HANDLE_T(odp_pool_t);
#define ODP_POOL_NAME_LEN 32
-/**
- * Pool type
- */
typedef enum odp_pool_type_t {
ODP_POOL_BUFFER = ODP_EVENT_BUFFER,
ODP_POOL_PACKET = ODP_EVENT_PACKET,
@@ -45,6 +46,8 @@ typedef enum odp_pool_type_t {
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/queue_types.h b/platform/linux-generic/include/odp/api/plat/queue_types.h
index 1569f5d6b..1561e2239 100644
--- a/platform/linux-generic/include/odp/api/plat/queue_types.h
+++ b/platform/linux-generic/include/odp/api/plat/queue_types.h
@@ -17,39 +17,30 @@
extern "C" {
#endif
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/queue.h>
+#else
+
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** @addtogroup odp_queue ODP QUEUE
- * Macros and operation on a queue.
+/** @ingroup odp_queue
* @{
*/
typedef ODP_HANDLE_T(odp_queue_t);
-typedef ODP_HANDLE_T(odp_queue_group_t);
-
#define ODP_QUEUE_INVALID _odp_cast_scalar(odp_queue_t, 0)
#define ODP_QUEUE_NAME_LEN 32
/**
- * @def ODP_QUEUE_TYPE_TM
- * Traffic manager queue
- * @note Internal to the implementation -- not part of queue type API
- */
-#define ODP_QUEUE_TYPE_TM 4
-
-/** Get printable format of odp_queue_t */
-static inline uint64_t odp_queue_to_u64(odp_queue_t hdl)
-{
- return _odp_pri(hdl);
-}
-
-/**
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/shared_memory_types.h b/platform/linux-generic/include/odp/api/plat/shared_memory_types.h
index afa0bf9cd..2c5b4ed2e 100644
--- a/platform/linux-generic/include/odp/api/plat/shared_memory_types.h
+++ b/platform/linux-generic/include/odp/api/plat/shared_memory_types.h
@@ -18,11 +18,15 @@
extern "C" {
#endif
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/abi/shared_memory.h>
+#else
+
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** @addtogroup odp_shared_memory ODP SHARED MEMORY
- * Operations on shared memory.
+/** @ingroup odp_shared_memory
* @{
*/
@@ -33,16 +37,12 @@ typedef ODP_HANDLE_T(odp_shm_t);
#define ODP_SHM_NAME_LEN 32
-/** Get printable format of odp_shm_t */
-static inline uint64_t odp_shm_to_u64(odp_shm_t hdl)
-{
- return _odp_pri(hdl);
-}
-
/**
* @}
*/
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/static_inline.h.in b/platform/linux-generic/include/odp/api/plat/static_inline.h.in
index 4562a2251..3cf004347 100644
--- a/platform/linux-generic/include/odp/api/plat/static_inline.h.in
+++ b/platform/linux-generic/include/odp/api/plat/static_inline.h.in
@@ -25,15 +25,15 @@ extern "C" {
/**
* @internal
- * @def _STATIC
- * Control conditional static inline expansions for ABI compatibility
+ * @def _ODP_INLINE
+ * Define a function as inlined or not inlined (for ABI compatibility)
*/
#if @ODP_ABI_COMPAT@
#define ODP_ABI_COMPAT 1
-#define _STATIC
+#define _ODP_INLINE
#else
#define ODP_ABI_COMPAT 0
-#define _STATIC static inline
+#define _ODP_INLINE static inline
#endif
#ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp/api/plat/std_clib_inlines.h b/platform/linux-generic/include/odp/api/plat/std_clib_inlines.h
index 2e833e41e..8f505d079 100644
--- a/platform/linux-generic/include/odp/api/plat/std_clib_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/std_clib_inlines.h
@@ -14,17 +14,17 @@ extern "C" {
#include <odp/api/spec/std_types.h>
#include <string.h>
-_STATIC void *odp_memcpy(void *dst, const void *src, size_t num)
+_ODP_INLINE void *odp_memcpy(void *dst, const void *src, size_t num)
{
return memcpy(dst, src, num);
}
-_STATIC void *odp_memset(void *ptr, int value, size_t num)
+_ODP_INLINE void *odp_memset(void *ptr, int value, size_t num)
{
return memset(ptr, value, num);
}
-_STATIC int odp_memcmp(const void *ptr1, const void *ptr2, size_t num)
+_ODP_INLINE int odp_memcmp(const void *ptr1, const void *ptr2, size_t num)
{
return memcmp(ptr1, ptr2, num);
}
diff --git a/platform/linux-generic/include/odp/api/plat/sync_inlines.h b/platform/linux-generic/include/odp/api/plat/sync_inlines.h
index 245c7502a..76eb68107 100644
--- a/platform/linux-generic/include/odp/api/plat/sync_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/sync_inlines.h
@@ -21,17 +21,17 @@ extern "C" {
* @{
*/
-_STATIC void odp_mb_release(void)
+_ODP_INLINE void odp_mb_release(void)
{
__atomic_thread_fence(__ATOMIC_RELEASE);
}
-_STATIC void odp_mb_acquire(void)
+_ODP_INLINE void odp_mb_acquire(void)
{
__atomic_thread_fence(__ATOMIC_ACQUIRE);
}
-_STATIC void odp_mb_full(void)
+_ODP_INLINE void odp_mb_full(void)
{
__atomic_thread_fence(__ATOMIC_SEQ_CST);
}
diff --git a/platform/linux-generic/include/odp/api/plat/ticketlock_inlines.h b/platform/linux-generic/include/odp/api/plat/ticketlock_inlines.h
index 87432a712..ecbea7c4d 100644
--- a/platform/linux-generic/include/odp/api/plat/ticketlock_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/ticketlock_inlines.h
@@ -13,11 +13,12 @@
#ifndef _ODP_PLAT_TICKETLOCK_INLINES_H_
#define _ODP_PLAT_TICKETLOCK_INLINES_H_
-#include <odp/api/ticketlock.h>
#include <odp/api/atomic.h>
#include <odp/api/sync.h>
#include <odp/api/cpu.h>
+#include <odp/api/plat/ticketlock_types.h>
+
/** @internal
* Acquire ticket lock.
*
@@ -110,4 +111,20 @@ static inline int _odp_ticketlock_is_locked(odp_ticketlock_t *ticketlock)
odp_atomic_load_u32(&ticketlock->next_ticket);
}
+/* Include inlined versions of API functions */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+
+/** @ingroup odp_locks
+ * @{
+ */
+
+#include <odp/api/plat/ticketlock_inlines_api.h>
+
+/**
+ * @}
+ */
+
+#endif
+
#endif
diff --git a/platform/linux-generic/include/odp/api/plat/ticketlock_inlines_api.h b/platform/linux-generic/include/odp/api/plat/ticketlock_inlines_api.h
new file mode 100644
index 000000000..5efe696ff
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/ticketlock_inlines_api.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Ticketlock inline functions
+ */
+
+#ifndef _ODP_PLAT_TICKETLOCK_INLINES_API_H_
+#define _ODP_PLAT_TICKETLOCK_INLINES_API_H_
+
+_ODP_INLINE void odp_ticketlock_lock(odp_ticketlock_t *lock)
+{
+ return _odp_ticketlock_lock(lock);
+}
+
+_ODP_INLINE int odp_ticketlock_trylock(odp_ticketlock_t *lock)
+{
+ return _odp_ticketlock_trylock(lock);
+}
+
+_ODP_INLINE void odp_ticketlock_unlock(odp_ticketlock_t *lock)
+{
+ _odp_ticketlock_unlock(lock);
+}
+
+_ODP_INLINE int odp_ticketlock_is_locked(odp_ticketlock_t *lock)
+{
+ return _odp_ticketlock_is_locked(lock);
+}
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/queue.h b/platform/linux-generic/include/odp/api/queue.h
index a5cf87347..adceafbd1 100644
--- a/platform/linux-generic/include/odp/api/queue.h
+++ b/platform/linux-generic/include/odp/api/queue.h
@@ -27,6 +27,10 @@ extern "C" {
* @{
*/
+/* REMOVE FROM API SPEC. Typedef needed only for suppressing Doxygen
+ * warning. */
+typedef void odp_queue_group_t;
+
/**
* @}
*/
diff --git a/platform/linux-generic/include/odp/api/ticketlock.h b/platform/linux-generic/include/odp/api/ticketlock.h
index 85be4bc5c..e0f5d81fd 100644
--- a/platform/linux-generic/include/odp/api/ticketlock.h
+++ b/platform/linux-generic/include/odp/api/ticketlock.h
@@ -19,6 +19,10 @@ extern "C" {
#include <odp/api/plat/ticketlock_types.h>
+#if ODP_ABI_COMPAT == 0
+#include <odp/api/plat/ticketlock_inlines.h>
+#endif
+
#include <odp/api/spec/ticketlock.h>
#ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp_align_internal.h b/platform/linux-generic/include/odp_align_internal.h
index d9cd30bde..61ff200c5 100644
--- a/platform/linux-generic/include/odp_align_internal.h
+++ b/platform/linux-generic/include/odp_align_internal.h
@@ -18,109 +18,47 @@ extern "C" {
#endif
#include <odp/api/align.h>
-
-/** @addtogroup odp_compiler_optim
- * @{
+#include <stdint.h>
+
+/* Macros to calculate ODP_ROUNDUP_POWER2_U32() in five rounds of shift
+ * and OR operations. */
+#define _RSHIFT_U32(x, y) (((uint32_t)(x)) >> (y))
+#define _POW2_U32_R1(x) (((uint32_t)(x)) | _RSHIFT_U32(x, 1))
+#define _POW2_U32_R2(x) (_POW2_U32_R1(x) | _RSHIFT_U32(_POW2_U32_R1(x), 2))
+#define _POW2_U32_R3(x) (_POW2_U32_R2(x) | _RSHIFT_U32(_POW2_U32_R2(x), 4))
+#define _POW2_U32_R4(x) (_POW2_U32_R3(x) | _RSHIFT_U32(_POW2_U32_R3(x), 8))
+#define _POW2_U32_R5(x) (_POW2_U32_R4(x) | _RSHIFT_U32(_POW2_U32_R4(x), 16))
+
+/* Round up a uint32_t value 'x' to the next power of two.
+ *
+ * The value is not round up, if it's already a power of two (including 1).
+ * The value must be larger than 0 and not exceed 0x80000000.
*/
+#define ROUNDUP_POWER2_U32(x) \
+ ((((uint32_t)(x)) > 0x80000000) ? 0 : (_POW2_U32_R5(x - 1) + 1))
/*
- * Round up
- */
-
-/**
- * @internal
* Round up 'x' to alignment 'align'
*/
-#define ODP_ALIGN_ROUNDUP(x, align)\
+#define ROUNDUP_ALIGN(x, align)\
((align) * (((x) + (align) - 1) / (align)))
-/**
- * @internal
- * When 'x' is not already a power of two, round it up to the next
- * power of two value. Zero is not supported as an input value.
- */
-#define ODP_ROUNDUP_POWER_2(x)\
- (1 << (((int)(8 * sizeof(x))) - __builtin_clz((x) - 1)))
-
-/**
- * @internal
- * Round up pointer 'x' to alignment 'align'
- */
-#define ODP_ALIGN_ROUNDUP_PTR(x, align)\
- ((void *)ODP_ALIGN_ROUNDUP((uintptr_t)(x), (uintptr_t)(align)))
-
-/**
- * @internal
+/*
* Round up 'x' to cache line size alignment
*/
-#define ODP_CACHE_LINE_SIZE_ROUNDUP(x)\
- ODP_ALIGN_ROUNDUP(x, ODP_CACHE_LINE_SIZE)
-
-/**
- * @internal
- * Round up pointer 'x' to cache line size alignment
- */
-#define ODP_CACHE_LINE_SIZE_ROUNDUP_PTR(x)\
- ((void *)ODP_CACHE_LINE_SIZE_ROUNDUP((uintptr_t)(x)))
-
-/**
- * @internal
- * Round up 'x' to page size alignment
- */
-#define ODP_PAGE_SIZE_ROUNDUP(x)\
- ODP_ALIGN_ROUNDUP(x, ODP_PAGE_SIZE)
+#define ROUNDUP_CACHE_LINE(x)\
+ ROUNDUP_ALIGN(x, ODP_CACHE_LINE_SIZE)
/*
- * Round down
- */
-
-/**
- * @internal
* Round down 'x' to 'align' alignment, which is a power of two
*/
-#define ODP_ALIGN_ROUNDDOWN_POWER_2(x, align)\
+#define ROUNDDOWN_POWER2(x, align)\
((x) & (~((align) - 1)))
-/**
- * @internal
- * Round down 'x' to cache line size alignment
- */
-#define ODP_CACHE_LINE_SIZE_ROUNDDOWN(x)\
- ODP_ALIGN_ROUNDDOWN_POWER_2(x, ODP_CACHE_LINE_SIZE)
-
-/**
- * @internal
- * Round down pointer 'x' to 'align' alignment, which is a power of two
- */
-#define ODP_ALIGN_ROUNDDOWN_PTR_POWER_2(x, align)\
-((void *)ODP_ALIGN_ROUNDDOWN_POWER_2((uintptr_t)(x), (uintptr_t)(align)))
-
-/**
- * @internal
- * Round down pointer 'x' to cache line size alignment
- */
-#define ODP_CACHE_LINE_SIZE_ROUNDDOWN_PTR(x)\
- ((void *)ODP_CACHE_LINE_SIZE_ROUNDDOWN((uintptr_t)(x)))
/*
- * Check align
- */
-
-/**
- * @internal
- * Check if pointer 'x' is aligned to 'align', which is a power of two
- */
-#define ODP_ALIGNED_CHECK_POWER_2(x, align)\
- ((((uintptr_t)(x)) & (((uintptr_t)(align))-1)) == 0)
-
-/**
- * @internal
* Check if value is a power of two
*/
-#define ODP_VAL_IS_POWER_2(x) ((((x)-1) & (x)) == 0)
-
-/**
- * @}
- */
+#define CHECK_IS_POWER2(x) ((((x) - 1) & (x)) == 0)
#ifdef __cplusplus
}
diff --git a/platform/linux-generic/include/odp_bitmap_internal.h b/platform/linux-generic/include/odp_bitmap_internal.h
new file mode 100644
index 000000000..1be4d0287
--- /dev/null
+++ b/platform/linux-generic/include/odp_bitmap_internal.h
@@ -0,0 +1,317 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP generic bitmap types and operations.
+ */
+
+#ifndef ODP_BITMAP_INTERNAL_H_
+#define ODP_BITMAP_INTERNAL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <odp/api/hints.h>
+
+/* Generate unique identifier for instantiated class */
+#define TOKENIZE(template, line) \
+ template ## _ ## line ## _ ## __COUNTER__
+
+/* Array size in general */
+#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
+
+#define BITS_PER_BYTE (8)
+#define BITS_PER_LONG __WORDSIZE
+#define BYTES_PER_LONG (BITS_PER_LONG / BITS_PER_BYTE)
+
+#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
+#define BITS_TO_LONGS(nr) BIT_WORD(nr + BITS_PER_LONG - 1)
+
+#define BITMAP_FIRST_WORD_MASK(start) \
+ (~0UL << ((start) & (BITS_PER_LONG - 1)))
+#define BITMAP_LAST_WORD_MASK(nbits) \
+ (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
+
+/* WAPL bitmap base class */
+typedef struct {
+ unsigned int nwords;
+ unsigned int *pl;
+ unsigned long *ul;
+} wapl_bitmap_t;
+
+/*
+ * Word-Aligned Position List (WAPL) bitmap, which actually
+ * is not a compression, but with an extra list of non-empty
+ * word positions.
+ *
+ * WAPL accelerates bitwise operations and iterations by
+ * applying only to non-empty positions instead of walking
+ * through the whole bitmap.
+ *
+ * WAPL uses [1 ~ N] instead of [0 ~ N - 1] as position
+ * values and an extra 0 as end indicator for position list.
+ * This is the reason to allocate one extra room below.
+ */
+#define instantiate_wapl_bitmap(line, nbits) \
+ struct TOKENIZE(wapl_bitmap, line) { \
+ unsigned int pl[BITS_TO_LONGS(nbits) + 1]; \
+ unsigned long ul[BITS_TO_LONGS(nbits) + 1]; \
+ }
+
+#define WAPL_BITMAP(nbits) instantiate_wapl_bitmap(__LINE__, nbits)
+
+/*
+ * Upcast any derived WAPL bitmap class to its base class
+ */
+#define __wapl_upcast(base, derived) \
+ do { \
+ __typeof__(derived) p = derived; \
+ base.pl = p->pl; \
+ base.ul = p->ul; \
+ base.nwords = ARRAY_SIZE(p->ul) - 1; \
+ } while (0)
+
+/*
+ * WAPL base class bitmap operations
+ */
+void __wapl_bitmap_and(wapl_bitmap_t *dst,
+ wapl_bitmap_t *src, wapl_bitmap_t *and);
+
+void __wapl_bitmap_or(wapl_bitmap_t *dst, wapl_bitmap_t *or);
+
+void __wapl_bitmap_set(wapl_bitmap_t *map, unsigned int bit);
+
+void __wapl_bitmap_clear(wapl_bitmap_t *map, unsigned int bit);
+
+/*
+ * Generic WAPL bitmap operations
+ */
+#define wapl_bitmap_zero(map) \
+ ({ \
+ __typeof__(map) p = map; \
+ memset((void *)p, 0, sizeof(__typeof__(*p))); \
+ })
+
+#define wapl_bitmap_copy(dst, src) \
+ ({ \
+ __typeof__(dst) d = dst; \
+ __typeof__(src) s = src; \
+ if (d != s) \
+ memcpy((void *)d, (void *)s, \
+ sizeof(__typeof__(*d))); \
+ })
+
+#define wapl_bitmap_and(dst, src, and) \
+ ({ \
+ wapl_bitmap_t d, s, a; \
+ __wapl_upcast(d, dst); \
+ __wapl_upcast(s, src); \
+ __wapl_upcast(a, and); \
+ __wapl_bitmap_and(&d, &s, &a); \
+ })
+
+#define wapl_bitmap_or(dst, src, or) \
+ ({ \
+ wapl_bitmap_t d, o; \
+ wapl_bitmap_copy(dst, src); \
+ __wapl_upcast(d, dst); \
+ __wapl_upcast(o, or); \
+ __wapl_bitmap_or(&d, &o); \
+ })
+
+#define wapl_bitmap_set(map, bit) \
+ ({ \
+ wapl_bitmap_t b; \
+ __wapl_upcast(b, map); \
+ __wapl_bitmap_set(&b, bit); \
+ })
+
+#define wapl_bitmap_clear(map, bit) \
+ ({ \
+ wapl_bitmap_t b; \
+ __wapl_upcast(b, map); \
+ __wapl_bitmap_clear(&b, bit); \
+ })
+
+/*
+ * Round robin iterator runs upon a WAPL bitmap:
+ *
+ * wapl_bitmap_iterator(iterator, WAPL bitmap);
+ * for (iterator->start(); iterator->has_next(); ) {
+ * unsigned int bit_index = iterator->next();
+ * ...operations on this bit index...
+ * }
+ */
+typedef struct wapl_bitmap_iterator {
+ int _start, _next, _nbits;
+ wapl_bitmap_t _base;
+
+ void (*start)(struct wapl_bitmap_iterator *this);
+ bool (*has_next)(struct wapl_bitmap_iterator *this);
+ unsigned int (*next)(struct wapl_bitmap_iterator *this);
+} wapl_bitmap_iterator_t;
+
+/*
+ * WAPL bitmap iterator constructor
+ */
+void __wapl_bitmap_iterator(wapl_bitmap_iterator_t *this);
+
+/*
+ * Generic constructor accepts any derived WAPL bitmap class
+ */
+#define wapl_bitmap_iterator(iterator, map) \
+ ({ \
+ __typeof__(iterator) __it = iterator; \
+ __wapl_upcast(__it->_base, map); \
+ __wapl_bitmap_iterator(__it); \
+ })
+
+/* Sparse bitmap base class */
+typedef struct {
+ unsigned int nbits;
+ unsigned int *last, *pl, *il;
+} sparse_bitmap_t;
+
+/*
+ * Sparse bitmap, lists all bit indexes directly as an array.
+ * Expected to be significantly straightforward iteration.
+ */
+#define instantiate_sparse_bitmap(line, nbits) \
+ struct TOKENIZE(sparse_bitmap, line) { \
+ unsigned int last; \
+ unsigned int pl[nbits]; \
+ unsigned int il[nbits]; \
+ }
+
+#define SPARSE_BITMAP(nbits) instantiate_sparse_bitmap(__LINE__, nbits)
+
+/*
+ * Upcast any derived sparse bitmap class to its base class
+ */
+#define __sparse_upcast(base, derived) \
+ do { \
+ __typeof__(derived) p = derived; \
+ base.pl = p->pl; \
+ base.il = p->il; \
+ base.last = &p->last; \
+ base.nbits = ARRAY_SIZE(p->il); \
+ } while (0)
+
+/*
+ * Sparse base class bitmap operations
+ */
+void __sparse_bitmap_set(sparse_bitmap_t *map, unsigned int bit);
+
+void __sparse_bitmap_clear(sparse_bitmap_t *map, unsigned int bit);
+
+/*
+ * Generic sparse bitmap operations
+ */
+#define sparse_bitmap_zero(map) \
+ ({ \
+ __typeof__(map) p = map; \
+ memset((void *)p, 0, sizeof(__typeof__(*p))); \
+ })
+
+#define sparse_bitmap_set(map, bit) \
+ ({ \
+ sparse_bitmap_t b; \
+ __sparse_upcast(b, map); \
+ __sparse_bitmap_set(&b, bit); \
+ })
+
+#define sparse_bitmap_clear(map, bit) \
+ ({ \
+ sparse_bitmap_t b; \
+ __sparse_upcast(b, map); \
+ __sparse_bitmap_clear(&b, bit); \
+ })
+
+/*
+ * Round robin iterator runs upon a sparse bitmap:
+ *
+ * sparse_bitmap_iterator(iterator, SPARSE bitmap);
+ * for (iterator->start(); iterator->has_next(); ) {
+ * unsigned int bit_index = iterator->next();
+ * ...operations on this bit index...
+ * }
+ */
+typedef struct sparse_bitmap_iterator {
+ int _start, _next, _nbits;
+ sparse_bitmap_t _base;
+
+ void (*start)(struct sparse_bitmap_iterator *this);
+ bool (*has_next)(struct sparse_bitmap_iterator *this);
+ unsigned int (*next)(struct sparse_bitmap_iterator *this);
+} sparse_bitmap_iterator_t;
+
+/*
+ * Sparse bitmap iterator constructor
+ */
+void __sparse_bitmap_iterator(sparse_bitmap_iterator_t *this);
+
+/*
+ * Generic constructor accepts any derived sparse bitmap class.
+ */
+#define sparse_bitmap_iterator(iterator, map) \
+ ({ \
+ __typeof__(iterator) __it = iterator; \
+ __sparse_upcast(__it->_base, map); \
+ __sparse_bitmap_iterator(__it); \
+ })
+
+/*
+ * Raw bitmap atomic set and clear.
+ */
+void raw_bitmap_set(unsigned long *map, unsigned int bit);
+
+void raw_bitmap_clear(unsigned long *map, unsigned int bit);
+
+/*
+ * It will enter infinite loop incase that all bits are zero,
+ * so please make sure the bitmap at least has one set.
+ */
+static inline int __bitmap_wraparound_next(
+ unsigned long *addr, unsigned int nbits, int start)
+{
+ unsigned long tmp;
+
+ if (start >= (int)nbits)
+ start = 0;
+
+ tmp = addr[BIT_WORD(start)];
+
+ /* Handle 1st word. */
+ tmp &= BITMAP_FIRST_WORD_MASK(start);
+ start = start & ~(BITS_PER_LONG - 1);
+
+ while (!tmp) {
+ start += BITS_PER_LONG;
+ if (start >= (int)nbits)
+ start = 0;
+
+ tmp = addr[BIT_WORD(start)];
+ }
+
+ start += __builtin_ffsl(tmp) - 1;
+ return start;
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp_classification_datamodel.h b/platform/linux-generic/include/odp_classification_datamodel.h
index 8505c67da..9df756bf9 100644
--- a/platform/linux-generic/include/odp_classification_datamodel.h
+++ b/platform/linux-generic/include/odp_classification_datamodel.h
@@ -25,6 +25,7 @@ extern "C" {
#include <odp_packet_internal.h>
#include <odp_packet_io_internal.h>
#include <odp_queue_internal.h>
+#include <protocols/ip.h>
/* Maximum Class Of Service Entry */
#define ODP_COS_MAX_ENTRY 64
@@ -43,7 +44,7 @@ extern "C" {
/* Max L3 QoS Value */
#define ODP_COS_MAX_L3_QOS (1 << ODP_COS_L3_QOS_BITS)
/* Max PMR Term bits */
-#define ODP_PMR_TERM_BYTES_MAX 8
+#define ODP_PMR_TERM_BYTES_MAX 16
/**
Packet Matching Rule Term Value
@@ -67,6 +68,14 @@ typedef struct pmr_term_value {
/** End value of the range */
uint64_t val_end;
} range;
+ struct {
+ _odp_ipv6_addr_t addr;
+ _odp_ipv6_addr_t mask;
+ } match_ipv6;
+ struct {
+ _odp_ipv6_addr_t addr_start;
+ _odp_ipv6_addr_t addr_end;
+ } range_ipv6;
};
uint32_t offset; /**< Offset if term == ODP_PMR_CUSTOM_FRAME */
uint32_t val_sz; /**< Size of the value to be matched */
@@ -82,8 +91,6 @@ struct cos_s {
union cos_u *linked_cos[ODP_PMR_PER_COS_MAX]; /* Chained CoS with PMR*/
uint32_t valid; /* validity Flag */
odp_cls_drop_t drop_policy; /* Associated Drop Policy */
- odp_queue_group_t queue_group; /* Associated Queue Group */
- odp_cos_flow_set_t flow_set; /* Assigned Flow Set */
size_t headroom; /* Headroom for this CoS */
odp_spinlock_t lock; /* cos lock */
odp_atomic_u32_t num_rule; /* num of PMRs attached with this CoS */
@@ -92,7 +99,7 @@ struct cos_s {
typedef union cos_u {
struct cos_s s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct cos_s))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct cos_s))];
} cos_t;
@@ -112,7 +119,7 @@ struct pmr_s {
typedef union pmr_u {
struct pmr_s s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct pmr_s))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pmr_s))];
} pmr_t;
/**
@@ -149,8 +156,6 @@ typedef struct classifier {
uint32_t l3_precedence; /* L3 QoS precedence */
pmr_l2_cos_t l2_cos_table; /* L2 QoS-CoS table map */
pmr_l3_cos_t l3_cos_table; /* L3 Qos-CoS table map */
- odp_cos_flow_set_t flow_set; /* Flow Set to be calculated
- for this pktio */
size_t headroom; /* Pktio Headroom */
size_t skip; /* Pktio Skip Offset */
} classifier_t;
diff --git a/platform/linux-generic/include/odp_classification_inlines.h b/platform/linux-generic/include/odp_classification_inlines.h
index b839197a0..2747db8cc 100644
--- a/platform/linux-generic/include/odp_classification_inlines.h
+++ b/platform/linux-generic/include/odp_classification_inlines.h
@@ -25,6 +25,8 @@ extern "C" {
#include <protocols/udp.h>
#include <protocols/tcp.h>
#include <odp_packet_internal.h>
+#include <stdio.h>
+#include <inttypes.h>
/* PMR term value verification function
These functions verify the given PMR term value with the value in the packet
@@ -179,27 +181,76 @@ static inline int verify_pmr_dmac(const uint8_t *pkt_addr,
return 0;
}
-static inline int verify_pmr_ipv6_saddr(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_ipv6_saddr(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ipv6hdr_t *ipv6;
+ uint64_t addr[2];
+
+ if (!packet_hdr_has_ipv6(pkt_hdr))
+ return 0;
+
+ ipv6 = (const _odp_ipv6hdr_t *)(pkt_addr + pkt_hdr->p.l3_offset);
+
+ addr[0] = ipv6->src_addr.u64[0];
+ addr[1] = ipv6->src_addr.u64[1];
+
+ /* 128 bit address is processed as two 64 bit value
+ * for bitwise AND operation */
+ addr[0] = addr[0] & term_value->match_ipv6.mask.u64[0];
+ addr[1] = addr[1] & term_value->match_ipv6.mask.u64[1];
+
+ if (!memcmp(addr, term_value->match_ipv6.addr.u8, _ODP_IPV6ADDR_LEN))
+ return 1;
+
return 0;
}
-static inline int verify_pmr_ipv6_daddr(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_ipv6_daddr(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ipv6hdr_t *ipv6;
+ uint64_t addr[2];
+
+ if (!packet_hdr_has_ipv6(pkt_hdr))
+ return 0;
+ ipv6 = (const _odp_ipv6hdr_t *)(pkt_addr + pkt_hdr->p.l3_offset);
+ addr[0] = ipv6->dst_addr.u64[0];
+ addr[1] = ipv6->dst_addr.u64[1];
+
+ /* 128 bit address is processed as two 64 bit value
+ * for bitwise AND operation */
+ addr[0] = addr[0] & term_value->match_ipv6.mask.u64[0];
+ addr[1] = addr[1] & term_value->match_ipv6.mask.u64[1];
+
+ if (!memcmp(addr, term_value->match_ipv6.addr.u8, _ODP_IPV6ADDR_LEN))
+ return 1;
+
return 0;
}
-static inline int verify_pmr_vlan_id_0(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_vlan_id_0(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ethhdr_t *eth;
+ const _odp_vlanhdr_t *vlan;
+ uint16_t tci;
+ uint16_t vlan_id;
+
+ if (!pkt_hdr->p.input_flags.vlan_qinq)
+ return 0;
+
+ eth = (const _odp_ethhdr_t *)(pkt_addr + pkt_hdr->p.l2_offset);
+ vlan = (const _odp_vlanhdr_t *)(eth + 1);
+ tci = odp_be_to_cpu_16(vlan->tci);
+ vlan_id = tci & 0x0fff;
+
+ if (term_value->match.value == (vlan_id & term_value->match.mask))
+ return 1;
+
return 0;
}
@@ -207,7 +258,23 @@ static inline int verify_pmr_vlan_id_x(const uint8_t *pkt_addr ODP_UNUSED,
odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
pmr_term_value_t *term_value ODP_UNUSED)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ethhdr_t *eth;
+ const _odp_vlanhdr_t *vlan;
+ uint16_t tci;
+ uint16_t vlan_id;
+
+ if (!pkt_hdr->p.input_flags.vlan_qinq)
+ return 0;
+
+ eth = (const _odp_ethhdr_t *)(pkt_addr + pkt_hdr->p.l2_offset);
+ vlan = (const _odp_vlanhdr_t *)(eth + 1);
+ vlan++;
+ tci = odp_be_to_cpu_16(vlan->tci);
+ vlan_id = tci & 0x0fff;
+
+ if (term_value->match.value == (vlan_id & term_value->match.mask))
+ return 1;
+
return 0;
}
@@ -265,19 +332,43 @@ static inline int verify_pmr_custom_frame(const uint8_t *pkt_addr,
return 0;
}
-static inline int verify_pmr_eth_type_0(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_eth_type_0(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ethhdr_t *eth;
+ uint16_t ethtype;
+
+ if (!pkt_hdr->p.input_flags.vlan_qinq)
+ return 0;
+
+ eth = (const _odp_ethhdr_t *)(pkt_addr + pkt_hdr->p.l2_offset);
+ ethtype = odp_be_to_cpu_16(eth->type);
+
+ if (term_value->match.value == (ethtype & term_value->match.mask))
+ return 1;
+
return 0;
}
-static inline int verify_pmr_eth_type_x(const uint8_t *pkt_addr ODP_UNUSED,
- odp_packet_hdr_t *pkt_hdr ODP_UNUSED,
- pmr_term_value_t *term_value ODP_UNUSED)
+static inline int verify_pmr_eth_type_x(const uint8_t *pkt_addr,
+ odp_packet_hdr_t *pkt_hdr,
+ pmr_term_value_t *term_value)
{
- ODP_UNIMPLEMENTED();
+ const _odp_ethhdr_t *eth;
+ uint16_t ethtype;
+ const _odp_vlanhdr_t *vlan;
+
+ if (!pkt_hdr->p.input_flags.vlan_qinq)
+ return 0;
+
+ eth = (const _odp_ethhdr_t *)(pkt_addr + pkt_hdr->p.l2_offset);
+ vlan = (const _odp_vlanhdr_t *)(eth + 1);
+ ethtype = odp_be_to_cpu_16(vlan->type);
+
+ if (term_value->match.value == (ethtype & term_value->match.mask))
+ return 1;
+
return 0;
}
#ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp_crypto_internal.h b/platform/linux-generic/include/odp_crypto_internal.h
index c7b893aaf..f85b76eaa 100644
--- a/platform/linux-generic/include/odp_crypto_internal.h
+++ b/platform/linux-generic/include/odp_crypto_internal.h
@@ -13,6 +13,7 @@ extern "C" {
#include <openssl/des.h>
#include <openssl/aes.h>
+#include <openssl/evp.h>
#define MAX_IV_LEN 64
#define OP_RESULT_MAGIC 0x91919191
diff --git a/platform/linux-generic/include/odp_packet_dpdk.h b/platform/linux-generic/include/odp_packet_dpdk.h
index c63685eca..4d7e0fc47 100644
--- a/platform/linux-generic/include/odp_packet_dpdk.h
+++ b/platform/linux-generic/include/odp_packet_dpdk.h
@@ -42,7 +42,7 @@ struct pkt_cache_t {
typedef union {
struct pkt_cache_t s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct pkt_cache_t))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pkt_cache_t))];
} pkt_cache_t ODP_ALIGNED_CACHE;
/** Packet IO using DPDK interface */
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index e6e9d7447..0a9f17799 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -26,62 +26,13 @@ extern "C" {
#include <odp/api/packet_io.h>
#include <odp/api/crypto.h>
#include <odp_crypto_internal.h>
+#include <odp/api/plat/packet_types.h>
/** Minimum segment length expected by packet_parse_common() */
#define PACKET_PARSE_SEG_LEN 96
-/**
- * Packet input & protocol flags
- */
-typedef union {
- /* All input flags */
- uint64_t all;
-
- struct {
- uint64_t parsed_l2:1; /**< L2 parsed */
- uint64_t dst_queue:1; /**< Dst queue present */
-
- uint64_t flow_hash:1; /**< Flow hash present */
- uint64_t timestamp:1; /**< Timestamp present */
-
- uint64_t l2:1; /**< known L2 protocol present */
- uint64_t l3:1; /**< known L3 protocol present */
- uint64_t l4:1; /**< known L4 protocol present */
-
- uint64_t eth:1; /**< Ethernet */
- uint64_t eth_bcast:1; /**< Ethernet broadcast */
- uint64_t eth_mcast:1; /**< Ethernet multicast */
- uint64_t jumbo:1; /**< Jumbo frame */
- uint64_t vlan:1; /**< VLAN hdr found */
- uint64_t vlan_qinq:1; /**< Stacked VLAN found, QinQ */
-
- uint64_t snap:1; /**< SNAP */
- uint64_t arp:1; /**< ARP */
-
- uint64_t ipv4:1; /**< IPv4 */
- uint64_t ipv6:1; /**< IPv6 */
- uint64_t ip_bcast:1; /**< IP broadcast */
- uint64_t ip_mcast:1; /**< IP multicast */
- uint64_t ipfrag:1; /**< IP fragment */
- uint64_t ipopt:1; /**< IP optional headers */
-
- uint64_t ipsec:1; /**< IPSec packet. Required by the
- odp_packet_has_ipsec_set() func. */
- uint64_t ipsec_ah:1; /**< IPSec authentication header */
- uint64_t ipsec_esp:1; /**< IPSec encapsulating security
- payload */
- uint64_t udp:1; /**< UDP */
- uint64_t tcp:1; /**< TCP */
- uint64_t tcpopt:1; /**< TCP options present */
- uint64_t sctp:1; /**< SCTP */
- uint64_t icmp:1; /**< ICMP */
-
- uint64_t color:2; /**< Packet color for traffic mgmt */
- uint64_t nodrop:1; /**< Drop eligibility status */
- };
-} input_flags_t;
-ODP_STATIC_ASSERT(sizeof(input_flags_t) == sizeof(uint64_t),
+ODP_STATIC_ASSERT(sizeof(_odp_packet_input_flags_t) == sizeof(uint64_t),
"INPUT_FLAGS_SIZE_ERROR");
/**
@@ -144,7 +95,7 @@ typedef enum {
* Packet parser metadata
*/
typedef struct {
- input_flags_t input_flags;
+ _odp_packet_input_flags_t input_flags;
error_flags_t error_flags;
output_flags_t output_flags;
@@ -209,7 +160,12 @@ typedef struct {
*/
static inline odp_packet_hdr_t *odp_packet_hdr(odp_packet_t pkt)
{
- return (odp_packet_hdr_t *)buf_hdl_to_hdr((odp_buffer_t)pkt);
+ return (odp_packet_hdr_t *)(uintptr_t)pkt;
+}
+
+static inline odp_packet_t packet_handle(odp_packet_hdr_t *pkt_hdr)
+{
+ return (odp_packet_t)pkt_hdr;
}
static inline void copy_packet_parser_metadata(odp_packet_hdr_t *src_hdr,
@@ -294,6 +250,11 @@ static inline int packet_hdr_has_eth(odp_packet_hdr_t *pkt_hdr)
return pkt_hdr->p.input_flags.eth;
}
+static inline int packet_hdr_has_ipv6(odp_packet_hdr_t *pkt_hdr)
+{
+ return pkt_hdr->p.input_flags.ipv6;
+}
+
static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts)
{
if (ts != NULL) {
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index 2001c4211..89bb6f3a3 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -176,7 +176,7 @@ struct pktio_entry {
typedef union {
struct pktio_entry s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct pktio_entry))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pktio_entry))];
} pktio_entry_t;
typedef struct {
diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
index 2aadbed76..a6f68d569 100644
--- a/platform/linux-generic/include/odp_packet_netmap.h
+++ b/platform/linux-generic/include/odp_packet_netmap.h
@@ -32,7 +32,7 @@ struct netmap_ring_t {
typedef union {
struct netmap_ring_t s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct netmap_ring_t))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct netmap_ring_t))];
} netmap_ring_t ODP_ALIGNED_CACHE;
/** Netmap ring slot */
diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h
index b0805ac3c..ebb779da2 100644
--- a/platform/linux-generic/include/odp_pool_internal.h
+++ b/platform/linux-generic/include/odp_pool_internal.h
@@ -24,6 +24,7 @@ extern "C" {
#include <odp_buffer_internal.h>
#include <odp_config_internal.h>
#include <odp_ring_internal.h>
+#include <odp/api/plat/strong_types.h>
typedef struct pool_cache_t {
uint32_t num;
diff --git a/platform/linux-generic/include/odp_queue_internal.h b/platform/linux-generic/include/odp_queue_internal.h
index 8b55de1ab..560f826e5 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -79,7 +79,7 @@ struct queue_entry_s {
union queue_entry_u {
struct queue_entry_s s;
- uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct queue_entry_s))];
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct queue_entry_s))];
};
diff --git a/platform/linux-generic/include/odp_schedule_if.h b/platform/linux-generic/include/odp_schedule_if.h
index 6c2b05011..530d157f2 100644
--- a/platform/linux-generic/include/odp_schedule_if.h
+++ b/platform/linux-generic/include/odp_schedule_if.h
@@ -12,6 +12,7 @@ extern "C" {
#endif
#include <odp/api/queue.h>
+#include <odp_queue_internal.h>
#include <odp/api/schedule.h>
typedef void (*schedule_pktio_start_fn_t)(int pktio_index, int num_in_queue,
@@ -24,6 +25,7 @@ typedef int (*schedule_init_queue_fn_t)(uint32_t queue_index,
);
typedef void (*schedule_destroy_queue_fn_t)(uint32_t queue_index);
typedef int (*schedule_sched_queue_fn_t)(uint32_t queue_index);
+typedef int (*schedule_unsched_queue_fn_t)(uint32_t queue_index);
typedef int (*schedule_ord_enq_multi_fn_t)(uint32_t queue_index,
void *buf_hdr[], int num, int *ret);
typedef int (*schedule_init_global_fn_t)(void);
@@ -33,6 +35,7 @@ typedef int (*schedule_term_local_fn_t)(void);
typedef void (*schedule_order_lock_fn_t)(void);
typedef void (*schedule_order_unlock_fn_t)(void);
typedef unsigned (*schedule_max_ordered_locks_fn_t)(void);
+typedef void (*schedule_save_context_fn_t)(queue_entry_t *queue);
typedef struct schedule_fn_t {
schedule_pktio_start_fn_t pktio_start;
@@ -42,6 +45,7 @@ typedef struct schedule_fn_t {
schedule_init_queue_fn_t init_queue;
schedule_destroy_queue_fn_t destroy_queue;
schedule_sched_queue_fn_t sched_queue;
+ schedule_unsched_queue_fn_t unsched_queue;
schedule_ord_enq_multi_fn_t ord_enq_multi;
schedule_init_global_fn_t init_global;
schedule_term_global_fn_t term_global;
@@ -50,6 +54,7 @@ typedef struct schedule_fn_t {
schedule_order_lock_fn_t order_lock;
schedule_order_unlock_fn_t order_unlock;
schedule_max_ordered_locks_fn_t max_ordered_locks;
+ schedule_save_context_fn_t save_context;
} schedule_fn_t;
/* Interface towards the scheduler */
diff --git a/platform/linux-generic/include/protocols/ip.h b/platform/linux-generic/include/protocols/ip.h
index 6c089e3cd..20041f1c0 100644
--- a/platform/linux-generic/include/protocols/ip.h
+++ b/platform/linux-generic/include/protocols/ip.h
@@ -117,6 +117,16 @@ ODP_STATIC_ASSERT(sizeof(_odp_ipv4hdr_t) == _ODP_IPV4HDR_LEN,
(uint8_t)((((ver_tc_flow) & 0x0fc00000) >> 22) & 0xff)
/**
+ * Ipv6 address
+ */
+typedef union ODP_PACKED {
+ uint8_t u8[16];
+ odp_u16be_t u16[8];
+ odp_u32be_t u32[4];
+ odp_u64be_t u64[2];
+} _odp_ipv6_addr_t;
+
+/**
* IPv6 header
*/
typedef struct ODP_PACKED {
@@ -124,8 +134,8 @@ typedef struct ODP_PACKED {
odp_u16be_t payload_len; /**< Payload length */
uint8_t next_hdr; /**< Next header */
uint8_t hop_limit; /**< Hop limit */
- uint8_t src_addr[16]; /**< Source address */
- uint8_t dst_addr[16]; /**< Destination address */
+ _odp_ipv6_addr_t src_addr; /**< Source address */
+ _odp_ipv6_addr_t dst_addr; /**< Destination address */
} _odp_ipv6hdr_t;
/** @internal Compile time assert */
diff --git a/platform/linux-generic/m4/odp_schedule.m4 b/platform/linux-generic/m4/odp_schedule.m4
index bc70c1fc8..91c19f21a 100644
--- a/platform/linux-generic/m4/odp_schedule.m4
+++ b/platform/linux-generic/m4/odp_schedule.m4
@@ -1,6 +1,13 @@
AC_ARG_ENABLE([schedule-sp],
[ --enable-schedule-sp enable strict priority scheduler],
[if test x$enableval = xyes; then
- schedule-sp=yes
+ schedule_sp_enabled=yes
ODP_CFLAGS="$ODP_CFLAGS -DODP_SCHEDULE_SP"
fi])
+
+AC_ARG_ENABLE([schedule-iquery],
+ [ --enable-schedule-iquery enable interests query (sparse bitmap) scheduler],
+ [if test x$enableval = xyes; then
+ schedule_iquery_enabled=yes
+ ODP_CFLAGS="$ODP_CFLAGS -DODP_SCHEDULE_IQUERY"
+ fi])
diff --git a/platform/linux-generic/odp_bitmap.c b/platform/linux-generic/odp_bitmap.c
new file mode 100644
index 000000000..a29b9ef28
--- /dev/null
+++ b/platform/linux-generic/odp_bitmap.c
@@ -0,0 +1,315 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <odp/api/std_types.h>
+#include <odp/api/byteorder.h>
+#include <odp_bitmap_internal.h>
+
+/*
+ * WAPL base class bitmap operations
+ */
+static inline void __wapl_add_pos(
+ wapl_bitmap_t *map, unsigned int p)
+{
+ unsigned int s, k = 0;
+ unsigned int *pl = map->pl;
+
+ while (pl[k] && p > pl[k])
+ k++;
+
+ if (p == pl[k])
+ return;
+
+ /* sorted insertion */
+ for (; pl[k] && p < pl[k]; k++) {
+ s = pl[k];
+ pl[k] = p;
+ p = s;
+ }
+
+ if (k < map->nwords)
+ pl[k++] = p;
+
+ pl[k] = 0;
+}
+
+static inline void __wapl_remove_pos(
+ wapl_bitmap_t *map, unsigned int p)
+{
+ unsigned int k = 0;
+ unsigned int *pl = map->pl;
+
+ while (pl[k] && p != pl[k])
+ k++;
+
+ for (; pl[k]; k++)
+ pl[k] = pl[k + 1];
+}
+
+void __wapl_bitmap_and(wapl_bitmap_t *dst,
+ wapl_bitmap_t *src, wapl_bitmap_t *and)
+{
+ unsigned int k = 0, p;
+ unsigned int *pl = src->pl;
+
+ while ((p = *pl++) != 0) {
+ dst->ul[p] = src->ul[p] & and->ul[p];
+ if (dst->ul[p])
+ dst->pl[k++] = p;
+ }
+
+ dst->pl[k] = 0;
+}
+
+void __wapl_bitmap_or(wapl_bitmap_t *dst, wapl_bitmap_t *or)
+{
+ unsigned int p;
+ unsigned int *pl = or->pl;
+
+ while ((p = *pl++) != 0) {
+ if (dst->ul[p] == 0)
+ __wapl_add_pos(dst, p);
+
+ dst->ul[p] |= or->ul[p];
+ }
+}
+
+void __wapl_bitmap_set(wapl_bitmap_t *map, unsigned int bit)
+{
+ unsigned int p = BIT_WORD(bit) + 1;
+ unsigned long set = 1UL << (bit & (BITS_PER_LONG - 1));
+
+ if (p > map->nwords)
+ return;
+
+ if (map->ul[p] == 0)
+ __wapl_add_pos(map, p);
+
+ map->ul[p] |= set;
+}
+
+void __wapl_bitmap_clear(wapl_bitmap_t *map, unsigned int bit)
+{
+ unsigned int p = BIT_WORD(bit) + 1;
+ unsigned long clear = 1UL << (bit & (BITS_PER_LONG - 1));
+
+ if (p > map->nwords)
+ return;
+
+ map->ul[p] &= ~clear;
+
+ if (map->ul[p] == 0)
+ __wapl_remove_pos(map, p);
+}
+
+/*
+ * WAPL bitmap iterator implementation
+ */
+static void __wapl_iterator_start(wapl_bitmap_iterator_t *this)
+{
+ this->_nbits = this->_base.nwords * BITS_PER_LONG;
+
+ /* Advance to next queue index to start this
+ * new round iteration.
+ */
+ if (this->_base.pl[0] == 0)
+ this->_start = -1;
+ else
+ this->_start = __bitmap_wraparound_next(
+ &this->_base.ul[1], this->_nbits, this->_start + 1);
+
+ this->_next = this->_start;
+}
+
+static bool __wapl_iterator_has_next(wapl_bitmap_iterator_t *this)
+{
+ return (this->_next != -1);
+}
+
+static unsigned int __wapl_iterator_next(wapl_bitmap_iterator_t *this)
+{
+ int next = this->_next;
+
+ this->_next = __bitmap_wraparound_next(
+ &this->_base.ul[1], this->_nbits, this->_next + 1);
+
+ if (this->_next == this->_start)
+ this->_next = -1;
+
+ return next;
+}
+
+void __wapl_bitmap_iterator(wapl_bitmap_iterator_t *this)
+{
+ this->start = __wapl_iterator_start;
+ this->has_next = __wapl_iterator_has_next;
+ this->next = __wapl_iterator_next;
+
+ this->_start = -1;
+ this->_next = this->_start;
+}
+
+/*
+ * Sparse base class bitmap operations
+ */
+void __sparse_bitmap_set(sparse_bitmap_t *map, unsigned int bit)
+{
+ unsigned int last = *map->last;
+
+ /* Index exceeds */
+ if (bit >= map->nbits)
+ return;
+
+ /* Full bitmap */
+ if (last >= map->nbits)
+ return;
+
+ /* Bit was not set previously,
+ * also record where we set the bit
+ */
+ if (!map->pl[bit]) {
+ map->il[last++] = bit;
+ map->pl[bit] = last;
+
+ *map->last = last;
+ }
+}
+
+void __sparse_bitmap_clear(sparse_bitmap_t *map, unsigned int bit)
+{
+ unsigned int p, i;
+ unsigned int last = *map->last;
+
+ /* Index exceeds */
+ if (bit >= map->nbits)
+ return;
+
+ /* Empty bitmap */
+ if (last == 0)
+ return;
+
+ /* Bit was set previously */
+ if (map->pl[bit]) {
+ p = map->pl[bit] - 1;
+ map->pl[bit] = 0;
+
+ last--;
+ *map->last = last;
+
+ /* Fill the hole with the latest index */
+ if (p < last) {
+ i = map->il[last];
+ map->pl[i] = p + 1;
+ map->il[p] = i;
+ }
+ }
+}
+
+/*
+ * Sparse bitmap iterator implementation
+ */
+static void __sparse_iterator_start(sparse_bitmap_iterator_t *this)
+{
+ this->_nbits = (int)*this->_base.last;
+
+ /* Advance to next queue index to start this
+ * new round iteration.
+ */
+ if (this->_nbits == 0)
+ this->_start = -1;
+ else
+ this->_start = (this->_start + 1) & (this->_nbits - 1);
+
+ this->_next = this->_start;
+}
+
+static bool __sparse_iterator_has_next(sparse_bitmap_iterator_t *this)
+{
+ return (this->_next != -1);
+}
+
+static unsigned int __sparse_iterator_next(sparse_bitmap_iterator_t *this)
+{
+ int next = this->_next;
+
+ this->_next = (this->_next + 1) & (this->_nbits - 1);
+ if (this->_next == this->_start)
+ this->_next = -1;
+
+ return this->_base.il[next];
+}
+
+void __sparse_bitmap_iterator(sparse_bitmap_iterator_t *this)
+{
+ this->start = __sparse_iterator_start;
+ this->has_next = __sparse_iterator_has_next;
+ this->next = __sparse_iterator_next;
+
+ this->_start = -1;
+ this->_next = this->_start;
+}
+
+/*
+ * Generic byte-width atomic set/clear
+ */
+static inline void atomic_byte_set(
+ unsigned char *addr, unsigned int bit)
+{
+ unsigned char load, store;
+ unsigned char set = 1 << (bit & (BITS_PER_BYTE - 1));
+
+ do {
+ load = *addr;
+ store = load | set;
+ } while (!__atomic_compare_exchange_n(addr, &load, store,
+ 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED));
+}
+
+static inline void atomic_byte_clear(
+ unsigned char *addr, unsigned int bit)
+{
+ unsigned char load, store;
+ unsigned char clear = 1 << (bit & (BITS_PER_BYTE - 1));
+
+ do {
+ load = *addr;
+ store = load & ~clear;
+ } while (!__atomic_compare_exchange_n(addr, &load, store,
+ 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED));
+}
+
+static inline unsigned char *__bit_byte(
+ unsigned long *word, unsigned int bit)
+{
+ unsigned int i;
+ unsigned char *b;
+
+ b = (unsigned char *)word;
+
+ i = bit & (BITS_PER_LONG - 1);
+ i = i / BITS_PER_BYTE;
+
+#if (ODP_BYTE_ORDER == ODP_BIG_ENDIAN)
+ i = BYTES_PER_LONG - 1 - i;
+#endif
+ return &b[i];
+}
+
+void raw_bitmap_set(unsigned long *map, unsigned int bit)
+{
+ unsigned long *p = map + BIT_WORD(bit);
+
+ atomic_byte_set(__bit_byte(p, bit), bit);
+}
+
+void raw_bitmap_clear(unsigned long *map, unsigned int bit)
+{
+ unsigned long *p = map + BIT_WORD(bit);
+
+ atomic_byte_clear(__bit_byte(p, bit), bit);
+}
diff --git a/platform/linux-generic/odp_buffer.c b/platform/linux-generic/odp_buffer.c
index b79103973..88c8140b5 100644
--- a/platform/linux-generic/odp_buffer.c
+++ b/platform/linux-generic/odp_buffer.c
@@ -76,3 +76,8 @@ void odp_buffer_print(odp_buffer_t buf)
ODP_PRINT("\n%s\n", str);
}
+
+uint64_t odp_buffer_to_u64(odp_buffer_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c
index 50a7e5473..5d96b00b3 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -185,7 +185,6 @@ odp_cos_t odp_cls_cos_create(const char *name, odp_cls_cos_param_t *param)
}
cos_tbl->cos_entry[i].s.queue = queue;
cos_tbl->cos_entry[i].s.pool = param->pool;
- cos_tbl->cos_entry[i].s.flow_set = 0;
cos_tbl->cos_entry[i].s.headroom = 0;
cos_tbl->cos_entry[i].s.valid = 1;
cos_tbl->cos_entry[i].s.drop_policy = drop_policy;
@@ -447,6 +446,32 @@ static int odp_pmr_create_term(pmr_term_value_t *value,
{
value->term = param->term;
value->range_term = param->range_term;
+ uint8_t i;
+
+ switch (value->term) {
+ case ODP_PMR_SIP6_ADDR:
+ case ODP_PMR_DIP6_ADDR:
+ if (!value->range_term) {
+ memset(value->match_ipv6.addr.u8, 0, 16);
+ memset(value->match_ipv6.mask.u8, 0, 16);
+ memcpy(&value->match_ipv6.addr.u8, param->match.value,
+ param->val_sz);
+ memcpy(&value->match_ipv6.mask.u8, param->match.mask,
+ param->val_sz);
+ for (i = 0; i < 2; i++)
+ value->match_ipv6.addr.u64[i] &=
+ value->match_ipv6.mask.u64[i];
+ } else {
+ memset(value->range_ipv6.addr_start.u8, 0, 16);
+ memset(value->range_ipv6.addr_end.u8, 0, 16);
+ memcpy(&value->range_ipv6.addr_start.u8, param->range.val_start,
+ param->val_sz);
+ memcpy(&value->range_ipv6.addr_end.u8, param->range.val_end,
+ param->val_sz);
+ }
+
+ break;
+ default:
if (!value->range_term) {
value->match.value = 0;
value->match.mask = 0;
@@ -461,6 +486,7 @@ static int odp_pmr_create_term(pmr_term_value_t *value,
memcpy(&value->range.val_end, param->range.val_end,
param->val_sz);
}
+ }
value->offset = param->offset;
value->val_sz = param->val_sz;
return 0;
@@ -732,7 +758,6 @@ int pktio_classifier_init(pktio_entry_t *entry)
if (entry == NULL)
return -1;
cls = &entry->s.cls;
- cls->flow_set = 0;
cls->error_cos = NULL;
cls->default_cos = NULL;
cls->headroom = 0;
@@ -897,3 +922,13 @@ cos_t *match_qos_cos(pktio_entry_t *entry, const uint8_t *pkt_addr,
}
return NULL;
}
+
+uint64_t odp_cos_to_u64(odp_cos_t hdl)
+{
+ return _odp_pri(hdl);
+}
+
+uint64_t odp_pmr_to_u64(odp_pmr_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_crypto.c b/platform/linux-generic/odp_crypto.c
index 4f17fd66c..54b222fd2 100644
--- a/platform/linux-generic/odp_crypto.c
+++ b/platform/linux-generic/odp_crypto.c
@@ -949,14 +949,14 @@ odp_crypto_operation(odp_crypto_op_param_t *param,
return 0;
}
-static unsigned long openssl_thread_id(void)
+static void ODP_UNUSED openssl_thread_id(CRYPTO_THREADID ODP_UNUSED *id)
{
- return (unsigned long)odp_thread_id();
+ CRYPTO_THREADID_set_numeric(id, odp_thread_id());
}
-static void openssl_lock(int mode, int n,
- const char *file ODP_UNUSED,
- int line ODP_UNUSED)
+static void ODP_UNUSED openssl_lock(int mode, int n,
+ const char *file ODP_UNUSED,
+ int line ODP_UNUSED)
{
if (mode & CRYPTO_LOCK)
odp_ticketlock_lock((odp_ticketlock_t *)
@@ -1003,7 +1003,7 @@ odp_crypto_init_global(void)
odp_ticketlock_init((odp_ticketlock_t *)
&global->openssl_lock[idx]);
- CRYPTO_set_id_callback(openssl_thread_id);
+ CRYPTO_THREADID_set_callback(openssl_thread_id);
CRYPTO_set_locking_callback(openssl_lock);
}
@@ -1120,3 +1120,13 @@ void odp_crypto_session_param_init(odp_crypto_session_param_t *param)
{
memset(param, 0, sizeof(odp_crypto_session_param_t));
}
+
+uint64_t odp_crypto_session_to_u64(odp_crypto_session_t hdl)
+{
+ return (uint64_t)hdl;
+}
+
+uint64_t odp_crypto_compl_to_u64(odp_crypto_compl_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_event.c b/platform/linux-generic/odp_event.c
index cc3fb0ad1..d71f4464a 100644
--- a/platform/linux-generic/odp_event.c
+++ b/platform/linux-generic/odp_event.c
@@ -38,3 +38,8 @@ void odp_event_free(odp_event_t event)
ODP_ABORT("Invalid event type: %d\n", odp_event_type(event));
}
}
+
+uint64_t odp_event_to_u64(odp_event_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index f632a513f..60eef3a64 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <odp/api/plat/packet_inlines.h>
#include <odp/api/packet.h>
#include <odp_packet_internal.h>
#include <odp_debug_internal.h>
@@ -23,9 +24,28 @@
/* Initial packet segment data length */
#define BASE_LEN CONFIG_PACKET_MAX_SEG_LEN
-static inline odp_packet_t packet_handle(odp_packet_hdr_t *pkt_hdr)
+/* Fill in packet header field offsets for inline functions */
+const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE = {
+ .data = offsetof(odp_packet_hdr_t, buf_hdr.seg[0].data),
+ .seg_len = offsetof(odp_packet_hdr_t, buf_hdr.seg[0].len),
+ .frame_len = offsetof(odp_packet_hdr_t, frame_len),
+ .headroom = offsetof(odp_packet_hdr_t, headroom),
+ .tailroom = offsetof(odp_packet_hdr_t, tailroom),
+ .pool = offsetof(odp_packet_hdr_t, buf_hdr.pool_hdl),
+ .input = offsetof(odp_packet_hdr_t, input),
+ .segcount = offsetof(odp_packet_hdr_t, buf_hdr.segcount),
+ .user_ptr = offsetof(odp_packet_hdr_t, buf_hdr.buf_ctx),
+ .user_area = offsetof(odp_packet_hdr_t, buf_hdr.uarea_addr),
+ .user_area_size = offsetof(odp_packet_hdr_t, buf_hdr.uarea_size),
+ .flow_hash = offsetof(odp_packet_hdr_t, flow_hash),
+ .timestamp = offsetof(odp_packet_hdr_t, timestamp),
+ .input_flags = offsetof(odp_packet_hdr_t, p.input_flags)
+
+};
+
+static inline odp_packet_hdr_t *packet_hdr(odp_packet_t pkt)
{
- return (odp_packet_t)pkt_hdr->buf_hdr.handle.handle;
+ return (odp_packet_hdr_t *)(uintptr_t)pkt;
}
static inline odp_buffer_t buffer_handle(odp_packet_hdr_t *pkt_hdr)
@@ -33,6 +53,11 @@ static inline odp_buffer_t buffer_handle(odp_packet_hdr_t *pkt_hdr)
return pkt_hdr->buf_hdr.handle.handle;
}
+static inline odp_packet_hdr_t *buf_to_packet_hdr(odp_buffer_t buf)
+{
+ return (odp_packet_hdr_t *)buf_hdl_to_hdr(buf);
+}
+
static inline uint32_t packet_seg_len(odp_packet_hdr_t *pkt_hdr,
uint32_t seg_idx)
{
@@ -485,8 +510,8 @@ static inline int packet_alloc(pool_t *pool, uint32_t len, int max_pkt,
odp_packet_hdr_t *hdr;
/* First buffer is the packet descriptor */
- pkt[i] = (odp_packet_t)buf[i * num_seg];
hdr = pkt_hdr[i * num_seg];
+ pkt[i] = packet_handle(hdr);
init_segments(&pkt_hdr[i * num_seg], num_seg);
packet_init(hdr, len, parse);
@@ -552,11 +577,13 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
void odp_packet_free(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+ odp_buffer_t hdl = buffer_handle(pkt_hdr);
+
int num_seg = pkt_hdr->buf_hdr.segcount;
if (odp_likely(CONFIG_PACKET_MAX_SEGS == 1 || num_seg == 1))
- buffer_free_multi((odp_buffer_t *)&pkt, 1);
+ buffer_free_multi(&hdl, 1);
else
free_bufs(pkt_hdr, 0, num_seg);
}
@@ -571,11 +598,11 @@ void odp_packet_free_multi(const odp_packet_t pkt[], int num)
int bufs = 0;
for (i = 0; i < num; i++) {
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt[i]);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt[i]);
int num_seg = pkt_hdr->buf_hdr.segcount;
odp_buffer_hdr_t *buf_hdr = &pkt_hdr->buf_hdr;
- buf[bufs] = (odp_buffer_t)pkt[i];
+ buf[bufs] = buffer_handle(pkt_hdr);
bufs++;
if (odp_likely(num_seg == 1))
@@ -593,7 +620,7 @@ void odp_packet_free_multi(const odp_packet_t pkt[], int num)
int odp_packet_reset(odp_packet_t pkt, uint32_t len)
{
- odp_packet_hdr_t *const pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *const pkt_hdr = packet_hdr(pkt);
pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
if (len > pool->headroom + pool->data_size + pool->tailroom)
@@ -606,22 +633,34 @@ int odp_packet_reset(odp_packet_t pkt, uint32_t len)
odp_packet_t _odp_packet_from_buffer(odp_buffer_t buf)
{
- return (odp_packet_t)buf;
+ if (odp_unlikely(buf == ODP_BUFFER_INVALID))
+ return ODP_PACKET_INVALID;
+
+ return (odp_packet_t)buf_to_packet_hdr(buf);
}
odp_buffer_t _odp_packet_to_buffer(odp_packet_t pkt)
{
- return (odp_buffer_t)pkt;
+ if (odp_unlikely(pkt == ODP_PACKET_INVALID))
+ return ODP_BUFFER_INVALID;
+
+ return buffer_handle(packet_hdr(pkt));
}
odp_packet_t odp_packet_from_event(odp_event_t ev)
{
- return (odp_packet_t)ev;
+ if (odp_unlikely(ev == ODP_EVENT_INVALID))
+ return ODP_PACKET_INVALID;
+
+ return (odp_packet_t)buf_to_packet_hdr((odp_buffer_t)ev);
}
odp_event_t odp_packet_to_event(odp_packet_t pkt)
{
- return (odp_event_t)pkt;
+ if (odp_unlikely(pkt == ODP_PACKET_INVALID))
+ return ODP_EVENT_INVALID;
+
+ return (odp_event_t)buffer_handle(packet_hdr(pkt));
}
/*
@@ -631,59 +670,23 @@ odp_event_t odp_packet_to_event(odp_packet_t pkt)
*
*/
-void *odp_packet_head(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->buf_hdr.seg[0].data - pkt_hdr->headroom;
-}
-
uint32_t odp_packet_buf_len(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
return pkt_hdr->buf_hdr.size * pkt_hdr->buf_hdr.segcount;
}
-void *odp_packet_data(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return packet_data(pkt_hdr);
-}
-
-uint32_t odp_packet_seg_len(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return packet_first_seg_len(pkt_hdr);
-}
-
-uint32_t odp_packet_len(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->frame_len;
-}
-
-uint32_t odp_packet_headroom(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->headroom;
-}
-
-uint32_t odp_packet_tailroom(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->tailroom;
-}
-
void *odp_packet_tail(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
return packet_tail(pkt_hdr);
}
void *odp_packet_push_head(odp_packet_t pkt, uint32_t len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (len > pkt_hdr->headroom)
return NULL;
@@ -868,7 +871,7 @@ static inline void reset_seg(odp_packet_hdr_t *pkt_hdr, int first, int num)
int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
void **data_ptr, uint32_t *seg_len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(*pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(*pkt);
uint32_t frame_len = pkt_hdr->frame_len;
uint32_t headroom = pkt_hdr->headroom;
int ret = 0;
@@ -972,7 +975,7 @@ int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
void *odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (len > pkt_hdr->frame_len)
return NULL;
@@ -984,7 +987,7 @@ void *odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len,
void **data_ptr, uint32_t *seg_len_out)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(*pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(*pkt);
uint32_t seg_len = packet_first_seg_len(pkt_hdr);
if (len > pkt_hdr->frame_len)
@@ -1018,7 +1021,7 @@ int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len,
void *odp_packet_push_tail(odp_packet_t pkt, uint32_t len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
void *old_tail;
if (len > pkt_hdr->tailroom)
@@ -1033,7 +1036,7 @@ void *odp_packet_push_tail(odp_packet_t pkt, uint32_t len)
int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len,
void **data_ptr, uint32_t *seg_len_out)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(*pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(*pkt);
uint32_t frame_len = pkt_hdr->frame_len;
uint32_t tailroom = pkt_hdr->tailroom;
uint32_t tail_off = frame_len;
@@ -1124,7 +1127,7 @@ int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len,
void *odp_packet_pull_tail(odp_packet_t pkt, uint32_t len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (len > packet_last_seg_len(pkt_hdr))
return NULL;
@@ -1139,7 +1142,7 @@ int odp_packet_trunc_tail(odp_packet_t *pkt, uint32_t len,
{
int last;
uint32_t seg_len;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(*pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(*pkt);
if (len > pkt_hdr->frame_len)
return -1;
@@ -1174,7 +1177,7 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len,
odp_packet_seg_t *seg)
{
int seg_idx;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
void *addr = packet_map(pkt_hdr, offset, len, &seg_idx);
if (addr != NULL && seg != NULL)
@@ -1183,13 +1186,6 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len,
return addr;
}
-/* This function is a no-op */
-void odp_packet_prefetch(odp_packet_t pkt ODP_UNUSED,
- uint32_t offset ODP_UNUSED,
- uint32_t len ODP_UNUSED)
-{
-}
-
/*
*
* Meta-data
@@ -1197,44 +1193,19 @@ void odp_packet_prefetch(odp_packet_t pkt ODP_UNUSED,
*
*/
-odp_pool_t odp_packet_pool(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->buf_hdr.pool_hdl;
-}
-
-odp_pktio_t odp_packet_input(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->input;
-}
-
int odp_packet_input_index(odp_packet_t pkt)
{
- return odp_pktio_index(odp_packet_hdr(pkt)->input);
-}
-
-void *odp_packet_user_ptr(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->buf_hdr.buf_ctx;
+ return odp_pktio_index(packet_hdr(pkt)->input);
}
void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ctx)
{
- odp_packet_hdr(pkt)->buf_hdr.buf_cctx = ctx;
-}
-
-void *odp_packet_user_area(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->buf_hdr.uarea_addr;
-}
-
-uint32_t odp_packet_user_area_size(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->buf_hdr.uarea_size;
+ packet_hdr(pkt)->buf_hdr.buf_cctx = ctx;
}
void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (!packet_hdr_has_l2(pkt_hdr))
return NULL;
@@ -1243,7 +1214,7 @@ void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len)
uint32_t odp_packet_l2_offset(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (!packet_hdr_has_l2(pkt_hdr))
return ODP_PACKET_OFFSET_INVALID;
@@ -1252,7 +1223,7 @@ uint32_t odp_packet_l2_offset(odp_packet_t pkt)
int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (offset >= pkt_hdr->frame_len)
return -1;
@@ -1264,7 +1235,7 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset)
void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (pkt_hdr->p.parsed_layers < LAYER_L3)
packet_parse_layer(pkt_hdr, LAYER_L3);
@@ -1273,7 +1244,7 @@ void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
uint32_t odp_packet_l3_offset(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (pkt_hdr->p.parsed_layers < LAYER_L3)
packet_parse_layer(pkt_hdr, LAYER_L3);
@@ -1282,7 +1253,7 @@ uint32_t odp_packet_l3_offset(odp_packet_t pkt)
int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (offset >= pkt_hdr->frame_len)
return -1;
@@ -1295,7 +1266,7 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (pkt_hdr->p.parsed_layers < LAYER_L4)
packet_parse_layer(pkt_hdr, LAYER_L4);
@@ -1304,7 +1275,7 @@ void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
uint32_t odp_packet_l4_offset(odp_packet_t pkt)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (pkt_hdr->p.parsed_layers < LAYER_L4)
packet_parse_layer(pkt_hdr, LAYER_L4);
@@ -1313,7 +1284,7 @@ uint32_t odp_packet_l4_offset(odp_packet_t pkt)
int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (offset >= pkt_hdr->frame_len)
return -1;
@@ -1324,72 +1295,22 @@ int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset)
return 0;
}
-uint32_t odp_packet_flow_hash(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->flow_hash;
-}
-
void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t flow_hash)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
pkt_hdr->flow_hash = flow_hash;
pkt_hdr->p.input_flags.flow_hash = 1;
}
-odp_time_t odp_packet_ts(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->timestamp;
-}
-
void odp_packet_ts_set(odp_packet_t pkt, odp_time_t timestamp)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
pkt_hdr->timestamp = timestamp;
pkt_hdr->p.input_flags.timestamp = 1;
}
-int odp_packet_is_segmented(odp_packet_t pkt)
-{
- return odp_packet_hdr(pkt)->buf_hdr.segcount > 1;
-}
-
-int odp_packet_num_segs(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->buf_hdr.segcount;
-}
-
-odp_packet_seg_t odp_packet_first_seg(odp_packet_t pkt)
-{
- (void)pkt;
-
- return 0;
-}
-
-odp_packet_seg_t odp_packet_last_seg(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return packet_last_seg(pkt_hdr);
-}
-
-odp_packet_seg_t odp_packet_next_seg(odp_packet_t pkt, odp_packet_seg_t seg)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- if (odp_unlikely(seg >= (odp_packet_seg_t)packet_last_seg(pkt_hdr)))
- return ODP_PACKET_SEG_INVALID;
-
- return seg + 1;
-}
-
/*
*
* Segment level
@@ -1399,7 +1320,7 @@ odp_packet_seg_t odp_packet_next_seg(odp_packet_t pkt, odp_packet_seg_t seg)
void *odp_packet_seg_data(odp_packet_t pkt, odp_packet_seg_t seg)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (odp_unlikely(seg >= pkt_hdr->buf_hdr.segcount))
return NULL;
@@ -1409,7 +1330,7 @@ void *odp_packet_seg_data(odp_packet_t pkt, odp_packet_seg_t seg)
uint32_t odp_packet_seg_data_len(odp_packet_t pkt, odp_packet_seg_t seg)
{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (odp_unlikely(seg >= pkt_hdr->buf_hdr.segcount))
return 0;
@@ -1427,7 +1348,7 @@ uint32_t odp_packet_seg_data_len(odp_packet_t pkt, odp_packet_seg_t seg)
int odp_packet_add_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len)
{
odp_packet_t pkt = *pkt_ptr;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
uint32_t pktlen = pkt_hdr->frame_len;
odp_packet_t newpkt;
@@ -1456,7 +1377,7 @@ int odp_packet_add_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len)
int odp_packet_rem_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len)
{
odp_packet_t pkt = *pkt_ptr;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
uint32_t pktlen = pkt_hdr->frame_len;
odp_packet_t newpkt;
@@ -1488,7 +1409,7 @@ int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len,
int rc;
uint32_t shift;
uint32_t seglen = 0; /* GCC */
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(*pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(*pkt);
void *addr = packet_map(pkt_hdr, offset, &seglen, NULL);
uint64_t uaddr = (uint64_t)(uintptr_t)addr;
uint64_t misalign;
@@ -1498,7 +1419,7 @@ int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len,
if (seglen >= len) {
misalign = align <= 1 ? 0 :
- ODP_ALIGN_ROUNDUP(uaddr, align) - uaddr;
+ ROUNDUP_ALIGN(uaddr, align) - uaddr;
if (misalign == 0)
return 0;
shift = align - misalign;
@@ -1508,7 +1429,7 @@ int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len,
shift = len - seglen;
uaddr -= shift;
misalign = align <= 1 ? 0 :
- ODP_ALIGN_ROUNDUP(uaddr, align) - uaddr;
+ ROUNDUP_ALIGN(uaddr, align) - uaddr;
if (misalign)
shift += align - misalign;
}
@@ -1518,7 +1439,7 @@ int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len,
return rc;
(void)odp_packet_move_data(*pkt, 0, shift,
- odp_packet_len(*pkt) - shift);
+ _odp_packet_len(*pkt) - shift);
(void)odp_packet_trunc_tail(pkt, shift, NULL, NULL);
return 1;
@@ -1526,8 +1447,8 @@ int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len,
int odp_packet_concat(odp_packet_t *dst, odp_packet_t src)
{
- odp_packet_hdr_t *dst_hdr = odp_packet_hdr(*dst);
- odp_packet_hdr_t *src_hdr = odp_packet_hdr(src);
+ odp_packet_hdr_t *dst_hdr = packet_hdr(*dst);
+ odp_packet_hdr_t *src_hdr = packet_hdr(src);
int dst_segs = dst_hdr->buf_hdr.segcount;
int src_segs = src_hdr->buf_hdr.segcount;
odp_pool_t dst_pool = dst_hdr->buf_hdr.pool_hdl;
@@ -1562,7 +1483,7 @@ int odp_packet_concat(odp_packet_t *dst, odp_packet_t src)
int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
{
- uint32_t pktlen = odp_packet_len(*pkt);
+ uint32_t pktlen = _odp_packet_len(*pkt);
if (len >= pktlen || tail == NULL)
return -1;
@@ -1585,7 +1506,7 @@ int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool)
{
- odp_packet_hdr_t *srchdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *srchdr = packet_hdr(pkt);
uint32_t pktlen = srchdr->frame_len;
odp_packet_t newpkt = odp_packet_alloc(pool, pktlen);
@@ -1603,7 +1524,7 @@ odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool)
odp_packet_t odp_packet_copy_part(odp_packet_t pkt, uint32_t offset,
uint32_t len, odp_pool_t pool)
{
- uint32_t pktlen = odp_packet_len(pkt);
+ uint32_t pktlen = _odp_packet_len(pkt);
odp_packet_t newpkt;
if (offset >= pktlen || offset + len > pktlen)
@@ -1623,7 +1544,7 @@ int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
uint32_t seglen = 0; /* GCC */
uint32_t cpylen;
uint8_t *dstaddr = (uint8_t *)dst;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (offset + len > pkt_hdr->frame_len)
return -1;
@@ -1647,7 +1568,7 @@ int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
uint32_t seglen = 0; /* GCC */
uint32_t cpylen;
const uint8_t *srcaddr = (const uint8_t *)src;
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
if (offset + len > pkt_hdr->frame_len)
return -1;
@@ -1668,8 +1589,8 @@ int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset,
odp_packet_t src, uint32_t src_offset,
uint32_t len)
{
- odp_packet_hdr_t *dst_hdr = odp_packet_hdr(dst);
- odp_packet_hdr_t *src_hdr = odp_packet_hdr(src);
+ odp_packet_hdr_t *dst_hdr = packet_hdr(dst);
+ odp_packet_hdr_t *src_hdr = packet_hdr(src);
void *dst_map;
void *src_map;
uint32_t cpylen, minseg;
@@ -1746,10 +1667,11 @@ void odp_packet_print(odp_packet_t pkt)
char str[max_len];
int len = 0;
int n = max_len - 1;
- odp_packet_hdr_t *hdr = odp_packet_hdr(pkt);
+ odp_packet_hdr_t *hdr = packet_hdr(pkt);
+ odp_buffer_t buf = _odp_packet_to_buffer(pkt);
len += snprintf(&str[len], n - len, "Packet ");
- len += odp_buffer_snprint(&str[len], n - len, (odp_buffer_t)pkt);
+ len += odp_buffer_snprint(&str[len], n - len, buf);
len += snprintf(&str[len], n - len, " input_flags 0x%" PRIx64 "\n",
hdr->p.input_flags.all);
len += snprintf(&str[len], n - len, " error_flags 0x%" PRIx32 "\n",
@@ -1794,7 +1716,7 @@ void odp_packet_print(odp_packet_t pkt)
int odp_packet_is_valid(odp_packet_t pkt)
{
- if (odp_buffer_is_valid((odp_buffer_t)pkt) == 0)
+ if (odp_buffer_is_valid(_odp_packet_to_buffer(pkt)) == 0)
return 0;
if (odp_event_type(odp_packet_to_event(pkt)) != ODP_EVENT_PACKET)
@@ -1812,8 +1734,8 @@ int odp_packet_is_valid(odp_packet_t pkt)
int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt)
{
- odp_packet_hdr_t *srchdr = odp_packet_hdr(srcpkt);
- odp_packet_hdr_t *dsthdr = odp_packet_hdr(dstpkt);
+ odp_packet_hdr_t *srchdr = packet_hdr(srcpkt);
+ odp_packet_hdr_t *dsthdr = packet_hdr(dstpkt);
dsthdr->input = srchdr->input;
dsthdr->dst_queue = srchdr->dst_queue;
@@ -1888,7 +1810,7 @@ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr,
{
const _odp_ipv6hdr_t *ipv6 = (const _odp_ipv6hdr_t *)*parseptr;
const _odp_ipv6hdr_ext_t *ipv6ext;
- uint32_t dstaddr0 = odp_be_to_cpu_32(ipv6->dst_addr[0]);
+ uint32_t dstaddr0 = odp_be_to_cpu_32(ipv6->dst_addr.u8[0]);
prs->l3_len = odp_be_to_cpu_16(ipv6->payload_len) +
_ODP_IPV6HDR_LEN;
@@ -2211,3 +2133,92 @@ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, layer_t layer)
return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len,
seg_len, layer);
}
+
+uint64_t odp_packet_to_u64(odp_packet_t hdl)
+{
+ return _odp_pri(hdl);
+}
+
+uint64_t odp_packet_seg_to_u64(odp_packet_seg_t hdl)
+{
+ return _odp_pri(hdl);
+}
+
+odp_packet_t odp_packet_ref_static(odp_packet_t pkt)
+{
+ return odp_packet_copy(pkt, odp_packet_pool(pkt));
+}
+
+odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset)
+{
+ odp_packet_t new;
+ int ret;
+
+ new = odp_packet_copy(pkt, odp_packet_pool(pkt));
+
+ if (new == ODP_PACKET_INVALID) {
+ ODP_ERR("copy failed\n");
+ return ODP_PACKET_INVALID;
+ }
+
+ ret = odp_packet_trunc_head(&new, offset, NULL, NULL);
+
+ if (ret < 0) {
+ ODP_ERR("trunk_head failed\n");
+ odp_packet_free(new);
+ return ODP_PACKET_INVALID;
+ }
+
+ return new;
+}
+
+odp_packet_t odp_packet_ref_pkt(odp_packet_t pkt, uint32_t offset,
+ odp_packet_t hdr)
+{
+ odp_packet_t new;
+ int ret;
+
+ new = odp_packet_copy(pkt, odp_packet_pool(pkt));
+
+ if (new == ODP_PACKET_INVALID) {
+ ODP_ERR("copy failed\n");
+ return ODP_PACKET_INVALID;
+ }
+
+ if (offset) {
+ ret = odp_packet_trunc_head(&new, offset, NULL, NULL);
+
+ if (ret < 0) {
+ ODP_ERR("trunk_head failed\n");
+ odp_packet_free(new);
+ return ODP_PACKET_INVALID;
+ }
+ }
+
+ ret = odp_packet_concat(&hdr, new);
+
+ if (ret < 0) {
+ ODP_ERR("concat failed\n");
+ odp_packet_free(new);
+ return ODP_PACKET_INVALID;
+ }
+
+ return hdr;
+}
+
+int odp_packet_has_ref(odp_packet_t pkt)
+{
+ (void)pkt;
+
+ return 0;
+}
+
+uint32_t odp_packet_unshared_len(odp_packet_t pkt)
+{
+ return odp_packet_len(pkt);
+}
+
+/* Include non-inlined versions of API functions */
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/plat/packet_inlines_api.h>
+#endif
diff --git a/platform/linux-generic/odp_packet_flags.c b/platform/linux-generic/odp_packet_flags.c
index 798fa115d..ea9a22710 100644
--- a/platform/linux-generic/odp_packet_flags.c
+++ b/platform/linux-generic/odp_packet_flags.c
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <odp/api/plat/packet_flag_inlines.h>
#include <odp/api/packet_flags.h>
#include <odp_packet_internal.h>
@@ -32,13 +33,6 @@ int odp_packet_has_error(odp_packet_t pkt)
/* Get Input Flags */
-int odp_packet_has_l2(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->p.input_flags.l2;
-}
-
int odp_packet_has_l2_error(odp_packet_t pkt)
{
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
@@ -79,13 +73,6 @@ int odp_packet_has_l4_error(odp_packet_t pkt)
return pkt_hdr->p.error_flags.tcp_err | pkt_hdr->p.error_flags.udp_err;
}
-int odp_packet_has_eth(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->p.input_flags.eth;
-}
-
int odp_packet_has_eth_bcast(odp_packet_t pkt)
{
retflag(pkt, input_flags.eth_bcast, LAYER_L2);
@@ -96,13 +83,6 @@ int odp_packet_has_eth_mcast(odp_packet_t pkt)
retflag(pkt, input_flags.eth_mcast, LAYER_L2);
}
-int odp_packet_has_jumbo(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->p.input_flags.jumbo;
-}
-
int odp_packet_has_vlan(odp_packet_t pkt)
{
retflag(pkt, input_flags.vlan, LAYER_L2);
@@ -173,20 +153,6 @@ int odp_packet_has_icmp(odp_packet_t pkt)
retflag(pkt, input_flags.icmp, LAYER_L4);
}
-int odp_packet_has_flow_hash(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->p.input_flags.flow_hash;
-}
-
-int odp_packet_has_ts(odp_packet_t pkt)
-{
- odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
- return pkt_hdr->p.input_flags.timestamp;
-}
-
odp_packet_color_t odp_packet_color(odp_packet_t pkt)
{
retflag(pkt, input_flags.color, LAYER_ALL);
@@ -352,3 +318,8 @@ void odp_packet_has_ts_clr(odp_packet_t pkt)
pkt_hdr->p.input_flags.timestamp = 0;
}
+
+/* Include non-inlined versions of API functions */
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/plat/packet_flag_inlines_api.h>
+#endif
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c
index 090a55f66..cf7c2c415 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -311,7 +311,7 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params,
/* Validate requested buffer alignment */
if (align > ODP_CONFIG_BUFFER_ALIGN_MAX ||
- align != ODP_ALIGN_ROUNDDOWN_POWER_2(align, align)) {
+ align != ROUNDDOWN_POWER2(align, align)) {
ODP_ERR("Bad align requirement");
return ODP_POOL_INVALID;
}
@@ -349,7 +349,7 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params,
}
if (uarea_size)
- uarea_size = ODP_CACHE_LINE_SIZE_ROUNDUP(uarea_size);
+ uarea_size = ROUNDUP_CACHE_LINE(uarea_size);
pool = reserve_pool();
@@ -373,15 +373,15 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params,
pool->params = *params;
hdr_size = sizeof(odp_packet_hdr_t);
- hdr_size = ODP_CACHE_LINE_SIZE_ROUNDUP(hdr_size);
+ hdr_size = ROUNDUP_CACHE_LINE(hdr_size);
- block_size = ODP_CACHE_LINE_SIZE_ROUNDUP(hdr_size + align + headroom +
- data_size + tailroom);
+ block_size = ROUNDUP_CACHE_LINE(hdr_size + align + headroom +
+ data_size + tailroom);
if (num <= RING_SIZE_MIN)
ring_size = RING_SIZE_MIN;
else
- ring_size = ODP_ROUNDUP_POWER_2(num);
+ ring_size = ROUNDUP_POWER2_U32(num);
pool->ring_mask = ring_size - 1;
pool->num = num;
diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c
index e0a969929..d4267c72f 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -526,8 +526,10 @@ static inline int deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
if (hdr == NULL) {
/* Already empty queue */
- if (queue->s.status == QUEUE_STATUS_SCHED)
+ if (queue->s.status == QUEUE_STATUS_SCHED) {
queue->s.status = QUEUE_STATUS_NOTSCHED;
+ sched_fn->unsched_queue(queue->s.index);
+ }
UNLOCK(&queue->s.lock);
return 0;
@@ -569,6 +571,9 @@ static inline int deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
if (hdr == NULL)
queue->s.tail = NULL;
+ if (queue->s.type == ODP_QUEUE_TYPE_SCHED)
+ sched_fn->save_context(queue);
+
UNLOCK(&queue->s.lock);
return i;
@@ -760,3 +765,8 @@ int sched_cb_queue_empty(uint32_t queue_index)
return ret;
}
+
+uint64_t odp_queue_to_u64(odp_queue_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c
index 645630a7a..cd5bf21bd 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -82,20 +82,20 @@ ODP_STATIC_ASSERT((ODP_SCHED_PRIO_NORMAL > 0) &&
#define PRIO_QUEUE_EMPTY ((uint32_t)-1)
/* For best performance, the number of queues should be a power of two. */
-ODP_STATIC_ASSERT(ODP_VAL_IS_POWER_2(ODP_CONFIG_QUEUES),
+ODP_STATIC_ASSERT(CHECK_IS_POWER2(ODP_CONFIG_QUEUES),
"Number_of_queues_is_not_power_of_two");
/* Ring size must be power of two, so that MAX_QUEUE_IDX_MASK can be used. */
-ODP_STATIC_ASSERT(ODP_VAL_IS_POWER_2(PRIO_QUEUE_RING_SIZE),
+ODP_STATIC_ASSERT(CHECK_IS_POWER2(PRIO_QUEUE_RING_SIZE),
"Ring_size_is_not_power_of_two");
/* Ring size must be power of two, so that PKTIO_RING_MASK can be used. */
-ODP_STATIC_ASSERT(ODP_VAL_IS_POWER_2(PKTIO_RING_SIZE),
+ODP_STATIC_ASSERT(CHECK_IS_POWER2(PKTIO_RING_SIZE),
"pktio_ring_size_is_not_power_of_two");
/* Number of commands queues must be power of two, so that PKTIO_CMD_QUEUE_MASK
* can be used. */
-ODP_STATIC_ASSERT(ODP_VAL_IS_POWER_2(PKTIO_CMD_QUEUES),
+ODP_STATIC_ASSERT(CHECK_IS_POWER2(PKTIO_CMD_QUEUES),
"pktio_cmd_queues_is_not_power_of_two");
/* Mask of queues per priority */
@@ -1200,11 +1200,20 @@ static int schedule_sched_queue(uint32_t queue_index)
return 0;
}
+static int schedule_unsched_queue(uint32_t queue_index ODP_UNUSED)
+{
+ return 0;
+}
+
static int schedule_num_grps(void)
{
return NUM_SCHED_GRPS;
}
+static void schedule_save_context(queue_entry_t *queue ODP_UNUSED)
+{
+}
+
/* Fill in scheduler interface */
const schedule_fn_t schedule_default_fn = {
.pktio_start = schedule_pktio_start,
@@ -1214,6 +1223,7 @@ const schedule_fn_t schedule_default_fn = {
.init_queue = schedule_init_queue,
.destroy_queue = schedule_destroy_queue,
.sched_queue = schedule_sched_queue,
+ .unsched_queue = schedule_unsched_queue,
.ord_enq_multi = schedule_ord_enq_multi,
.init_global = schedule_init_global,
.term_global = schedule_term_global,
@@ -1221,7 +1231,8 @@ const schedule_fn_t schedule_default_fn = {
.term_local = schedule_term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
- .max_ordered_locks = schedule_max_ordered_locks
+ .max_ordered_locks = schedule_max_ordered_locks,
+ .save_context = schedule_save_context
};
/* Fill in scheduler API calls */
diff --git a/platform/linux-generic/odp_schedule_if.c b/platform/linux-generic/odp_schedule_if.c
index daf6c98c2..a9ede98d3 100644
--- a/platform/linux-generic/odp_schedule_if.c
+++ b/platform/linux-generic/odp_schedule_if.c
@@ -12,9 +12,15 @@ extern const schedule_api_t schedule_sp_api;
extern const schedule_fn_t schedule_default_fn;
extern const schedule_api_t schedule_default_api;
+extern const schedule_fn_t schedule_iquery_fn;
+extern const schedule_api_t schedule_iquery_api;
+
#ifdef ODP_SCHEDULE_SP
const schedule_fn_t *sched_fn = &schedule_sp_fn;
const schedule_api_t *sched_api = &schedule_sp_api;
+#elif defined(ODP_SCHEDULE_IQUERY)
+const schedule_fn_t *sched_fn = &schedule_iquery_fn;
+const schedule_api_t *sched_api = &schedule_iquery_api;
#else
const schedule_fn_t *sched_fn = &schedule_default_fn;
const schedule_api_t *sched_api = &schedule_default_api;
diff --git a/platform/linux-generic/odp_schedule_iquery.c b/platform/linux-generic/odp_schedule_iquery.c
new file mode 100644
index 000000000..b69245788
--- /dev/null
+++ b/platform/linux-generic/odp_schedule_iquery.c
@@ -0,0 +1,1521 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <odp/api/schedule.h>
+#include <odp_schedule_if.h>
+#include <odp/api/align.h>
+#include <odp/api/queue.h>
+#include <odp/api/shared_memory.h>
+#include <odp_internal.h>
+#include <odp_debug_internal.h>
+#include <odp_ring_internal.h>
+#include <odp_queue_internal.h>
+#include <odp_buffer_internal.h>
+#include <odp_bitmap_internal.h>
+#include <odp/api/thread.h>
+#include <odp/api/time.h>
+#include <odp/api/rwlock.h>
+#include <odp/api/hints.h>
+#include <odp/api/cpu.h>
+#include <odp/api/thrmask.h>
+#include <odp_config_internal.h>
+
+/* Number of priority levels */
+#define NUM_SCHED_PRIO 8
+
+ODP_STATIC_ASSERT(ODP_SCHED_PRIO_LOWEST == (NUM_SCHED_PRIO - 1),
+ "lowest_prio_does_not_match_with_num_prios");
+
+ODP_STATIC_ASSERT((ODP_SCHED_PRIO_NORMAL > 0) &&
+ (ODP_SCHED_PRIO_NORMAL < (NUM_SCHED_PRIO - 1)),
+ "normal_prio_is_not_between_highest_and_lowest");
+
+/* Number of scheduling groups */
+#define NUM_SCHED_GRPS 256
+
+/* Start of named groups in group mask arrays */
+#define SCHED_GROUP_NAMED (ODP_SCHED_GROUP_CONTROL + 1)
+
+/* Instantiate a WAPL bitmap to be used as queue index bitmap */
+typedef WAPL_BITMAP(ODP_CONFIG_QUEUES) queue_index_bitmap_t;
+
+typedef struct {
+ odp_rwlock_t lock;
+ queue_index_bitmap_t queues; /* queues in this priority level */
+} sched_prio_t;
+
+typedef struct {
+ odp_rwlock_t lock;
+ bool allocated;
+ odp_thrmask_t threads; /* threads subscribe to this group */
+ queue_index_bitmap_t queues; /* queues in this group */
+ char name[ODP_SCHED_GROUP_NAME_LEN];
+} sched_group_t;
+
+/* Packet input poll command queues */
+#define PKTIO_CMD_QUEUES 4
+
+/* Maximum number of packet input queues per command */
+#define MAX_PKTIN 16
+
+/* Maximum number of packet IO interfaces */
+#define NUM_PKTIO ODP_CONFIG_PKTIO_ENTRIES
+
+/* Maximum number of pktio poll commands */
+#define NUM_PKTIO_CMD (MAX_PKTIN * NUM_PKTIO)
+
+/* Pktio command is free */
+#define PKTIO_CMD_FREE ((uint32_t)-1)
+
+/* Packet IO poll queue ring size. In worst case, all pktios
+ * have all pktins enabled and one poll command is created per
+ * pktin queue. The ring size must be larger than or equal to
+ * NUM_PKTIO_CMD / PKTIO_CMD_QUEUES, so that it can hold all
+ * poll commands in the worst case.
+ */
+#define PKTIO_RING_SIZE (NUM_PKTIO_CMD / PKTIO_CMD_QUEUES)
+
+/* Mask for wrapping around pktio poll command index */
+#define PKTIO_RING_MASK (PKTIO_RING_SIZE - 1)
+
+/* Maximum number of dequeues */
+#define MAX_DEQ CONFIG_BURST_SIZE
+
+/* Instantiate a RING data structure as pktio command queue */
+typedef struct {
+ /* Ring header */
+ ring_t ring;
+
+ /* Ring data: pktio poll command indexes */
+ uint32_t cmd_index[PKTIO_RING_SIZE];
+} pktio_cmd_queue_t ODP_ALIGNED_CACHE;
+
+/* Packet IO poll command */
+typedef struct {
+ int pktio;
+ int count;
+ int pktin[MAX_PKTIN];
+ uint32_t index;
+} pktio_cmd_t;
+
+/* Collect the pktio poll resources */
+typedef struct {
+ odp_rwlock_t lock;
+ /* count active commands per pktio interface */
+ int actives[NUM_PKTIO];
+ pktio_cmd_t commands[NUM_PKTIO_CMD];
+ pktio_cmd_queue_t queues[PKTIO_CMD_QUEUES];
+} pktio_poll_t;
+
+/* Forward declaration */
+typedef struct sched_thread_local sched_thread_local_t;
+
+typedef struct {
+ odp_shm_t selfie;
+
+ /* Schedule priorities */
+ sched_prio_t prios[NUM_SCHED_PRIO];
+
+ /* Schedule groups */
+ sched_group_t groups[NUM_SCHED_GRPS];
+
+ /* Cache queue parameters for easy reference */
+ odp_schedule_param_t queues[ODP_CONFIG_QUEUES];
+
+ /* Poll pktio inputs in spare time */
+ pktio_poll_t pktio_poll;
+
+ /* Queues send or unwind their availability indications
+ * for scheduling, the bool value also serves as a focal
+ * point for atomic competition. */
+ bool availables[ODP_CONFIG_QUEUES];
+
+ /* Quick reference to per thread context */
+ sched_thread_local_t *threads[ODP_THREAD_COUNT_MAX];
+} sched_global_t;
+
+/* Per thread events cache */
+typedef struct {
+ int count;
+ odp_queue_t queue;
+ odp_event_t stash[MAX_DEQ], *top;
+} event_cache_t;
+
+/* Maximum number of ordered locks per queue */
+#define MAX_ORDERED_LOCKS_PER_QUEUE 2
+
+ODP_STATIC_ASSERT(MAX_ORDERED_LOCKS_PER_QUEUE <= CONFIG_QUEUE_MAX_ORD_LOCKS,
+ "Too_many_ordered_locks");
+
+/* Ordered stash size */
+#define MAX_ORDERED_STASH 512
+
+/* Storage for stashed enqueue operation arguments */
+typedef struct {
+ odp_buffer_hdr_t *buf_hdr[QUEUE_MULTI_MAX];
+ queue_entry_t *queue;
+ int num;
+} ordered_stash_t;
+
+/* Ordered lock states */
+typedef union {
+ uint8_t u8[CONFIG_QUEUE_MAX_ORD_LOCKS];
+ uint32_t all;
+} lock_called_t;
+
+ODP_STATIC_ASSERT(sizeof(lock_called_t) == sizeof(uint32_t),
+ "Lock_called_values_do_not_fit_in_uint32");
+
+/* Instantiate a sparse bitmap to store thread's interested
+ * queue indexes per priority.
+ */
+typedef SPARSE_BITMAP(ODP_CONFIG_QUEUES) queue_index_sparse_t;
+
+struct sched_thread_local {
+ int thread;
+ bool pause;
+
+ /* Cache events only for atomic queue */
+ event_cache_t cache;
+
+ /* Saved atomic context */
+ bool *atomic;
+
+ /* Record the pktio polls have done */
+ uint16_t pktin_polls;
+
+ /* Interested queue indexes to be checked by thread
+ * at each priority level for scheduling, and a round
+ * robin iterator to improve fairness between queues
+ * in the same priority level.
+ */
+ odp_rwlock_t lock;
+ queue_index_sparse_t indexes[NUM_SCHED_PRIO];
+ sparse_bitmap_iterator_t iterators[NUM_SCHED_PRIO];
+
+ struct {
+ queue_entry_t *src_queue; /**< Source queue entry */
+ uint64_t ctx; /**< Ordered context id */
+ int stash_num; /**< Number of stashed enqueue operations */
+ uint8_t in_order; /**< Order status */
+ lock_called_t lock_called; /**< States of ordered locks */
+ /** Storage for stashed enqueue operations */
+ ordered_stash_t stash[MAX_ORDERED_STASH];
+ } ordered;
+};
+
+/* Global scheduler context */
+static sched_global_t *sched;
+
+/* Thread local scheduler context */
+__thread sched_thread_local_t thread_local;
+
+static int schedule_init_global(void)
+{
+ odp_shm_t shm;
+ int i, k, prio, group;
+
+ ODP_DBG("Schedule[iquery] init ... ");
+
+ shm = odp_shm_reserve("odp_scheduler_iquery",
+ sizeof(sched_global_t),
+ ODP_CACHE_LINE_SIZE, 0);
+
+ sched = odp_shm_addr(shm);
+
+ if (sched == NULL) {
+ ODP_ERR("Schedule[iquery] "
+ "init: shm reserve.\n");
+ return -1;
+ }
+
+ memset(sched, 0, sizeof(sched_global_t));
+
+ sched->selfie = shm;
+
+ for (prio = 0; prio < NUM_SCHED_PRIO; prio++)
+ odp_rwlock_init(&sched->prios[prio].lock);
+
+ for (group = 0; group < NUM_SCHED_GRPS; group++) {
+ sched->groups[group].allocated = false;
+ odp_rwlock_init(&sched->groups[group].lock);
+ }
+
+ odp_rwlock_init(&sched->pktio_poll.lock);
+
+ for (i = 0; i < PKTIO_CMD_QUEUES; i++) {
+ pktio_cmd_queue_t *queue =
+ &sched->pktio_poll.queues[i];
+
+ ring_init(&queue->ring);
+
+ for (k = 0; k < PKTIO_RING_SIZE; k++)
+ queue->cmd_index[k] = RING_EMPTY;
+ }
+
+ for (i = 0; i < NUM_PKTIO_CMD; i++)
+ sched->pktio_poll.commands[i].index = PKTIO_CMD_FREE;
+
+ ODP_DBG("done\n");
+ return 0;
+}
+
+static int schedule_term_global(void)
+{
+ uint32_t i;
+ odp_shm_t shm = sched->selfie;
+
+ for (i = 0; i < ODP_CONFIG_QUEUES; i++) {
+ int count = 0;
+ odp_event_t events[1];
+
+ if (sched->availables[i])
+ count = sched_cb_queue_deq_multi(i, events, 1);
+
+ if (count < 0)
+ sched_cb_queue_destroy_finalize(i);
+ else if (count > 0)
+ ODP_ERR("Queue (%d) not empty\n", i);
+ }
+
+ memset(sched, 0, sizeof(sched_global_t));
+
+ if (odp_shm_free(shm) < 0) {
+ ODP_ERR("Schedule[iquery] "
+ "term: shm release.\n");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * These APIs are used to manipulate thread's interests.
+ */
+static void thread_set_interest(sched_thread_local_t *thread,
+ unsigned int queue_index, int prio);
+
+static void thread_clear_interest(sched_thread_local_t *thread,
+ unsigned int queue_index, int prio);
+
+static void thread_set_interests(sched_thread_local_t *thread,
+ queue_index_bitmap_t *set);
+
+static void thread_clear_interests(sched_thread_local_t *thread,
+ queue_index_bitmap_t *clear);
+
+static void sched_thread_local_reset(void)
+{
+ int prio;
+ queue_index_sparse_t *index;
+ sparse_bitmap_iterator_t *iterator;
+
+ memset(&thread_local, 0, sizeof(sched_thread_local_t));
+
+ thread_local.thread = odp_thread_id();
+ thread_local.cache.queue = ODP_QUEUE_INVALID;
+
+ odp_rwlock_init(&thread_local.lock);
+
+ for (prio = 0; prio < NUM_SCHED_PRIO; prio++) {
+ index = &thread_local.indexes[prio];
+ iterator = &thread_local.iterators[prio];
+
+ sparse_bitmap_zero(index);
+ sparse_bitmap_iterator(iterator, index);
+ }
+}
+
+static int schedule_init_local(void)
+{
+ int group;
+ sched_group_t *G;
+ queue_index_bitmap_t collect;
+
+ wapl_bitmap_zero(&collect);
+ sched_thread_local_reset();
+
+ /* Collect all queue indexes of the schedule groups
+ * which this thread has subscribed
+ */
+ for (group = 0; group < NUM_SCHED_GRPS; group++) {
+ G = &sched->groups[group];
+ odp_rwlock_read_lock(&G->lock);
+
+ if ((group < SCHED_GROUP_NAMED || G->allocated) &&
+ odp_thrmask_isset(&G->threads, thread_local.thread))
+ wapl_bitmap_or(&collect, &collect, &G->queues);
+
+ odp_rwlock_read_unlock(&G->lock);
+ }
+
+ /* Distribute the above collected queue indexes into
+ * thread local interests per priority level.
+ */
+ thread_set_interests(&thread_local, &collect);
+
+ /* "Night gathers, and now my watch begins..." */
+ sched->threads[thread_local.thread] = &thread_local;
+ return 0;
+}
+
+static inline void schedule_release_context(void);
+
+static int schedule_term_local(void)
+{
+ int group;
+ sched_group_t *G;
+
+ if (thread_local.cache.count) {
+ ODP_ERR("Locally pre-scheduled events exist.\n");
+ return -1;
+ }
+
+ schedule_release_context();
+
+ /* Unsubscribe all named schedule groups */
+ for (group = SCHED_GROUP_NAMED;
+ group < NUM_SCHED_GRPS; group++) {
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ if (G->allocated && odp_thrmask_isset(
+ &G->threads, thread_local.thread))
+ odp_thrmask_clr(&G->threads, thread_local.thread);
+
+ odp_rwlock_write_unlock(&G->lock);
+ }
+
+ /* "...for this night and all the nights to come." */
+ sched->threads[thread_local.thread] = NULL;
+ sched_thread_local_reset();
+ return 0;
+}
+
+static int init_sched_queue(uint32_t queue_index,
+ const odp_schedule_param_t *sched_param)
+{
+ int prio, group, thread;
+ sched_prio_t *P;
+ sched_group_t *G;
+ sched_thread_local_t *local;
+
+ prio = sched_param->prio;
+ group = sched_param->group;
+
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ /* Named schedule group must be created prior
+ * to queue creation to this group.
+ */
+ if (group >= SCHED_GROUP_NAMED && !G->allocated) {
+ odp_rwlock_write_unlock(&G->lock);
+ return -1;
+ }
+
+ /* Record the queue in its priority level globally */
+ P = &sched->prios[prio];
+
+ odp_rwlock_write_lock(&P->lock);
+ wapl_bitmap_set(&P->queues, queue_index);
+ odp_rwlock_write_unlock(&P->lock);
+
+ /* Record the queue in its schedule group */
+ wapl_bitmap_set(&G->queues, queue_index);
+
+ /* Cache queue parameters for easy reference */
+ memcpy(&sched->queues[queue_index],
+ sched_param, sizeof(odp_schedule_param_t));
+
+ /* Update all threads in this schedule group to
+ * start check this queue index upon scheduling.
+ */
+ thread = odp_thrmask_first(&G->threads);
+ while (thread >= 0) {
+ local = sched->threads[thread];
+ thread_set_interest(local, queue_index, prio);
+ thread = odp_thrmask_next(&G->threads, thread);
+ }
+
+ odp_rwlock_write_unlock(&G->lock);
+ return 0;
+}
+
+/*
+ * Must be called with schedule group's rwlock held.
+ * This is also being used in destroy_schedule_group()
+ * to destroy all orphan queues while destroying a whole
+ * schedule group.
+ */
+static void __destroy_sched_queue(
+ sched_group_t *G, uint32_t queue_index)
+{
+ int prio, thread;
+ sched_prio_t *P;
+ sched_thread_local_t *local;
+
+ prio = sched->queues[queue_index].prio;
+
+ /* Forget the queue in its schedule group */
+ wapl_bitmap_clear(&G->queues, queue_index);
+
+ /* Forget queue schedule parameters */
+ memset(&sched->queues[queue_index],
+ 0, sizeof(odp_schedule_param_t));
+
+ /* Update all threads in this schedule group to
+ * stop check this queue index upon scheduling.
+ */
+ thread = odp_thrmask_first(&G->threads);
+ while (thread >= 0) {
+ local = sched->threads[thread];
+ thread_clear_interest(local, queue_index, prio);
+ thread = odp_thrmask_next(&G->threads, thread);
+ }
+
+ /* Forget the queue in its priority level globally */
+ P = &sched->prios[prio];
+
+ odp_rwlock_write_lock(&P->lock);
+ wapl_bitmap_clear(&P->queues, queue_index);
+ odp_rwlock_write_unlock(&P->lock);
+}
+
+static void destroy_sched_queue(uint32_t queue_index)
+{
+ int group;
+ sched_group_t *G;
+
+ group = sched->queues[queue_index].group;
+
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ /* Named schedule group could have been destroyed
+ * earlier and left these orphan queues.
+ */
+ if (group >= SCHED_GROUP_NAMED && !G->allocated) {
+ odp_rwlock_write_unlock(&G->lock);
+ return;
+ }
+
+ __destroy_sched_queue(G, queue_index);
+ odp_rwlock_write_unlock(&G->lock);
+}
+
+static int pktio_cmd_queue_hash(int pktio, int pktin)
+{
+ return (pktio ^ pktin) % PKTIO_CMD_QUEUES;
+}
+
+static inline pktio_cmd_t *alloc_pktio_cmd(void)
+{
+ int i;
+ pktio_cmd_t *cmd = NULL;
+
+ odp_rwlock_write_lock(&sched->pktio_poll.lock);
+
+ /* Find next free command */
+ for (i = 0; i < NUM_PKTIO_CMD; i++) {
+ if (sched->pktio_poll.commands[i].index
+ == PKTIO_CMD_FREE) {
+ cmd = &sched->pktio_poll.commands[i];
+ cmd->index = i;
+ break;
+ }
+ }
+
+ odp_rwlock_write_unlock(&sched->pktio_poll.lock);
+ return cmd;
+}
+
+static inline void free_pktio_cmd(pktio_cmd_t *cmd)
+{
+ odp_rwlock_write_lock(&sched->pktio_poll.lock);
+
+ cmd->index = PKTIO_CMD_FREE;
+
+ odp_rwlock_write_unlock(&sched->pktio_poll.lock);
+}
+
+static void schedule_pktio_start(int pktio, int count, int pktin[])
+{
+ int i, index;
+ pktio_cmd_t *cmd;
+
+ if (count > MAX_PKTIN)
+ ODP_ABORT("Too many input queues for scheduler\n");
+
+ /* Record the active commands count per pktio interface */
+ sched->pktio_poll.actives[pktio] = count;
+
+ /* Create a pktio poll command per pktin */
+ for (i = 0; i < count; i++) {
+ cmd = alloc_pktio_cmd();
+
+ if (cmd == NULL)
+ ODP_ABORT("Scheduler out of pktio commands\n");
+
+ index = pktio_cmd_queue_hash(pktio, pktin[i]);
+
+ cmd->pktio = pktio;
+ cmd->count = 1;
+ cmd->pktin[0] = pktin[i];
+ ring_enq(&sched->pktio_poll.queues[index].ring,
+ PKTIO_RING_MASK, cmd->index);
+ }
+}
+
+static int schedule_pktio_stop(int pktio, int pktin ODP_UNUSED)
+{
+ int remains;
+
+ odp_rwlock_write_lock(&sched->pktio_poll.lock);
+
+ sched->pktio_poll.actives[pktio]--;
+ remains = sched->pktio_poll.actives[pktio];
+
+ odp_rwlock_write_unlock(&sched->pktio_poll.lock);
+ return remains;
+}
+
+#define DO_SCHED_LOCK() odp_rwlock_read_lock(&thread_local.lock)
+#define DO_SCHED_UNLOCK() odp_rwlock_read_unlock(&thread_local.lock)
+
+static inline bool do_schedule_prio(int prio);
+
+static inline int pop_cache_events(odp_event_t ev[], unsigned int max)
+{
+ int k = 0;
+ event_cache_t *cache;
+
+ cache = &thread_local.cache;
+ while (cache->count && max) {
+ ev[k] = *cache->top++;
+ k++;
+ max--;
+ cache->count--;
+ }
+
+ return k;
+}
+
+static inline void assign_queue_handle(odp_queue_t *handle)
+{
+ if (handle)
+ *handle = thread_local.cache.queue;
+}
+
+static inline void pktio_poll_input(void)
+{
+ int i, hash;
+ uint32_t index;
+
+ ring_t *ring;
+ pktio_cmd_t *cmd;
+
+ /*
+ * Each thread starts the search for a poll command
+ * from the hash(threadID) queue to mitigate contentions.
+ * If the queue is empty, it moves to other queues.
+ *
+ * Most of the times, the search stops on the first
+ * command found to optimize multi-threaded performance.
+ * A small portion of polls have to do full iteration to
+ * avoid packet input starvation when there are less
+ * threads than command queues.
+ */
+ hash = thread_local.thread % PKTIO_CMD_QUEUES;
+
+ for (i = 0; i < PKTIO_CMD_QUEUES; i++,
+ hash = (hash + 1) % PKTIO_CMD_QUEUES) {
+ ring = &sched->pktio_poll.queues[hash].ring;
+ index = ring_deq(ring, PKTIO_RING_MASK);
+
+ if (odp_unlikely(index == RING_EMPTY))
+ continue;
+
+ cmd = &sched->pktio_poll.commands[index];
+
+ /* Poll packet input */
+ if (odp_unlikely(sched_cb_pktin_poll(cmd->pktio,
+ cmd->count,
+ cmd->pktin))) {
+ /* Pktio stopped or closed. Remove poll
+ * command and call stop_finalize when all
+ * commands of the pktio has been removed.
+ */
+ if (schedule_pktio_stop(cmd->pktio,
+ cmd->pktin[0]) == 0)
+ sched_cb_pktio_stop_finalize(cmd->pktio);
+
+ free_pktio_cmd(cmd);
+ } else {
+ /* Continue scheduling the pktio */
+ ring_enq(ring, PKTIO_RING_MASK, index);
+
+ /* Do not iterate through all pktin poll
+ * command queues every time.
+ */
+ if (odp_likely(thread_local.pktin_polls & 0xF))
+ break;
+ }
+ }
+
+ thread_local.pktin_polls++;
+}
+
+/*
+ * Schedule queues
+ */
+static int do_schedule(odp_queue_t *out_queue,
+ odp_event_t out_ev[], unsigned int max_num)
+{
+ int prio, count;
+
+ /* Consume locally cached events */
+ count = pop_cache_events(out_ev, max_num);
+ if (count > 0) {
+ assign_queue_handle(out_queue);
+ return count;
+ }
+
+ schedule_release_context();
+
+ if (odp_unlikely(thread_local.pause))
+ return count;
+
+ DO_SCHED_LOCK();
+ /* Schedule events */
+ for (prio = 0; prio < NUM_SCHED_PRIO; prio++) {
+ /* Round robin iterate the interested queue
+ * indexes in this priority level to compete
+ * and consume available queues
+ */
+ if (!do_schedule_prio(prio))
+ continue;
+
+ count = pop_cache_events(out_ev, max_num);
+ assign_queue_handle(out_queue);
+ DO_SCHED_UNLOCK();
+ return count;
+ }
+
+ DO_SCHED_UNLOCK();
+
+ /* Poll packet input when there are no events */
+ pktio_poll_input();
+ return 0;
+}
+
+static int schedule_loop(odp_queue_t *out_queue, uint64_t wait,
+ odp_event_t out_ev[], unsigned int max_num)
+{
+ int count, first = 1;
+ odp_time_t next, wtime;
+
+ while (1) {
+ count = do_schedule(out_queue, out_ev, max_num);
+
+ if (count)
+ break;
+
+ if (wait == ODP_SCHED_WAIT)
+ continue;
+
+ if (wait == ODP_SCHED_NO_WAIT)
+ break;
+
+ if (first) {
+ wtime = odp_time_local_from_ns(wait);
+ next = odp_time_sum(odp_time_local(), wtime);
+ first = 0;
+ continue;
+ }
+
+ if (odp_time_cmp(next, odp_time_local()) < 0)
+ break;
+ }
+
+ return count;
+}
+
+static odp_event_t schedule(odp_queue_t *out_queue, uint64_t wait)
+{
+ odp_event_t ev;
+
+ ev = ODP_EVENT_INVALID;
+
+ schedule_loop(out_queue, wait, &ev, 1);
+
+ return ev;
+}
+
+static int schedule_multi(odp_queue_t *out_queue, uint64_t wait,
+ odp_event_t events[], int num)
+{
+ return schedule_loop(out_queue, wait, events, num);
+}
+
+static void schedule_pause(void)
+{
+ thread_local.pause = 1;
+}
+
+static void schedule_resume(void)
+{
+ thread_local.pause = 0;
+}
+
+static uint64_t schedule_wait_time(uint64_t ns)
+{
+ return ns;
+}
+
+static int number_of_priorites(void)
+{
+ return NUM_SCHED_PRIO;
+}
+
+/*
+ * Create a named schedule group with pre-defined
+ * set of subscription threads.
+ *
+ * Sched queues belonging to this group must be
+ * created after the group creation. Upon creation
+ * the group holds 0 sched queues.
+ */
+static odp_schedule_group_t schedule_group_create(
+ const char *name, const odp_thrmask_t *mask)
+{
+ int group;
+ sched_group_t *G;
+
+ for (group = SCHED_GROUP_NAMED;
+ group < NUM_SCHED_GRPS; group++) {
+ G = &sched->groups[group];
+
+ odp_rwlock_write_lock(&G->lock);
+ if (!G->allocated) {
+ strncpy(G->name, name ? name : "",
+ ODP_SCHED_GROUP_NAME_LEN - 1);
+ odp_thrmask_copy(&G->threads, mask);
+ wapl_bitmap_zero(&G->queues);
+
+ G->allocated = true;
+ odp_rwlock_write_unlock(&G->lock);
+ return (odp_schedule_group_t)group;
+ }
+ odp_rwlock_write_unlock(&G->lock);
+ }
+
+ return ODP_SCHED_GROUP_INVALID;
+}
+
+static inline void __destroy_group_queues(sched_group_t *group)
+{
+ unsigned int index;
+ queue_index_bitmap_t queues;
+ wapl_bitmap_iterator_t it;
+
+ /* Constructor */
+ wapl_bitmap_zero(&queues);
+ wapl_bitmap_copy(&queues, &group->queues);
+ wapl_bitmap_iterator(&it, &queues);
+
+ /* Walk through the queue index bitmap */
+ for (it.start(&it); it.has_next(&it);) {
+ index = it.next(&it);
+ __destroy_sched_queue(group, index);
+ }
+}
+
+/*
+ * Destroy a named schedule group.
+ */
+static int schedule_group_destroy(odp_schedule_group_t group)
+{
+ int done = -1;
+ sched_group_t *G;
+
+ if (group < SCHED_GROUP_NAMED ||
+ group >= NUM_SCHED_GRPS)
+ return -1;
+
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ if (G->allocated) {
+ /* Destroy all queues in this schedule group
+ * and leave no orphan queues.
+ */
+ __destroy_group_queues(G);
+
+ done = 0;
+ G->allocated = false;
+ wapl_bitmap_zero(&G->queues);
+ odp_thrmask_zero(&G->threads);
+ memset(G->name, 0, ODP_SCHED_GROUP_NAME_LEN);
+ }
+
+ odp_rwlock_write_unlock(&G->lock);
+ return done;
+}
+
+static odp_schedule_group_t schedule_group_lookup(const char *name)
+{
+ int group;
+ sched_group_t *G;
+
+ for (group = SCHED_GROUP_NAMED;
+ group < NUM_SCHED_GRPS; group++) {
+ G = &sched->groups[group];
+
+ odp_rwlock_read_lock(&G->lock);
+ if (strcmp(name, G->name) == 0) {
+ odp_rwlock_read_unlock(&G->lock);
+ return (odp_schedule_group_t)group;
+ }
+ odp_rwlock_read_unlock(&G->lock);
+ }
+
+ return ODP_SCHED_GROUP_INVALID;
+}
+
+static int schedule_group_join(odp_schedule_group_t group,
+ const odp_thrmask_t *mask)
+{
+ int done = -1, thread;
+ sched_group_t *G;
+ sched_thread_local_t *local;
+
+ /* Named schedule group only */
+ if (group < SCHED_GROUP_NAMED ||
+ group >= NUM_SCHED_GRPS)
+ return done;
+
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ if (G->allocated) {
+ /* Make new joined threads to start check
+ * queue indexes in this schedule group
+ */
+ thread = odp_thrmask_first(mask);
+ while (thread >= 0) {
+ local = sched->threads[thread];
+ thread_set_interests(local, &G->queues);
+
+ odp_thrmask_set(&G->threads, thread);
+ thread = odp_thrmask_next(mask, thread);
+ }
+ done = 0;
+ }
+
+ odp_rwlock_write_unlock(&G->lock);
+ return done;
+}
+
+static int schedule_group_leave(odp_schedule_group_t group,
+ const odp_thrmask_t *mask)
+{
+ int done = -1, thread;
+ sched_group_t *G;
+ sched_thread_local_t *local;
+
+ /* Named schedule group only */
+ if (group < SCHED_GROUP_NAMED ||
+ group >= NUM_SCHED_GRPS)
+ return done;
+
+ G = &sched->groups[group];
+ odp_rwlock_write_lock(&G->lock);
+
+ if (G->allocated) {
+ /* Make leaving threads to stop check
+ * queue indexes in this schedule group
+ */
+ thread = odp_thrmask_first(mask);
+ while (thread >= 0) {
+ local = sched->threads[thread];
+ thread_clear_interests(local, &G->queues);
+
+ odp_thrmask_clr(&G->threads, thread);
+ thread = odp_thrmask_next(mask, thread);
+ }
+ done = 0;
+ }
+
+ odp_rwlock_write_unlock(&G->lock);
+ return done;
+}
+
+static int schedule_group_thrmask(odp_schedule_group_t group,
+ odp_thrmask_t *thrmask)
+{
+ int done = -1;
+ sched_group_t *G;
+
+ /* Named schedule group only */
+ if (group < SCHED_GROUP_NAMED ||
+ group >= NUM_SCHED_GRPS)
+ return done;
+
+ G = &sched->groups[group];
+ odp_rwlock_read_lock(&G->lock);
+
+ if (G->allocated && thrmask != NULL) {
+ done = 0;
+ odp_thrmask_copy(thrmask, &G->threads);
+ }
+
+ odp_rwlock_read_unlock(&G->lock);
+ return done;
+}
+
+static int schedule_group_info(odp_schedule_group_t group,
+ odp_schedule_group_info_t *info)
+{
+ int done = -1;
+ sched_group_t *G;
+
+ /* Named schedule group only */
+ if (group < SCHED_GROUP_NAMED ||
+ group >= NUM_SCHED_GRPS)
+ return done;
+
+ G = &sched->groups[group];
+ odp_rwlock_read_lock(&G->lock);
+
+ if (G->allocated && info != NULL) {
+ done = 0;
+ info->name = G->name;
+ odp_thrmask_copy(&info->thrmask, &G->threads);
+ }
+
+ odp_rwlock_read_unlock(&G->lock);
+ return done;
+}
+
+/* This function is a no-op */
+static void schedule_prefetch(int num ODP_UNUSED)
+{
+}
+
+/*
+ * Limited to join and leave pre-defined schedule groups
+ * before and after thread local initialization or termination.
+ */
+static int group_add_thread(odp_schedule_group_t group, int thread)
+{
+ sched_group_t *G;
+
+ if (group < 0 || group >= SCHED_GROUP_NAMED)
+ return -1;
+
+ G = &sched->groups[group];
+
+ odp_rwlock_write_lock(&G->lock);
+ odp_thrmask_set(&G->threads, thread);
+ odp_rwlock_write_unlock(&G->lock);
+ return 0;
+}
+
+static int group_remove_thread(odp_schedule_group_t group, int thread)
+{
+ sched_group_t *G;
+
+ if (group < 0 || group >= SCHED_GROUP_NAMED)
+ return -1;
+
+ G = &sched->groups[group];
+
+ odp_rwlock_write_lock(&G->lock);
+ odp_thrmask_clr(&G->threads, thread);
+ odp_rwlock_write_unlock(&G->lock);
+ return 0;
+}
+
+static int number_of_groups(void)
+{
+ return NUM_SCHED_GRPS;
+}
+
+static int schedule_sched_queue(uint32_t queue_index)
+{
+ /* Set available indications globally */
+ sched->availables[queue_index] = true;
+ return 0;
+}
+
+static int schedule_unsched_queue(uint32_t queue_index)
+{
+ /* Clear available indications globally */
+ sched->availables[queue_index] = false;
+ return 0;
+}
+
+static void schedule_release_atomic(void)
+{
+ unsigned int queue_index;
+
+ if ((thread_local.atomic != NULL) &&
+ (thread_local.cache.count == 0)) {
+ queue_index = thread_local.atomic - sched->availables;
+ thread_local.atomic = NULL;
+ sched->availables[queue_index] = true;
+ }
+}
+
+static inline int ordered_own_turn(queue_entry_t *queue)
+{
+ uint64_t ctx;
+
+ ctx = odp_atomic_load_acq_u64(&queue->s.ordered.ctx);
+
+ return ctx == thread_local.ordered.ctx;
+}
+
+static inline void wait_for_order(queue_entry_t *queue)
+{
+ /* Busy loop to synchronize ordered processing */
+ while (1) {
+ if (ordered_own_turn(queue))
+ break;
+ odp_cpu_pause();
+ }
+}
+
+/**
+ * Perform stashed enqueue operations
+ *
+ * Should be called only when already in order.
+ */
+static inline void ordered_stash_release(void)
+{
+ int i;
+
+ for (i = 0; i < thread_local.ordered.stash_num; i++) {
+ queue_entry_t *queue;
+ odp_buffer_hdr_t **buf_hdr;
+ int num;
+
+ queue = thread_local.ordered.stash[i].queue;
+ buf_hdr = thread_local.ordered.stash[i].buf_hdr;
+ num = thread_local.ordered.stash[i].num;
+
+ queue_enq_multi(queue, buf_hdr, num);
+ }
+ thread_local.ordered.stash_num = 0;
+}
+
+static inline void release_ordered(void)
+{
+ unsigned i;
+ queue_entry_t *queue;
+
+ queue = thread_local.ordered.src_queue;
+
+ wait_for_order(queue);
+
+ /* Release all ordered locks */
+ for (i = 0; i < queue->s.param.sched.lock_count; i++) {
+ if (!thread_local.ordered.lock_called.u8[i])
+ odp_atomic_store_rel_u64(&queue->s.ordered.lock[i],
+ thread_local.ordered.ctx + 1);
+ }
+
+ thread_local.ordered.lock_called.all = 0;
+ thread_local.ordered.src_queue = NULL;
+ thread_local.ordered.in_order = 0;
+
+ ordered_stash_release();
+
+ /* Next thread can continue processing */
+ odp_atomic_add_rel_u64(&queue->s.ordered.ctx, 1);
+}
+
+static void schedule_release_ordered(void)
+{
+ queue_entry_t *queue;
+
+ queue = thread_local.ordered.src_queue;
+
+ if (odp_unlikely(!queue || thread_local.cache.count))
+ return;
+
+ release_ordered();
+}
+
+static inline void schedule_release_context(void)
+{
+ if (thread_local.ordered.src_queue != NULL)
+ release_ordered();
+ else
+ schedule_release_atomic();
+}
+
+static int schedule_ord_enq_multi(uint32_t queue_index, void *buf_hdr[],
+ int num, int *ret)
+{
+ int i;
+ uint32_t stash_num = thread_local.ordered.stash_num;
+ queue_entry_t *dst_queue = get_qentry(queue_index);
+ queue_entry_t *src_queue = thread_local.ordered.src_queue;
+
+ if (!thread_local.ordered.src_queue || thread_local.ordered.in_order)
+ return 0;
+
+ if (ordered_own_turn(src_queue)) {
+ /* Own turn, so can do enqueue directly. */
+ thread_local.ordered.in_order = 1;
+ ordered_stash_release();
+ return 0;
+ }
+
+ if (odp_unlikely(stash_num >= MAX_ORDERED_STASH)) {
+ /* If the local stash is full, wait until it is our turn and
+ * then release the stash and do enqueue directly. */
+ wait_for_order(src_queue);
+
+ thread_local.ordered.in_order = 1;
+
+ ordered_stash_release();
+ return 0;
+ }
+
+ thread_local.ordered.stash[stash_num].queue = dst_queue;
+ thread_local.ordered.stash[stash_num].num = num;
+ for (i = 0; i < num; i++)
+ thread_local.ordered.stash[stash_num].buf_hdr[i] = buf_hdr[i];
+
+ thread_local.ordered.stash_num++;
+
+ *ret = num;
+ return 1;
+}
+
+static void order_lock(void)
+{
+ queue_entry_t *queue;
+
+ queue = thread_local.ordered.src_queue;
+
+ if (!queue)
+ return;
+
+ wait_for_order(queue);
+}
+
+static void order_unlock(void)
+{
+}
+
+static void schedule_order_lock(unsigned lock_index)
+{
+ odp_atomic_u64_t *ord_lock;
+ queue_entry_t *queue;
+
+ queue = thread_local.ordered.src_queue;
+
+ ODP_ASSERT(queue && lock_index <= queue->s.param.sched.lock_count &&
+ !thread_local.ordered.lock_called.u8[lock_index]);
+
+ ord_lock = &queue->s.ordered.lock[lock_index];
+
+ /* Busy loop to synchronize ordered processing */
+ while (1) {
+ uint64_t lock_seq;
+
+ lock_seq = odp_atomic_load_acq_u64(ord_lock);
+
+ if (lock_seq == thread_local.ordered.ctx) {
+ thread_local.ordered.lock_called.u8[lock_index] = 1;
+ return;
+ }
+ odp_cpu_pause();
+ }
+}
+
+static void schedule_order_unlock(unsigned lock_index)
+{
+ odp_atomic_u64_t *ord_lock;
+ queue_entry_t *queue;
+
+ queue = thread_local.ordered.src_queue;
+
+ ODP_ASSERT(queue && lock_index <= queue->s.param.sched.lock_count);
+
+ ord_lock = &queue->s.ordered.lock[lock_index];
+
+ ODP_ASSERT(thread_local.ordered.ctx == odp_atomic_load_u64(ord_lock));
+
+ odp_atomic_store_rel_u64(ord_lock, thread_local.ordered.ctx + 1);
+}
+
+static unsigned schedule_max_ordered_locks(void)
+{
+ return MAX_ORDERED_LOCKS_PER_QUEUE;
+}
+
+static void schedule_save_context(queue_entry_t *queue)
+{
+ if (queue->s.param.sched.sync == ODP_SCHED_SYNC_ATOMIC) {
+ thread_local.atomic = &sched->availables[queue->s.index];
+ } else if (queue->s.param.sched.sync == ODP_SCHED_SYNC_ORDERED) {
+ uint64_t ctx;
+ odp_atomic_u64_t *next_ctx;
+
+ next_ctx = &queue->s.ordered.next_ctx;
+ ctx = odp_atomic_fetch_inc_u64(next_ctx);
+
+ thread_local.ordered.ctx = ctx;
+ thread_local.ordered.src_queue = queue;
+ }
+}
+
+/* Fill in scheduler interface */
+const schedule_fn_t schedule_iquery_fn = {
+ .pktio_start = schedule_pktio_start,
+ .thr_add = group_add_thread,
+ .thr_rem = group_remove_thread,
+ .num_grps = number_of_groups,
+ .init_queue = init_sched_queue,
+ .destroy_queue = destroy_sched_queue,
+ .sched_queue = schedule_sched_queue,
+ .unsched_queue = schedule_unsched_queue,
+ .ord_enq_multi = schedule_ord_enq_multi,
+ .init_global = schedule_init_global,
+ .term_global = schedule_term_global,
+ .init_local = schedule_init_local,
+ .term_local = schedule_term_local,
+ .order_lock = order_lock,
+ .order_unlock = order_unlock,
+ .max_ordered_locks = schedule_max_ordered_locks,
+ .save_context = schedule_save_context,
+};
+
+/* Fill in scheduler API calls */
+const schedule_api_t schedule_iquery_api = {
+ .schedule_wait_time = schedule_wait_time,
+ .schedule = schedule,
+ .schedule_multi = schedule_multi,
+ .schedule_pause = schedule_pause,
+ .schedule_resume = schedule_resume,
+ .schedule_release_atomic = schedule_release_atomic,
+ .schedule_release_ordered = schedule_release_ordered,
+ .schedule_prefetch = schedule_prefetch,
+ .schedule_num_prio = number_of_priorites,
+ .schedule_group_create = schedule_group_create,
+ .schedule_group_destroy = schedule_group_destroy,
+ .schedule_group_lookup = schedule_group_lookup,
+ .schedule_group_join = schedule_group_join,
+ .schedule_group_leave = schedule_group_leave,
+ .schedule_group_thrmask = schedule_group_thrmask,
+ .schedule_group_info = schedule_group_info,
+ .schedule_order_lock = schedule_order_lock,
+ .schedule_order_unlock = schedule_order_unlock
+};
+
+static void thread_set_interest(sched_thread_local_t *thread,
+ unsigned int queue_index, int prio)
+{
+ queue_index_sparse_t *index;
+
+ if (thread == NULL)
+ return;
+
+ if (prio >= NUM_SCHED_PRIO)
+ return;
+
+ index = &thread->indexes[prio];
+
+ odp_rwlock_write_lock(&thread->lock);
+ sparse_bitmap_set(index, queue_index);
+ odp_rwlock_write_unlock(&thread->lock);
+}
+
+static void thread_clear_interest(sched_thread_local_t *thread,
+ unsigned int queue_index, int prio)
+{
+ queue_index_sparse_t *index;
+
+ if (thread == NULL)
+ return;
+
+ if (prio >= NUM_SCHED_PRIO)
+ return;
+
+ index = &thread->indexes[prio];
+
+ odp_rwlock_write_lock(&thread->lock);
+ sparse_bitmap_clear(index, queue_index);
+ odp_rwlock_write_unlock(&thread->lock);
+}
+
+static void thread_set_interests(sched_thread_local_t *thread,
+ queue_index_bitmap_t *set)
+{
+ int prio;
+ sched_prio_t *P;
+ unsigned int queue_index;
+ queue_index_bitmap_t subset;
+ wapl_bitmap_iterator_t it;
+
+ if (thread == NULL || set == NULL)
+ return;
+
+ for (prio = 0; prio < NUM_SCHED_PRIO; prio++) {
+ P = &sched->prios[prio];
+ odp_rwlock_read_lock(&P->lock);
+
+ /* The collection of queue indexes in 'set'
+ * may belong to several priority levels.
+ */
+ wapl_bitmap_zero(&subset);
+ wapl_bitmap_and(&subset, &P->queues, set);
+
+ odp_rwlock_read_unlock(&P->lock);
+
+ /* Add the subset to local indexes */
+ wapl_bitmap_iterator(&it, &subset);
+ for (it.start(&it); it.has_next(&it);) {
+ queue_index = it.next(&it);
+ thread_set_interest(thread, queue_index, prio);
+ }
+ }
+}
+
+static void thread_clear_interests(sched_thread_local_t *thread,
+ queue_index_bitmap_t *clear)
+{
+ int prio;
+ sched_prio_t *P;
+ unsigned int queue_index;
+ queue_index_bitmap_t subset;
+ wapl_bitmap_iterator_t it;
+
+ if (thread == NULL || clear == NULL)
+ return;
+
+ for (prio = 0; prio < NUM_SCHED_PRIO; prio++) {
+ P = &sched->prios[prio];
+ odp_rwlock_read_lock(&P->lock);
+
+ /* The collection of queue indexes in 'clear'
+ * may belong to several priority levels.
+ */
+ wapl_bitmap_zero(&subset);
+ wapl_bitmap_and(&subset, &P->queues, clear);
+
+ odp_rwlock_read_unlock(&P->lock);
+
+ /* Remove the subset from local indexes */
+ wapl_bitmap_iterator(&it, &subset);
+ for (it.start(&it); it.has_next(&it);) {
+ queue_index = it.next(&it);
+ thread_clear_interest(thread, queue_index, prio);
+ }
+ }
+}
+
+static inline bool is_atomic_queue(unsigned int queue_index)
+{
+ return (sched->queues[queue_index].sync
+ == ODP_SCHED_SYNC_ATOMIC);
+}
+
+static inline bool is_ordered_queue(unsigned int queue_index)
+{
+ return (sched->queues[queue_index].sync
+ == ODP_SCHED_SYNC_ORDERED);
+}
+
+static inline bool compete_atomic_queue(unsigned int queue_index)
+{
+ bool expected = sched->availables[queue_index];
+
+ if (expected && is_atomic_queue(queue_index)) {
+ expected = __atomic_compare_exchange_n(
+ &sched->availables[queue_index],
+ &expected, false, 0,
+ __ATOMIC_RELEASE, __ATOMIC_RELAXED);
+ }
+
+ return expected;
+}
+
+static inline int consume_queue(int prio, unsigned int queue_index)
+{
+ int count;
+ unsigned int max = MAX_DEQ;
+ event_cache_t *cache = &thread_local.cache;
+
+ /* Low priorities have smaller batch size to limit
+ * head of line blocking latency.
+ */
+ if (odp_unlikely(prio > ODP_SCHED_PRIO_DEFAULT))
+ max = MAX_DEQ / 2;
+
+ /* For ordered queues we want consecutive events to
+ * be dispatched to separate threads, so do not cache
+ * them locally.
+ */
+ if (is_ordered_queue(queue_index))
+ max = 1;
+
+ count = sched_cb_queue_deq_multi(
+ queue_index, cache->stash, max);
+
+ if (count < 0) {
+ DO_SCHED_UNLOCK();
+ sched_cb_queue_destroy_finalize(queue_index);
+ DO_SCHED_LOCK();
+ return 0;
+ }
+
+ if (count == 0)
+ return 0;
+
+ cache->top = &cache->stash[0];
+ cache->count = count;
+ cache->queue = sched_cb_queue_handle(queue_index);
+ return count;
+}
+
+static inline bool do_schedule_prio(int prio)
+{
+ int nbits, next, end;
+ unsigned int queue_index;
+ sparse_bitmap_iterator_t *it;
+
+ it = &thread_local.iterators[prio];
+ nbits = (int)*it->_base.last;
+
+ /* No interests at all! */
+ if (nbits <= 0)
+ return false;
+
+ /* In critical path, cannot afford iterator calls,
+ * do it manually with internal knowledge
+ */
+ it->_start = (it->_start + 1) % nbits;
+ end = it->_start + nbits;
+
+ for (next = it->_start; next < end; next++) {
+ queue_index = it->_base.il[next % nbits];
+
+ if (!compete_atomic_queue(queue_index))
+ continue;
+
+ if (!consume_queue(prio, queue_index))
+ continue;
+
+ return true;
+ }
+
+ return false;
+}
diff --git a/platform/linux-generic/odp_schedule_sp.c b/platform/linux-generic/odp_schedule_sp.c
index 5150d28df..0fd4d87da 100644
--- a/platform/linux-generic/odp_schedule_sp.c
+++ b/platform/linux-generic/odp_schedule_sp.c
@@ -9,6 +9,7 @@
#include <odp/api/thread.h>
#include <odp/api/time.h>
#include <odp/api/schedule.h>
+#include <odp/api/shared_memory.h>
#include <odp_schedule_if.h>
#include <odp_debug_internal.h>
#include <odp_align_internal.h>
@@ -27,18 +28,17 @@
#define PKTIN_PRIO (NUM_PRIO - 1)
#define CMD_QUEUE 0
#define CMD_PKTIO 1
-#define ROUNDUP_CACHE(x) ODP_CACHE_LINE_SIZE_ROUNDUP(x)
#define GROUP_ALL ODP_SCHED_GROUP_ALL
#define GROUP_WORKER ODP_SCHED_GROUP_WORKER
#define GROUP_CONTROL ODP_SCHED_GROUP_CONTROL
#define GROUP_PKTIN GROUP_ALL
/* Maximum number of commands: one priority/group for all queues and pktios */
-#define RING_SIZE (ODP_ROUNDUP_POWER_2(NUM_QUEUE + NUM_PKTIO))
+#define RING_SIZE (ROUNDUP_POWER2_U32(NUM_QUEUE + NUM_PKTIO))
#define RING_MASK (RING_SIZE - 1)
/* Ring size must be power of two */
-ODP_STATIC_ASSERT(ODP_VAL_IS_POWER_2(RING_SIZE),
+ODP_STATIC_ASSERT(CHECK_IS_POWER2(RING_SIZE),
"Ring_size_is_not_power_of_two");
ODP_STATIC_ASSERT(NUM_ORDERED_LOCKS <= CONFIG_QUEUE_MAX_ORD_LOCKS,
@@ -60,7 +60,7 @@ struct sched_cmd_s {
typedef struct sched_cmd_t {
struct sched_cmd_s s;
- uint8_t pad[ROUNDUP_CACHE(sizeof(struct sched_cmd_s)) -
+ uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct sched_cmd_s)) -
sizeof(struct sched_cmd_s)];
} sched_cmd_t ODP_ALIGNED_CACHE;
@@ -108,6 +108,7 @@ typedef struct {
sched_cmd_t pktio_cmd[NUM_PKTIO];
prio_queue_t prio_queue[NUM_GROUP][NUM_PRIO];
sched_group_t sched_group;
+ odp_shm_t shm;
} sched_global_t;
typedef struct {
@@ -119,7 +120,7 @@ typedef struct {
int group[NUM_GROUP];
} sched_local_t;
-static sched_global_t sched_global;
+static sched_global_t *sched_global;
static __thread sched_local_t sched_local;
static inline uint32_t index_to_ring_idx(int pktio, uint32_t index)
@@ -145,30 +146,44 @@ static inline uint32_t index_from_ring_idx(uint32_t *index, uint32_t ring_idx)
static int init_global(void)
{
int i, j;
- sched_group_t *sched_group = &sched_global.sched_group;
+ odp_shm_t shm;
+ sched_group_t *sched_group = NULL;
ODP_DBG("Using SP scheduler\n");
- memset(&sched_global, 0, sizeof(sched_global_t));
+ shm = odp_shm_reserve("sp_scheduler",
+ sizeof(sched_global_t),
+ ODP_CACHE_LINE_SIZE, 0);
+
+ sched_global = odp_shm_addr(shm);
+
+ if (sched_global == NULL) {
+ ODP_ERR("Schedule init: Shm reserve failed.\n");
+ return -1;
+ }
+
+ memset(sched_global, 0, sizeof(sched_global_t));
+ sched_global->shm = shm;
for (i = 0; i < NUM_QUEUE; i++) {
- sched_global.queue_cmd[i].s.type = CMD_QUEUE;
- sched_global.queue_cmd[i].s.index = i;
- sched_global.queue_cmd[i].s.ring_idx = index_to_ring_idx(0, i);
+ sched_global->queue_cmd[i].s.type = CMD_QUEUE;
+ sched_global->queue_cmd[i].s.index = i;
+ sched_global->queue_cmd[i].s.ring_idx = index_to_ring_idx(0, i);
}
for (i = 0; i < NUM_PKTIO; i++) {
- sched_global.pktio_cmd[i].s.type = CMD_PKTIO;
- sched_global.pktio_cmd[i].s.index = i;
- sched_global.pktio_cmd[i].s.ring_idx = index_to_ring_idx(1, i);
- sched_global.pktio_cmd[i].s.prio = PKTIN_PRIO;
- sched_global.pktio_cmd[i].s.group = GROUP_PKTIN;
+ sched_global->pktio_cmd[i].s.type = CMD_PKTIO;
+ sched_global->pktio_cmd[i].s.index = i;
+ sched_global->pktio_cmd[i].s.ring_idx = index_to_ring_idx(1, i);
+ sched_global->pktio_cmd[i].s.prio = PKTIN_PRIO;
+ sched_global->pktio_cmd[i].s.group = GROUP_PKTIN;
}
for (i = 0; i < NUM_GROUP; i++)
for (j = 0; j < NUM_PRIO; j++)
- ring_init(&sched_global.prio_queue[i][j].ring);
+ ring_init(&sched_global->prio_queue[i][j].ring);
+ sched_group = &sched_global->sched_group;
odp_ticketlock_init(&sched_group->s.lock);
for (i = 0; i < NUM_THREAD; i++)
@@ -202,16 +217,22 @@ static int init_local(void)
static int term_global(void)
{
- int qi;
+ int qi, ret = 0;
for (qi = 0; qi < NUM_QUEUE; qi++) {
- if (sched_global.queue_cmd[qi].s.init) {
+ if (sched_global->queue_cmd[qi].s.init) {
/* todo: dequeue until empty ? */
sched_cb_queue_destroy_finalize(qi);
}
}
- return 0;
+ ret = odp_shm_free(sched_global->shm);
+ if (ret < 0) {
+ ODP_ERR("Shm free failed for sp_scheduler");
+ ret = -1;
+ }
+
+ return ret;
}
static int term_local(void)
@@ -267,7 +288,7 @@ static void remove_group(sched_group_t *sched_group, int thr, int group)
static int thr_add(odp_schedule_group_t group, int thr)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < 0 || group >= NUM_GROUP)
return -1;
@@ -292,7 +313,7 @@ static int thr_add(odp_schedule_group_t group, int thr)
static int thr_rem(odp_schedule_group_t group, int thr)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < 0 || group >= NUM_GROUP)
return -1;
@@ -320,7 +341,7 @@ static int num_grps(void)
static int init_queue(uint32_t qi, const odp_schedule_param_t *sched_param)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
odp_schedule_group_t group = sched_param->group;
int prio = 0;
@@ -333,18 +354,18 @@ static int init_queue(uint32_t qi, const odp_schedule_param_t *sched_param)
if (sched_param->prio > 0)
prio = LOWEST_QUEUE_PRIO;
- sched_global.queue_cmd[qi].s.prio = prio;
- sched_global.queue_cmd[qi].s.group = group;
- sched_global.queue_cmd[qi].s.init = 1;
+ sched_global->queue_cmd[qi].s.prio = prio;
+ sched_global->queue_cmd[qi].s.group = group;
+ sched_global->queue_cmd[qi].s.init = 1;
return 0;
}
static void destroy_queue(uint32_t qi)
{
- sched_global.queue_cmd[qi].s.prio = 0;
- sched_global.queue_cmd[qi].s.group = 0;
- sched_global.queue_cmd[qi].s.init = 0;
+ sched_global->queue_cmd[qi].s.prio = 0;
+ sched_global->queue_cmd[qi].s.group = 0;
+ sched_global->queue_cmd[qi].s.init = 0;
}
static inline void add_tail(sched_cmd_t *cmd)
@@ -354,8 +375,7 @@ static inline void add_tail(sched_cmd_t *cmd)
int prio = cmd->s.prio;
uint32_t idx = cmd->s.ring_idx;
- prio_queue = &sched_global.prio_queue[group][prio];
-
+ prio_queue = &sched_global->prio_queue[group][prio];
ring_enq(&prio_queue->ring, RING_MASK, idx);
}
@@ -365,8 +385,7 @@ static inline sched_cmd_t *rem_head(int group, int prio)
uint32_t ring_idx, index;
int pktio;
- prio_queue = &sched_global.prio_queue[group][prio];
-
+ prio_queue = &sched_global->prio_queue[group][prio];
ring_idx = ring_deq(&prio_queue->ring, RING_MASK);
if (ring_idx == RING_EMPTY)
@@ -375,21 +394,26 @@ static inline sched_cmd_t *rem_head(int group, int prio)
pktio = index_from_ring_idx(&index, ring_idx);
if (pktio)
- return &sched_global.pktio_cmd[index];
+ return &sched_global->pktio_cmd[index];
- return &sched_global.queue_cmd[index];
+ return &sched_global->queue_cmd[index];
}
static int sched_queue(uint32_t qi)
{
sched_cmd_t *cmd;
- cmd = &sched_global.queue_cmd[qi];
+ cmd = &sched_global->queue_cmd[qi];
add_tail(cmd);
return 0;
}
+static int unsched_queue(uint32_t qi ODP_UNUSED)
+{
+ return 0;
+}
+
static int ord_enq_multi(uint32_t queue_index, void *buf_hdr[], int num,
int *ret)
{
@@ -410,7 +434,7 @@ static void pktio_start(int pktio_index, int num, int pktin_idx[])
ODP_DBG("pktio index: %i, %i pktin queues %i\n",
pktio_index, num, pktin_idx[0]);
- cmd = &sched_global.pktio_cmd[pktio_index];
+ cmd = &sched_global->pktio_cmd[pktio_index];
if (num > NUM_PKTIN)
ODP_ABORT("Supports only %i pktin queues per interface\n",
@@ -428,7 +452,7 @@ static inline sched_cmd_t *sched_cmd(void)
{
int prio, i;
int thr = sched_local.thr_id;
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
thr_group_t *thr_group = &sched_group->s.thr[thr];
uint32_t gen_cnt;
@@ -602,7 +626,7 @@ static odp_schedule_group_t schedule_group_create(const char *name,
const odp_thrmask_t *thrmask)
{
odp_schedule_group_t group = ODP_SCHED_GROUP_INVALID;
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
int i;
odp_ticketlock_lock(&sched_group->s.lock);
@@ -633,7 +657,7 @@ static odp_schedule_group_t schedule_group_create(const char *name,
static int schedule_group_destroy(odp_schedule_group_t group)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < NUM_STATIC_GROUP || group >= NUM_GROUP)
return -1;
@@ -656,7 +680,7 @@ static int schedule_group_destroy(odp_schedule_group_t group)
static odp_schedule_group_t schedule_group_lookup(const char *name)
{
odp_schedule_group_t group = ODP_SCHED_GROUP_INVALID;
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
int i;
odp_ticketlock_lock(&sched_group->s.lock);
@@ -677,7 +701,7 @@ static int schedule_group_join(odp_schedule_group_t group,
const odp_thrmask_t *thrmask)
{
int thr;
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < 0 || group >= NUM_GROUP)
return -1;
@@ -709,7 +733,7 @@ static int schedule_group_leave(odp_schedule_group_t group,
const odp_thrmask_t *thrmask)
{
int thr;
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
odp_thrmask_t *all = &sched_group->s.group[GROUP_ALL].mask;
odp_thrmask_t not;
@@ -743,7 +767,7 @@ static int schedule_group_leave(odp_schedule_group_t group,
static int schedule_group_thrmask(odp_schedule_group_t group,
odp_thrmask_t *thrmask)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < 0 || group >= NUM_GROUP)
return -1;
@@ -765,7 +789,7 @@ static int schedule_group_thrmask(odp_schedule_group_t group,
static int schedule_group_info(odp_schedule_group_t group,
odp_schedule_group_info_t *info)
{
- sched_group_t *sched_group = &sched_global.sched_group;
+ sched_group_t *sched_group = &sched_global->sched_group;
if (group < 0 || group >= NUM_GROUP)
return -1;
@@ -803,6 +827,10 @@ static void order_unlock(void)
{
}
+static void save_context(queue_entry_t *queue ODP_UNUSED)
+{
+}
+
/* Fill in scheduler interface */
const schedule_fn_t schedule_sp_fn = {
.pktio_start = pktio_start,
@@ -812,6 +840,7 @@ const schedule_fn_t schedule_sp_fn = {
.init_queue = init_queue,
.destroy_queue = destroy_queue,
.sched_queue = sched_queue,
+ .unsched_queue = unsched_queue,
.ord_enq_multi = ord_enq_multi,
.init_global = init_global,
.term_global = term_global,
@@ -819,7 +848,8 @@ const schedule_fn_t schedule_sp_fn = {
.term_local = term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
- .max_ordered_locks = max_ordered_locks
+ .max_ordered_locks = max_ordered_locks,
+ .save_context = save_context
};
/* Fill in scheduler API calls */
diff --git a/platform/linux-generic/odp_shared_memory.c b/platform/linux-generic/odp_shared_memory.c
index ba32deecd..a6faff6e3 100644
--- a/platform/linux-generic/odp_shared_memory.c
+++ b/platform/linux-generic/odp_shared_memory.c
@@ -8,6 +8,7 @@
#include <odp/api/debug.h>
#include <odp/api/std_types.h>
#include <odp/api/shared_memory.h>
+#include <odp/api/plat/strong_types.h>
#include <_ishm_internal.h>
#include <string.h>
@@ -112,3 +113,8 @@ void odp_shm_print_all(void)
{
_odp_ishm_status("Memory allocation status:");
}
+
+uint64_t odp_shm_to_u64(odp_shm_t hdl)
+{
+ return _odp_pri(hdl);
+}
diff --git a/platform/linux-generic/odp_ticketlock.c b/platform/linux-generic/odp_ticketlock.c
index f18d78f57..f73dd9ab4 100644
--- a/platform/linux-generic/odp_ticketlock.c
+++ b/platform/linux-generic/odp_ticketlock.c
@@ -5,6 +5,7 @@
*/
#include <odp/api/plat/ticketlock_inlines.h>
+#include <odp/api/spec/ticketlock.h>
void odp_ticketlock_init(odp_ticketlock_t *ticketlock)
{
@@ -12,22 +13,7 @@ void odp_ticketlock_init(odp_ticketlock_t *ticketlock)
odp_atomic_init_u32(&ticketlock->cur_ticket, 0);
}
-void odp_ticketlock_lock(odp_ticketlock_t *lock)
-{
- return _odp_ticketlock_lock(lock);
-}
-
-int odp_ticketlock_trylock(odp_ticketlock_t *lock)
-{
- return _odp_ticketlock_trylock(lock);
-}
-
-void odp_ticketlock_unlock(odp_ticketlock_t *lock)
-{
- _odp_ticketlock_unlock(lock);
-}
-
-int odp_ticketlock_is_locked(odp_ticketlock_t *lock)
-{
- return _odp_ticketlock_is_locked(lock);
-}
+/* Include non-inlined versions of API functions */
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/plat/ticketlock_inlines_api.h>
+#endif
diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c
index 53fec0855..cf610bfa0 100644
--- a/platform/linux-generic/odp_timer.c
+++ b/platform/linux-generic/odp_timer.c
@@ -233,12 +233,9 @@ static odp_timer_pool_t odp_timer_pool_new(const char *name,
__odp_errno = ENFILE; /* Table overflow */
return ODP_TIMER_POOL_INVALID;
}
- size_t sz0 = ODP_ALIGN_ROUNDUP(sizeof(odp_timer_pool),
- ODP_CACHE_LINE_SIZE);
- size_t sz1 = ODP_ALIGN_ROUNDUP(sizeof(tick_buf_t) * param->num_timers,
- ODP_CACHE_LINE_SIZE);
- size_t sz2 = ODP_ALIGN_ROUNDUP(sizeof(odp_timer) * param->num_timers,
- ODP_CACHE_LINE_SIZE);
+ size_t sz0 = ROUNDUP_CACHE_LINE(sizeof(odp_timer_pool));
+ size_t sz1 = ROUNDUP_CACHE_LINE(sizeof(tick_buf_t) * param->num_timers);
+ size_t sz2 = ROUNDUP_CACHE_LINE(sizeof(odp_timer) * param->num_timers);
odp_shm_t shm = odp_shm_reserve(name, sz0 + sz1 + sz2,
ODP_CACHE_LINE_SIZE, ODP_SHM_SW_ONLY);
if (odp_unlikely(shm == ODP_SHM_INVALID))
diff --git a/platform/linux-generic/odp_traffic_mngr.c b/platform/linux-generic/odp_traffic_mngr.c
index 9dc3a8649..4e9358b96 100644
--- a/platform/linux-generic/odp_traffic_mngr.c
+++ b/platform/linux-generic/odp_traffic_mngr.c
@@ -37,6 +37,9 @@ static const pkt_desc_t EMPTY_PKT_DESC = { .word = 0 };
#define MAX_PRIORITIES ODP_TM_MAX_PRIORITIES
#define NUM_SHAPER_COLORS ODP_NUM_SHAPER_COLORS
+/* Traffic manager queue */
+#define QUEUE_TYPE_TM 4
+
static tm_prop_t basic_prop_tbl[MAX_PRIORITIES][NUM_SHAPER_COLORS] = {
[0] = {
[ODP_TM_SHAPER_GREEN] = { 0, DECR_BOTH },
@@ -104,7 +107,7 @@ static int queue_tm_reenq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr)
odp_tm_queue_t tm_queue = MAKE_ODP_TM_QUEUE((uint8_t *)queue -
offsetof(tm_queue_obj_t,
tm_qentry));
- odp_packet_t pkt = (odp_packet_t)buf_hdr->handle.handle;
+ odp_packet_t pkt = _odp_packet_from_buffer(buf_hdr->handle.handle);
return odp_tm_enq(tm_queue, pkt);
}
@@ -3915,7 +3918,7 @@ odp_tm_queue_t odp_tm_queue_create(odp_tm_t odp_tm,
tm_queue_obj->pkt = ODP_PACKET_INVALID;
odp_ticketlock_init(&tm_wred_node->tm_wred_node_lock);
- tm_queue_obj->tm_qentry.s.type = ODP_QUEUE_TYPE_TM;
+ tm_queue_obj->tm_qentry.s.type = QUEUE_TYPE_TM;
tm_queue_obj->tm_qentry.s.enqueue = queue_tm_reenq;
tm_queue_obj->tm_qentry.s.enqueue_multi = queue_tm_reenq_multi;
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 0eb025aeb..1922109a7 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -14,6 +14,9 @@
#include <odp/api/cpumask.h>
+#include <odp/api/plat/packet_inlines.h>
+#include <odp/api/packet.h>
+
#include <odp_packet_io_internal.h>
#include <odp_classification_internal.h>
#include <odp_packet_dpdk.h>
@@ -560,19 +563,19 @@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry,
return 0;
}
-static void dpdk_init_capability(pktio_entry_t *pktio_entry)
+static void dpdk_init_capability(pktio_entry_t *pktio_entry,
+ struct rte_eth_dev_info *dev_info)
{
pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk;
odp_pktio_capability_t *capa = &pkt_dpdk->capa;
- struct rte_eth_dev_info dev_info;
- memset(&dev_info, 0, sizeof(struct rte_eth_dev_info));
+ memset(dev_info, 0, sizeof(struct rte_eth_dev_info));
memset(capa, 0, sizeof(odp_pktio_capability_t));
- rte_eth_dev_info_get(pkt_dpdk->port_id, &dev_info);
- capa->max_input_queues = RTE_MIN(dev_info.max_rx_queues,
+ rte_eth_dev_info_get(pkt_dpdk->port_id, dev_info);
+ capa->max_input_queues = RTE_MIN(dev_info->max_rx_queues,
PKTIO_MAX_QUEUES);
- capa->max_output_queues = RTE_MIN(dev_info.max_tx_queues,
+ capa->max_output_queues = RTE_MIN(dev_info->max_tx_queues,
PKTIO_MAX_QUEUES);
capa->set_op.op.promisc_mode = 1;
@@ -631,7 +634,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
return -1;
}
- dpdk_init_capability(pktio_entry);
+ dpdk_init_capability(pktio_entry, &dev_info);
mtu = dpdk_mtu_get(pktio_entry);
if (mtu == 0) {
@@ -836,7 +839,7 @@ static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry,
return 0;
}
for (i = 0; i < num; i++) {
- pkt_len = odp_packet_len(pkt_table[i]);
+ pkt_len = _odp_packet_len(pkt_table[i]);
if (pkt_len > pkt_dpdk->mtu) {
if (i == 0)
diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c
index 377f20e65..06175e5a0 100644
--- a/platform/linux-generic/pktio/ipc.c
+++ b/platform/linux-generic/pktio/ipc.c
@@ -409,7 +409,7 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
void *mbase = pktio_entry->s.ipc.pool_mdata_base;
phdr = (void *)((uint8_t *)mbase + offsets[i]);
- pkt = (odp_packet_t)phdr->buf_hdr.handle.handle;
+ pkt = packet_handle(phdr);
odp_packet_free(pkt);
}
}
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 8eb81459e..ae3db34d9 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -8,6 +8,9 @@
#include <odp_posix_extensions.h>
+#include <odp/api/plat/packet_inlines.h>
+#include <odp/api/packet.h>
+
#include <odp_packet_io_internal.h>
#include <odp_packet_netmap.h>
#include <odp_packet_socket.h>
@@ -452,7 +455,7 @@ static int netmap_start(pktio_entry_t *pktio_entry)
{
pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm;
netmap_ring_t *desc_ring;
- struct nm_desc base_desc;
+ struct nm_desc *desc_ptr;
unsigned i;
unsigned j;
unsigned num_rx_desc = 0;
@@ -503,18 +506,27 @@ static int netmap_start(pktio_entry_t *pktio_entry)
pktio_entry->s.num_out_queue,
pktio_entry->s.num_out_queue);
- memset(&base_desc, 0, sizeof(struct nm_desc));
- base_desc.self = &base_desc;
- base_desc.mem = NULL;
- memcpy(base_desc.req.nr_name, pkt_nm->if_name, sizeof(pkt_nm->if_name));
- base_desc.req.nr_flags &= ~NR_REG_MASK;
+ /* Use nm_open() to parse netmap flags from interface name */
+ desc_ptr = nm_open(pkt_nm->nm_name, NULL, 0, NULL);
+ if (desc_ptr == NULL) {
+ ODP_ERR("nm_start(%s) failed\n", pkt_nm->nm_name);
+ goto error;
+ }
+ struct nm_desc base_desc = *desc_ptr;
- if (num_rx_desc == 1)
- base_desc.req.nr_flags |= NR_REG_ALL_NIC;
- else
- base_desc.req.nr_flags |= NR_REG_ONE_NIC;
+ nm_close(desc_ptr);
+ base_desc.self = &base_desc;
+ base_desc.mem = NULL;
base_desc.req.nr_ringid = 0;
+ if ((base_desc.req.nr_flags & NR_REG_MASK) == NR_REG_ALL_NIC ||
+ (base_desc.req.nr_flags & NR_REG_MASK) == NR_REG_ONE_NIC) {
+ base_desc.req.nr_flags &= ~NR_REG_MASK;
+ if (num_rx_desc == 1)
+ base_desc.req.nr_flags |= NR_REG_ALL_NIC;
+ else
+ base_desc.req.nr_flags |= NR_REG_ONE_NIC;
+ }
/* Only the first rx descriptor does mmap */
desc_ring = pkt_nm->rx_desc_ring;
@@ -548,8 +560,12 @@ static int netmap_start(pktio_entry_t *pktio_entry)
/* Open tx descriptors */
desc_ring = pkt_nm->tx_desc_ring;
flags = NM_OPEN_IFNAME | NM_OPEN_NO_MMAP;
- base_desc.req.nr_flags &= ~NR_REG_ALL_NIC;
- base_desc.req.nr_flags |= NR_REG_ONE_NIC;
+
+ if ((base_desc.req.nr_flags & NR_REG_MASK) == NR_REG_ALL_NIC) {
+ base_desc.req.nr_flags &= ~NR_REG_ALL_NIC;
+ base_desc.req.nr_flags |= NR_REG_ONE_NIC;
+ }
+
for (i = 0; i < pktio_entry->s.num_out_queue; i++) {
for (j = desc_ring[i].s.first; j <= desc_ring[i].s.last; j++) {
base_desc.req.nr_ringid = j;
@@ -793,7 +809,7 @@ static int netmap_send(pktio_entry_t *pktio_entry, int index,
for (nb_tx = 0; nb_tx < num; nb_tx++) {
pkt = pkt_table[nb_tx];
- pkt_len = odp_packet_len(pkt);
+ pkt_len = _odp_packet_len(pkt);
if (pkt_len > pkt_nm->mtu) {
if (nb_tx == 0)
diff --git a/test/Makefile.inc b/test/Makefile.inc
index 4d302120c..2556fd3e4 100644
--- a/test/Makefile.inc
+++ b/test/Makefile.inc
@@ -10,6 +10,7 @@ INCFLAGS = \
-I$(top_builddir)/platform/@with_platform@/include \
-I$(top_srcdir)/helper/include \
-I$(top_srcdir)/include \
+ -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \
-I$(top_srcdir)/platform/@with_platform@/include \
-I$(top_srcdir)/test \
-I$(top_builddir)/include
diff --git a/test/common_plat/common/odp_cunit_common.c b/test/common_plat/common/odp_cunit_common.c
index 2337c92b0..d3328af6c 100644
--- a/test/common_plat/common/odp_cunit_common.c
+++ b/test/common_plat/common/odp_cunit_common.c
@@ -7,7 +7,7 @@
#include <string.h>
#include <odp_api.h>
#include <odp_cunit_common.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
/* Globals */
static odph_odpthread_t thread_tbl[MAX_WORKERS];
static odp_instance_t instance;
diff --git a/test/common_plat/miscellaneous/odp_api_from_cpp.cpp b/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
index be74c275c..2b3078642 100644
--- a/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
+++ b/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
@@ -1,6 +1,6 @@
#include <cstdio>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/threads.h>
int main(int argc ODP_UNUSED, const char *argv[] ODP_UNUSED)
{
diff --git a/test/common_plat/performance/.gitignore b/test/common_plat/performance/.gitignore
index 1527d2516..72035e002 100644
--- a/test/common_plat/performance/.gitignore
+++ b/test/common_plat/performance/.gitignore
@@ -1,8 +1,10 @@
*.log
*.trs
odp_atomic
+odp_bench_packet
odp_crypto
odp_l2fwd
+odp_pktio_ordered
odp_pktio_perf
odp_sched_latency
odp_scheduling
diff --git a/test/common_plat/performance/Makefile.am b/test/common_plat/performance/Makefile.am
index f1846095b..9111c0c2d 100644
--- a/test/common_plat/performance/Makefile.am
+++ b/test/common_plat/performance/Makefile.am
@@ -2,13 +2,17 @@ include $(top_srcdir)/test/Makefile.inc
TESTS_ENVIRONMENT += TEST_DIR=${builddir}
-EXECUTABLES = odp_crypto$(EXEEXT) odp_pktio_perf$(EXEEXT)
+EXECUTABLES = odp_bench_packet$(EXEEXT) \
+ odp_crypto$(EXEEXT) \
+ odp_pktio_perf$(EXEEXT)
COMPILE_ONLY = odp_l2fwd$(EXEEXT) \
+ odp_pktio_ordered$(EXEEXT) \
odp_sched_latency$(EXEEXT) \
odp_scheduling$(EXEEXT)
TESTSCRIPTS = odp_l2fwd_run.sh \
+ odp_pktio_ordered_run.sh \
odp_sched_latency_run.sh \
odp_scheduling_run.sh
@@ -20,17 +24,28 @@ endif
bin_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY)
+odp_bench_packet_LDFLAGS = $(AM_LDFLAGS) -static
+odp_bench_packet_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
odp_crypto_LDFLAGS = $(AM_LDFLAGS) -static
odp_crypto_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
+odp_pktio_perf_LDFLAGS = $(AM_LDFLAGS) -static
+odp_pktio_perf_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
+odp_l2fwd_LDFLAGS = $(AM_LDFLAGS) -static
+odp_l2fwd_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
+odp_pktio_ordered_LDFLAGS = $(AM_LDFLAGS) -static
+odp_pktio_ordered_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
odp_sched_latency_LDFLAGS = $(AM_LDFLAGS) -static
odp_sched_latency_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
odp_scheduling_LDFLAGS = $(AM_LDFLAGS) -static
odp_scheduling_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test
noinst_HEADERS = \
- $(top_srcdir)/test/test_debug.h
+ $(top_srcdir)/test/test_debug.h \
+ dummy_crc.h
+dist_odp_bench_packet_SOURCES = odp_bench_packet.c
dist_odp_crypto_SOURCES = odp_crypto.c
+dist_odp_pktio_ordered_SOURCES = odp_pktio_ordered.c
dist_odp_sched_latency_SOURCES = odp_sched_latency.c
dist_odp_scheduling_SOURCES = odp_scheduling.c
dist_odp_pktio_perf_SOURCES = odp_pktio_perf.c
diff --git a/test/common_plat/performance/dummy_crc.h b/test/common_plat/performance/dummy_crc.h
new file mode 100644
index 000000000..38da44455
--- /dev/null
+++ b/test/common_plat/performance/dummy_crc.h
@@ -0,0 +1,493 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/*-
+ * BSD LICENSE
+ *
+ * Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ *
+ * This file is meant only for generating dummy processing work.
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+
+static const uint32_t dummy_crc32c_tables[8][256] = {{
+ 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C,
+ 0x26A1E7E8, 0xD4CA64EB, 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
+ 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, 0x105EC76F, 0xE235446C,
+ 0xF165B798, 0x030E349B, 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
+ 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, 0x5D1D08BF, 0xAF768BBC,
+ 0xBC267848, 0x4E4DFB4B, 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
+ 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, 0xAA64D611, 0x580F5512,
+ 0x4B5FA6E6, 0xB93425E5, 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
+ 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, 0xF779DEAE, 0x05125DAD,
+ 0x1642AE59, 0xE4292D5A, 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
+ 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, 0x417B1DBC, 0xB3109EBF,
+ 0xA0406D4B, 0x522BEE48, 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
+ 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, 0x0C38D26C, 0xFE53516F,
+ 0xED03A29B, 0x1F682198, 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
+ 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, 0xDBFC821C, 0x2997011F,
+ 0x3AC7F2EB, 0xC8AC71E8, 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
+ 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, 0xA65C047D, 0x5437877E,
+ 0x4767748A, 0xB50CF789, 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
+ 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, 0x7198540D, 0x83F3D70E,
+ 0x90A324FA, 0x62C8A7F9, 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
+ 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, 0x3CDB9BDD, 0xCEB018DE,
+ 0xDDE0EB2A, 0x2F8B6829, 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
+ 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, 0x082F63B7, 0xFA44E0B4,
+ 0xE9141340, 0x1B7F9043, 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
+ 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, 0x55326B08, 0xA759E80B,
+ 0xB4091BFF, 0x466298FC, 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
+ 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, 0xA24BB5A6, 0x502036A5,
+ 0x4370C551, 0xB11B4652, 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
+ 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, 0xEF087A76, 0x1D63F975,
+ 0x0E330A81, 0xFC588982, 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
+ 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, 0x38CC2A06, 0xCAA7A905,
+ 0xD9F75AF1, 0x2B9CD9F2, 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
+ 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, 0x0417B1DB, 0xF67C32D8,
+ 0xE52CC12C, 0x1747422F, 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
+ 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, 0xD3D3E1AB, 0x21B862A8,
+ 0x32E8915C, 0xC083125F, 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
+ 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, 0x9E902E7B, 0x6CFBAD78,
+ 0x7FAB5E8C, 0x8DC0DD8F, 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
+ 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, 0x69E9F0D5, 0x9B8273D6,
+ 0x88D28022, 0x7AB90321, 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
+ 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, 0x34F4F86A, 0xC69F7B69,
+ 0xD5CF889D, 0x27A40B9E, 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
+ 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
+},
+{
+ 0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899, 0x4E8A61DC, 0x5D28F9AB,
+ 0x69CF5132, 0x7A6DC945, 0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21,
+ 0xD39EA264, 0xC03C3A13, 0xF4DB928A, 0xE7790AFD, 0x3FC5F181, 0x2C6769F6,
+ 0x1880C16F, 0x0B225918, 0x714F905D, 0x62ED082A, 0x560AA0B3, 0x45A838C4,
+ 0xA2D13239, 0xB173AA4E, 0x859402D7, 0x96369AA0, 0xEC5B53E5, 0xFFF9CB92,
+ 0xCB1E630B, 0xD8BCFB7C, 0x7F8BE302, 0x6C297B75, 0x58CED3EC, 0x4B6C4B9B,
+ 0x310182DE, 0x22A31AA9, 0x1644B230, 0x05E62A47, 0xE29F20BA, 0xF13DB8CD,
+ 0xC5DA1054, 0xD6788823, 0xAC154166, 0xBFB7D911, 0x8B507188, 0x98F2E9FF,
+ 0x404E1283, 0x53EC8AF4, 0x670B226D, 0x74A9BA1A, 0x0EC4735F, 0x1D66EB28,
+ 0x298143B1, 0x3A23DBC6, 0xDD5AD13B, 0xCEF8494C, 0xFA1FE1D5, 0xE9BD79A2,
+ 0x93D0B0E7, 0x80722890, 0xB4958009, 0xA737187E, 0xFF17C604, 0xECB55E73,
+ 0xD852F6EA, 0xCBF06E9D, 0xB19DA7D8, 0xA23F3FAF, 0x96D89736, 0x857A0F41,
+ 0x620305BC, 0x71A19DCB, 0x45463552, 0x56E4AD25, 0x2C896460, 0x3F2BFC17,
+ 0x0BCC548E, 0x186ECCF9, 0xC0D23785, 0xD370AFF2, 0xE797076B, 0xF4359F1C,
+ 0x8E585659, 0x9DFACE2E, 0xA91D66B7, 0xBABFFEC0, 0x5DC6F43D, 0x4E646C4A,
+ 0x7A83C4D3, 0x69215CA4, 0x134C95E1, 0x00EE0D96, 0x3409A50F, 0x27AB3D78,
+ 0x809C2506, 0x933EBD71, 0xA7D915E8, 0xB47B8D9F, 0xCE1644DA, 0xDDB4DCAD,
+ 0xE9537434, 0xFAF1EC43, 0x1D88E6BE, 0x0E2A7EC9, 0x3ACDD650, 0x296F4E27,
+ 0x53028762, 0x40A01F15, 0x7447B78C, 0x67E52FFB, 0xBF59D487, 0xACFB4CF0,
+ 0x981CE469, 0x8BBE7C1E, 0xF1D3B55B, 0xE2712D2C, 0xD69685B5, 0xC5341DC2,
+ 0x224D173F, 0x31EF8F48, 0x050827D1, 0x16AABFA6, 0x6CC776E3, 0x7F65EE94,
+ 0x4B82460D, 0x5820DE7A, 0xFBC3FAF9, 0xE861628E, 0xDC86CA17, 0xCF245260,
+ 0xB5499B25, 0xA6EB0352, 0x920CABCB, 0x81AE33BC, 0x66D73941, 0x7575A136,
+ 0x419209AF, 0x523091D8, 0x285D589D, 0x3BFFC0EA, 0x0F186873, 0x1CBAF004,
+ 0xC4060B78, 0xD7A4930F, 0xE3433B96, 0xF0E1A3E1, 0x8A8C6AA4, 0x992EF2D3,
+ 0xADC95A4A, 0xBE6BC23D, 0x5912C8C0, 0x4AB050B7, 0x7E57F82E, 0x6DF56059,
+ 0x1798A91C, 0x043A316B, 0x30DD99F2, 0x237F0185, 0x844819FB, 0x97EA818C,
+ 0xA30D2915, 0xB0AFB162, 0xCAC27827, 0xD960E050, 0xED8748C9, 0xFE25D0BE,
+ 0x195CDA43, 0x0AFE4234, 0x3E19EAAD, 0x2DBB72DA, 0x57D6BB9F, 0x447423E8,
+ 0x70938B71, 0x63311306, 0xBB8DE87A, 0xA82F700D, 0x9CC8D894, 0x8F6A40E3,
+ 0xF50789A6, 0xE6A511D1, 0xD242B948, 0xC1E0213F, 0x26992BC2, 0x353BB3B5,
+ 0x01DC1B2C, 0x127E835B, 0x68134A1E, 0x7BB1D269, 0x4F567AF0, 0x5CF4E287,
+ 0x04D43CFD, 0x1776A48A, 0x23910C13, 0x30339464, 0x4A5E5D21, 0x59FCC556,
+ 0x6D1B6DCF, 0x7EB9F5B8, 0x99C0FF45, 0x8A626732, 0xBE85CFAB, 0xAD2757DC,
+ 0xD74A9E99, 0xC4E806EE, 0xF00FAE77, 0xE3AD3600, 0x3B11CD7C, 0x28B3550B,
+ 0x1C54FD92, 0x0FF665E5, 0x759BACA0, 0x663934D7, 0x52DE9C4E, 0x417C0439,
+ 0xA6050EC4, 0xB5A796B3, 0x81403E2A, 0x92E2A65D, 0xE88F6F18, 0xFB2DF76F,
+ 0xCFCA5FF6, 0xDC68C781, 0x7B5FDFFF, 0x68FD4788, 0x5C1AEF11, 0x4FB87766,
+ 0x35D5BE23, 0x26772654, 0x12908ECD, 0x013216BA, 0xE64B1C47, 0xF5E98430,
+ 0xC10E2CA9, 0xD2ACB4DE, 0xA8C17D9B, 0xBB63E5EC, 0x8F844D75, 0x9C26D502,
+ 0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7, 0x0A104FA2, 0x19B2D7D5,
+ 0x2D557F4C, 0x3EF7E73B, 0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F,
+ 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483,
+},
+{
+ 0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073, 0x9EDEA41A, 0x3B9F3664,
+ 0xD1B1F617, 0x74F06469, 0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6,
+ 0xA68F9ADF, 0x03CE08A1, 0xE9E0C8D2, 0x4CA15AAC, 0x70A27D8A, 0xD5E3EFF4,
+ 0x3FCD2F87, 0x9A8CBDF9, 0xEE7CD990, 0x4B3D4BEE, 0xA1138B9D, 0x045219E3,
+ 0x48F3434F, 0xEDB2D131, 0x079C1142, 0xA2DD833C, 0xD62DE755, 0x736C752B,
+ 0x9942B558, 0x3C032726, 0xE144FB14, 0x4405696A, 0xAE2BA919, 0x0B6A3B67,
+ 0x7F9A5F0E, 0xDADBCD70, 0x30F50D03, 0x95B49F7D, 0xD915C5D1, 0x7C5457AF,
+ 0x967A97DC, 0x333B05A2, 0x47CB61CB, 0xE28AF3B5, 0x08A433C6, 0xADE5A1B8,
+ 0x91E6869E, 0x34A714E0, 0xDE89D493, 0x7BC846ED, 0x0F382284, 0xAA79B0FA,
+ 0x40577089, 0xE516E2F7, 0xA9B7B85B, 0x0CF62A25, 0xE6D8EA56, 0x43997828,
+ 0x37691C41, 0x92288E3F, 0x78064E4C, 0xDD47DC32, 0xC76580D9, 0x622412A7,
+ 0x880AD2D4, 0x2D4B40AA, 0x59BB24C3, 0xFCFAB6BD, 0x16D476CE, 0xB395E4B0,
+ 0xFF34BE1C, 0x5A752C62, 0xB05BEC11, 0x151A7E6F, 0x61EA1A06, 0xC4AB8878,
+ 0x2E85480B, 0x8BC4DA75, 0xB7C7FD53, 0x12866F2D, 0xF8A8AF5E, 0x5DE93D20,
+ 0x29195949, 0x8C58CB37, 0x66760B44, 0xC337993A, 0x8F96C396, 0x2AD751E8,
+ 0xC0F9919B, 0x65B803E5, 0x1148678C, 0xB409F5F2, 0x5E273581, 0xFB66A7FF,
+ 0x26217BCD, 0x8360E9B3, 0x694E29C0, 0xCC0FBBBE, 0xB8FFDFD7, 0x1DBE4DA9,
+ 0xF7908DDA, 0x52D11FA4, 0x1E704508, 0xBB31D776, 0x511F1705, 0xF45E857B,
+ 0x80AEE112, 0x25EF736C, 0xCFC1B31F, 0x6A802161, 0x56830647, 0xF3C29439,
+ 0x19EC544A, 0xBCADC634, 0xC85DA25D, 0x6D1C3023, 0x8732F050, 0x2273622E,
+ 0x6ED23882, 0xCB93AAFC, 0x21BD6A8F, 0x84FCF8F1, 0xF00C9C98, 0x554D0EE6,
+ 0xBF63CE95, 0x1A225CEB, 0x8B277743, 0x2E66E53D, 0xC448254E, 0x6109B730,
+ 0x15F9D359, 0xB0B84127, 0x5A968154, 0xFFD7132A, 0xB3764986, 0x1637DBF8,
+ 0xFC191B8B, 0x595889F5, 0x2DA8ED9C, 0x88E97FE2, 0x62C7BF91, 0xC7862DEF,
+ 0xFB850AC9, 0x5EC498B7, 0xB4EA58C4, 0x11ABCABA, 0x655BAED3, 0xC01A3CAD,
+ 0x2A34FCDE, 0x8F756EA0, 0xC3D4340C, 0x6695A672, 0x8CBB6601, 0x29FAF47F,
+ 0x5D0A9016, 0xF84B0268, 0x1265C21B, 0xB7245065, 0x6A638C57, 0xCF221E29,
+ 0x250CDE5A, 0x804D4C24, 0xF4BD284D, 0x51FCBA33, 0xBBD27A40, 0x1E93E83E,
+ 0x5232B292, 0xF77320EC, 0x1D5DE09F, 0xB81C72E1, 0xCCEC1688, 0x69AD84F6,
+ 0x83834485, 0x26C2D6FB, 0x1AC1F1DD, 0xBF8063A3, 0x55AEA3D0, 0xF0EF31AE,
+ 0x841F55C7, 0x215EC7B9, 0xCB7007CA, 0x6E3195B4, 0x2290CF18, 0x87D15D66,
+ 0x6DFF9D15, 0xC8BE0F6B, 0xBC4E6B02, 0x190FF97C, 0xF321390F, 0x5660AB71,
+ 0x4C42F79A, 0xE90365E4, 0x032DA597, 0xA66C37E9, 0xD29C5380, 0x77DDC1FE,
+ 0x9DF3018D, 0x38B293F3, 0x7413C95F, 0xD1525B21, 0x3B7C9B52, 0x9E3D092C,
+ 0xEACD6D45, 0x4F8CFF3B, 0xA5A23F48, 0x00E3AD36, 0x3CE08A10, 0x99A1186E,
+ 0x738FD81D, 0xD6CE4A63, 0xA23E2E0A, 0x077FBC74, 0xED517C07, 0x4810EE79,
+ 0x04B1B4D5, 0xA1F026AB, 0x4BDEE6D8, 0xEE9F74A6, 0x9A6F10CF, 0x3F2E82B1,
+ 0xD50042C2, 0x7041D0BC, 0xAD060C8E, 0x08479EF0, 0xE2695E83, 0x4728CCFD,
+ 0x33D8A894, 0x96993AEA, 0x7CB7FA99, 0xD9F668E7, 0x9557324B, 0x3016A035,
+ 0xDA386046, 0x7F79F238, 0x0B899651, 0xAEC8042F, 0x44E6C45C, 0xE1A75622,
+ 0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177, 0x437AD51E, 0xE63B4760,
+ 0x0C158713, 0xA954156D, 0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2,
+ 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8,
+},
+{
+ 0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939, 0x7B2231F3, 0xA6679B4B,
+ 0xC4451272, 0x1900B8CA, 0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF,
+ 0x8D665215, 0x5023F8AD, 0x32017194, 0xEF44DB2C, 0xE964B13D, 0x34211B85,
+ 0x560392BC, 0x8B463804, 0x924680CE, 0x4F032A76, 0x2D21A34F, 0xF06409F7,
+ 0x1F20D2DB, 0xC2657863, 0xA047F15A, 0x7D025BE2, 0x6402E328, 0xB9474990,
+ 0xDB65C0A9, 0x06206A11, 0xD725148B, 0x0A60BE33, 0x6842370A, 0xB5079DB2,
+ 0xAC072578, 0x71428FC0, 0x136006F9, 0xCE25AC41, 0x2161776D, 0xFC24DDD5,
+ 0x9E0654EC, 0x4343FE54, 0x5A43469E, 0x8706EC26, 0xE524651F, 0x3861CFA7,
+ 0x3E41A5B6, 0xE3040F0E, 0x81268637, 0x5C632C8F, 0x45639445, 0x98263EFD,
+ 0xFA04B7C4, 0x27411D7C, 0xC805C650, 0x15406CE8, 0x7762E5D1, 0xAA274F69,
+ 0xB327F7A3, 0x6E625D1B, 0x0C40D422, 0xD1057E9A, 0xABA65FE7, 0x76E3F55F,
+ 0x14C17C66, 0xC984D6DE, 0xD0846E14, 0x0DC1C4AC, 0x6FE34D95, 0xB2A6E72D,
+ 0x5DE23C01, 0x80A796B9, 0xE2851F80, 0x3FC0B538, 0x26C00DF2, 0xFB85A74A,
+ 0x99A72E73, 0x44E284CB, 0x42C2EEDA, 0x9F874462, 0xFDA5CD5B, 0x20E067E3,
+ 0x39E0DF29, 0xE4A57591, 0x8687FCA8, 0x5BC25610, 0xB4868D3C, 0x69C32784,
+ 0x0BE1AEBD, 0xD6A40405, 0xCFA4BCCF, 0x12E11677, 0x70C39F4E, 0xAD8635F6,
+ 0x7C834B6C, 0xA1C6E1D4, 0xC3E468ED, 0x1EA1C255, 0x07A17A9F, 0xDAE4D027,
+ 0xB8C6591E, 0x6583F3A6, 0x8AC7288A, 0x57828232, 0x35A00B0B, 0xE8E5A1B3,
+ 0xF1E51979, 0x2CA0B3C1, 0x4E823AF8, 0x93C79040, 0x95E7FA51, 0x48A250E9,
+ 0x2A80D9D0, 0xF7C57368, 0xEEC5CBA2, 0x3380611A, 0x51A2E823, 0x8CE7429B,
+ 0x63A399B7, 0xBEE6330F, 0xDCC4BA36, 0x0181108E, 0x1881A844, 0xC5C402FC,
+ 0xA7E68BC5, 0x7AA3217D, 0x52A0C93F, 0x8FE56387, 0xEDC7EABE, 0x30824006,
+ 0x2982F8CC, 0xF4C75274, 0x96E5DB4D, 0x4BA071F5, 0xA4E4AAD9, 0x79A10061,
+ 0x1B838958, 0xC6C623E0, 0xDFC69B2A, 0x02833192, 0x60A1B8AB, 0xBDE41213,
+ 0xBBC47802, 0x6681D2BA, 0x04A35B83, 0xD9E6F13B, 0xC0E649F1, 0x1DA3E349,
+ 0x7F816A70, 0xA2C4C0C8, 0x4D801BE4, 0x90C5B15C, 0xF2E73865, 0x2FA292DD,
+ 0x36A22A17, 0xEBE780AF, 0x89C50996, 0x5480A32E, 0x8585DDB4, 0x58C0770C,
+ 0x3AE2FE35, 0xE7A7548D, 0xFEA7EC47, 0x23E246FF, 0x41C0CFC6, 0x9C85657E,
+ 0x73C1BE52, 0xAE8414EA, 0xCCA69DD3, 0x11E3376B, 0x08E38FA1, 0xD5A62519,
+ 0xB784AC20, 0x6AC10698, 0x6CE16C89, 0xB1A4C631, 0xD3864F08, 0x0EC3E5B0,
+ 0x17C35D7A, 0xCA86F7C2, 0xA8A47EFB, 0x75E1D443, 0x9AA50F6F, 0x47E0A5D7,
+ 0x25C22CEE, 0xF8878656, 0xE1873E9C, 0x3CC29424, 0x5EE01D1D, 0x83A5B7A5,
+ 0xF90696D8, 0x24433C60, 0x4661B559, 0x9B241FE1, 0x8224A72B, 0x5F610D93,
+ 0x3D4384AA, 0xE0062E12, 0x0F42F53E, 0xD2075F86, 0xB025D6BF, 0x6D607C07,
+ 0x7460C4CD, 0xA9256E75, 0xCB07E74C, 0x16424DF4, 0x106227E5, 0xCD278D5D,
+ 0xAF050464, 0x7240AEDC, 0x6B401616, 0xB605BCAE, 0xD4273597, 0x09629F2F,
+ 0xE6264403, 0x3B63EEBB, 0x59416782, 0x8404CD3A, 0x9D0475F0, 0x4041DF48,
+ 0x22635671, 0xFF26FCC9, 0x2E238253, 0xF36628EB, 0x9144A1D2, 0x4C010B6A,
+ 0x5501B3A0, 0x88441918, 0xEA669021, 0x37233A99, 0xD867E1B5, 0x05224B0D,
+ 0x6700C234, 0xBA45688C, 0xA345D046, 0x7E007AFE, 0x1C22F3C7, 0xC167597F,
+ 0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57, 0xBC65029D, 0x6120A825,
+ 0x0302211C, 0xDE478BA4, 0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1,
+ 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842,
+},
+{
+ 0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4, 0xE045BEB0, 0xD854D11C,
+ 0x906761E8, 0xA8760E44, 0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65,
+ 0x2522B521, 0x1D33DA8D, 0x55006A79, 0x6D1105D5, 0x8F2261D3, 0xB7330E7F,
+ 0xFF00BE8B, 0xC711D127, 0x6F67DF63, 0x5776B0CF, 0x1F45003B, 0x27546F97,
+ 0x4A456A42, 0x725405EE, 0x3A67B51A, 0x0276DAB6, 0xAA00D4F2, 0x9211BB5E,
+ 0xDA220BAA, 0xE2336406, 0x1BA8B557, 0x23B9DAFB, 0x6B8A6A0F, 0x539B05A3,
+ 0xFBED0BE7, 0xC3FC644B, 0x8BCFD4BF, 0xB3DEBB13, 0xDECFBEC6, 0xE6DED16A,
+ 0xAEED619E, 0x96FC0E32, 0x3E8A0076, 0x069B6FDA, 0x4EA8DF2E, 0x76B9B082,
+ 0x948AD484, 0xAC9BBB28, 0xE4A80BDC, 0xDCB96470, 0x74CF6A34, 0x4CDE0598,
+ 0x04EDB56C, 0x3CFCDAC0, 0x51EDDF15, 0x69FCB0B9, 0x21CF004D, 0x19DE6FE1,
+ 0xB1A861A5, 0x89B90E09, 0xC18ABEFD, 0xF99BD151, 0x37516AAE, 0x0F400502,
+ 0x4773B5F6, 0x7F62DA5A, 0xD714D41E, 0xEF05BBB2, 0xA7360B46, 0x9F2764EA,
+ 0xF236613F, 0xCA270E93, 0x8214BE67, 0xBA05D1CB, 0x1273DF8F, 0x2A62B023,
+ 0x625100D7, 0x5A406F7B, 0xB8730B7D, 0x806264D1, 0xC851D425, 0xF040BB89,
+ 0x5836B5CD, 0x6027DA61, 0x28146A95, 0x10050539, 0x7D1400EC, 0x45056F40,
+ 0x0D36DFB4, 0x3527B018, 0x9D51BE5C, 0xA540D1F0, 0xED736104, 0xD5620EA8,
+ 0x2CF9DFF9, 0x14E8B055, 0x5CDB00A1, 0x64CA6F0D, 0xCCBC6149, 0xF4AD0EE5,
+ 0xBC9EBE11, 0x848FD1BD, 0xE99ED468, 0xD18FBBC4, 0x99BC0B30, 0xA1AD649C,
+ 0x09DB6AD8, 0x31CA0574, 0x79F9B580, 0x41E8DA2C, 0xA3DBBE2A, 0x9BCAD186,
+ 0xD3F96172, 0xEBE80EDE, 0x439E009A, 0x7B8F6F36, 0x33BCDFC2, 0x0BADB06E,
+ 0x66BCB5BB, 0x5EADDA17, 0x169E6AE3, 0x2E8F054F, 0x86F90B0B, 0xBEE864A7,
+ 0xF6DBD453, 0xCECABBFF, 0x6EA2D55C, 0x56B3BAF0, 0x1E800A04, 0x269165A8,
+ 0x8EE76BEC, 0xB6F60440, 0xFEC5B4B4, 0xC6D4DB18, 0xABC5DECD, 0x93D4B161,
+ 0xDBE70195, 0xE3F66E39, 0x4B80607D, 0x73910FD1, 0x3BA2BF25, 0x03B3D089,
+ 0xE180B48F, 0xD991DB23, 0x91A26BD7, 0xA9B3047B, 0x01C50A3F, 0x39D46593,
+ 0x71E7D567, 0x49F6BACB, 0x24E7BF1E, 0x1CF6D0B2, 0x54C56046, 0x6CD40FEA,
+ 0xC4A201AE, 0xFCB36E02, 0xB480DEF6, 0x8C91B15A, 0x750A600B, 0x4D1B0FA7,
+ 0x0528BF53, 0x3D39D0FF, 0x954FDEBB, 0xAD5EB117, 0xE56D01E3, 0xDD7C6E4F,
+ 0xB06D6B9A, 0x887C0436, 0xC04FB4C2, 0xF85EDB6E, 0x5028D52A, 0x6839BA86,
+ 0x200A0A72, 0x181B65DE, 0xFA2801D8, 0xC2396E74, 0x8A0ADE80, 0xB21BB12C,
+ 0x1A6DBF68, 0x227CD0C4, 0x6A4F6030, 0x525E0F9C, 0x3F4F0A49, 0x075E65E5,
+ 0x4F6DD511, 0x777CBABD, 0xDF0AB4F9, 0xE71BDB55, 0xAF286BA1, 0x9739040D,
+ 0x59F3BFF2, 0x61E2D05E, 0x29D160AA, 0x11C00F06, 0xB9B60142, 0x81A76EEE,
+ 0xC994DE1A, 0xF185B1B6, 0x9C94B463, 0xA485DBCF, 0xECB66B3B, 0xD4A70497,
+ 0x7CD10AD3, 0x44C0657F, 0x0CF3D58B, 0x34E2BA27, 0xD6D1DE21, 0xEEC0B18D,
+ 0xA6F30179, 0x9EE26ED5, 0x36946091, 0x0E850F3D, 0x46B6BFC9, 0x7EA7D065,
+ 0x13B6D5B0, 0x2BA7BA1C, 0x63940AE8, 0x5B856544, 0xF3F36B00, 0xCBE204AC,
+ 0x83D1B458, 0xBBC0DBF4, 0x425B0AA5, 0x7A4A6509, 0x3279D5FD, 0x0A68BA51,
+ 0xA21EB415, 0x9A0FDBB9, 0xD23C6B4D, 0xEA2D04E1, 0x873C0134, 0xBF2D6E98,
+ 0xF71EDE6C, 0xCF0FB1C0, 0x6779BF84, 0x5F68D028, 0x175B60DC, 0x2F4A0F70,
+ 0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82, 0x2D3CD5C6, 0x152DBA6A,
+ 0x5D1E0A9E, 0x650F6532, 0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013,
+ 0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3,
+},
+{
+ 0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA, 0xB2F53777, 0x5DC55C6E,
+ 0x697997B4, 0x8649FCAD, 0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5,
+ 0xD2F32F68, 0x3DC34471, 0x097F8FAB, 0xE64FE4B2, 0xC00C303E, 0x2F3C5B27,
+ 0x1B8090FD, 0xF4B0FBE4, 0x72F90749, 0x9DC96C50, 0xA975A78A, 0x4645CC93,
+ 0xA00A2821, 0x4F3A4338, 0x7B8688E2, 0x94B6E3FB, 0x12FF1F56, 0xFDCF744F,
+ 0xC973BF95, 0x2643D48C, 0x85F4168D, 0x6AC47D94, 0x5E78B64E, 0xB148DD57,
+ 0x370121FA, 0xD8314AE3, 0xEC8D8139, 0x03BDEA20, 0xE5F20E92, 0x0AC2658B,
+ 0x3E7EAE51, 0xD14EC548, 0x570739E5, 0xB83752FC, 0x8C8B9926, 0x63BBF23F,
+ 0x45F826B3, 0xAAC84DAA, 0x9E748670, 0x7144ED69, 0xF70D11C4, 0x183D7ADD,
+ 0x2C81B107, 0xC3B1DA1E, 0x25FE3EAC, 0xCACE55B5, 0xFE729E6F, 0x1142F576,
+ 0x970B09DB, 0x783B62C2, 0x4C87A918, 0xA3B7C201, 0x0E045BEB, 0xE13430F2,
+ 0xD588FB28, 0x3AB89031, 0xBCF16C9C, 0x53C10785, 0x677DCC5F, 0x884DA746,
+ 0x6E0243F4, 0x813228ED, 0xB58EE337, 0x5ABE882E, 0xDCF77483, 0x33C71F9A,
+ 0x077BD440, 0xE84BBF59, 0xCE086BD5, 0x213800CC, 0x1584CB16, 0xFAB4A00F,
+ 0x7CFD5CA2, 0x93CD37BB, 0xA771FC61, 0x48419778, 0xAE0E73CA, 0x413E18D3,
+ 0x7582D309, 0x9AB2B810, 0x1CFB44BD, 0xF3CB2FA4, 0xC777E47E, 0x28478F67,
+ 0x8BF04D66, 0x64C0267F, 0x507CEDA5, 0xBF4C86BC, 0x39057A11, 0xD6351108,
+ 0xE289DAD2, 0x0DB9B1CB, 0xEBF65579, 0x04C63E60, 0x307AF5BA, 0xDF4A9EA3,
+ 0x5903620E, 0xB6330917, 0x828FC2CD, 0x6DBFA9D4, 0x4BFC7D58, 0xA4CC1641,
+ 0x9070DD9B, 0x7F40B682, 0xF9094A2F, 0x16392136, 0x2285EAEC, 0xCDB581F5,
+ 0x2BFA6547, 0xC4CA0E5E, 0xF076C584, 0x1F46AE9D, 0x990F5230, 0x763F3929,
+ 0x4283F2F3, 0xADB399EA, 0x1C08B7D6, 0xF338DCCF, 0xC7841715, 0x28B47C0C,
+ 0xAEFD80A1, 0x41CDEBB8, 0x75712062, 0x9A414B7B, 0x7C0EAFC9, 0x933EC4D0,
+ 0xA7820F0A, 0x48B26413, 0xCEFB98BE, 0x21CBF3A7, 0x1577387D, 0xFA475364,
+ 0xDC0487E8, 0x3334ECF1, 0x0788272B, 0xE8B84C32, 0x6EF1B09F, 0x81C1DB86,
+ 0xB57D105C, 0x5A4D7B45, 0xBC029FF7, 0x5332F4EE, 0x678E3F34, 0x88BE542D,
+ 0x0EF7A880, 0xE1C7C399, 0xD57B0843, 0x3A4B635A, 0x99FCA15B, 0x76CCCA42,
+ 0x42700198, 0xAD406A81, 0x2B09962C, 0xC439FD35, 0xF08536EF, 0x1FB55DF6,
+ 0xF9FAB944, 0x16CAD25D, 0x22761987, 0xCD46729E, 0x4B0F8E33, 0xA43FE52A,
+ 0x90832EF0, 0x7FB345E9, 0x59F09165, 0xB6C0FA7C, 0x827C31A6, 0x6D4C5ABF,
+ 0xEB05A612, 0x0435CD0B, 0x308906D1, 0xDFB96DC8, 0x39F6897A, 0xD6C6E263,
+ 0xE27A29B9, 0x0D4A42A0, 0x8B03BE0D, 0x6433D514, 0x508F1ECE, 0xBFBF75D7,
+ 0x120CEC3D, 0xFD3C8724, 0xC9804CFE, 0x26B027E7, 0xA0F9DB4A, 0x4FC9B053,
+ 0x7B757B89, 0x94451090, 0x720AF422, 0x9D3A9F3B, 0xA98654E1, 0x46B63FF8,
+ 0xC0FFC355, 0x2FCFA84C, 0x1B736396, 0xF443088F, 0xD200DC03, 0x3D30B71A,
+ 0x098C7CC0, 0xE6BC17D9, 0x60F5EB74, 0x8FC5806D, 0xBB794BB7, 0x544920AE,
+ 0xB206C41C, 0x5D36AF05, 0x698A64DF, 0x86BA0FC6, 0x00F3F36B, 0xEFC39872,
+ 0xDB7F53A8, 0x344F38B1, 0x97F8FAB0, 0x78C891A9, 0x4C745A73, 0xA344316A,
+ 0x250DCDC7, 0xCA3DA6DE, 0xFE816D04, 0x11B1061D, 0xF7FEE2AF, 0x18CE89B6,
+ 0x2C72426C, 0xC3422975, 0x450BD5D8, 0xAA3BBEC1, 0x9E87751B, 0x71B71E02,
+ 0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154, 0xE501FDF9, 0x0A3196E0,
+ 0x3E8D5D3A, 0xD1BD3623, 0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B,
+ 0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C,
+},
+{
+ 0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558, 0xA5E0C5D1, 0xCDE3E919,
+ 0x75E69C41, 0x1DE5B089, 0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B,
+ 0xEBCD3882, 0x83CE144A, 0x3BCB6112, 0x53C84DDA, 0x9C5BFAA6, 0xF458D66E,
+ 0x4C5DA336, 0x245E8FFE, 0x39BB3F77, 0x51B813BF, 0xE9BD66E7, 0x81BE4A2F,
+ 0xD27607F5, 0xBA752B3D, 0x02705E65, 0x6A7372AD, 0x7796C224, 0x1F95EEEC,
+ 0xA7909BB4, 0xCF93B77C, 0x3D5B83BD, 0x5558AF75, 0xED5DDA2D, 0x855EF6E5,
+ 0x98BB466C, 0xF0B86AA4, 0x48BD1FFC, 0x20BE3334, 0x73767EEE, 0x1B755226,
+ 0xA370277E, 0xCB730BB6, 0xD696BB3F, 0xBE9597F7, 0x0690E2AF, 0x6E93CE67,
+ 0xA100791B, 0xC90355D3, 0x7106208B, 0x19050C43, 0x04E0BCCA, 0x6CE39002,
+ 0xD4E6E55A, 0xBCE5C992, 0xEF2D8448, 0x872EA880, 0x3F2BDDD8, 0x5728F110,
+ 0x4ACD4199, 0x22CE6D51, 0x9ACB1809, 0xF2C834C1, 0x7AB7077A, 0x12B42BB2,
+ 0xAAB15EEA, 0xC2B27222, 0xDF57C2AB, 0xB754EE63, 0x0F519B3B, 0x6752B7F3,
+ 0x349AFA29, 0x5C99D6E1, 0xE49CA3B9, 0x8C9F8F71, 0x917A3FF8, 0xF9791330,
+ 0x417C6668, 0x297F4AA0, 0xE6ECFDDC, 0x8EEFD114, 0x36EAA44C, 0x5EE98884,
+ 0x430C380D, 0x2B0F14C5, 0x930A619D, 0xFB094D55, 0xA8C1008F, 0xC0C22C47,
+ 0x78C7591F, 0x10C475D7, 0x0D21C55E, 0x6522E996, 0xDD279CCE, 0xB524B006,
+ 0x47EC84C7, 0x2FEFA80F, 0x97EADD57, 0xFFE9F19F, 0xE20C4116, 0x8A0F6DDE,
+ 0x320A1886, 0x5A09344E, 0x09C17994, 0x61C2555C, 0xD9C72004, 0xB1C40CCC,
+ 0xAC21BC45, 0xC422908D, 0x7C27E5D5, 0x1424C91D, 0xDBB77E61, 0xB3B452A9,
+ 0x0BB127F1, 0x63B20B39, 0x7E57BBB0, 0x16549778, 0xAE51E220, 0xC652CEE8,
+ 0x959A8332, 0xFD99AFFA, 0x459CDAA2, 0x2D9FF66A, 0x307A46E3, 0x58796A2B,
+ 0xE07C1F73, 0x887F33BB, 0xF56E0EF4, 0x9D6D223C, 0x25685764, 0x4D6B7BAC,
+ 0x508ECB25, 0x388DE7ED, 0x808892B5, 0xE88BBE7D, 0xBB43F3A7, 0xD340DF6F,
+ 0x6B45AA37, 0x034686FF, 0x1EA33676, 0x76A01ABE, 0xCEA56FE6, 0xA6A6432E,
+ 0x6935F452, 0x0136D89A, 0xB933ADC2, 0xD130810A, 0xCCD53183, 0xA4D61D4B,
+ 0x1CD36813, 0x74D044DB, 0x27180901, 0x4F1B25C9, 0xF71E5091, 0x9F1D7C59,
+ 0x82F8CCD0, 0xEAFBE018, 0x52FE9540, 0x3AFDB988, 0xC8358D49, 0xA036A181,
+ 0x1833D4D9, 0x7030F811, 0x6DD54898, 0x05D66450, 0xBDD31108, 0xD5D03DC0,
+ 0x8618701A, 0xEE1B5CD2, 0x561E298A, 0x3E1D0542, 0x23F8B5CB, 0x4BFB9903,
+ 0xF3FEEC5B, 0x9BFDC093, 0x546E77EF, 0x3C6D5B27, 0x84682E7F, 0xEC6B02B7,
+ 0xF18EB23E, 0x998D9EF6, 0x2188EBAE, 0x498BC766, 0x1A438ABC, 0x7240A674,
+ 0xCA45D32C, 0xA246FFE4, 0xBFA34F6D, 0xD7A063A5, 0x6FA516FD, 0x07A63A35,
+ 0x8FD9098E, 0xE7DA2546, 0x5FDF501E, 0x37DC7CD6, 0x2A39CC5F, 0x423AE097,
+ 0xFA3F95CF, 0x923CB907, 0xC1F4F4DD, 0xA9F7D815, 0x11F2AD4D, 0x79F18185,
+ 0x6414310C, 0x0C171DC4, 0xB412689C, 0xDC114454, 0x1382F328, 0x7B81DFE0,
+ 0xC384AAB8, 0xAB878670, 0xB66236F9, 0xDE611A31, 0x66646F69, 0x0E6743A1,
+ 0x5DAF0E7B, 0x35AC22B3, 0x8DA957EB, 0xE5AA7B23, 0xF84FCBAA, 0x904CE762,
+ 0x2849923A, 0x404ABEF2, 0xB2828A33, 0xDA81A6FB, 0x6284D3A3, 0x0A87FF6B,
+ 0x17624FE2, 0x7F61632A, 0xC7641672, 0xAF673ABA, 0xFCAF7760, 0x94AC5BA8,
+ 0x2CA92EF0, 0x44AA0238, 0x594FB2B1, 0x314C9E79, 0x8949EB21, 0xE14AC7E9,
+ 0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD, 0x8B39B544, 0xE33A998C,
+ 0x5B3FECD4, 0x333CC01C, 0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E,
+ 0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F,
+},
+{
+ 0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769, 0x211D826D, 0x6821FF4A,
+ 0xB3657823, 0xFA590504, 0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3,
+ 0x632686B7, 0x2A1AFB90, 0xF15E7CF9, 0xB86201DE, 0x847609B4, 0xCD4A7493,
+ 0x160EF3FA, 0x5F328EDD, 0xA56B8BD9, 0xEC57F6FE, 0x37137197, 0x7E2F0CB0,
+ 0xC64D0D6E, 0x8F717049, 0x5435F720, 0x1D098A07, 0xE7508F03, 0xAE6CF224,
+ 0x7528754D, 0x3C14086A, 0x0D006599, 0x443C18BE, 0x9F789FD7, 0xD644E2F0,
+ 0x2C1DE7F4, 0x65219AD3, 0xBE651DBA, 0xF759609D, 0x4F3B6143, 0x06071C64,
+ 0xDD439B0D, 0x947FE62A, 0x6E26E32E, 0x271A9E09, 0xFC5E1960, 0xB5626447,
+ 0x89766C2D, 0xC04A110A, 0x1B0E9663, 0x5232EB44, 0xA86BEE40, 0xE1579367,
+ 0x3A13140E, 0x732F6929, 0xCB4D68F7, 0x827115D0, 0x593592B9, 0x1009EF9E,
+ 0xEA50EA9A, 0xA36C97BD, 0x782810D4, 0x31146DF3, 0x1A00CB32, 0x533CB615,
+ 0x8878317C, 0xC1444C5B, 0x3B1D495F, 0x72213478, 0xA965B311, 0xE059CE36,
+ 0x583BCFE8, 0x1107B2CF, 0xCA4335A6, 0x837F4881, 0x79264D85, 0x301A30A2,
+ 0xEB5EB7CB, 0xA262CAEC, 0x9E76C286, 0xD74ABFA1, 0x0C0E38C8, 0x453245EF,
+ 0xBF6B40EB, 0xF6573DCC, 0x2D13BAA5, 0x642FC782, 0xDC4DC65C, 0x9571BB7B,
+ 0x4E353C12, 0x07094135, 0xFD504431, 0xB46C3916, 0x6F28BE7F, 0x2614C358,
+ 0x1700AEAB, 0x5E3CD38C, 0x857854E5, 0xCC4429C2, 0x361D2CC6, 0x7F2151E1,
+ 0xA465D688, 0xED59ABAF, 0x553BAA71, 0x1C07D756, 0xC743503F, 0x8E7F2D18,
+ 0x7426281C, 0x3D1A553B, 0xE65ED252, 0xAF62AF75, 0x9376A71F, 0xDA4ADA38,
+ 0x010E5D51, 0x48322076, 0xB26B2572, 0xFB575855, 0x2013DF3C, 0x692FA21B,
+ 0xD14DA3C5, 0x9871DEE2, 0x4335598B, 0x0A0924AC, 0xF05021A8, 0xB96C5C8F,
+ 0x6228DBE6, 0x2B14A6C1, 0x34019664, 0x7D3DEB43, 0xA6796C2A, 0xEF45110D,
+ 0x151C1409, 0x5C20692E, 0x8764EE47, 0xCE589360, 0x763A92BE, 0x3F06EF99,
+ 0xE44268F0, 0xAD7E15D7, 0x572710D3, 0x1E1B6DF4, 0xC55FEA9D, 0x8C6397BA,
+ 0xB0779FD0, 0xF94BE2F7, 0x220F659E, 0x6B3318B9, 0x916A1DBD, 0xD856609A,
+ 0x0312E7F3, 0x4A2E9AD4, 0xF24C9B0A, 0xBB70E62D, 0x60346144, 0x29081C63,
+ 0xD3511967, 0x9A6D6440, 0x4129E329, 0x08159E0E, 0x3901F3FD, 0x703D8EDA,
+ 0xAB7909B3, 0xE2457494, 0x181C7190, 0x51200CB7, 0x8A648BDE, 0xC358F6F9,
+ 0x7B3AF727, 0x32068A00, 0xE9420D69, 0xA07E704E, 0x5A27754A, 0x131B086D,
+ 0xC85F8F04, 0x8163F223, 0xBD77FA49, 0xF44B876E, 0x2F0F0007, 0x66337D20,
+ 0x9C6A7824, 0xD5560503, 0x0E12826A, 0x472EFF4D, 0xFF4CFE93, 0xB67083B4,
+ 0x6D3404DD, 0x240879FA, 0xDE517CFE, 0x976D01D9, 0x4C2986B0, 0x0515FB97,
+ 0x2E015D56, 0x673D2071, 0xBC79A718, 0xF545DA3F, 0x0F1CDF3B, 0x4620A21C,
+ 0x9D642575, 0xD4585852, 0x6C3A598C, 0x250624AB, 0xFE42A3C2, 0xB77EDEE5,
+ 0x4D27DBE1, 0x041BA6C6, 0xDF5F21AF, 0x96635C88, 0xAA7754E2, 0xE34B29C5,
+ 0x380FAEAC, 0x7133D38B, 0x8B6AD68F, 0xC256ABA8, 0x19122CC1, 0x502E51E6,
+ 0xE84C5038, 0xA1702D1F, 0x7A34AA76, 0x3308D751, 0xC951D255, 0x806DAF72,
+ 0x5B29281B, 0x1215553C, 0x230138CF, 0x6A3D45E8, 0xB179C281, 0xF845BFA6,
+ 0x021CBAA2, 0x4B20C785, 0x906440EC, 0xD9583DCB, 0x613A3C15, 0x28064132,
+ 0xF342C65B, 0xBA7EBB7C, 0x4027BE78, 0x091BC35F, 0xD25F4436, 0x9B633911,
+ 0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612, 0x866AB316, 0xCF56CE31,
+ 0x14124958, 0x5D2E347F, 0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8,
+ 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5,
+} };
+
+#define DUMMY_CRC32_UPD(crc, n) \
+ (dummy_crc32c_tables[(n)][(crc) & 0xff] ^ \
+ dummy_crc32c_tables[(n) - 1][((crc) >> 8) & 0xff])
+
+static inline uint32_t dummy_crc32c_u32(uint32_t data, uint32_t init_val)
+{
+ uint32_t crc, term1, term2;
+
+ crc = init_val;
+ crc ^= data;
+
+ term1 = DUMMY_CRC32_UPD(crc, 3);
+ term2 = crc >> 16;
+ crc = term1 ^ DUMMY_CRC32_UPD(term2, 1);
+
+ return crc;
+}
+
+static inline uint32_t dummy_crc32c_u64(uint64_t data, uint32_t init_val)
+{
+ union {
+ uint64_t u64;
+ uint32_t u32[2];
+ } d;
+ d.u64 = data;
+
+ uint32_t crc, term1, term2;
+
+ crc = init_val;
+ crc ^= d.u32[0];
+
+ term1 = DUMMY_CRC32_UPD(crc, 7);
+ term2 = crc >> 16;
+ crc = term1 ^ DUMMY_CRC32_UPD(term2, 5);
+ term1 = DUMMY_CRC32_UPD(d.u32[1], 3);
+ term2 = d.u32[1] >> 16;
+ crc ^= term1 ^ DUMMY_CRC32_UPD(term2, 1);
+
+ return crc;
+}
+
+static inline uint32_t dummy_hash_crc32c(const void *data, uint32_t data_len,
+ uint32_t init_val)
+{
+ size_t i;
+ uint64_t temp = 0;
+ uintptr_t pd = (uintptr_t)data;
+
+ for (i = 0; i < data_len / 8; i++) {
+ init_val = dummy_crc32c_u64(*(const uint64_t *)pd, init_val);
+ pd += 8;
+ }
+
+ switch (7 - (data_len & 0x07)) {
+ case 0:
+ temp |= (uint64_t)*((const uint8_t *)pd + 6) << 48;
+ /* Fallthrough */
+ case 1:
+ temp |= (uint64_t)*((const uint8_t *)pd + 5) << 40;
+ /* Fallthrough */
+ case 2:
+ temp |= (uint64_t)*((const uint8_t *)pd + 4) << 32;
+ temp |= *(const uint32_t *)pd;
+ init_val = dummy_crc32c_u64(temp, init_val);
+ break;
+ case 3:
+ init_val = dummy_crc32c_u32(*(const uint32_t *)pd, init_val);
+ break;
+ case 4:
+ temp |= *((const uint8_t *)pd + 2) << 16;
+ /* Fallthrough */
+ case 5:
+ temp |= *((const uint8_t *)pd + 1) << 8;
+ /* Fallthrough */
+ case 6:
+ temp |= *(const uint8_t *)pd;
+ init_val = dummy_crc32c_u32(temp, init_val);
+ /* Fallthrough */
+ default:
+ break;
+ }
+
+ return init_val;
+}
diff --git a/test/common_plat/performance/odp_bench_packet.c b/test/common_plat/performance/odp_bench_packet.c
new file mode 100644
index 000000000..1aa9d819d
--- /dev/null
+++ b/test/common_plat/performance/odp_bench_packet.c
@@ -0,0 +1,1611 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * @example odp_bench_packet.c Microbenchmarks for packet functions
+ */
+
+#include <stdlib.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <signal.h>
+
+#include <test_debug.h>
+
+#include <odp_api.h>
+#include <odp/helper/threads.h>
+#include <odp/helper/eth.h>
+#include <odp/helper/ip.h>
+#include <odp/helper/udp.h>
+
+/** Minimum number of packet data bytes in the first segment */
+#define PKT_POOL_SEG_LEN 128
+
+/** Packet user area size in bytes */
+#define PKT_POOL_UAREA_SIZE 8
+
+/** Minimum test packet size */
+#define TEST_MIN_PKT_SIZE 64
+
+/** Maximum test packet size */
+#define TEST_MAX_PKT_SIZE 2048
+
+/** Number of test runs per individual benchmark */
+#define TEST_REPEAT_COUNT 1000
+
+/** Number of times to run tests for each packet size */
+#define TEST_SIZE_RUN_COUNT 10
+
+/** Maximum burst size for *_multi operations */
+#define TEST_MAX_BURST 64
+
+/** Offset of the contiguous area */
+#define TEST_ALIGN_OFFSET 16
+
+/** Length of the contiguous area */
+#define TEST_ALIGN_LEN 32
+
+/** Minimum byte alignment of contiguous area */
+#define TEST_ALIGN 32
+
+/** Test packet offsets */
+#define TEST_L2_OFFSET 0
+#define TEST_L3_OFFSET (TEST_MIN_PKT_SIZE / 4)
+#define TEST_L4_OFFSET (TEST_MIN_PKT_SIZE / 2)
+
+/** Default burst size for *_multi operations */
+#define TEST_DEF_BURST 8
+
+/** Get rid of path in filename - only for unix-type paths using '/' */
+#define NO_PATH(file_name) (strrchr((file_name), '/') ? \
+ strrchr((file_name), '/') + 1 : (file_name))
+
+#define BENCH_INFO(run, init, term, name) \
+ {#run, run, init, term, name}
+
+ODP_STATIC_ASSERT((TEST_ALIGN_OFFSET + TEST_ALIGN_LEN) <= TEST_MIN_PKT_SIZE,
+ "Invalid_alignment");
+
+/** Warm up round packet size */
+#define WARM_UP TEST_MIN_PKT_SIZE
+
+/** Test packet sizes */
+const uint32_t test_packet_len[] = {WARM_UP, TEST_MIN_PKT_SIZE, 128, 256, 512,
+ 1024, 1518, TEST_MAX_PKT_SIZE};
+
+/**
+ * Parsed command line arguments
+ */
+typedef struct {
+ int bench_idx; /** Benchmark index to run indefinitely */
+ int burst_size; /** Burst size for *_multi operations */
+} appl_args_t;
+
+/**
+ * Initialize benchmark resources
+ */
+typedef void (*bench_init_fn_t)(void);
+
+/**
+ * Run benchmark
+ *
+ * @retval >0 on success
+ * */
+typedef int (*bench_run_fn_t)(void);
+
+/**
+ * Release benchmark resources
+ */
+typedef void (*bench_term_fn_t)(void);
+
+/**
+ * Benchmark data
+ */
+typedef struct {
+ const char *name;
+ bench_run_fn_t run;
+ bench_init_fn_t init;
+ bench_term_fn_t term;
+ const char *desc;
+} bench_info_t;
+
+/**
+ * Grouping of all global data
+ */
+typedef struct {
+ /** Application (parsed) arguments */
+ appl_args_t appl;
+ /** Packet pool */
+ odp_pool_t pool;
+ /** Benchmark functions */
+ bench_info_t *bench;
+ /** Number of benchmark functions */
+ int num_bench;
+ struct {
+ /** Test packet length */
+ uint32_t len;
+ /** Minimum test packet headroom */
+ uint32_t headroom;
+ /** Minimum test packet tailroom */
+ uint32_t tailroom;
+ /** Minimum test packet segment length */
+ uint32_t seg_len;
+ } pkt;
+ /** Array for storing test packets */
+ odp_packet_t pkt_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
+ /** Array for storing test packets */
+ odp_packet_t pkt2_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test event */
+ odp_event_t event_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test pointers */
+ void *ptr_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test segments */
+ odp_packet_seg_t seg_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test outputs */
+ uint32_t output_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test pool handles */
+ odp_pool_t pool_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test pktio handles */
+ odp_pktio_t pktio_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test timestamps */
+ odp_time_t ts_tbl[TEST_REPEAT_COUNT];
+ /** Array for storing test data */
+ uint8_t data_tbl[TEST_REPEAT_COUNT][TEST_MAX_PKT_SIZE];
+ /** Benchmark run failed */
+ uint8_t bench_failed;
+} args_t;
+
+/** Global pointer to args */
+static args_t *gbl_args;
+/** Global barrier to synchronize main and worker */
+static odp_barrier_t barrier;
+/** Break worker loop if set to 1 */
+static int exit_thread;
+
+static void sig_handler(int signo ODP_UNUSED)
+{
+ exit_thread = 1;
+}
+
+/**
+ * Run given benchmark indefinitely
+ */
+static void run_indef(args_t *args, int idx)
+{
+ const char *desc;
+
+ desc = args->bench[idx].desc != NULL ?
+ args->bench[idx].desc : args->bench[idx].name;
+
+ printf("Running %s() indefinitely\n", desc);
+
+ while (!exit_thread) {
+ int ret;
+
+ if (args->bench[idx].init != NULL)
+ args->bench[idx].init();
+
+ ret = args->bench[idx].run();
+
+ if (args->bench[idx].term != NULL)
+ args->bench[idx].term();
+
+ if (!ret)
+ LOG_ABORT("Benchmark %s failed\n", desc);
+ }
+}
+
+/**
+ * Master function for running the microbenchmarks
+ */
+static int run_benchmarks(void *arg)
+{
+ int i, j, k;
+ args_t *args = arg;
+ int num_sizes = sizeof(test_packet_len) / sizeof(test_packet_len[0]);
+ double results[gbl_args->num_bench][num_sizes];
+
+ memset(results, 0, sizeof(results));
+
+ printf("\nRunning benchmarks (cycles per call)\n"
+ "------------------------------------\n");
+
+ for (i = 0; i < num_sizes; i++) {
+ uint64_t tot_cycles = 0;
+
+ printf("\nPacket length: %6d bytes\n"
+ "---------------------------\n", test_packet_len[i]);
+
+ gbl_args->pkt.len = test_packet_len[i];
+
+ for (j = 0, k = 1; j < gbl_args->num_bench; k++) {
+ int ret;
+ uint64_t c1, c2;
+ const char *desc;
+
+ if (args->appl.bench_idx &&
+ (j + 1) != args->appl.bench_idx) {
+ j++;
+ continue;
+ } else if (args->appl.bench_idx &&
+ (j + 1) == args->appl.bench_idx) {
+ run_indef(args, j);
+ return 0;
+ }
+
+ desc = args->bench[j].desc != NULL ?
+ args->bench[j].desc :
+ args->bench[j].name;
+
+ if (args->bench[j].init != NULL)
+ args->bench[j].init();
+
+ c1 = odp_cpu_cycles();
+ ret = args->bench[j].run();
+ c2 = odp_cpu_cycles();
+
+ if (args->bench[j].term != NULL)
+ args->bench[j].term();
+
+ if (!ret) {
+ LOG_ERR("Benchmark %s failed\n", desc);
+ args->bench_failed = 1;
+ return -1;
+ }
+
+ tot_cycles += odp_cpu_cycles_diff(c2, c1);
+
+ if (k >= TEST_SIZE_RUN_COUNT) {
+ double cycles;
+
+ /** Each benchmark runs internally
+ * TEST_REPEAT_COUNT times. */
+ cycles = ((double)tot_cycles) /
+ (TEST_SIZE_RUN_COUNT *
+ TEST_REPEAT_COUNT);
+ results[j][i] = cycles;
+
+ printf("%-30s: %8.1f\n", desc, cycles);
+
+ j++;
+ k = 0;
+ tot_cycles = 0;
+ }
+ }
+ }
+ printf("\n%-30s", "Benchmark / packet_size [B]");
+ for (i = 0; i < num_sizes; i++) {
+ if (i == 0)
+ printf(" WARM UP ");
+ else
+ printf("%8.1d ", test_packet_len[i]);
+ }
+ printf("\n---------------------------------");
+ for (i = 0; i < num_sizes; i++)
+ printf("----------");
+
+ for (i = 0; i < gbl_args->num_bench; i++) {
+ printf("\n[%02d] %-30s", i + 1, args->bench[i].desc != NULL ?
+ args->bench[i].desc : args->bench[i].name);
+
+ for (j = 0; j < num_sizes; j++)
+ printf("%8.1f ", results[i][j]);
+ }
+ printf("\n\n");
+ return 0;
+}
+
+static void allocate_test_packets(uint32_t len, odp_packet_t pkt[], int num)
+{
+ int pkts = 0;
+
+ while (pkts < num) {
+ int ret;
+
+ ret = odp_packet_alloc_multi(gbl_args->pool, len, &pkt[pkts],
+ num - pkts);
+ if (ret < 0)
+ LOG_ABORT("Allocating test packets failed\n");
+
+ pkts += ret;
+ }
+}
+
+static void alloc_packets_half(void)
+{
+ allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT);
+}
+
+static void alloc_packets_multi(void)
+{
+ allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
+}
+
+static void alloc_concat_packets(void)
+{
+ allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT);
+ allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt2_tbl,
+ TEST_REPEAT_COUNT);
+}
+
+static void alloc_packets_twice(void)
+{
+ allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT);
+ allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt2_tbl,
+ TEST_REPEAT_COUNT);
+}
+
+static void create_packets(void)
+{
+ int i;
+ uint32_t headroom, tailroom, seg_len;
+ uint32_t min_headroom = 0;
+ uint32_t min_tailroom = 0;
+ uint32_t min_seg_len = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
+
+ allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT);
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ headroom = odp_packet_headroom(pkt_tbl[i]);
+ tailroom = odp_packet_tailroom(pkt_tbl[i]);
+ seg_len = odp_packet_seg_len(pkt_tbl[i]);
+
+ seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
+
+ if (i == 0) {
+ min_headroom = headroom;
+ min_tailroom = tailroom;
+ min_seg_len = seg_len;
+ } else {
+ if (headroom < min_headroom)
+ min_headroom = headroom;
+ if (tailroom < min_tailroom)
+ min_tailroom = tailroom;
+ if (seg_len < min_seg_len)
+ min_seg_len = seg_len;
+ }
+
+ if (odp_packet_l2_offset_set(pkt_tbl[i], TEST_L2_OFFSET) ||
+ odp_packet_l3_offset_set(pkt_tbl[i], TEST_L3_OFFSET) ||
+ odp_packet_l4_offset_set(pkt_tbl[i], TEST_L4_OFFSET))
+ LOG_ABORT("Setting test packet offsets failed\n");
+
+ odp_packet_flow_hash_set(pkt_tbl[i], i);
+ odp_packet_ts_set(pkt_tbl[i], odp_time_local());
+ }
+ gbl_args->pkt.headroom = min_headroom;
+ gbl_args->pkt.tailroom = min_tailroom;
+ gbl_args->pkt.seg_len = min_seg_len;
+}
+
+static void create_events(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ create_packets();
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
+}
+
+static void free_packets(void)
+{
+ odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
+}
+
+static void free_packets_multi(void)
+{
+ odp_packet_free_multi(gbl_args->pkt_tbl,
+ TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
+}
+
+static void free_packets_twice(void)
+{
+ odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
+ odp_packet_free_multi(gbl_args->pkt2_tbl, TEST_REPEAT_COUNT);
+}
+
+static int bench_empty(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->output_tbl[i] = i;
+
+ return i;
+}
+
+static int bench_packet_alloc(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ odp_packet_t pkt;
+
+ pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
+
+ gbl_args->pkt_tbl[i] = pkt;
+ }
+
+ return i;
+}
+
+static int bench_packet_alloc_multi(void)
+{
+ int i;
+ int pkts = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ pkts += odp_packet_alloc_multi(gbl_args->pool,
+ gbl_args->pkt.len,
+ &gbl_args->pkt_tbl[pkts],
+ gbl_args->appl.burst_size);
+ return pkts;
+}
+
+static int bench_packet_free(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ odp_packet_free(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_free_multi(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ int pkt_idx = i * gbl_args->appl.burst_size;
+
+ odp_packet_free_multi(&gbl_args->pkt_tbl[pkt_idx],
+ gbl_args->appl.burst_size);
+ }
+ return i;
+}
+
+static int bench_packet_alloc_free(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ odp_packet_t pkt;
+
+ pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
+
+ odp_packet_free(pkt);
+ }
+ return i;
+}
+
+static int bench_packet_alloc_free_multi(void)
+{
+ int i;
+ int pkts;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ pkts = odp_packet_alloc_multi(gbl_args->pool, gbl_args->pkt.len,
+ gbl_args->pkt_tbl,
+ gbl_args->appl.burst_size);
+ odp_packet_free_multi(gbl_args->pkt_tbl, pkts);
+ }
+ return i;
+}
+
+static int bench_packet_reset(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_reset(gbl_args->pkt_tbl[i],
+ gbl_args->pkt.len);
+ return !ret;
+}
+
+static int bench_packet_from_event(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ pkt_tbl[i] = odp_packet_from_event(gbl_args->event_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_to_event(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_head(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_head(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_buf_len(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_buf_len(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_data(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_data(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_seg_len(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_seg_len(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_len(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_len(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_headroom(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_headroom(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_tailroom(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_tailroom(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_tail(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_tail(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_offset(void)
+{
+ int i;
+ uint32_t offset = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_offset(gbl_args->pkt_tbl[i],
+ offset, NULL, NULL);
+ return i;
+}
+
+static int bench_packet_prefetch(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ odp_packet_prefetch(gbl_args->pkt_tbl[i], 0, gbl_args->pkt.len);
+
+ return i;
+}
+
+static int bench_packet_push_head(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ uint32_t hroom = gbl_args->pkt.headroom;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_push_head(pkt_tbl[i], hroom);
+
+ return i;
+}
+
+static int bench_packet_pull_head(void)
+{
+ int i;
+ uint32_t len = gbl_args->pkt.seg_len - 1;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_pull_head(pkt_tbl[i], len);
+
+ return i;
+}
+
+static int bench_packet_push_tail(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ uint32_t troom = gbl_args->pkt.tailroom;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_push_tail(pkt_tbl[i], troom);
+
+ return i;
+}
+
+static int bench_packet_pull_tail(void)
+{
+ int i;
+ uint32_t len = gbl_args->pkt.seg_len - 1;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_pull_tail(pkt_tbl[i], len);
+
+ return i;
+}
+
+static int bench_packet_extend_head(void)
+{
+ int i;
+ int ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ void **ptr_tbl = gbl_args->ptr_tbl;
+ uint32_t *data_tbl = gbl_args->output_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_extend_head(&pkt_tbl[i], len, ptr_tbl[i],
+ &data_tbl[i]);
+ return ret >= 0;
+}
+
+static int bench_packet_trunc_head(void)
+{
+ int i;
+ int ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ void **ptr_tbl = gbl_args->ptr_tbl;
+ uint32_t *data_tbl = gbl_args->output_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_trunc_head(&pkt_tbl[i], len, ptr_tbl[i],
+ &data_tbl[i]);
+ return ret >= 0;
+}
+
+static int bench_packet_extend_tail(void)
+{
+ int i;
+ int ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ void **ptr_tbl = gbl_args->ptr_tbl;
+ uint32_t *data_tbl = gbl_args->output_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_extend_tail(&pkt_tbl[i], len, ptr_tbl[i],
+ &data_tbl[i]);
+ return ret >= 0;
+}
+
+static int bench_packet_trunc_tail(void)
+{
+ int i;
+ int ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ void **ptr_tbl = gbl_args->ptr_tbl;
+ uint32_t *data_tbl = gbl_args->output_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_trunc_tail(&pkt_tbl[i], len, ptr_tbl[i],
+ &data_tbl[i]);
+ return ret >= 0;
+}
+
+static int bench_packet_add_data(void)
+{
+ int i;
+ int ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ uint32_t len = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_add_data(&pkt_tbl[i], 0, len);
+
+ return ret >= 0;
+}
+
+static int bench_packet_rem_data(void)
+{
+ int i;
+ int ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ uint32_t len = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_rem_data(&pkt_tbl[i], 0, len);
+
+ return ret >= 0;
+}
+
+static int bench_packet_align(void)
+{
+ int i;
+ int ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_align(&pkt_tbl[i], TEST_ALIGN_OFFSET,
+ TEST_ALIGN_LEN, TEST_ALIGN);
+ return ret >= 0;
+}
+
+static int bench_packet_is_segmented(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_is_segmented(gbl_args->pkt_tbl[i]);
+
+ return (ret == 0) ? 1 : ret;
+}
+
+static int bench_packet_num_segs(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_num_segs(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_first_seg(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_last_seg(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->seg_tbl[i] = odp_packet_last_seg(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_next_seg(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->seg_tbl[i] = odp_packet_next_seg(pkt_tbl[i],
+ seg_tbl[i]);
+ return i;
+}
+
+static int bench_packet_seg_data(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_seg_data(pkt_tbl[i],
+ seg_tbl[i]);
+ return i;
+}
+
+static int bench_packet_seg_data_len(void)
+{
+ int i;
+ uint32_t ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_seg_data_len(pkt_tbl[i], seg_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_concat(void)
+{
+ int i;
+ int ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_concat(&pkt_tbl[i], frag_tbl[i]);
+
+ return ret >= 0;
+}
+
+static int bench_packet_split(void)
+{
+ int i;
+ int ret = 0;
+ uint32_t head_len;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
+
+ head_len = odp_packet_len(pkt_tbl[0]) / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_split(&pkt_tbl[i], head_len, &frag_tbl[i]);
+
+ return ret >= 0;
+}
+
+static int bench_packet_copy(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ cpy_tbl[i] = odp_packet_copy(pkt_tbl[i], gbl_args->pool);
+
+ return i;
+}
+
+static int bench_packet_copy_part(void)
+{
+ int i;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ cpy_tbl[i] = odp_packet_copy_part(pkt_tbl[i], 0, len,
+ gbl_args->pool);
+ return i;
+}
+
+static int bench_packet_copy_to_mem(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t len = gbl_args->pkt.len;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_copy_to_mem(pkt_tbl[i], 0, len,
+ gbl_args->data_tbl[i]);
+ return !ret;
+}
+
+static int bench_packet_copy_from_mem(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t len = gbl_args->pkt.len;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_copy_from_mem(pkt_tbl[i], 0, len,
+ gbl_args->data_tbl[i]);
+ return !ret;
+}
+
+static int bench_packet_copy_from_pkt(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t len = gbl_args->pkt.len;
+ odp_packet_t *dst_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *src_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_copy_from_pkt(dst_tbl[i], 0, src_tbl[i], 0,
+ len);
+ return !ret;
+}
+
+static int bench_packet_copy_data(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_copy_data(pkt_tbl[i], 0, len, len);
+
+ return !ret;
+}
+
+static int bench_packet_move_data(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t len = gbl_args->pkt.len / 2;
+ uint32_t offset = len / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_move_data(pkt_tbl[i], offset, len, len);
+
+ return !ret;
+}
+
+static int bench_packet_pool(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->pool_tbl[i] = odp_packet_pool(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_input(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->pktio_tbl[i] = odp_packet_input(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_input_index(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_input_index(gbl_args->pkt_tbl[i]);
+
+ return (ret == 0) ? 1 : ret;
+}
+
+static int bench_packet_user_ptr(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_user_ptr(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_user_ptr_set(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ odp_packet_user_ptr_set(gbl_args->pkt_tbl[i],
+ gbl_args->ptr_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_user_area(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_user_area(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_user_area_size(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_user_area_size(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_l2_ptr(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_l2_ptr(gbl_args->pkt_tbl[i],
+ NULL);
+ return i;
+}
+
+static int bench_packet_l2_offset(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l2_offset(gbl_args->pkt_tbl[i]);
+
+ return ret >= 0;
+}
+
+static int bench_packet_l2_offset_set(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t offset = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l2_offset_set(gbl_args->pkt_tbl[i], offset);
+
+ return !ret;
+}
+
+static int bench_packet_l3_ptr(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_l3_ptr(gbl_args->pkt_tbl[i],
+ NULL);
+ return i;
+}
+
+static int bench_packet_l3_offset(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l3_offset(gbl_args->pkt_tbl[i]);
+
+ return ret >= 0;
+}
+
+static int bench_packet_l3_offset_set(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t offset = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l3_offset_set(gbl_args->pkt_tbl[i], offset);
+
+ return !ret;
+}
+
+static int bench_packet_l4_ptr(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ptr_tbl[i] = odp_packet_l4_ptr(gbl_args->pkt_tbl[i],
+ NULL);
+ return i;
+}
+
+static int bench_packet_l4_offset(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l4_offset(gbl_args->pkt_tbl[i]);
+
+ return ret >= 0;
+}
+
+static int bench_packet_l4_offset_set(void)
+{
+ int i;
+ uint32_t ret = 0;
+ uint32_t offset = gbl_args->pkt.len / 2;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_l4_offset_set(gbl_args->pkt_tbl[i], offset);
+
+ return !ret;
+}
+
+static int bench_packet_flow_hash(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_flow_hash(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_flow_hash_set(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ odp_packet_flow_hash_set(gbl_args->pkt_tbl[i], i);
+
+ return i;
+}
+
+static int bench_packet_ts(void)
+{
+ int i;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ gbl_args->ts_tbl[i] = odp_packet_ts(gbl_args->pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_ts_set(void)
+{
+ int i;
+ odp_time_t ts = odp_time_local();
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ odp_packet_ts_set(gbl_args->pkt_tbl[i], ts);
+
+ return i;
+}
+
+/**
+ * Prinf usage information
+ */
+static void usage(char *progname)
+{
+ printf("\n"
+ "OpenDataPlane Packet function microbenchmark.\n"
+ "\n"
+ "Usage: %s OPTIONS\n"
+ " E.g. %s\n"
+ "\n"
+ "Optional OPTIONS:\n"
+ " -b, --burst Test packet burst size.\n"
+ " -i, --index Benchmark index to run indefinitely.\n"
+ " -h, --help Display help and exit.\n\n"
+ "\n", NO_PATH(progname), NO_PATH(progname));
+}
+
+/**
+ * Parse and store the command line arguments
+ *
+ * @param argc argument count
+ * @param argv[] argument vector
+ * @param appl_args Store application arguments here
+ */
+static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
+{
+ int opt;
+ int long_index;
+ static const struct option longopts[] = {
+ {"burst", required_argument, NULL, 'b'},
+ {"help", no_argument, NULL, 'h'},
+ {"index", required_argument, NULL, 'i'},
+ {NULL, 0, NULL, 0}
+ };
+
+ static const char *shortopts = "b:i:h";
+
+ /* Let helper collect its own arguments (e.g. --odph_proc) */
+ odph_parse_options(argc, argv, shortopts, longopts);
+
+ opterr = 0; /* Do not issue errors on helper options */
+
+ appl_args->bench_idx = 0; /* Run all benchmarks */
+ appl_args->burst_size = TEST_DEF_BURST;
+
+ while (1) {
+ opt = getopt_long(argc, argv, shortopts, longopts, &long_index);
+
+ if (opt == -1)
+ break; /* No more options */
+
+ switch (opt) {
+ case 'b':
+ appl_args->burst_size = atoi(optarg);
+ break;
+ case 'h':
+ usage(argv[0]);
+ exit(EXIT_SUCCESS);
+ break;
+ case 'i':
+ appl_args->bench_idx = atoi(optarg);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (appl_args->burst_size < 1 ||
+ appl_args->burst_size > TEST_MAX_BURST) {
+ printf("Invalid burst size (max %d)\n", TEST_MAX_BURST);
+ exit(EXIT_FAILURE);
+ }
+
+ optind = 1; /* Reset 'extern optind' from the getopt lib */
+}
+
+/**
+ * Print system and application info
+ */
+static void print_info(char *progname, appl_args_t *appl_args ODP_UNUSED)
+{
+ printf("\n"
+ "ODP system info\n"
+ "---------------\n"
+ "ODP API version: %s\n"
+ "ODP impl name: %s\n"
+ "CPU model: %s\n"
+ "CPU freq (hz): %" PRIu64 "\n"
+ "Cache line size: %i\n"
+ "CPU count: %i\n"
+ "\n",
+ odp_version_api_str(), odp_version_impl_name(),
+ odp_cpu_model_str(), odp_cpu_hz_max(),
+ odp_sys_cache_line_size(), odp_cpu_count());
+
+ printf("Running ODP appl: \"%s\"\n"
+ "-----------------\n", progname);
+ fflush(NULL);
+}
+
+/**
+ * Test functions
+ */
+bench_info_t test_suite[] = {
+ BENCH_INFO(bench_empty, NULL, NULL, NULL),
+ BENCH_INFO(bench_packet_alloc, NULL, free_packets, NULL),
+ BENCH_INFO(bench_packet_alloc_multi, NULL, free_packets_multi,
+ NULL),
+ BENCH_INFO(bench_packet_free, create_packets, NULL, NULL),
+ BENCH_INFO(bench_packet_free_multi, alloc_packets_multi, NULL,
+ NULL),
+ BENCH_INFO(bench_packet_alloc_free, NULL, NULL, NULL),
+ BENCH_INFO(bench_packet_alloc_free_multi, NULL, NULL, NULL),
+ BENCH_INFO(bench_packet_reset, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_from_event, create_events, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_to_event, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_head, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_buf_len, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_data, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_seg_len, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_len, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_headroom, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_tailroom, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_tail, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_offset, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_prefetch, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_push_head, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_pull_head, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_push_tail, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_pull_tail, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_extend_head, alloc_packets_half,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_trunc_head, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_extend_tail, alloc_packets_half,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_trunc_tail, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_add_data, alloc_packets_half,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_rem_data, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_align, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_is_segmented, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_num_segs, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_first_seg, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_last_seg, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_next_seg, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_seg_data, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_seg_data_len, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_concat, alloc_concat_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_split, create_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_copy, create_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_copy_part, create_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_copy_to_mem, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_copy_from_mem, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_copy_from_pkt, alloc_packets_twice,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_copy_data, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_move_data, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_pool, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_input, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_input_index, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_user_ptr, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_user_ptr_set, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_user_area, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_user_area_size, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_l2_ptr, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l2_offset, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l2_offset_set, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_l3_ptr, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l3_offset, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l3_offset_set, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_l4_ptr, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l4_offset, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_l4_offset_set, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_flow_hash, create_packets, free_packets,
+ NULL),
+ BENCH_INFO(bench_packet_flow_hash_set, create_packets,
+ free_packets, NULL),
+ BENCH_INFO(bench_packet_ts, create_packets, free_packets, NULL),
+ BENCH_INFO(bench_packet_ts_set, create_packets, free_packets,
+ NULL),
+};
+
+/**
+ * ODP packet microbenchmark application
+ */
+int main(int argc, char *argv[])
+{
+ odph_odpthread_t worker_thread;
+ int cpu;
+ odp_shm_t shm;
+ odp_cpumask_t cpumask;
+ char cpumaskstr[ODP_CPUMASK_STR_SIZE];
+ odp_pool_capability_t capa;
+ odp_pool_param_t params;
+ odp_instance_t instance;
+ uint32_t pkt_num;
+ uint8_t ret;
+
+ /* Init ODP before calling anything else */
+ if (odp_init_global(&instance, NULL, NULL)) {
+ LOG_ERR("Error: ODP global init failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Init this thread */
+ if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
+ LOG_ERR("Error: ODP local init failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Reserve memory for args from shared mem */
+ shm = odp_shm_reserve("shm_args", sizeof(args_t),
+ ODP_CACHE_LINE_SIZE, 0);
+
+ if (shm == ODP_SHM_INVALID) {
+ LOG_ERR("Error: shared mem reserve failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ gbl_args = odp_shm_addr(shm);
+
+ if (gbl_args == NULL) {
+ LOG_ERR("Error: shared mem alloc failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ memset(gbl_args, 0, sizeof(args_t));
+
+ gbl_args->bench = test_suite;
+ gbl_args->num_bench = sizeof(test_suite) / sizeof(test_suite[0]);
+
+ /* Parse and store the application arguments */
+ parse_args(argc, argv, &gbl_args->appl);
+
+ /* Print both system and application information */
+ print_info(NO_PATH(argv[0]), &gbl_args->appl);
+
+ /* Get default worker cpumask */
+ if (odp_cpumask_default_worker(&cpumask, 1) != 1) {
+ LOG_ERR("Error: unable to allocate worker thread.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
+
+ /* Check pool capability */
+ if (odp_pool_capability(&capa)) {
+ LOG_ERR("Error: unable to query pool capability.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* At least 2 x TEST_REPEAT_COUNT packets required */
+ pkt_num = (gbl_args->appl.burst_size > 2) ?
+ gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
+ 2 * TEST_REPEAT_COUNT;
+
+ if (capa.pkt.max_num && capa.pkt.max_num < pkt_num) {
+ LOG_ERR("Error: packet pool size not supported.\n");
+ printf("MAX: %" PRIu32 "\n", capa.pkt.max_num);
+ exit(EXIT_FAILURE);
+ } else if (capa.pkt.max_len && capa.pkt.max_len < TEST_MAX_PKT_SIZE) {
+ LOG_ERR("Error: packet length not supported.\n");
+ exit(EXIT_FAILURE);
+ } else if (capa.pkt.max_seg_len &&
+ capa.pkt.max_seg_len < PKT_POOL_SEG_LEN) {
+ LOG_ERR("Error: segment length not supported.\n");
+ exit(EXIT_FAILURE);
+ } else if (capa.pkt.max_uarea_size &&
+ capa.pkt.max_uarea_size < PKT_POOL_UAREA_SIZE) {
+ LOG_ERR("Error: user area size not supported.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Create packet pool */
+ odp_pool_param_init(&params);
+ params.pkt.seg_len = PKT_POOL_SEG_LEN;
+ params.pkt.len = TEST_MAX_PKT_SIZE;
+ params.pkt.num = pkt_num;
+ params.pkt.uarea_size = PKT_POOL_UAREA_SIZE;
+ params.type = ODP_POOL_PACKET;
+
+ gbl_args->pool = odp_pool_create("packet pool", &params);
+
+ if (gbl_args->pool == ODP_POOL_INVALID) {
+ LOG_ERR("Error: packet pool create failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ printf("CPU: %i\n", odp_cpumask_first(&cpumask));
+ printf("CPU mask: %s\n", cpumaskstr);
+ printf("Burst size: %d\n", gbl_args->appl.burst_size);
+ printf("Bench repeat: %d\n", TEST_REPEAT_COUNT);
+
+ odp_pool_print(gbl_args->pool);
+
+ memset(&worker_thread, 0, sizeof(odph_odpthread_t));
+
+ odp_barrier_init(&barrier, 1 + 1);
+
+ signal(SIGINT, sig_handler);
+
+ /* Create worker threads */
+ cpu = odp_cpumask_first(&cpumask);
+
+ odp_cpumask_t thd_mask;
+ odph_odpthread_params_t thr_params;
+
+ memset(&thr_params, 0, sizeof(thr_params));
+ thr_params.start = run_benchmarks;
+ thr_params.arg = gbl_args;
+ thr_params.thr_type = ODP_THREAD_WORKER;
+ thr_params.instance = instance;
+
+ odp_cpumask_zero(&thd_mask);
+ odp_cpumask_set(&thd_mask, cpu);
+ odph_odpthreads_create(&worker_thread, &thd_mask,
+ &thr_params);
+
+ odph_odpthreads_join(&worker_thread);
+
+ ret = gbl_args->bench_failed;
+
+ if (odp_pool_destroy(gbl_args->pool)) {
+ LOG_ERR("Error: pool destroy\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_shm_free(shm)) {
+ LOG_ERR("Error: shm free\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_local()) {
+ LOG_ERR("Error: term local\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_global(instance)) {
+ LOG_ERR("Error: term global\n");
+ exit(EXIT_FAILURE);
+ }
+
+ return ret;
+}
diff --git a/test/common_plat/performance/odp_crypto.c b/test/common_plat/performance/odp_crypto.c
index 993628830..954bdb794 100644
--- a/test/common_plat/performance/odp_crypto.c
+++ b/test/common_plat/performance/odp_crypto.c
@@ -17,7 +17,7 @@
#include <sys/resource.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
#define app_err(fmt, ...) \
fprintf(stderr, "%s:%d:%s(): Error: " fmt, __FILE__, \
diff --git a/test/common_plat/performance/odp_l2fwd.c b/test/common_plat/performance/odp_l2fwd.c
index 82c3a251f..8f5c5e152 100644
--- a/test/common_plat/performance/odp_l2fwd.c
+++ b/test/common_plat/performance/odp_l2fwd.c
@@ -25,9 +25,7 @@
#include <test_debug.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
/** @def MAX_WORKERS
* @brief Maximum number of worker threads
@@ -243,15 +241,13 @@ static inline void fill_eth_addrs(odp_packet_t pkt_tbl[],
odp_packet_prefetch(pkt, 0, ODPH_ETHHDR_LEN);
- if (odp_packet_has_eth(pkt)) {
- eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ eth = odp_packet_data(pkt);
- if (gbl_args->appl.src_change)
- eth->src = gbl_args->port_eth_addr[dst_port];
+ if (gbl_args->appl.src_change)
+ eth->src = gbl_args->port_eth_addr[dst_port];
- if (gbl_args->appl.dst_change)
- eth->dst = gbl_args->dst_eth_addr[dst_port];
- }
+ if (gbl_args->appl.dst_change)
+ eth->dst = gbl_args->dst_eth_addr[dst_port];
}
}
@@ -605,6 +601,7 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
odp_pktio_op_mode_t mode_rx;
odp_pktio_op_mode_t mode_tx;
pktin_mode_t in_mode = gbl_args->appl.in_mode;
+ odp_pktio_info_t info;
odp_pktio_param_init(&pktio_param);
@@ -622,8 +619,13 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
return -1;
}
- printf("created pktio %" PRIu64 " (%s)\n",
- odp_pktio_to_u64(pktio), dev);
+ if (odp_pktio_info(pktio, &info)) {
+ LOG_ERR("Error: pktio info failed %s\n", dev);
+ return -1;
+ }
+
+ printf("created pktio %" PRIu64 ", dev: %s, drv: %s\n",
+ odp_pktio_to_u64(pktio), dev, info.drv_name);
if (odp_pktio_capability(pktio, &capa)) {
LOG_ERR("Error: capability query failed %s\n", dev);
diff --git a/test/common_plat/performance/odp_l2fwd_run.sh b/test/common_plat/performance/odp_l2fwd_run.sh
index 757cf5353..dd42ede97 100755
--- a/test/common_plat/performance/odp_l2fwd_run.sh
+++ b/test/common_plat/performance/odp_l2fwd_run.sh
@@ -66,12 +66,14 @@ run_l2fwd()
exit 1
fi
- #@todo: limit odp_generator to cores
- #https://bugs.linaro.org/show_bug.cgi?id=1398
+ # Max 4 workers
+ # @todo: ensure that generator and l2fwd workers are not allocated to
+ # the same CPUs
(odp_generator${EXEEXT} --interval $FLOOD_MODE -I $IF0 \
--srcip 192.168.0.1 --dstip 192.168.0.2 \
- -m u 2>&1 > /dev/null) \
+ -m u -w 4 2>&1 > /dev/null) \
2>&1 > /dev/null &
+
GEN_PID=$!
# this just turns off output buffering so that you still get periodic
@@ -82,6 +84,8 @@ run_l2fwd()
STDBUF=
fi
LOG=odp_l2fwd_tmp.log
+
+ # Max 2 workers
$STDBUF odp_l2fwd${EXEEXT} -i $IF1,$IF2 -m 0 -t 30 -c 2 | tee $LOG
ret=$?
diff --git a/test/common_plat/performance/odp_pktio_ordered.c b/test/common_plat/performance/odp_pktio_ordered.c
new file mode 100644
index 000000000..bff4586e5
--- /dev/null
+++ b/test/common_plat/performance/odp_pktio_ordered.c
@@ -0,0 +1,1342 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * @example odp_pktio_ordered.c ODP ordered pktio test application
+ */
+
+/** enable strtok */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include <test_debug.h>
+#include <dummy_crc.h>
+
+#include <odp_api.h>
+#include <odp/helper/threads.h>
+#include <odp/helper/eth.h>
+#include <odp/helper/ip.h>
+#include <odp/helper/udp.h>
+
+/** Jenkins hash support.
+ *
+ * Copyright (C) 2006 Bob Jenkins (bob_jenkins@burtleburtle.net)
+ *
+ * http://burtleburtle.net/bob/hash/
+ *
+ * These are the credits from Bob's sources:
+ *
+ * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
+ *
+ * These are functions for producing 32-bit hashes for hash table lookup.
+ * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
+ * are externally useful functions. Routines to test the hash are included
+ * if SELF_TEST is defined. You can use this free for any purpose. It's in
+ * the public domain. It has no warranty.
+ *
+ * $FreeBSD$
+ */
+#define rot(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
+
+#define mix(a, b, c) \
+{ \
+ a -= c; a ^= rot(c, 4); c += b; \
+ b -= a; b ^= rot(a, 6); a += c; \
+ c -= b; c ^= rot(b, 8); b += a; \
+ a -= c; a ^= rot(c, 16); c += b; \
+ b -= a; b ^= rot(a, 19); a += c; \
+ c -= b; c ^= rot(b, 4); b += a; \
+}
+
+#define final(a, b, c) \
+{ \
+ c ^= b; c -= rot(b, 14); \
+ a ^= c; a -= rot(c, 11); \
+ b ^= a; b -= rot(a, 25); \
+ c ^= b; c -= rot(b, 16); \
+ a ^= c; a -= rot(c, 4); \
+ b ^= a; b -= rot(a, 14); \
+ c ^= b; c -= rot(b, 24); \
+}
+
+#define JHASH_GOLDEN_RATIO 0x9e3779b9
+
+/** Maximum number of worker threads */
+#define MAX_WORKERS 64
+
+/** Number of packet buffers in the memory pool */
+#define PKT_POOL_SIZE 8192
+
+/** Buffer size of the packet pool buffer in bytes*/
+#define PKT_POOL_BUF_SIZE 1856
+
+/** Packet user area size in bytes */
+#define PKT_UAREA_SIZE 32
+
+/** Maximum number of packets in a burst */
+#define MAX_PKT_BURST 32
+
+/** Maximum number of pktio queues per interface */
+#define MAX_QUEUES 32
+
+/** Maximum number of pktio interfaces */
+#define MAX_PKTIOS 8
+
+/** Maximum number of packet flows */
+#define MAX_FLOWS 128
+
+ODP_STATIC_ASSERT(MAX_PKTIOS < MAX_FLOWS,
+ "MAX_FLOWS must be greater than MAX_PKTIOS\n");
+
+/** Minimum valid packet length */
+#define MIN_PACKET_LEN (ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN + ODPH_UDPHDR_LEN)
+
+/** Default number of input queues */
+#define DEF_NUM_RX_QUEUES 1
+
+/** Default number of flows */
+#define DEF_NUM_FLOWS 12
+
+/** Default number of extra processing rounds */
+#define DEF_EXTRA_ROUNDS 15
+
+/** Default statistics print interval in seconds */
+#define DEF_STATS_INT 1
+
+/** Get rid of path in filename - only for unix-type paths using '/' */
+#define NO_PATH(file_name) (strrchr((file_name), '/') ? \
+ strrchr((file_name), '/') + 1 : (file_name))
+
+/**
+ * Packet input mode
+ */
+typedef enum pktin_mode_t {
+ SCHED_ORDERED = 0,
+ SCHED_ATOMIC,
+ SCHED_PARALLEL
+} pktin_mode_t;
+
+/**
+ * Parsed command line application arguments
+ */
+typedef struct {
+ int cpu_count; /**< CPU count */
+ int if_count; /**< Number of interfaces to be used */
+ int addr_count; /**< Number of dst addresses to be used */
+ int num_rx_q; /**< Number of input queues per interface */
+ int num_flows; /**< Number of packet flows */
+ int extra_rounds; /**< Number of extra input processing rounds */
+ char **if_names; /**< Array of pointers to interface names */
+ odph_ethaddr_t addrs[MAX_PKTIOS]; /**< Array of dst addresses */
+ pktin_mode_t in_mode; /**< Packet input mode */
+ int time; /**< Time in seconds to run. */
+ int accuracy; /**< Statistics print interval */
+ char *if_str; /**< Storage for interface names */
+} appl_args_t;
+
+static int exit_threads; /**< Break workers loop if set to 1 */
+
+/**
+ * Queue context
+ */
+typedef struct {
+ odp_bool_t input_queue; /**< Input queue */
+ uint64_t idx; /**< Queue index */
+ uint64_t seq[MAX_FLOWS]; /**< Per flow sequence numbers */
+} qcontext_t;
+
+/**
+ * Flow info stored in the packet user area
+ */
+typedef struct {
+ uint64_t seq; /**< Sequence number */
+ uint32_t crc; /**< CRC hash */
+ uint16_t idx; /**< Flow index */
+ uint8_t src_idx; /**< Source port index */
+ uint8_t dst_idx; /**< Destination port index */
+
+} flow_t;
+ODP_STATIC_ASSERT(sizeof(flow_t) <= PKT_UAREA_SIZE,
+ "Flow data doesn't fit in the packet user area\n");
+
+/**
+ * Statistics
+ */
+typedef union {
+ struct {
+ /** Number of forwarded packets */
+ uint64_t packets;
+ /** Packets dropped due to a receive error */
+ uint64_t rx_drops;
+ /** Packets dropped due to a transmit error */
+ uint64_t tx_drops;
+ /** Packets with invalid sequence number */
+ uint64_t invalid_seq;
+ } s;
+
+ uint8_t padding[ODP_CACHE_LINE_SIZE];
+} stats_t ODP_ALIGNED_CACHE;
+
+/**
+ * IPv4 5-tuple
+ */
+typedef struct {
+ int32_t src_ip;
+ int32_t dst_ip;
+ int16_t src_port;
+ int16_t dst_port;
+ int8_t proto;
+ int8_t pad0;
+ int16_t pad1;
+} ipv4_tuple5_t;
+
+/**
+ * Packet headers
+ */
+typedef struct {
+ odph_ethhdr_t *eth;
+ odph_ipv4hdr_t *ipv4;
+ odph_udphdr_t *udp;
+} packet_hdr_t;
+
+/**
+ * Thread specific arguments
+ */
+typedef struct thread_args_t {
+ stats_t *stats; /**< Pointer to per thread statistics */
+} thread_args_t;
+
+/**
+ * Grouping of all global data
+ */
+typedef struct {
+ /** Per thread packet stats */
+ stats_t stats[MAX_WORKERS];
+ /** Application (parsed) arguments */
+ appl_args_t appl;
+ /** Thread specific arguments */
+ thread_args_t thread[MAX_WORKERS];
+ /** Table of port ethernet addresses */
+ odph_ethaddr_t port_eth_addr[MAX_PKTIOS];
+ /** Table of dst ethernet addresses */
+ odph_ethaddr_t dst_eth_addr[MAX_PKTIOS];
+ /** Table of dst ports */
+ int dst_port[MAX_PKTIOS];
+ /** Table of atomic queues for flows */
+ odp_queue_t fqueue[MAX_PKTIOS][MAX_FLOWS];
+ /** Table of flow queue contexts */
+ qcontext_t flow_qcontext[MAX_PKTIOS][MAX_FLOWS];
+ /** Table of input queue contexts */
+ qcontext_t input_qcontext[MAX_PKTIOS][MAX_QUEUES];
+ /** Table of pktio handles */
+ struct {
+ odp_pktio_t pktio;
+ odp_pktout_queue_t pktout[MAX_FLOWS];
+ odp_queue_t pktin[MAX_QUEUES];
+ int num_rx_queue;
+ int num_tx_queue;
+ } pktios[MAX_PKTIOS];
+} args_t;
+
+/** Global pointer to args */
+static args_t *gbl_args;
+
+/** Global barrier to synchronize main and workers */
+static odp_barrier_t barrier;
+
+/**
+ * Lookup the destination port for a given packet
+ *
+ * @param pkt ODP packet handle
+ */
+static inline int lookup_dest_port(odp_packet_t pkt)
+{
+ int i, src_idx;
+ odp_pktio_t pktio_src;
+
+ pktio_src = odp_packet_input(pkt);
+
+ for (src_idx = -1, i = 0; gbl_args->pktios[i].pktio
+ != ODP_PKTIO_INVALID; i++)
+ if (gbl_args->pktios[i].pktio == pktio_src)
+ src_idx = i;
+
+ if (src_idx == -1)
+ LOG_ABORT("Failed to determine pktio input\n");
+
+ return gbl_args->dst_port[src_idx];
+}
+
+/**
+ * Map required packet headers
+ *
+ * @param pkt Packet handle
+ * @param hdr[out] Packet headers
+ *
+ * @retval 0 on success
+ * @retval -1 on failure
+ */
+static inline int packet_hdr(odp_packet_t pkt, packet_hdr_t *hdr)
+{
+ uint8_t *udp;
+ uint16_t eth_type;
+ uint8_t ihl;
+
+ if (odp_unlikely(odp_packet_seg_len(pkt) < MIN_PACKET_LEN))
+ return -1;
+
+ if (odp_unlikely(!odp_packet_has_eth(pkt)))
+ return -1;
+
+ hdr->eth = odp_packet_l2_ptr(pkt, NULL);
+ eth_type = odp_be_to_cpu_16(hdr->eth->type);
+ if (odp_unlikely(eth_type != ODPH_ETHTYPE_IPV4))
+ return -1;
+
+ hdr->ipv4 = (odph_ipv4hdr_t *)(hdr->eth + 1);
+ if (odp_unlikely(hdr->ipv4->proto != ODPH_IPPROTO_UDP))
+ return -1;
+
+ ihl = ODPH_IPV4HDR_IHL(hdr->ipv4->ver_ihl);
+ if (odp_unlikely(ihl < ODPH_IPV4HDR_IHL_MIN))
+ return -1;
+
+ udp = (uint8_t *)hdr->ipv4 + (ihl * 4);
+
+ hdr->udp = (odph_udphdr_t *)udp;
+
+ return 0;
+}
+
+/**
+ * Compute hash from a 5-tuple
+ *
+ * @param key IPv4 5-tuple
+ *
+ * @return 32-bit hash value
+ */
+static inline uint64_t calc_ipv4_5tuple_hash(ipv4_tuple5_t *tuple)
+{
+ uint32_t a, b, c;
+
+ a = tuple->proto + JHASH_GOLDEN_RATIO;
+ b = tuple->src_ip + JHASH_GOLDEN_RATIO;
+ c = tuple->dst_ip + JHASH_GOLDEN_RATIO;
+
+ mix(a, b, c);
+
+ a += (tuple->src_port << 16) + tuple->dst_port + JHASH_GOLDEN_RATIO;
+ final(a, b, c);
+
+ return c;
+}
+
+/**
+ * Compute packet flow index
+ *
+ * @param hdr Packet headers
+ *
+ * @return Flow index
+ */
+static inline uint64_t calc_flow_idx(packet_hdr_t *hdr)
+{
+ ipv4_tuple5_t tuple;
+ uint64_t idx;
+
+ tuple.dst_ip = odp_be_to_cpu_32(hdr->ipv4->dst_addr);
+ tuple.src_ip = odp_be_to_cpu_32(hdr->ipv4->src_addr);
+ tuple.proto = hdr->ipv4->proto;
+ tuple.src_port = odp_be_to_cpu_16(hdr->udp->src_port);
+ tuple.dst_port = odp_be_to_cpu_16(hdr->udp->dst_port);
+ tuple.pad0 = 0;
+ tuple.pad1 = 0;
+ idx = calc_ipv4_5tuple_hash(&tuple);
+
+ return idx % gbl_args->appl.num_flows;
+}
+
+/**
+ * Fill packet's eth addresses according to the destination port
+ *
+ * @param hdr[out] Packet headers
+ * @param dst_port Destination port
+ */
+static inline void fill_eth_addrs(packet_hdr_t *hdr, int dst_port)
+{
+ hdr->eth->src = gbl_args->port_eth_addr[dst_port];
+ hdr->eth->dst = gbl_args->dst_eth_addr[dst_port];
+}
+
+/**
+ * Process flow queue
+ *
+ * @param ev_tbl Array of events
+ * @param num Number of events in the array
+ * @param stats Pointer for storing thread statistics
+ * @param qcontext Source queue context
+ * @param pktout Arrays of output queues
+ */
+static inline void process_flow(odp_event_t ev_tbl[], int num, stats_t *stats,
+ qcontext_t *qcontext,
+ odp_pktout_queue_t pktout[][MAX_FLOWS])
+{
+ odp_packet_t pkt;
+ flow_t *flow;
+ uint64_t queue_seq;
+ int dst_if;
+ int i;
+ int sent;
+
+ for (i = 0; i < num; i++) {
+ pkt = odp_packet_from_event(ev_tbl[i]);
+
+ flow = odp_packet_user_area(pkt);
+
+ queue_seq = qcontext->seq[flow->src_idx];
+
+ /* Check sequence number */
+ if (gbl_args->appl.in_mode != SCHED_PARALLEL &&
+ odp_unlikely(flow->seq != queue_seq)) {
+ printf("Invalid sequence number: packet_seq=%" PRIu64 ""
+ " queue_seq=%" PRIu64 ", src_if=%" PRIu8 ", "
+ "dst_if=%" PRIu8 ", flow=%" PRIu16 "\n",
+ flow->seq, queue_seq, flow->src_idx,
+ flow->dst_idx, flow->idx);
+ qcontext->seq[flow->src_idx] = flow->seq + 1;
+ stats->s.invalid_seq++;
+ } else {
+ qcontext->seq[flow->src_idx]++;
+ }
+
+ dst_if = flow->dst_idx;
+ sent = odp_pktout_send(pktout[dst_if][flow->idx], &pkt, 1);
+
+ if (odp_unlikely(sent != 1)) {
+ stats->s.tx_drops++;
+ odp_packet_free(pkt);
+ }
+ stats->s.packets++;
+ }
+}
+
+/**
+ * Process input queue
+ *
+ * @param ev_tbl Array of events
+ * @param num Number of events in the array
+ * @param stats Pointer for storing thread statistics
+ * @param qcontext Source queue context
+ */
+static inline void process_input(odp_event_t ev_tbl[], int num, stats_t *stats,
+ qcontext_t *qcontext)
+{
+ flow_t *flow;
+ flow_t *flow_tbl[MAX_PKT_BURST];
+ int ret;
+ int i, j;
+ int pkts = 0;
+
+ for (i = 0; i < num; i++) {
+ odp_packet_t pkt;
+ packet_hdr_t hdr;
+ int flow_idx;
+
+ pkt = odp_packet_from_event(ev_tbl[i]);
+
+ odp_packet_prefetch(pkt, 0, MIN_PACKET_LEN);
+
+ ret = packet_hdr(pkt, &hdr);
+ if (odp_unlikely(ret)) {
+ odp_packet_free(pkt);
+ stats->s.rx_drops++;
+ continue;
+ }
+
+ flow_idx = calc_flow_idx(&hdr);
+
+ fill_eth_addrs(&hdr, flow_idx);
+
+ flow = odp_packet_user_area(pkt);
+ flow->idx = flow_idx;
+ flow->src_idx = qcontext->idx;
+ flow->dst_idx = lookup_dest_port(pkt);
+ flow_tbl[pkts] = flow;
+
+ /* Simulate "fat pipe" processing by generating extra work */
+ for (j = 0; j < gbl_args->appl.extra_rounds; j++)
+ flow->crc = dummy_hash_crc32c(odp_packet_data(pkt),
+ odp_packet_len(pkt), 0);
+ pkts++;
+ }
+
+ if (odp_unlikely(!pkts))
+ return;
+
+ /* Set sequence numbers */
+ if (gbl_args->appl.in_mode == SCHED_ORDERED)
+ odp_schedule_order_lock(0);
+
+ for (i = 0; i < pkts; i++) {
+ flow = flow_tbl[i];
+ flow->seq = qcontext->seq[flow->idx]++;
+ }
+
+ if (gbl_args->appl.in_mode == SCHED_ORDERED)
+ odp_schedule_order_unlock(0);
+
+ for (i = 0; i < pkts; i++) {
+ flow = flow_tbl[i];
+ ret = odp_queue_enq(gbl_args->fqueue[flow->dst_idx][flow->idx],
+ ev_tbl[i]);
+
+ if (odp_unlikely(ret != 0)) {
+ LOG_ERR("odp_queue_enq() failed\n");
+ stats->s.tx_drops++;
+ odp_event_free(ev_tbl[i]);
+ } else {
+ stats->s.packets++;
+ }
+ }
+}
+
+/**
+ * Worker thread
+ *
+ * @param arg Thread arguments of type 'thread_args_t *'
+ */
+static int run_worker(void *arg)
+{
+ odp_event_t ev_tbl[MAX_PKT_BURST];
+ odp_queue_t queue;
+ odp_pktout_queue_t pktout[MAX_PKTIOS][MAX_FLOWS];
+ qcontext_t *qcontext;
+ thread_args_t *thr_args = arg;
+ stats_t *stats = thr_args->stats;
+ int pkts;
+ int i, j;
+
+ memset(pktout, 0, sizeof(pktout));
+
+ for (i = 0; i < gbl_args->appl.if_count; i++) {
+ for (j = 0; j < gbl_args->appl.num_flows; j++) {
+ pktout[i][j] = gbl_args->pktios[i].pktout[j %
+ gbl_args->pktios[i].num_tx_queue];
+ }
+ }
+ odp_barrier_wait(&barrier);
+
+ /* Loop packets */
+ while (!exit_threads) {
+ pkts = odp_schedule_multi(&queue, ODP_SCHED_NO_WAIT, ev_tbl,
+ MAX_PKT_BURST);
+ if (pkts <= 0)
+ continue;
+
+ qcontext = odp_queue_context(queue);
+
+ if (qcontext->input_queue)
+ process_input(ev_tbl, pkts, stats, qcontext);
+ else
+ process_flow(ev_tbl, pkts, stats, qcontext, pktout);
+ }
+
+ /* Free remaining events in queues */
+ while (1) {
+ odp_event_t ev;
+
+ ev = odp_schedule(NULL,
+ odp_schedule_wait_time(ODP_TIME_SEC_IN_NS));
+
+ if (ev == ODP_EVENT_INVALID)
+ break;
+
+ odp_event_free(ev);
+ }
+
+ return 0;
+}
+
+/**
+ * Create a pktio handle and associate with input queues
+ *
+ * @param dev Name of device to open
+ * @param index Pktio index
+ * @param num_rx Number of input queues
+ * @param num_tx Number of output queues
+ * @param pool Pool to associate with device for packet RX/TX
+ *
+ * @retval 0 on success
+ * @retval -1 on failure
+ */
+static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
+ odp_pool_t pool)
+{
+ odp_pktio_t pktio;
+ odp_pktio_param_t pktio_param;
+ odp_pktio_capability_t capa;
+ odp_pktin_queue_param_t pktin_param;
+ odp_pktout_queue_param_t pktout_param;
+ odp_pktio_op_mode_t mode_rx;
+ odp_pktio_op_mode_t mode_tx;
+ int i;
+
+ odp_pktio_param_init(&pktio_param);
+
+ pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+ pktio = odp_pktio_open(dev, pool, &pktio_param);
+ if (pktio == ODP_PKTIO_INVALID) {
+ LOG_ERR("Error: failed to open %s\n", dev);
+ return -1;
+ }
+
+ printf("Created pktio %" PRIu64 " (%s)\n",
+ odp_pktio_to_u64(pktio), dev);
+
+ if (odp_pktio_capability(pktio, &capa)) {
+ LOG_ERR("Error: capability query failed %s\n", dev);
+ odp_pktio_close(pktio);
+ return -1;
+ }
+
+ odp_pktin_queue_param_init(&pktin_param);
+ odp_pktout_queue_param_init(&pktout_param);
+
+ mode_tx = ODP_PKTIO_OP_MT;
+ mode_rx = ODP_PKTIO_OP_MT;
+
+ if (gbl_args->appl.in_mode == SCHED_ATOMIC) {
+ pktin_param.queue_param.sched.sync = ODP_SCHED_SYNC_ATOMIC;
+ } else if (gbl_args->appl.in_mode == SCHED_PARALLEL) {
+ pktin_param.queue_param.sched.sync = ODP_SCHED_SYNC_PARALLEL;
+ } else {
+ pktin_param.queue_param.sched.sync = ODP_SCHED_SYNC_ORDERED;
+ pktin_param.queue_param.sched.lock_count = 1;
+ }
+ pktin_param.queue_param.sched.prio = ODP_SCHED_PRIO_DEFAULT;
+ pktin_param.queue_param.sched.group = ODP_SCHED_GROUP_ALL;
+
+ if (num_rx > (int)capa.max_input_queues) {
+ printf("Allocating %i shared input queues, %i requested\n",
+ capa.max_input_queues, num_rx);
+ num_rx = capa.max_input_queues;
+ mode_rx = ODP_PKTIO_OP_MT;
+ }
+
+ if (num_tx > (int)capa.max_output_queues) {
+ printf("Allocating %i shared output queues, %i requested\n",
+ capa.max_output_queues, num_tx);
+ num_tx = capa.max_output_queues;
+ mode_tx = ODP_PKTIO_OP_MT;
+ }
+
+ pktin_param.hash_enable = 1;
+ pktin_param.hash_proto.proto.ipv4_udp = 1;
+ pktin_param.num_queues = num_rx;
+ pktin_param.op_mode = mode_rx;
+
+ pktout_param.op_mode = mode_tx;
+ pktout_param.num_queues = num_tx;
+
+ if (odp_pktin_queue_config(pktio, &pktin_param)) {
+ LOG_ERR("Error: input queue config failed %s\n", dev);
+ return -1;
+ }
+
+ if (odp_pktout_queue_config(pktio, &pktout_param)) {
+ LOG_ERR("Error: output queue config failed %s\n", dev);
+ return -1;
+ }
+
+ if (odp_pktin_event_queue(pktio, gbl_args->pktios[idx].pktin,
+ num_rx) != num_rx) {
+ LOG_ERR("Error: pktin event queue query failed %s\n",
+ dev);
+ return -1;
+ }
+
+ /* Set queue contexts */
+ for (i = 0; i < num_rx; i++) {
+ gbl_args->input_qcontext[idx][i].idx = idx;
+ gbl_args->input_qcontext[idx][i].input_queue = 1;
+
+ if (odp_queue_context_set(gbl_args->pktios[idx].pktin[i],
+ &gbl_args->input_qcontext[idx][i],
+ sizeof(qcontext_t))) {
+ LOG_ERR("Error: pktin queue context set failed %s\n",
+ dev);
+ return -1;
+ }
+ }
+
+ if (odp_pktout_queue(pktio,
+ gbl_args->pktios[idx].pktout,
+ num_tx) != num_tx) {
+ LOG_ERR("Error: pktout queue query failed %s\n", dev);
+ return -1;
+ }
+
+ printf("Created %i input and %i output queues on (%s)\n",
+ num_rx, num_tx, dev);
+
+ gbl_args->pktios[idx].num_rx_queue = num_rx;
+ gbl_args->pktios[idx].num_tx_queue = num_tx;
+ gbl_args->pktios[idx].pktio = pktio;
+
+ return 0;
+}
+
+/**
+ * Print statistics
+ *
+ * @param num_workers Number of worker threads
+ * @param thr_stats Pointer to stats storage
+ * @param duration Number of seconds to loop in
+ * @param timeout Number of seconds for stats calculation
+ *
+ */
+static int print_speed_stats(int num_workers, stats_t *thr_stats,
+ int duration, int timeout)
+{
+ uint64_t pkts = 0;
+ uint64_t pkts_prev = 0;
+ uint64_t pps;
+ uint64_t rx_drops, tx_drops, invalid_seq;
+ uint64_t maximum_pps = 0;
+ int i;
+ int elapsed = 0;
+ int stats_enabled = 1;
+ int loop_forever = (duration == 0);
+
+ if (timeout <= 0) {
+ stats_enabled = 0;
+ timeout = 1;
+ }
+ /* Wait for all threads to be ready*/
+ odp_barrier_wait(&barrier);
+
+ do {
+ pkts = 0;
+ rx_drops = 0;
+ tx_drops = 0;
+ invalid_seq = 0;
+
+ sleep(timeout);
+
+ for (i = 0; i < num_workers; i++) {
+ pkts += thr_stats[i].s.packets;
+ rx_drops += thr_stats[i].s.rx_drops;
+ tx_drops += thr_stats[i].s.tx_drops;
+ invalid_seq += thr_stats[i].s.invalid_seq;
+ }
+ if (stats_enabled) {
+ pps = (pkts - pkts_prev) / timeout;
+ if (pps > maximum_pps)
+ maximum_pps = pps;
+ printf("%" PRIu64 " pps, %" PRIu64 " max pps, ", pps,
+ maximum_pps);
+
+ printf("%" PRIu64 " rx drops, %" PRIu64 " tx drops, ",
+ rx_drops, tx_drops);
+
+ printf("%" PRIu64 " invalid seq\n", invalid_seq);
+
+ pkts_prev = pkts;
+ }
+ elapsed += timeout;
+ } while (loop_forever || (elapsed < duration));
+
+ if (stats_enabled)
+ printf("TEST RESULT: %" PRIu64 " maximum packets per second.\n",
+ maximum_pps);
+
+ return (pkts > 100 && !invalid_seq) ? 0 : -1;
+}
+
+/**
+ * Find the destination port for a given input port
+ *
+ * @param port Input port index
+ */
+static int find_dest_port(int port)
+{
+ /* Even number of ports */
+ if (gbl_args->appl.if_count % 2 == 0)
+ return (port % 2 == 0) ? port + 1 : port - 1;
+
+ /* Odd number of ports */
+ if (port == gbl_args->appl.if_count - 1)
+ return 0;
+ else
+ return port + 1;
+}
+
+/**
+ * Initialize port forwarding table
+ */
+static void init_forwarding_tbl(void)
+{
+ int rx_idx;
+
+ for (rx_idx = 0; rx_idx < gbl_args->appl.if_count; rx_idx++)
+ gbl_args->dst_port[rx_idx] = find_dest_port(rx_idx);
+}
+
+/**
+ * Prinf usage information
+ */
+static void usage(char *progname)
+{
+ printf("\n"
+ "OpenDataPlane ordered pktio application.\n"
+ "\n"
+ "Usage: %s OPTIONS\n"
+ " E.g. %s -i eth0,eth1\n"
+ " In the above example,\n"
+ " eth0 will send pkts to eth1 and vice versa\n"
+ "\n"
+ "Mandatory OPTIONS:\n"
+ " -i, --interface Eth interfaces (comma-separated, no spaces)\n"
+ " Interface count min 1, max %i\n"
+ "\n"
+ "Optional OPTIONS:\n"
+ " -m, --mode Packet input mode\n"
+ " 0: Scheduled ordered queues (default)\n"
+ " 1: Scheduled atomic queues\n"
+ " 2: Scheduled parallel queues (packet order not maintained)\n"
+ " -r, --num_rx_q Number of RX queues per interface\n"
+ " -f, --num_flows Number of packet flows\n"
+ " -e, --extra_input <number> Number of extra input processing rounds\n"
+ " -c, --count <number> CPU count.\n"
+ " -t, --time <number> Time in seconds to run.\n"
+ " -a, --accuracy <number> Statistics print interval in seconds\n"
+ " (default is 1 second).\n"
+ " -d, --dst_addr Destination addresses (comma-separated, no spaces)\n"
+ " -h, --help Display help and exit.\n\n"
+ "\n", NO_PATH(progname), NO_PATH(progname), MAX_PKTIOS
+ );
+}
+
+/**
+ * Parse and store the command line arguments
+ *
+ * @param argc argument count
+ * @param argv[] argument vector
+ * @param appl_args Store application arguments here
+ */
+static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
+{
+ int opt;
+ int long_index;
+ char *token;
+ char *addr_str;
+ size_t len;
+ int i;
+ static const struct option longopts[] = {
+ {"count", required_argument, NULL, 'c'},
+ {"time", required_argument, NULL, 't'},
+ {"accuracy", required_argument, NULL, 'a'},
+ {"interface", required_argument, NULL, 'i'},
+ {"mode", required_argument, NULL, 'm'},
+ {"dst_addr", required_argument, NULL, 'd'},
+ {"num_rx_q", required_argument, NULL, 'r'},
+ {"num_flows", required_argument, NULL, 'f'},
+ {"extra_input", required_argument, NULL, 'e'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+ };
+
+ static const char *shortopts = "+c:+t:+a:i:m:d:r:f:e:h";
+
+ /* let helper collect its own arguments (e.g. --odph_proc) */
+ odph_parse_options(argc, argv, shortopts, longopts);
+
+ appl_args->time = 0; /* loop forever if time to run is 0 */
+ appl_args->accuracy = DEF_STATS_INT;
+ appl_args->num_rx_q = DEF_NUM_RX_QUEUES;
+ appl_args->num_flows = DEF_NUM_FLOWS;
+ appl_args->extra_rounds = DEF_EXTRA_ROUNDS;
+
+ opterr = 0; /* do not issue errors on helper options */
+
+ while (1) {
+ opt = getopt_long(argc, argv, shortopts, longopts, &long_index);
+
+ if (opt == -1)
+ break; /* No more options */
+
+ switch (opt) {
+ case 'c':
+ appl_args->cpu_count = atoi(optarg);
+ break;
+ case 't':
+ appl_args->time = atoi(optarg);
+ break;
+ case 'a':
+ appl_args->accuracy = atoi(optarg);
+ break;
+ /* parse packet-io interface names */
+ case 'd':
+ len = strlen(optarg);
+ if (len == 0) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ len += 1; /* add room for '\0' */
+
+ addr_str = malloc(len);
+ if (addr_str == NULL) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ /* store the mac addresses names */
+ strcpy(addr_str, optarg);
+ for (token = strtok(addr_str, ","), i = 0;
+ token != NULL; token = strtok(NULL, ","), i++) {
+ if (i >= MAX_PKTIOS) {
+ printf("too many MAC addresses\n");
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ if (odph_eth_addr_parse(&appl_args->addrs[i],
+ token) != 0) {
+ printf("invalid MAC address\n");
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ appl_args->addr_count = i;
+ if (appl_args->addr_count < 1) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ free(addr_str);
+ break;
+ case 'i':
+ len = strlen(optarg);
+ if (len == 0) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ len += 1; /* add room for '\0' */
+
+ appl_args->if_str = malloc(len);
+ if (appl_args->if_str == NULL) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ /* count the number of tokens separated by ',' */
+ strcpy(appl_args->if_str, optarg);
+ for (token = strtok(appl_args->if_str, ","), i = 0;
+ token != NULL;
+ token = strtok(NULL, ","), i++)
+ ;
+
+ appl_args->if_count = i;
+
+ if (appl_args->if_count < 1 ||
+ appl_args->if_count > MAX_PKTIOS) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ /* allocate storage for the if names */
+ appl_args->if_names =
+ calloc(appl_args->if_count, sizeof(char *));
+
+ /* store the if names (reset names string) */
+ strcpy(appl_args->if_str, optarg);
+ for (token = strtok(appl_args->if_str, ","), i = 0;
+ token != NULL; token = strtok(NULL, ","), i++) {
+ appl_args->if_names[i] = token;
+ }
+ break;
+ case 'm':
+ i = atoi(optarg);
+ if (i == 1)
+ appl_args->in_mode = SCHED_ATOMIC;
+ else if (i == 2)
+ appl_args->in_mode = SCHED_PARALLEL;
+ else
+ appl_args->in_mode = SCHED_ORDERED;
+ break;
+ case 'r':
+ appl_args->num_rx_q = atoi(optarg);
+ break;
+ case 'f':
+ appl_args->num_flows = atoi(optarg);
+ break;
+ case 'e':
+ appl_args->extra_rounds = atoi(optarg);
+ break;
+ case 'h':
+ usage(argv[0]);
+ exit(EXIT_SUCCESS);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (appl_args->cpu_count > MAX_WORKERS) {
+ printf("Too many workers requested %d, max: %d\n",
+ appl_args->cpu_count, MAX_WORKERS);
+ exit(EXIT_FAILURE);
+ }
+
+ if (appl_args->num_flows > MAX_FLOWS) {
+ printf("Too many flows requested %d, max: %d\n",
+ appl_args->num_flows, MAX_FLOWS);
+ exit(EXIT_FAILURE);
+ }
+
+ if (appl_args->if_count == 0 || appl_args->num_flows == 0 ||
+ appl_args->num_rx_q == 0) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ if (appl_args->addr_count != 0 &&
+ appl_args->addr_count != appl_args->if_count) {
+ printf("Number of destination addresses differs from number"
+ " of interfaces\n");
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ optind = 1; /* reset 'extern optind' from the getopt lib */
+}
+
+/**
+ * Print system and application info
+ */
+static void print_info(char *progname, appl_args_t *appl_args)
+{
+ int i;
+
+ printf("\n"
+ "ODP system info\n"
+ "---------------\n"
+ "ODP API version: %s\n"
+ "ODP impl name: %s\n"
+ "CPU model: %s\n"
+ "CPU freq (hz): %" PRIu64 "\n"
+ "Cache line size: %i\n"
+ "CPU count: %i\n"
+ "\n",
+ odp_version_api_str(), odp_version_impl_name(),
+ odp_cpu_model_str(), odp_cpu_hz_max(),
+ odp_sys_cache_line_size(), odp_cpu_count());
+
+ printf("Running ODP appl: \"%s\"\n"
+ "-----------------\n"
+ "IF-count: %i\n"
+ "Using IFs: ",
+ progname, appl_args->if_count);
+ for (i = 0; i < appl_args->if_count; ++i)
+ printf(" %s", appl_args->if_names[i]);
+ printf("\n\n");
+ fflush(NULL);
+}
+
+static void gbl_args_init(args_t *args)
+{
+ int pktio, queue;
+
+ memset(args, 0, sizeof(args_t));
+
+ for (pktio = 0; pktio < MAX_PKTIOS; pktio++) {
+ args->pktios[pktio].pktio = ODP_PKTIO_INVALID;
+
+ for (queue = 0; queue < MAX_QUEUES; queue++)
+ args->pktios[pktio].pktin[queue] = ODP_QUEUE_INVALID;
+ }
+}
+
+/**
+ * ODP ordered pktio application
+ */
+int main(int argc, char *argv[])
+{
+ odp_cpumask_t cpumask;
+ odp_instance_t instance;
+ odp_pool_t pool;
+ odp_pool_param_t params;
+ odp_shm_t shm;
+ odp_queue_capability_t capa;
+ odph_ethaddr_t new_addr;
+ odph_odpthread_t thread_tbl[MAX_WORKERS];
+ stats_t *stats;
+ char cpumaskstr[ODP_CPUMASK_STR_SIZE];
+ int cpu;
+ int i, j;
+ int if_count;
+ int ret;
+ int num_workers;
+ int in_mode;
+
+ /* Init ODP before calling anything else */
+ if (odp_init_global(&instance, NULL, NULL)) {
+ LOG_ERR("Error: ODP global init failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Init this thread */
+ if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
+ LOG_ERR("Error: ODP local init failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* Reserve memory for args from shared mem */
+ shm = odp_shm_reserve("shm_args", sizeof(args_t),
+ ODP_CACHE_LINE_SIZE, 0);
+
+ if (shm == ODP_SHM_INVALID) {
+ LOG_ERR("Error: shared mem reserve failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ gbl_args = odp_shm_addr(shm);
+
+ if (gbl_args == NULL) {
+ LOG_ERR("Error: shared mem alloc failed.\n");
+ odp_shm_free(shm);
+ exit(EXIT_FAILURE);
+ }
+ gbl_args_init(gbl_args);
+
+ /* Parse and store the application arguments */
+ parse_args(argc, argv, &gbl_args->appl);
+
+ if (gbl_args->appl.in_mode == SCHED_ORDERED) {
+ /* At least one ordered lock required */
+ odp_queue_capability(&capa);
+ if (capa.max_ordered_locks < 1) {
+ LOG_ERR("Error: Ordered locks not available.\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+ /* Print both system and application information */
+ print_info(NO_PATH(argv[0]), &gbl_args->appl);
+
+ /* Default to system CPU count unless user specified */
+ num_workers = MAX_WORKERS;
+ if (gbl_args->appl.cpu_count)
+ num_workers = gbl_args->appl.cpu_count;
+
+ /* Get default worker cpumask */
+ num_workers = odp_cpumask_default_worker(&cpumask, num_workers);
+ (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
+
+ if_count = gbl_args->appl.if_count;
+
+ printf("Num worker threads: %i\n", num_workers);
+ printf("First CPU: %i\n", odp_cpumask_first(&cpumask));
+ printf("CPU mask: %s\n\n", cpumaskstr);
+
+ /* Create packet pool */
+ odp_pool_param_init(&params);
+ params.pkt.seg_len = PKT_POOL_BUF_SIZE;
+ params.pkt.len = PKT_POOL_BUF_SIZE;
+ params.pkt.num = PKT_POOL_SIZE;
+ params.pkt.uarea_size = PKT_UAREA_SIZE;
+ params.type = ODP_POOL_PACKET;
+
+ pool = odp_pool_create("packet pool", &params);
+
+ if (pool == ODP_POOL_INVALID) {
+ LOG_ERR("Error: packet pool create failed.\n");
+ exit(EXIT_FAILURE);
+ }
+ odp_pool_print(pool);
+
+ init_forwarding_tbl();
+
+ for (i = 0; i < if_count; ++i) {
+ const char *dev = gbl_args->appl.if_names[i];
+ int num_rx, num_tx;
+
+ num_rx = gbl_args->appl.num_rx_q;
+ num_tx = gbl_args->appl.num_flows;
+
+ if (create_pktio(dev, i, num_rx, num_tx, pool))
+ exit(EXIT_FAILURE);
+
+ /* Save interface ethernet address */
+ if (odp_pktio_mac_addr(gbl_args->pktios[i].pktio,
+ gbl_args->port_eth_addr[i].addr,
+ ODPH_ETHADDR_LEN) != ODPH_ETHADDR_LEN) {
+ LOG_ERR("Error: interface ethernet address unknown\n");
+ exit(EXIT_FAILURE);
+ }
+
+ odp_pktio_print(gbl_args->pktios[i].pktio);
+
+ /* Save destination eth address */
+ /* 02:00:00:00:00:XX */
+ memset(&new_addr, 0, sizeof(odph_ethaddr_t));
+ if (gbl_args->appl.addr_count) {
+ memcpy(&new_addr, &gbl_args->appl.addrs[i],
+ sizeof(odph_ethaddr_t));
+ } else {
+ new_addr.addr[0] = 0x02;
+ new_addr.addr[5] = i;
+ }
+ gbl_args->dst_eth_addr[i] = new_addr;
+ }
+
+ gbl_args->pktios[i].pktio = ODP_PKTIO_INVALID;
+
+ /* Allocate the same number of flows to each interface */
+ for (i = 0; i < if_count; i++) {
+ odp_pktio_capability_t capa;
+
+ if (odp_pktio_capability(gbl_args->pktios[i].pktio, &capa)) {
+ LOG_ERR("Error: pktio capability failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if ((unsigned)gbl_args->appl.num_flows > capa.max_output_queues)
+ gbl_args->appl.num_flows = capa.max_output_queues;
+ }
+
+ /* Create atomic queues for packet tagging */
+ for (i = 0; i < if_count; i++) {
+ for (j = 0; j < gbl_args->appl.num_flows; j++) {
+ odp_queue_t queue;
+ odp_queue_param_t qparam;
+ char qname[ODP_QUEUE_NAME_LEN];
+
+ snprintf(qname, sizeof(qname), "flow_%d_%d", i, j);
+
+ odp_queue_param_init(&qparam);
+ qparam.type = ODP_QUEUE_TYPE_SCHED;
+ qparam.sched.prio = ODP_SCHED_PRIO_DEFAULT;
+ qparam.sched.sync = ODP_SCHED_SYNC_ATOMIC;
+ qparam.sched.group = ODP_SCHED_GROUP_ALL;
+
+ gbl_args->flow_qcontext[i][j].idx = i;
+ gbl_args->flow_qcontext[i][j].input_queue = 0;
+ qparam.context = &gbl_args->flow_qcontext[i][j];
+ qparam.context_len = sizeof(qcontext_t);
+
+ queue = odp_queue_create(qname, &qparam);
+ if (queue == ODP_QUEUE_INVALID) {
+ LOG_ERR("Error: flow queue create failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ gbl_args->fqueue[i][j] = queue;
+ }
+ }
+
+ in_mode = gbl_args->appl.in_mode;
+ printf("\nApplication parameters\n"
+ "----------------------\n"
+ "Input queues: %d\n"
+ "Mode: %s\n"
+ "Flows: %d\n"
+ "Extra rounds: %d\n\n", gbl_args->appl.num_rx_q,
+ (in_mode == SCHED_ATOMIC) ? "PKTIN_SCHED_ATOMIC" :
+ (in_mode == SCHED_PARALLEL ? "PKTIN_SCHED_PARALLEL" :
+ "PKTIN_SCHED_ORDERED"), gbl_args->appl.num_flows,
+ gbl_args->appl.extra_rounds);
+
+ memset(thread_tbl, 0, sizeof(thread_tbl));
+
+ stats = gbl_args->stats;
+
+ odp_barrier_init(&barrier, num_workers + 1);
+
+ /* Create worker threads */
+ cpu = odp_cpumask_first(&cpumask);
+ for (i = 0; i < num_workers; ++i) {
+ odp_cpumask_t thd_mask;
+ odph_odpthread_params_t thr_params;
+
+ memset(&thr_params, 0, sizeof(thr_params));
+ thr_params.start = run_worker;
+ thr_params.arg = &gbl_args->thread[i];
+ thr_params.thr_type = ODP_THREAD_WORKER;
+ thr_params.instance = instance;
+
+ gbl_args->thread[i].stats = &stats[i];
+
+ odp_cpumask_zero(&thd_mask);
+ odp_cpumask_set(&thd_mask, cpu);
+ odph_odpthreads_create(&thread_tbl[i], &thd_mask,
+ &thr_params);
+ cpu = odp_cpumask_next(&cpumask, cpu);
+ }
+
+ /* Start packet receive and transmit */
+ for (i = 0; i < if_count; ++i) {
+ odp_pktio_t pktio;
+
+ pktio = gbl_args->pktios[i].pktio;
+ ret = odp_pktio_start(pktio);
+ if (ret) {
+ LOG_ERR("Error: unable to start %s\n",
+ gbl_args->appl.if_names[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ ret = print_speed_stats(num_workers, stats, gbl_args->appl.time,
+ gbl_args->appl.accuracy);
+
+ /* Stop receiving new packet */
+ for (i = 0; i < if_count; i++)
+ odp_pktio_stop(gbl_args->pktios[i].pktio);
+
+ exit_threads = 1;
+
+ /* Master thread waits for other threads to exit */
+ for (i = 0; i < num_workers; ++i)
+ odph_odpthreads_join(&thread_tbl[i]);
+
+ for (i = 0; i < if_count; i++) {
+ odp_pktio_close(gbl_args->pktios[i].pktio);
+
+ for (j = 0; j < gbl_args->appl.num_flows; j++)
+ odp_queue_destroy(gbl_args->fqueue[i][j]);
+ }
+
+ free(gbl_args->appl.if_names);
+ free(gbl_args->appl.if_str);
+
+ if (odp_pool_destroy(pool)) {
+ LOG_ERR("Error: pool destroy\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_shm_free(shm)) {
+ LOG_ERR("Error: shm free\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_local()) {
+ LOG_ERR("Error: term local\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (odp_term_global(instance)) {
+ LOG_ERR("Error: term global\n");
+ exit(EXIT_FAILURE);
+ }
+
+ return ret;
+}
diff --git a/test/common_plat/performance/odp_pktio_ordered_run.sh b/test/common_plat/performance/odp_pktio_ordered_run.sh
new file mode 100755
index 000000000..d91211c0c
--- /dev/null
+++ b/test/common_plat/performance/odp_pktio_ordered_run.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# Copyright (c) 2016, Linaro Limited
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+DURATION=5
+LOG=odp_pktio_ordered.log
+LOOPS=100000000
+PASS_PPS=5000
+PCAP_IN=`find . ${TEST_DIR} $(dirname $0) -name udp64.pcap -print -quit`
+PCAP_OUT=/dev/null
+
+# This just turns off output buffering so that you still get periodic
+# output while piping to tee, as long as stdbuf is available.
+if [ "$(which stdbuf)" != "" ]; then
+ STDBUF="stdbuf -o 0"
+else
+ STDBUF=
+fi
+
+$STDBUF ./odp_pktio_ordered${EXEEXT} -i pcap:in=${PCAP_IN}:loops=$LOOPS,\
+pcap:out=${PCAP_OUT} -t $DURATION | tee $LOG
+
+ret=$?
+
+if [ ! -f $LOG ]; then
+ echo "FAIL: $LOG not found"
+ ret=1
+elif [ $ret -eq 0 ]; then
+ MAX_PPS=$(awk '/TEST RESULT/ {print $3}' $LOG)
+ if [ "$MAX_PPS" -lt "$PASS_PPS" ]; then
+ echo "FAIL: pps below threshold $MAX_PPS < $PASS_PPS"
+ ret=1
+ fi
+fi
+
+rm -f $LOG
+
+exit $ret
diff --git a/test/common_plat/performance/odp_pktio_perf.c b/test/common_plat/performance/odp_pktio_perf.c
index 92d979d37..094630811 100644
--- a/test/common_plat/performance/odp_pktio_perf.c
+++ b/test/common_plat/performance/odp_pktio_perf.c
@@ -22,10 +22,7 @@
*/
#include <odp_api.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
#include <getopt.h>
#include <stdlib.h>
diff --git a/test/common_plat/performance/odp_sched_latency.c b/test/common_plat/performance/odp_sched_latency.c
index 063fb21c1..2b28cd7bc 100644
--- a/test/common_plat/performance/odp_sched_latency.c
+++ b/test/common_plat/performance/odp_sched_latency.c
@@ -20,7 +20,7 @@
#include <odp_api.h>
/* ODP helper for Linux apps */
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
/* GNU lib C */
#include <getopt.h>
diff --git a/test/common_plat/performance/odp_scheduling.c b/test/common_plat/performance/odp_scheduling.c
index e2a49d34d..c74a07133 100644
--- a/test/common_plat/performance/odp_scheduling.c
+++ b/test/common_plat/performance/odp_scheduling.c
@@ -20,7 +20,7 @@
#include <odp_api.h>
/* ODP helper for Linux apps */
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
/* Needs librt*/
#include <time.h>
diff --git a/test/common_plat/performance/udp64.pcap b/test/common_plat/performance/udp64.pcap
new file mode 100644
index 000000000..45f9d6e63
--- /dev/null
+++ b/test/common_plat/performance/udp64.pcap
Binary files differ
diff --git a/test/common_plat/validation/api/classification/classification.h b/test/common_plat/validation/api/classification/classification.h
index d73c82161..53c527f38 100644
--- a/test/common_plat/validation/api/classification/classification.h
+++ b/test/common_plat/validation/api/classification/classification.h
@@ -55,6 +55,27 @@
#define DATA_MAGIC 0x01020304
#define TEST_SEQ_INVALID ((uint32_t)~0)
+/* Test packet Time-to-live */
+#define DEFAULT_TTL 128
+
+/* Test packet default DSCP value */
+#define LOW_DROP_PRECEDENCE 0x02
+#define MEDIUM_DROP_PRECEDENCE 0x04
+#define HIGH_DROP_PRECEDENCE 0x06
+#define DROP_PRECEDENCE_MASK 0x06
+#define DSCP_CLASS1 0x08
+#define DSCP_CLASS2 0x10
+#define DSCP_CLASS3 0x18
+#define DSCP_CLASS4 0x20
+#define DEFAULT_DSCP (DSCP_CLASS2 | LOW_DROP_PRECEDENCE)
+
+/* Test packet default ECN */
+#define DEFAULT_ECN ODPH_IP_ECN_ECT0
+
+/* Test packet default TOS */
+#define DEFAULT_TOS ((DEFAULT_DSCP << ODPH_IP_TOS_DSCP_SHIFT) | \
+ DEFAULT_ECN)
+
/* test functions: */
void classification_test_create_cos(void);
void classification_test_destroy_cos(void);
@@ -77,6 +98,10 @@ void classification_test_pmr_term_udp_sport(void);
void classification_test_pmr_term_ipproto(void);
void classification_test_pmr_term_dmac(void);
void classification_test_pmr_term_packet_len(void);
+void classification_test_pmr_term_vlan_id_0(void);
+void classification_test_pmr_term_vlan_id_x(void);
+void classification_test_pmr_term_eth_type_0(void);
+void classification_test_pmr_term_eth_type_x(void);
/* test arrays: */
extern odp_testinfo_t classification_suite_basic[];
diff --git a/test/common_plat/validation/api/classification/odp_classification_common.c b/test/common_plat/validation/api/classification/odp_classification_common.c
index 2923a711d..3b379c14c 100644
--- a/test/common_plat/validation/api/classification/odp_classification_common.c
+++ b/test/common_plat/validation/api/classification/odp_classification_common.c
@@ -7,10 +7,6 @@
#include "odp_classification_testsuites.h"
#include "classification.h"
#include <odp_cunit_common.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/tcp.h>
#include "test_debug.h"
typedef struct cls_test_packet {
@@ -18,6 +14,16 @@ typedef struct cls_test_packet {
odp_u32be_t seq;
} cls_test_packet_t;
+static uint8_t IPV6_SRC_ADDR[ODPH_IPV6ADDR_LEN] = {
+ /* I.e. ::ffff:10.0.0.1 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 10, 0, 0, 1
+};
+
+static uint8_t IPV6_DST_ADDR[ODPH_IPV6ADDR_LEN] = {
+ /* I.e. ::ffff:10.0.0.100 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 10, 0, 0, 100
+};
+
odp_pktio_t create_pktio(odp_queue_type_t q_type, odp_pool_t pool)
{
odp_pktio_t pktio;
@@ -215,30 +221,32 @@ odp_pool_t pool_create(const char *poolname)
return odp_pool_create(poolname, &param);
}
-odp_packet_t create_packet(odp_pool_t pool, bool vlan,
- odp_atomic_u32_t *seq, bool flag_udp)
-{
- return create_packet_len(pool, vlan, seq, flag_udp, 0);
-}
-
-odp_packet_t create_packet_len(odp_pool_t pool, bool vlan,
- odp_atomic_u32_t *seq, bool flag_udp,
- uint16_t len)
+odp_packet_t create_packet(cls_packet_info_t pkt_info)
{
uint32_t seqno;
odph_ethhdr_t *ethhdr;
odph_udphdr_t *udp;
odph_tcphdr_t *tcp;
odph_ipv4hdr_t *ip;
+ odph_ipv6hdr_t *ipv6;
uint16_t payload_len;
uint64_t src_mac = CLS_DEFAULT_SMAC;
uint64_t dst_mac = CLS_DEFAULT_DMAC;
uint64_t dst_mac_be;
uint32_t addr = 0;
uint32_t mask;
- int offset;
odp_packet_t pkt;
int packet_len = 0;
+ uint32_t version, tc, flow, ver_tc_flow;
+ uint8_t *buf, next_hdr;
+ uint32_t l4_len, l3_len, l2_len, l3_offset, l4_offset;
+ uint16_t vlan_hdr_len = 0;
+ uint16_t l2_hdr_len = 0;
+ uint16_t l3_hdr_len = 0;
+ uint16_t l4_hdr_len = 0;
+ uint16_t eth_type;
+ odp_u16be_t *vlan_type;
+ odph_vlanhdr_t *vlan_hdr;
/* 48 bit ethernet address needs to be left shifted for proper
value after changing to be*/
@@ -246,77 +254,94 @@ odp_packet_t create_packet_len(odp_pool_t pool, bool vlan,
if (dst_mac != dst_mac_be)
dst_mac_be = dst_mac_be >> (64 - 8 * ODPH_ETHADDR_LEN);
- payload_len = sizeof(cls_test_packet_t) + len;
- packet_len += ODPH_ETHHDR_LEN;
- packet_len += ODPH_IPV4HDR_LEN;
- if (flag_udp)
- packet_len += ODPH_UDPHDR_LEN;
- else
- packet_len += ODPH_TCPHDR_LEN;
- packet_len += payload_len;
-
- if (vlan)
- packet_len += ODPH_VLANHDR_LEN;
-
- pkt = odp_packet_alloc(pool, packet_len);
+ payload_len = sizeof(cls_test_packet_t) + pkt_info.len;
+ seqno = odp_atomic_fetch_inc_u32(pkt_info.seq);
+
+ vlan_hdr_len = pkt_info.vlan ? ODPH_VLANHDR_LEN : 0;
+ vlan_hdr_len = pkt_info.vlan_qinq ? 2 * vlan_hdr_len : vlan_hdr_len;
+ l3_hdr_len = pkt_info.ipv6 ? ODPH_IPV6HDR_LEN : ODPH_IPV4HDR_LEN;
+ l4_hdr_len = pkt_info.udp ? ODPH_UDPHDR_LEN : ODPH_TCPHDR_LEN;
+ eth_type = pkt_info.ipv6 ? ODPH_ETHTYPE_IPV6 : ODPH_ETHTYPE_IPV4;
+ next_hdr = pkt_info.udp ? ODPH_IPPROTO_UDP : ODPH_IPPROTO_TCP;
+ l2_hdr_len = ODPH_ETHHDR_LEN + vlan_hdr_len;
+ l4_len = l4_hdr_len + payload_len;
+ l3_len = l3_hdr_len + l4_len;
+ l2_len = l2_hdr_len + l3_len;
+ packet_len = l2_len;
+
+ pkt = odp_packet_alloc(pkt_info.pool, packet_len);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
/* Ethernet Header */
- offset = 0;
- odp_packet_l2_offset_set(pkt, offset);
+ buf = odp_packet_data(pkt);
+ odp_packet_l2_offset_set(pkt, 0);
ethhdr = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
memcpy(ethhdr->src.addr, &src_mac, ODPH_ETHADDR_LEN);
memcpy(ethhdr->dst.addr, &dst_mac_be, ODPH_ETHADDR_LEN);
- offset += sizeof(odph_ethhdr_t);
- if (vlan) {
- /* Default vlan header */
- odph_vlanhdr_t *vlan_hdr;
+ vlan_type = (odp_u16be_t *)&ethhdr->type;
+ vlan_hdr = (odph_vlanhdr_t *)(ethhdr + 1);
- ethhdr->type = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN);
- vlan_hdr = (odph_vlanhdr_t *)(ethhdr + 1);
+ if (pkt_info.vlan_qinq) {
+ odp_packet_has_vlan_qinq_set(pkt, 1);
+ *vlan_type = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN_OUTER);
+ vlan_hdr->tci = odp_cpu_to_be_16(0);
+ vlan_type = (uint16_t *)&vlan_hdr->type;
+ vlan_hdr++;
+ }
+ if (pkt_info.vlan) {
+ /* Default vlan header */
+ odp_packet_has_vlan_set(pkt, 1);
+ *vlan_type = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN);
vlan_hdr->tci = odp_cpu_to_be_16(0);
- vlan_hdr->type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
- offset += sizeof(odph_vlanhdr_t);
+ vlan_hdr->type = odp_cpu_to_be_16(eth_type);
} else {
- ethhdr->type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
+ ethhdr->type = odp_cpu_to_be_16(eth_type);
}
- odp_packet_l3_offset_set(pkt, offset);
-
- /* ipv4 */
- ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
-
- parse_ipv4_string(CLS_DEFAULT_DADDR, &addr, &mask);
- ip->dst_addr = odp_cpu_to_be_32(addr);
-
- parse_ipv4_string(CLS_DEFAULT_SADDR, &addr, &mask);
- ip->src_addr = odp_cpu_to_be_32(addr);
- ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
- odp_packet_has_ipv4_set(pkt, 1);
-
- if (flag_udp)
- ip->tot_len = odp_cpu_to_be_16(ODPH_UDPHDR_LEN + payload_len +
- ODPH_IPV4HDR_LEN);
- else
- ip->tot_len = odp_cpu_to_be_16(ODPH_TCPHDR_LEN + payload_len +
- ODPH_IPV4HDR_LEN);
-
- ip->ttl = 128;
- if (flag_udp)
- ip->proto = ODPH_IPPROTO_UDP;
- else
- ip->proto = ODPH_IPPROTO_TCP;
+ l3_offset = l2_hdr_len;
+ odp_packet_l3_offset_set(pkt, l3_offset);
+
+ if (!pkt_info.ipv6) {
+ /* ipv4 */
+ ip = (odph_ipv4hdr_t *)(buf + l3_offset);
+
+ parse_ipv4_string(CLS_DEFAULT_DADDR, &addr, &mask);
+ ip->dst_addr = odp_cpu_to_be_32(addr);
+
+ parse_ipv4_string(CLS_DEFAULT_SADDR, &addr, &mask);
+ ip->src_addr = odp_cpu_to_be_32(addr);
+ ip->ver_ihl = ODPH_IPV4 << 4 | ODPH_IPV4HDR_IHL_MIN;
+ ip->id = odp_cpu_to_be_16(seqno);
+ ip->chksum = 0;
+ ip->chksum = odph_ipv4_csum_update(pkt);
+ ip->proto = next_hdr;
+ ip->tot_len = odp_cpu_to_be_16(l3_len);
+ ip->ttl = DEFAULT_TTL;
+ odp_packet_has_ipv4_set(pkt, 1);
+ } else {
+ /* ipv6 */
+ odp_packet_has_ipv6_set(pkt, 1);
+ ipv6 = (odph_ipv6hdr_t *)odp_packet_l3_ptr(pkt, NULL);
+ version = ODPH_IPV6 << ODPH_IPV6HDR_VERSION_SHIFT;
+ tc = DEFAULT_TOS << ODPH_IPV6HDR_TC_SHIFT;
+ flow = seqno << ODPH_IPV6HDR_FLOW_LABEL_SHIFT;
+ ver_tc_flow = version | tc | flow;
+
+ ipv6->ver_tc_flow = odp_cpu_to_be_32(ver_tc_flow);
+ ipv6->payload_len = odp_cpu_to_be_16(l4_len);
+ ipv6->next_hdr = next_hdr;
+ ipv6->hop_limit = DEFAULT_TTL;
+ memcpy(ipv6->src_addr, IPV6_SRC_ADDR, ODPH_IPV6ADDR_LEN);
+ memcpy(ipv6->dst_addr, IPV6_DST_ADDR, ODPH_IPV6ADDR_LEN);
+ }
- seqno = odp_atomic_fetch_inc_u32(seq);
- ip->id = odp_cpu_to_be_16(seqno);
- ip->chksum = 0;
- ip->chksum = odph_ipv4_csum_update(pkt);
- offset += ODPH_IPV4HDR_LEN;
+ l4_offset = l3_offset + l3_hdr_len;
+ odp_packet_l4_offset_set(pkt, l4_offset);
+ tcp = (odph_tcphdr_t *)(buf + l4_offset);
+ udp = (odph_udphdr_t *)(buf + l4_offset);
/* udp */
- if (flag_udp) {
- odp_packet_l4_offset_set(pkt, offset);
- udp = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
+ if (pkt_info.udp) {
udp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
udp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
udp->length = odp_cpu_to_be_16(payload_len + ODPH_UDPHDR_LEN);
@@ -327,8 +352,6 @@ odp_packet_t create_packet_len(odp_pool_t pool, bool vlan,
return ODP_PACKET_INVALID;
}
} else {
- odp_packet_l4_offset_set(pkt, offset);
- tcp = (odph_tcphdr_t *)odp_packet_l4_ptr(pkt, NULL);
tcp->src_port = odp_cpu_to_be_16(CLS_DEFAULT_SPORT);
tcp->dst_port = odp_cpu_to_be_16(CLS_DEFAULT_DPORT);
tcp->hl = ODPH_TCPHDR_LEN / 4;
@@ -338,6 +361,7 @@ odp_packet_t create_packet_len(odp_pool_t pool, bool vlan,
LOG_ERR("odph_udp_tcp_chksum failed\n");
return ODP_PACKET_INVALID;
}
+
}
/* set pkt sequence number */
diff --git a/test/common_plat/validation/api/classification/odp_classification_test_pmr.c b/test/common_plat/validation/api/classification/odp_classification_test_pmr.c
index 88fbf8f48..d95242055 100644
--- a/test/common_plat/validation/api/classification/odp_classification_test_pmr.c
+++ b/test/common_plat/validation/api/classification/odp_classification_test_pmr.c
@@ -7,16 +7,13 @@
#include "odp_classification_testsuites.h"
#include "classification.h"
#include <odp_cunit_common.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/tcp.h>
static odp_pool_t pkt_pool;
-
/** sequence number of IP packets */
odp_atomic_u32_t seq;
+static cls_packet_info_t default_pkt_info;
+
int classification_suite_pmr_init(void)
{
pkt_pool = pool_create("classification_pmr_pool");
@@ -25,7 +22,12 @@ int classification_suite_pmr_init(void)
return -1;
}
+ memset(&default_pkt_info, 0, sizeof(cls_packet_info_t));
+ default_pkt_info.pool = pkt_pool;
+ default_pkt_info.seq = &seq;
+
odp_atomic_init_u32(&seq, 0);
+
return 0;
}
@@ -107,7 +109,6 @@ void classification_test_pmr_term_tcp_dport(void)
odp_pool_t pool_recv;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
-
val = CLS_DEFAULT_DPORT;
mask = 0xffff;
seqno = 0;
@@ -144,7 +145,7 @@ void classification_test_pmr_term_tcp_dport(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -167,7 +168,7 @@ void classification_test_pmr_term_tcp_dport(void)
odp_packet_free(pkt);
/* Other packets are delivered to default queue */
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -258,7 +259,7 @@ void classification_test_pmr_term_tcp_sport(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -279,7 +280,7 @@ void classification_test_pmr_term_tcp_sport(void)
CU_ASSERT(recvpool == pool);
odp_packet_free(pkt);
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -333,6 +334,7 @@ void classification_test_pmr_term_udp_dport(void)
odp_pmr_param_t pmr_param;
odp_cls_cos_param_t cls_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = CLS_DEFAULT_DPORT;
mask = 0xffff;
@@ -370,7 +372,9 @@ void classification_test_pmr_term_udp_dport(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -392,7 +396,7 @@ void classification_test_pmr_term_udp_dport(void)
odp_packet_free(pkt);
/* Other packets received in default queue */
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -446,6 +450,7 @@ void classification_test_pmr_term_udp_sport(void)
odp_pmr_param_t pmr_param;
odp_cls_cos_param_t cls_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = CLS_DEFAULT_SPORT;
mask = 0xffff;
@@ -483,7 +488,9 @@ void classification_test_pmr_term_udp_sport(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -504,7 +511,7 @@ void classification_test_pmr_term_udp_sport(void)
CU_ASSERT(recvpool == pool);
odp_packet_free(pkt);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -557,6 +564,7 @@ void classification_test_pmr_term_ipproto(void)
odp_cls_cos_param_t cls_param;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = ODPH_IPPROTO_UDP;
mask = 0xff;
@@ -594,7 +602,9 @@ void classification_test_pmr_term_ipproto(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -613,7 +623,7 @@ void classification_test_pmr_term_ipproto(void)
odp_packet_free(pkt);
/* Other packets delivered to default queue */
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -663,6 +673,7 @@ void classification_test_pmr_term_dmac(void)
odp_cls_cos_param_t cls_param;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = CLS_DEFAULT_DMAC; /* 48 bit Ethernet Mac address */
mask = 0xffffffffffff;
@@ -700,7 +711,9 @@ void classification_test_pmr_term_dmac(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -716,7 +729,7 @@ void classification_test_pmr_term_dmac(void)
odp_packet_free(pkt);
/* Other packets delivered to default queue */
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
memset(eth->dst.addr, 0, ODPH_ETHADDR_LEN);
@@ -766,6 +779,7 @@ void classification_test_pmr_term_packet_len(void)
odp_cls_cos_param_t cls_param;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = 1024;
/*Mask value will match any packet of length 1000 - 1099*/
@@ -805,7 +819,365 @@ void classification_test_pmr_term_packet_len(void)
CU_ASSERT(pmr != ODP_PMR_INVAL);
/* create packet of payload length 1024 */
- pkt = create_packet_len(pkt_pool, false, &seq, true, 1024);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt_info.len = 1024;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(default_pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == default_pool);
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+void classification_test_pmr_term_vlan_id_0(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ uint16_t val;
+ uint16_t mask;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_cos_t default_cos;
+ odp_pool_t default_pool;
+ odp_pool_t pool;
+ odp_pool_t recvpool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ char cosname[ODP_COS_NAME_LEN];
+ odp_cls_cos_param_t cls_param;
+ odp_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ odph_vlanhdr_t *vlan_0;
+ cls_packet_info_t pkt_info;
+
+ val = 1024;
+ mask = 0xff00;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("vlan_id_0", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("vlan_id_0");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "vlan_id_0");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_VLAN_ID_0;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVAL);
+
+ /* create packet of payload length 1024 */
+ pkt_info = default_pkt_info;
+ pkt_info.vlan = true;
+ pkt_info.vlan_qinq = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ vlan_0 = (odph_vlanhdr_t *)(eth + 1);
+ vlan_0->tci = odp_cpu_to_be_16(1024);
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(default_pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == default_pool);
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+void classification_test_pmr_term_vlan_id_x(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ uint16_t val;
+ uint16_t mask;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_cos_t default_cos;
+ odp_pool_t default_pool;
+ odp_pool_t pool;
+ odp_pool_t recvpool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ char cosname[ODP_COS_NAME_LEN];
+ odp_cls_cos_param_t cls_param;
+ odp_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ odph_vlanhdr_t *vlan_x;
+ cls_packet_info_t pkt_info;
+
+ val = 1024;
+ mask = 0xff00;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("vlan_id_x", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("vlan_id_x");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "vlan_id_x");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_VLAN_ID_X;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVAL);
+
+ /* create packet of payload length 1024 */
+ pkt_info = default_pkt_info;
+ pkt_info.vlan = true;
+ pkt_info.vlan_qinq = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ vlan_x = (odph_vlanhdr_t *)(eth + 1);
+ vlan_x++;
+ vlan_x->tci = odp_cpu_to_be_16(1024);
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(default_pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == default_pool);
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+void classification_test_pmr_term_eth_type_0(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ uint16_t val;
+ uint16_t mask;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_cos_t default_cos;
+ odp_pool_t default_pool;
+ odp_pool_t pool;
+ odp_pool_t recvpool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ char cosname[ODP_COS_NAME_LEN];
+ odp_cls_cos_param_t cls_param;
+ odp_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+
+ val = 0x88A8;
+ mask = 0xffff;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("eth_type_0", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("eth_type_0");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "eth_type_0");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_ETHTYPE_0;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVAL);
+
+ pkt_info = default_pkt_info;
+ pkt_info.vlan = true;
+ pkt_info.vlan_qinq = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == pool);
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -819,12 +1191,106 @@ void classification_test_pmr_term_packet_len(void)
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
recvpool = odp_packet_pool(pkt);
+ CU_ASSERT(recvpool == default_pool);
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+void classification_test_pmr_term_eth_type_x(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ uint16_t val;
+ uint16_t mask;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_cos_t default_cos;
+ odp_pool_t default_pool;
+ odp_pool_t pool;
+ odp_pool_t recvpool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ char cosname[ODP_COS_NAME_LEN];
+ odp_cls_cos_param_t cls_param;
+ odp_pmr_param_t pmr_param;
+ odph_ethhdr_t *eth;
+ odph_vlanhdr_t *vlan_x;
+ cls_packet_info_t pkt_info;
+
+ val = 0x8100;
+ mask = 0xff00;
+ seqno = 0;
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ CU_ASSERT_FATAL(pktio != ODP_PKTIO_INVALID);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("eth_type_x", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("eth_type_x");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "eth_type_x");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_ETHTYPE_X;
+ pmr_param.match.value = &val;
+ pmr_param.match.mask = &mask;
+ pmr_param.val_sz = sizeof(val);
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT(pmr != ODP_PMR_INVAL);
+
+ /* create packet of payload length 1024 */
+ pkt_info = default_pkt_info;
+ pkt_info.vlan = true;
+ pkt_info.vlan_qinq = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ vlan_x = (odph_vlanhdr_t *)(eth + 1);
+ vlan_x->tci = odp_cpu_to_be_16(1024);
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ recvpool = odp_packet_pool(pkt);
CU_ASSERT(recvpool == pool);
CU_ASSERT(retqueue == queue);
odp_packet_free(pkt);
/* Other packets delivered to default queue */
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -875,6 +1341,7 @@ static void classification_test_pmr_pool_set(void)
odp_cls_cos_param_t cls_param;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = ODPH_IPPROTO_UDP;
mask = 0xff;
@@ -919,7 +1386,9 @@ static void classification_test_pmr_pool_set(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -971,6 +1440,7 @@ static void classification_test_pmr_queue_set(void)
odp_cls_cos_param_t cls_param;
odp_pmr_param_t pmr_param;
odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
val = ODPH_IPPROTO_UDP;
mask = 0xff;
@@ -1014,8 +1484,9 @@ static void classification_test_pmr_queue_set(void)
pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
CU_ASSERT(pmr != ODP_PMR_INVAL);
-
- pkt = create_packet(pkt_pool, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -1102,7 +1573,7 @@ static void classification_test_pmr_term_daddr(void)
/* packet with dst ip address matching PMR rule to be
received in the CoS queue*/
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
@@ -1123,7 +1594,229 @@ static void classification_test_pmr_term_daddr(void)
odp_packet_free(pkt);
/* Other packets delivered to default queue */
- pkt = create_packet(pkt_pool, false, &seq, false);
+ pkt = create_packet(default_pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+static void classification_test_pmr_term_ipv6daddr(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_pool_t pool;
+ odp_pool_t default_pool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ odp_cos_t default_cos;
+ char cosname[ODP_QUEUE_NAME_LEN];
+ odp_pmr_param_t pmr_param;
+ odp_cls_cos_param_t cls_param;
+ odph_ipv6hdr_t *ip;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+
+ uint8_t IPV6_DST_ADDR[ODPH_IPV6ADDR_LEN] = {
+ /* I.e. ::ffff:10.1.1.100 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 10, 1, 1, 100
+ };
+ uint8_t ipv6_mask[ODPH_IPV6ADDR_LEN] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+ };
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("daddr", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("daddr");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "daddr");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_DIP6_ADDR;
+ pmr_param.match.value = IPV6_DST_ADDR;
+ pmr_param.match.mask = ipv6_mask;
+ pmr_param.val_sz = ODPH_IPV6ADDR_LEN;
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT_FATAL(pmr != ODP_PMR_INVAL);
+
+ /* packet with dst ip address matching PMR rule to be
+ received in the CoS queue*/
+ pkt_info = default_pkt_info;
+ pkt_info.ipv6 = true;
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ ip = (odph_ipv6hdr_t *)odp_packet_l3_ptr(pkt, NULL);
+ memcpy(ip->dst_addr, IPV6_DST_ADDR, ODPH_IPV6ADDR_LEN);
+
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == default_queue);
+
+ odp_cos_destroy(cos);
+ odp_cos_destroy(default_cos);
+ odp_cls_pmr_destroy(pmr);
+ odp_packet_free(pkt);
+ stop_pktio(pktio);
+ odp_pool_destroy(default_pool);
+ odp_pool_destroy(pool);
+ odp_queue_destroy(queue);
+ odp_queue_destroy(default_queue);
+ odp_pktio_close(pktio);
+}
+
+static void classification_test_pmr_term_ipv6saddr(void)
+{
+ odp_packet_t pkt;
+ uint32_t seqno;
+ int retval;
+ odp_pktio_t pktio;
+ odp_queue_t queue;
+ odp_queue_t retqueue;
+ odp_queue_t default_queue;
+ odp_pool_t pool;
+ odp_pool_t default_pool;
+ odp_pmr_t pmr;
+ odp_cos_t cos;
+ odp_cos_t default_cos;
+ char cosname[ODP_QUEUE_NAME_LEN];
+ odp_pmr_param_t pmr_param;
+ odp_cls_cos_param_t cls_param;
+ odph_ipv6hdr_t *ip;
+ odph_ethhdr_t *eth;
+ cls_packet_info_t pkt_info;
+ uint8_t IPV6_SRC_ADDR[ODPH_IPV6ADDR_LEN] = {
+ /* I.e. ::ffff:10.0.0.100 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 10, 1, 1, 1
+ };
+ uint8_t ipv6_mask[ODPH_IPV6ADDR_LEN] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+ };
+
+ pktio = create_pktio(ODP_QUEUE_TYPE_SCHED, pkt_pool);
+ retval = start_pktio(pktio);
+ CU_ASSERT(retval == 0);
+
+ configure_default_cos(pktio, &default_cos,
+ &default_queue, &default_pool);
+
+ queue = queue_create("saddr", true);
+ CU_ASSERT_FATAL(queue != ODP_QUEUE_INVALID);
+
+ pool = pool_create("saddr");
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ sprintf(cosname, "saddr");
+ odp_cls_cos_param_init(&cls_param);
+ cls_param.pool = pool;
+ cls_param.queue = queue;
+ cls_param.drop_policy = ODP_COS_DROP_POOL;
+
+ cos = odp_cls_cos_create(cosname, &cls_param);
+ CU_ASSERT_FATAL(cos != ODP_COS_INVALID);
+
+ odp_cls_pmr_param_init(&pmr_param);
+ pmr_param.term = ODP_PMR_SIP6_ADDR;
+ pmr_param.match.value = IPV6_SRC_ADDR;
+ pmr_param.match.mask = ipv6_mask;
+ pmr_param.val_sz = ODPH_IPV6ADDR_LEN;
+
+ pmr = odp_cls_pmr_create(&pmr_param, 1, default_cos, cos);
+ CU_ASSERT_FATAL(pmr != ODP_PMR_INVAL);
+
+ /* packet with dst ip address matching PMR rule to be
+ received in the CoS queue*/
+ pkt_info = default_pkt_info;
+ pkt_info.ipv6 = true;
+
+ pkt = create_packet(pkt_info);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
+ odp_pktio_mac_addr(pktio, eth->src.addr, ODPH_ETHADDR_LEN);
+ odp_pktio_mac_addr(pktio, eth->dst.addr, ODPH_ETHADDR_LEN);
+ ip = (odph_ipv6hdr_t *)odp_packet_l3_ptr(pkt, NULL);
+ memcpy(ip->src_addr, IPV6_SRC_ADDR, ODPH_IPV6ADDR_LEN);
+
+ seqno = cls_pkt_get_seq(pkt);
+ CU_ASSERT(seqno != TEST_SEQ_INVALID);
+
+ enqueue_pktio_interface(pkt, pktio);
+
+ pkt = receive_packet(&retqueue, ODP_TIME_SEC_IN_NS);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(seqno == cls_pkt_get_seq(pkt));
+ CU_ASSERT(retqueue == queue);
+ odp_packet_free(pkt);
+
+ /* Other packets delivered to default queue */
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -1160,6 +1853,12 @@ odp_testinfo_t classification_suite_pmr[] = {
ODP_TEST_INFO(classification_test_pmr_pool_set),
ODP_TEST_INFO(classification_test_pmr_queue_set),
ODP_TEST_INFO(classification_test_pmr_term_daddr),
+ ODP_TEST_INFO(classification_test_pmr_term_ipv6saddr),
+ ODP_TEST_INFO(classification_test_pmr_term_ipv6daddr),
ODP_TEST_INFO(classification_test_pmr_term_packet_len),
+ ODP_TEST_INFO(classification_test_pmr_term_vlan_id_0),
+ ODP_TEST_INFO(classification_test_pmr_term_vlan_id_x),
+ ODP_TEST_INFO(classification_test_pmr_term_eth_type_0),
+ ODP_TEST_INFO(classification_test_pmr_term_eth_type_x),
ODP_TEST_INFO_NULL,
};
diff --git a/test/common_plat/validation/api/classification/odp_classification_tests.c b/test/common_plat/validation/api/classification/odp_classification_tests.c
index ed45518be..4f4308264 100644
--- a/test/common_plat/validation/api/classification/odp_classification_tests.c
+++ b/test/common_plat/validation/api/classification/odp_classification_tests.c
@@ -7,10 +7,6 @@
#include "odp_classification_testsuites.h"
#include "classification.h"
#include <odp_cunit_common.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/tcp.h>
static odp_cos_t cos_list[CLS_ENTRIES];
static odp_pmr_t pmr_list[CLS_ENTRIES];
@@ -23,6 +19,9 @@ static odp_pktio_t pktio_loop;
/** sequence number of IP packets */
odp_atomic_u32_t seq;
+/* default packet info */
+static cls_packet_info_t default_pkt_info;
+
int classification_suite_init(void)
{
int i;
@@ -47,6 +46,10 @@ int classification_suite_init(void)
return -1;
}
+ memset(&default_pkt_info, 0, sizeof(cls_packet_info_t));
+ default_pkt_info.pool = pool_default;
+ default_pkt_info.seq = &seq;
+
odp_pktin_queue_param_init(&pktin_param);
pktin_param.queue_param.sched.sync = ODP_SCHED_SYNC_ATOMIC;
@@ -220,8 +223,11 @@ void test_cls_pmr_chain(void)
uint32_t addr = 0;
uint32_t mask;
uint32_t seqno = 0;
+ cls_packet_info_t pkt_info;
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -244,7 +250,7 @@ void test_cls_pmr_chain(void)
CU_ASSERT(pool == pool_list[CLS_PMR_CHAIN_DST]);
odp_packet_free(pkt);
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -305,8 +311,12 @@ void test_pktio_default_cos(void)
odp_queue_t queue;
uint32_t seqno = 0;
odp_pool_t pool;
+ cls_packet_info_t pkt_info;
+
/* create a default packet */
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -364,9 +374,12 @@ void test_pktio_error_cos(void)
odp_queue_t queue;
odp_packet_t pkt;
odp_pool_t pool;
+ cls_packet_info_t pkt_info;
/*Create an error packet */
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
@@ -476,10 +489,15 @@ void test_cos_with_l2_priority(void)
odp_queue_t queue;
odp_pool_t pool;
uint32_t seqno = 0;
+ cls_packet_info_t pkt_info;
uint8_t i;
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt_info.vlan = true;
+
for (i = 0; i < CLS_L2_QOS_MAX; i++) {
- pkt = create_packet(pool_default, true, &seq, true);
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -550,8 +568,11 @@ void test_pmr_cos(void)
odp_queue_t queue;
odp_pool_t pool;
uint32_t seqno = 0;
+ cls_packet_info_t pkt_info;
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
@@ -633,8 +654,11 @@ void test_pktio_pmr_composite_cos(void)
odp_pool_t pool;
odp_queue_t queue;
uint32_t seqno = 0;
+ cls_packet_info_t pkt_info;
- pkt = create_packet(pool_default, false, &seq, true);
+ pkt_info = default_pkt_info;
+ pkt_info.udp = true;
+ pkt = create_packet(pkt_info);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
seqno = cls_pkt_get_seq(pkt);
CU_ASSERT(seqno != TEST_SEQ_INVALID);
diff --git a/test/common_plat/validation/api/classification/odp_classification_testsuites.h b/test/common_plat/validation/api/classification/odp_classification_testsuites.h
index aea3de1b1..d296923ad 100644
--- a/test/common_plat/validation/api/classification/odp_classification_testsuites.h
+++ b/test/common_plat/validation/api/classification/odp_classification_testsuites.h
@@ -8,9 +8,20 @@
#define ODP_CLASSIFICATION_TESTSUITES_H_
#include <odp_api.h>
+#include <odp/helper/odph_api.h>
#include <odp_cunit_common.h>
#include <stdbool.h>
+typedef struct cls_packet_info {
+ odp_pool_t pool;
+ bool vlan;
+ bool vlan_qinq;
+ odp_atomic_u32_t *seq;
+ bool udp;
+ bool ipv6;
+ uint32_t len;
+} cls_packet_info_t;
+
extern odp_testinfo_t classification_suite[];
extern odp_testinfo_t classification_suite_basic[];
extern odp_testinfo_t classification_suite_pmr[];
@@ -21,11 +32,7 @@ int classification_suite_term(void);
int classification_suite_pmr_term(void);
int classification_suite_pmr_init(void);
-odp_packet_t create_packet(odp_pool_t pool, bool vlan,
- odp_atomic_u32_t *seq, bool udp);
-odp_packet_t create_packet_len(odp_pool_t pool, bool vlan,
- odp_atomic_u32_t *seq, bool flag_udp,
- uint16_t len);
+odp_packet_t create_packet(cls_packet_info_t pkt_info);
int cls_pkt_set_seq(odp_packet_t pkt);
uint32_t cls_pkt_get_seq(odp_packet_t pkt);
odp_pktio_t create_pktio(odp_queue_type_t q_type, odp_pool_t pool);
diff --git a/test/common_plat/validation/api/crypto/crypto.c b/test/common_plat/validation/api/crypto/crypto.c
index 208901682..e7c2bf320 100644
--- a/test/common_plat/validation/api/crypto/crypto.c
+++ b/test/common_plat/validation/api/crypto/crypto.c
@@ -13,8 +13,10 @@
#define PKT_POOL_LEN (1 * 1024)
odp_suiteinfo_t crypto_suites[] = {
- {ODP_CRYPTO_SYNC_INP, crypto_suite_sync_init, NULL, crypto_suite},
- {ODP_CRYPTO_ASYNC_INP, crypto_suite_async_init, NULL, crypto_suite},
+ {ODP_CRYPTO_SYNC_INP, crypto_suite_sync_init, crypto_suite_term,
+ crypto_suite},
+ {ODP_CRYPTO_ASYNC_INP, crypto_suite_async_init, crypto_suite_term,
+ crypto_suite},
ODP_SUITE_INFO_NULL,
};
diff --git a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
index de9d6e459..43ddb2ffd 100644
--- a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
+++ b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
@@ -21,6 +21,40 @@ struct suite_context_s {
static struct suite_context_s suite_context;
+static const char *auth_alg_name(odp_auth_alg_t auth)
+{
+ switch (auth) {
+ case ODP_AUTH_ALG_NULL:
+ return "ODP_AUTH_ALG_NULL";
+ case ODP_AUTH_ALG_MD5_HMAC:
+ return "ODP_AUTH_ALG_MD5_HMAC";
+ case ODP_AUTH_ALG_SHA256_HMAC:
+ return "ODP_AUTH_ALG_SHA256_HMAC";
+ case ODP_AUTH_ALG_AES_GCM:
+ return "ODP_AUTH_ALG_AES_GCM";
+ default:
+ return "Unknown";
+ }
+}
+
+static const char *cipher_alg_name(odp_cipher_alg_t cipher)
+{
+ switch (cipher) {
+ case ODP_CIPHER_ALG_NULL:
+ return "ODP_CIPHER_ALG_NULL";
+ case ODP_CIPHER_ALG_DES:
+ return "ODP_CIPHER_ALG_DES";
+ case ODP_CIPHER_ALG_3DES_CBC:
+ return "ODP_CIPHER_ALG_3DES_CBC";
+ case ODP_CIPHER_ALG_AES_CBC:
+ return "ODP_CIPHER_ALG_AES_CBC";
+ case ODP_CIPHER_ALG_AES_GCM:
+ return "ODP_CIPHER_ALG_AES_GCM";
+ default:
+ return "Unknown";
+ }
+}
+
/* Basic algorithm run function for async inplace mode.
* Creates a session from input parameters and runs one operation
* on input_vec. Checks the output of the crypto operation against
@@ -47,7 +81,7 @@ static void alg_test(odp_crypto_op_t op,
uint32_t digest_len)
{
odp_crypto_session_t session;
- odp_crypto_capability_t capability;
+ odp_crypto_capability_t capa;
int rc;
odp_crypto_ses_create_err_t status;
odp_bool_t posted;
@@ -63,50 +97,43 @@ static void alg_test(odp_crypto_op_t op,
int num, i;
int found;
- rc = odp_crypto_capability(&capability);
+ rc = odp_crypto_capability(&capa);
CU_ASSERT(!rc);
- if (capability.hw_ciphers.all_bits) {
- if (cipher_alg == ODP_CIPHER_ALG_3DES_CBC &&
- !(capability.hw_ciphers.bit.trides_cbc))
- rc = -1;
- if (cipher_alg == ODP_CIPHER_ALG_AES_CBC &&
- !(capability.hw_ciphers.bit.aes_cbc))
- rc = -1;
- if (cipher_alg == ODP_CIPHER_ALG_AES_GCM &&
- !(capability.hw_ciphers.bit.aes_gcm))
- rc = -1;
- } else {
- if (cipher_alg == ODP_CIPHER_ALG_3DES_CBC &&
- !(capability.ciphers.bit.trides_cbc))
- rc = -1;
- if (cipher_alg == ODP_CIPHER_ALG_AES_CBC &&
- !(capability.ciphers.bit.aes_cbc))
- rc = -1;
- if (cipher_alg == ODP_CIPHER_ALG_AES_GCM &&
- !(capability.ciphers.bit.aes_gcm))
- rc = -1;
- }
+ if (cipher_alg == ODP_CIPHER_ALG_3DES_CBC &&
+ !(capa.ciphers.bit.trides_cbc))
+ rc = -1;
+ if (cipher_alg == ODP_CIPHER_ALG_AES_CBC &&
+ !(capa.ciphers.bit.aes_cbc))
+ rc = -1;
+ if (cipher_alg == ODP_CIPHER_ALG_AES_GCM &&
+ !(capa.ciphers.bit.aes_gcm))
+ rc = -1;
+ if (cipher_alg == ODP_CIPHER_ALG_DES &&
+ !(capa.ciphers.bit.des))
+ rc = -1;
+ if (cipher_alg == ODP_CIPHER_ALG_NULL &&
+ !(capa.ciphers.bit.null))
+ rc = -1;
CU_ASSERT(!rc);
-
- if (capability.hw_auths.all_bits) {
- if (auth_alg == ODP_AUTH_ALG_AES_GCM &&
- !(capability.hw_auths.bit.aes_gcm))
- rc = -1;
- if (auth_alg == ODP_AUTH_ALG_NULL &&
- !(capability.hw_auths.bit.null))
- rc = -1;
- } else {
- if (auth_alg == ODP_AUTH_ALG_AES_GCM &&
- !(capability.auths.bit.aes_gcm))
- rc = -1;
- if (auth_alg == ODP_AUTH_ALG_NULL &&
- !(capability.auths.bit.null))
- rc = -1;
- }
+ CU_ASSERT((~capa.ciphers.all_bits & capa.hw_ciphers.all_bits) == 0);
+
+ if (auth_alg == ODP_AUTH_ALG_AES_GCM &&
+ !(capa.auths.bit.aes_gcm))
+ rc = -1;
+ if (auth_alg == ODP_AUTH_ALG_MD5_HMAC &&
+ !(capa.auths.bit.md5_hmac))
+ rc = -1;
+ if (auth_alg == ODP_AUTH_ALG_NULL &&
+ !(capa.auths.bit.null))
+ rc = -1;
+ if (auth_alg == ODP_AUTH_ALG_SHA256_HMAC &&
+ !(capa.auths.bit.sha256_hmac))
+ rc = -1;
CU_ASSERT(!rc);
+ CU_ASSERT((~capa.auths.all_bits & capa.hw_auths.all_bits) == 0);
num = odp_crypto_cipher_capability(cipher_alg, cipher_capa,
MAX_ALG_CAPA);
@@ -250,6 +277,150 @@ cleanup:
odp_packet_free(pkt);
}
+/**
+ * Check if given cipher and authentication algorithms are supported
+ *
+ * @param cipher Cipher algorithm
+ * @param auth Authentication algorithm
+ *
+ * @retval ODP_TEST_ACTIVE when both algorithms are supported
+ * @retval ODP_TEST_INACTIVE when either algorithm is not supported
+ */
+static int check_alg_support(odp_cipher_alg_t cipher, odp_auth_alg_t auth)
+{
+ odp_crypto_capability_t capability;
+
+ if (odp_crypto_capability(&capability))
+ return ODP_TEST_INACTIVE;
+
+ /* Cipher algorithms */
+ switch (cipher) {
+ case ODP_CIPHER_ALG_NULL:
+ if (!capability.ciphers.bit.null)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_CIPHER_ALG_DES:
+ if (!capability.ciphers.bit.des)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_CIPHER_ALG_3DES_CBC:
+ if (!capability.ciphers.bit.trides_cbc)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_CIPHER_ALG_AES_CBC:
+ if (!capability.ciphers.bit.aes_cbc)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_CIPHER_ALG_AES_GCM:
+ if (!capability.ciphers.bit.aes_gcm)
+ return ODP_TEST_INACTIVE;
+ break;
+ default:
+ fprintf(stderr, "Unsupported cipher algorithm\n");
+ return ODP_TEST_INACTIVE;
+ }
+
+ /* Authentication algorithms */
+ switch (auth) {
+ case ODP_AUTH_ALG_NULL:
+ if (!capability.auths.bit.null)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_AUTH_ALG_MD5_HMAC:
+ if (!capability.auths.bit.md5_hmac)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_AUTH_ALG_SHA256_HMAC:
+ if (!capability.auths.bit.sha256_hmac)
+ return ODP_TEST_INACTIVE;
+ break;
+ case ODP_AUTH_ALG_AES_GCM:
+ if (!capability.auths.bit.aes_gcm)
+ return ODP_TEST_INACTIVE;
+ break;
+ default:
+ fprintf(stderr, "Unsupported authentication algorithm\n");
+ return ODP_TEST_INACTIVE;
+ }
+
+ return ODP_TEST_ACTIVE;
+}
+
+/**
+ * Check if given cipher options are supported
+ *
+ * @param cipher Cipher algorithm
+ * @param key_len Key length
+ * @param iv_len IV length
+ *
+ * @retval non-zero if both cipher options are supported
+ * @retval 0 if both options are not supported
+ */
+static int check_cipher_options(odp_cipher_alg_t cipher, uint32_t key_len,
+ uint32_t iv_len)
+{
+ int i;
+ int num;
+ odp_crypto_cipher_capability_t cipher_capa[MAX_ALG_CAPA];
+
+ num = odp_crypto_cipher_capability(cipher, cipher_capa, MAX_ALG_CAPA);
+ CU_ASSERT_FATAL(num >= 1);
+
+ for (i = 0; i < num; i++) {
+ if (key_len == cipher_capa[i].key_len &&
+ iv_len == cipher_capa[i].iv_len)
+ break;
+ }
+
+ if (i == num) {
+ printf("\n Unsupported: alg=%s, key_len=%" PRIu32 ", "
+ "iv_len=%" PRIu32 "\n", cipher_alg_name(cipher), key_len,
+ iv_len);
+ return 0;
+ }
+ return 1;
+}
+
+/**
+ * Check if given authentication options are supported
+ *
+ * @param auth Authentication algorithm
+ * @param key_len Key length
+ * @param digest_len Digest length
+ *
+ * @retval non-zero if both authentication options are supported
+ * @retval 0 if both options are not supported
+ */
+static int check_auth_options(odp_auth_alg_t auth, uint32_t key_len,
+ uint32_t digest_len)
+{
+ int i;
+ int num;
+ odp_crypto_auth_capability_t capa[MAX_ALG_CAPA];
+
+ num = odp_crypto_auth_capability(auth, capa, MAX_ALG_CAPA);
+ CU_ASSERT_FATAL(num >= 1);
+
+ for (i = 0; i < num; i++) {
+ if (key_len == capa[i].key_len &&
+ digest_len == capa[i].digest_len)
+ break;
+ }
+
+ if (i == num) {
+ printf("\n Unsupported: alg=%s, key_len=%" PRIu32 ", "
+ "digest_len=%" PRIu32 "\n", auth_alg_name(auth), key_len,
+ digest_len);
+ return 0;
+ }
+ return 1;
+}
+
+static int check_alg_3des_cbc(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_3DES_CBC, ODP_AUTH_ALG_NULL);
+}
+
/* This test verifies the correctness of encode (plaintext -> ciphertext)
* operation for 3DES_CBC algorithm. IV for the operation is the session IV.
* In addition the test verifies if the implementation can use the
@@ -269,6 +440,10 @@ void crypto_test_enc_alg_3des_cbc(void)
iv.data = tdes_cbc_reference_iv[i];
iv.length = sizeof(tdes_cbc_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_3DES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_3DES_CBC,
iv,
@@ -300,6 +475,10 @@ void crypto_test_enc_alg_3des_cbc_ovr_iv(void)
cipher_key.data = tdes_cbc_reference_key[i];
cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_3DES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_3DES_CBC,
iv,
@@ -335,6 +514,10 @@ void crypto_test_dec_alg_3des_cbc(void)
iv.data = tdes_cbc_reference_iv[i];
iv.length = sizeof(tdes_cbc_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_3DES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_3DES_CBC,
iv,
@@ -368,6 +551,10 @@ void crypto_test_dec_alg_3des_cbc_ovr_iv(void)
cipher_key.data = tdes_cbc_reference_key[i];
cipher_key.length = sizeof(tdes_cbc_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_3DES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_3DES_CBC,
iv,
@@ -383,6 +570,11 @@ void crypto_test_dec_alg_3des_cbc_ovr_iv(void)
}
}
+static int check_alg_aes_gcm(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_AES_GCM, ODP_AUTH_ALG_AES_GCM);
+}
+
/* This test verifies the correctness of encode (plaintext -> ciphertext)
* operation for AES128_GCM algorithm. IV for the operation is the session IV.
* In addition the test verifies if the implementation can use the
@@ -402,6 +594,13 @@ void crypto_test_enc_alg_aes128_gcm(void)
iv.data = aes128_gcm_reference_iv[i];
iv.length = sizeof(aes128_gcm_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_GCM,
+ cipher_key.length, iv.length))
+ continue;
+ if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
+ auth_key.length, AES128_GCM_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_AES_GCM,
iv,
@@ -438,6 +637,13 @@ void crypto_test_enc_alg_aes128_gcm_ovr_iv(void)
cipher_key.data = aes128_gcm_reference_key[i];
cipher_key.length = sizeof(aes128_gcm_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_GCM,
+ cipher_key.length, iv.length))
+ continue;
+ if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
+ auth_key.length, AES128_GCM_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_AES_GCM,
iv,
@@ -477,6 +683,13 @@ void crypto_test_dec_alg_aes128_gcm(void)
iv.data = aes128_gcm_reference_iv[i];
iv.length = sizeof(aes128_gcm_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_GCM,
+ cipher_key.length, iv.length))
+ continue;
+ if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
+ auth_key.length, AES128_GCM_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_AES_GCM,
iv,
@@ -514,6 +727,13 @@ void crypto_test_dec_alg_aes128_gcm_ovr_iv(void)
cipher_key.data = aes128_gcm_reference_key[i];
cipher_key.length = sizeof(aes128_gcm_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_GCM,
+ cipher_key.length, iv.length))
+ continue;
+ if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
+ auth_key.length, AES128_GCM_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_AES_GCM,
iv,
@@ -533,6 +753,11 @@ void crypto_test_dec_alg_aes128_gcm_ovr_iv(void)
}
}
+static int check_alg_aes_cbc(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_AES_CBC, ODP_AUTH_ALG_NULL);
+}
+
/* This test verifies the correctness of encode (plaintext -> ciphertext)
* operation for AES128_CBC algorithm. IV for the operation is the session IV.
* In addition the test verifies if the implementation can use the
@@ -552,6 +777,10 @@ void crypto_test_enc_alg_aes128_cbc(void)
iv.data = aes128_cbc_reference_iv[i];
iv.length = sizeof(aes128_cbc_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_AES_CBC,
iv,
@@ -583,6 +812,10 @@ void crypto_test_enc_alg_aes128_cbc_ovr_iv(void)
cipher_key.data = aes128_cbc_reference_key[i];
cipher_key.length = sizeof(aes128_cbc_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_AES_CBC,
iv,
@@ -618,6 +851,10 @@ void crypto_test_dec_alg_aes128_cbc(void)
iv.data = aes128_cbc_reference_iv[i];
iv.length = sizeof(aes128_cbc_reference_iv[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_AES_CBC,
iv,
@@ -651,6 +888,10 @@ void crypto_test_dec_alg_aes128_cbc_ovr_iv(void)
cipher_key.data = aes128_cbc_reference_key[i];
cipher_key.length = sizeof(aes128_cbc_reference_key[i]);
+ if (!check_cipher_options(ODP_CIPHER_ALG_AES_CBC,
+ cipher_key.length, iv.length))
+ continue;
+
alg_test(ODP_CRYPTO_OP_DECODE,
ODP_CIPHER_ALG_AES_CBC,
iv,
@@ -666,6 +907,11 @@ void crypto_test_dec_alg_aes128_cbc_ovr_iv(void)
}
}
+static int check_alg_hmac_md5(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_MD5_HMAC);
+}
+
/* This test verifies the correctness of HMAC_MD5 digest operation.
* The output check length is truncated to 12 bytes (96 bits) as
* returned by the crypto operation API call.
@@ -687,6 +933,10 @@ void crypto_test_alg_hmac_md5(void)
auth_key.data = hmac_md5_reference_key[i];
auth_key.length = sizeof(hmac_md5_reference_key[i]);
+ if (!check_auth_options(ODP_AUTH_ALG_MD5_HMAC, auth_key.length,
+ HMAC_MD5_96_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_NULL,
iv,
@@ -703,6 +953,11 @@ void crypto_test_alg_hmac_md5(void)
}
}
+static int check_alg_hmac_sha256(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA256_HMAC);
+}
+
/* This test verifies the correctness of HMAC_MD5 digest operation.
* The output check length is truncated to 12 bytes (96 bits) as
* returned by the crypto operation API call.
@@ -725,6 +980,11 @@ void crypto_test_alg_hmac_sha256(void)
auth_key.data = hmac_sha256_reference_key[i];
auth_key.length = sizeof(hmac_sha256_reference_key[i]);
+ if (!check_auth_options(ODP_AUTH_ALG_SHA256_HMAC,
+ auth_key.length,
+ HMAC_SHA256_128_CHECK_LEN))
+ continue;
+
alg_test(ODP_CRYPTO_OP_ENCODE,
ODP_CIPHER_ALG_NULL,
iv,
@@ -766,19 +1026,51 @@ int crypto_suite_async_init(void)
}
odp_testinfo_t crypto_suite[] = {
- ODP_TEST_INFO(crypto_test_enc_alg_3des_cbc),
- ODP_TEST_INFO(crypto_test_dec_alg_3des_cbc),
- ODP_TEST_INFO(crypto_test_enc_alg_3des_cbc_ovr_iv),
- ODP_TEST_INFO(crypto_test_dec_alg_3des_cbc_ovr_iv),
- ODP_TEST_INFO(crypto_test_enc_alg_aes128_cbc),
- ODP_TEST_INFO(crypto_test_dec_alg_aes128_cbc),
- ODP_TEST_INFO(crypto_test_enc_alg_aes128_cbc_ovr_iv),
- ODP_TEST_INFO(crypto_test_dec_alg_aes128_cbc_ovr_iv),
- ODP_TEST_INFO(crypto_test_enc_alg_aes128_gcm),
- ODP_TEST_INFO(crypto_test_enc_alg_aes128_gcm_ovr_iv),
- ODP_TEST_INFO(crypto_test_dec_alg_aes128_gcm),
- ODP_TEST_INFO(crypto_test_dec_alg_aes128_gcm_ovr_iv),
- ODP_TEST_INFO(crypto_test_alg_hmac_md5),
- ODP_TEST_INFO(crypto_test_alg_hmac_sha256),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_3des_cbc,
+ check_alg_3des_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_3des_cbc,
+ check_alg_3des_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_3des_cbc_ovr_iv,
+ check_alg_3des_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_3des_cbc_ovr_iv,
+ check_alg_3des_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes128_cbc,
+ check_alg_aes_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes128_cbc,
+ check_alg_aes_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes128_cbc_ovr_iv,
+ check_alg_aes_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes128_cbc_ovr_iv,
+ check_alg_aes_cbc),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes128_gcm,
+ check_alg_aes_gcm),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_aes128_gcm_ovr_iv,
+ check_alg_aes_gcm),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes128_gcm,
+ check_alg_aes_gcm),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes128_gcm_ovr_iv,
+ check_alg_aes_gcm),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_alg_hmac_md5,
+ check_alg_hmac_md5),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_alg_hmac_sha256,
+ check_alg_hmac_sha256),
ODP_TEST_INFO_NULL,
};
+
+int crypto_suite_term(void)
+{
+ int i;
+ int first = 1;
+
+ for (i = 0; crypto_suite[i].pName; i++) {
+ if (crypto_suite[i].check_active &&
+ crypto_suite[i].check_active() == ODP_TEST_INACTIVE) {
+ if (first) {
+ first = 0;
+ printf("\n\n Inactive tests:\n");
+ }
+ printf(" %s\n", crypto_suite[i].pName);
+ }
+ }
+ return 0;
+}
diff --git a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.h b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.h
index 8bda34472..0f6933790 100644
--- a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.h
+++ b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.h
@@ -17,5 +17,6 @@ extern odp_testinfo_t crypto_suite[];
int crypto_suite_sync_init(void);
int crypto_suite_async_init(void);
+int crypto_suite_term(void);
#endif
diff --git a/test/common_plat/validation/api/packet/packet.c b/test/common_plat/validation/api/packet/packet.c
index 2b1ef802b..4aa3f598e 100644
--- a/test/common_plat/validation/api/packet/packet.c
+++ b/test/common_plat/validation/api/packet/packet.c
@@ -111,8 +111,10 @@ int packet_suite_init(void)
uint32_t i;
uint32_t num = 200;
- if (odp_pool_capability(&capa) < 0)
+ if (odp_pool_capability(&capa) < 0) {
+ printf("pool_capability failed\n");
return -1;
+ }
/* Pick a typical packet size and decrement it to the single segment
* limit if needed (min_seg_len maybe equal to max_len
@@ -139,14 +141,17 @@ int packet_suite_init(void)
params.pkt.uarea_size = sizeof(struct udata_struct);
packet_pool = odp_pool_create("packet_pool", &params);
- if (packet_pool == ODP_POOL_INVALID)
+ if (packet_pool == ODP_POOL_INVALID) {
+ printf("pool_create failed: 1\n");
return -1;
+ }
params.pkt.uarea_size = 0;
packet_pool_no_uarea = odp_pool_create("packet_pool_no_uarea",
&params);
if (packet_pool_no_uarea == ODP_POOL_INVALID) {
odp_pool_destroy(packet_pool);
+ printf("pool_create failed: 2\n");
return -1;
}
@@ -157,6 +162,7 @@ int packet_suite_init(void)
if (packet_pool_double_uarea == ODP_POOL_INVALID) {
odp_pool_destroy(packet_pool_no_uarea);
odp_pool_destroy(packet_pool);
+ printf("pool_create failed: 3\n");
return -1;
}
@@ -177,8 +183,10 @@ int packet_suite_init(void)
} while (segmented_test_packet == ODP_PACKET_INVALID);
if (odp_packet_is_valid(test_packet) == 0 ||
- odp_packet_is_valid(segmented_test_packet) == 0)
+ odp_packet_is_valid(segmented_test_packet) == 0) {
+ printf("packet_is_valid failed\n");
return -1;
+ }
segmentation_supported = odp_packet_is_segmented(segmented_test_packet);
@@ -190,16 +198,21 @@ int packet_suite_init(void)
udat = odp_packet_user_area(test_packet);
udat_size = odp_packet_user_area_size(test_packet);
- if (!udat || udat_size != sizeof(struct udata_struct))
+ if (!udat || udat_size != sizeof(struct udata_struct)) {
+ printf("packet_user_area failed: 1\n");
return -1;
+ }
odp_pool_print(packet_pool);
memcpy(udat, &test_packet_udata, sizeof(struct udata_struct));
udat = odp_packet_user_area(segmented_test_packet);
udat_size = odp_packet_user_area_size(segmented_test_packet);
- if (udat == NULL || udat_size != sizeof(struct udata_struct))
+ if (udat == NULL || udat_size != sizeof(struct udata_struct)) {
+ printf("packet_user_area failed: 2\n");
return -1;
+ }
+
memcpy(udat, &test_packet_udata, sizeof(struct udata_struct));
return 0;
@@ -235,6 +248,7 @@ void packet_test_alloc_free(void)
params.pkt.num = 1;
pool = odp_pool_create("packet_pool_alloc", &params);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
/* Allocate the only buffer from the pool */
packet = odp_packet_alloc(pool, packet_len);
@@ -1434,7 +1448,7 @@ void packet_test_concat_extend_trunc(void)
param.pkt.num = 100;
pool = odp_pool_create("packet_pool_concat", &param);
- CU_ASSERT(packet_pool != ODP_POOL_INVALID);
+ CU_ASSERT_FATAL(packet_pool != ODP_POOL_INVALID);
pkt = odp_packet_alloc(pool, alloc_len);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
@@ -1453,6 +1467,7 @@ void packet_test_concat_extend_trunc(void)
CU_ASSERT(odp_packet_len(pkt) == (cur_len + alloc_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
}
ret = odp_packet_extend_tail(&pkt, ext_len, NULL, NULL);
@@ -1460,12 +1475,14 @@ void packet_test_concat_extend_trunc(void)
CU_ASSERT(odp_packet_len(pkt) == (cur_len + ext_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
ret = odp_packet_extend_head(&pkt, ext_len, NULL, NULL);
CU_ASSERT(ret >= 0);
CU_ASSERT(odp_packet_len(pkt) == (cur_len + ext_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
pkt2 = odp_packet_alloc(pool, alloc_len);
CU_ASSERT_FATAL(pkt2 != ODP_PACKET_INVALID);
@@ -1478,18 +1495,21 @@ void packet_test_concat_extend_trunc(void)
CU_ASSERT(odp_packet_len(pkt) == (cur_len + alloc_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
ret = odp_packet_trunc_head(&pkt, trunc_len, NULL, NULL);
CU_ASSERT(ret >= 0);
CU_ASSERT(odp_packet_len(pkt) == (cur_len - trunc_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
ret = odp_packet_trunc_tail(&pkt, trunc_len, NULL, NULL);
CU_ASSERT(ret >= 0);
CU_ASSERT(odp_packet_len(pkt) == (cur_len - trunc_len));
cur_len = odp_packet_len(pkt);
+ CU_ASSERT(cur_len == odp_packet_unshared_len(pkt));
odp_packet_free(pkt);
@@ -1521,7 +1541,7 @@ void packet_test_extend_small(void)
param.pkt.num = 100;
pool = odp_pool_create("packet_pool_extend", &param);
- CU_ASSERT(packet_pool != ODP_POOL_INVALID);
+ CU_ASSERT_FATAL(packet_pool != ODP_POOL_INVALID);
for (round = 0; round < 2; round++) {
pkt = odp_packet_alloc(pool, 1);
@@ -1557,6 +1577,7 @@ void packet_test_extend_small(void)
}
CU_ASSERT(odp_packet_len(pkt) == len);
+ CU_ASSERT(odp_packet_unshared_len(pkt) == len);
len = odp_packet_len(pkt);
@@ -1615,7 +1636,7 @@ void packet_test_extend_large(void)
param.pkt.num = 100;
pool = odp_pool_create("packet_pool_extend", &param);
- CU_ASSERT(packet_pool != ODP_POOL_INVALID);
+ CU_ASSERT_FATAL(packet_pool != ODP_POOL_INVALID);
for (round = 0; round < 2 * num_div; round++) {
ext_len = len / div;
@@ -1734,7 +1755,7 @@ void packet_test_extend_mix(void)
param.pkt.num = 100;
pool = odp_pool_create("packet_pool_extend", &param);
- CU_ASSERT(packet_pool != ODP_POOL_INVALID);
+ CU_ASSERT_FATAL(packet_pool != ODP_POOL_INVALID);
for (round = 0; round < 2; round++) {
small_count = 30;
@@ -1822,6 +1843,114 @@ void packet_test_extend_mix(void)
CU_ASSERT(odp_pool_destroy(pool) == 0);
}
+void packet_test_extend_ref(void)
+{
+ odp_packet_t max_pkt, ref;
+ uint32_t hr, tr, max_len;
+
+ max_pkt = odp_packet_copy(segmented_test_packet,
+ odp_packet_pool(segmented_test_packet));
+ CU_ASSERT_FATAL(max_pkt != ODP_PACKET_INVALID);
+ max_len = odp_packet_len(max_pkt);
+
+ /* Maximize the max pkt */
+ hr = odp_packet_headroom(max_pkt);
+ tr = odp_packet_tailroom(max_pkt);
+ odp_packet_push_head(max_pkt, hr);
+ odp_packet_push_tail(max_pkt, tr);
+
+ /* Max packet should not be extendable at either end */
+ CU_ASSERT(odp_packet_extend_tail(&max_pkt, 1, NULL, NULL) < 0);
+ CU_ASSERT(odp_packet_extend_head(&max_pkt, 1, NULL, NULL) < 0);
+
+ /* See if we can trunc and extend anyway */
+ CU_ASSERT(odp_packet_trunc_tail(&max_pkt, hr + tr + 1,
+ NULL, NULL) >= 0);
+ CU_ASSERT(odp_packet_extend_head(&max_pkt, 1, NULL, NULL) >= 0);
+ CU_ASSERT(odp_packet_len(max_pkt) == max_len);
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == max_len);
+
+ /* Now try with a reference in place */
+ CU_ASSERT(odp_packet_trunc_tail(&max_pkt, 100, NULL, NULL) >= 0);
+ ref = odp_packet_ref(max_pkt, 100);
+
+ /* Verify ref lengths */
+ CU_ASSERT(ref != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_len(ref) == max_len - 200);
+ if (odp_packet_has_ref(ref) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(ref) == 0);
+
+ /* And ref's affect on max_pkt */
+ CU_ASSERT(odp_packet_has_ref(max_pkt) == 1);
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == 100);
+ } else {
+ CU_ASSERT(odp_packet_unshared_len(ref) == odp_packet_len(ref));
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) ==
+ odp_packet_len(max_pkt));
+ }
+
+ /* Now extend max_pkt and verify effect */
+ CU_ASSERT(odp_packet_extend_head(&max_pkt, 10, NULL, NULL) >= 0);
+ CU_ASSERT(odp_packet_len(max_pkt) == max_len - 90);
+
+ if (odp_packet_has_ref(max_pkt) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == 110);
+ }
+
+ /* Extend on max_pkt should not affect ref */
+ CU_ASSERT(odp_packet_len(ref) == max_len - 200);
+
+ if (odp_packet_has_ref(ref) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref) == 0);
+ }
+
+ /* Now extend ref and verify effect*/
+ CU_ASSERT(odp_packet_extend_head(&ref, 20, NULL, NULL) >= 0);
+ CU_ASSERT(odp_packet_len(ref) == max_len - 180);
+
+ if (odp_packet_has_ref(ref) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref) == 20);
+ }
+
+ /* Extend on ref should not affect max_pkt */
+ CU_ASSERT(odp_packet_len(max_pkt) == max_len - 90);
+
+ if (odp_packet_has_ref(max_pkt) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == 110);
+ }
+
+ /* Trunc max_pkt of all unshared len */
+ CU_ASSERT(odp_packet_trunc_head(&max_pkt, 110, NULL, NULL) >= 0);
+
+ /* Verify effect on max_pkt */
+ CU_ASSERT(odp_packet_len(max_pkt) == max_len - 200);
+
+ if (odp_packet_has_ref(max_pkt) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == 0);
+ }
+
+ /* Verify that ref is unchanged */
+ CU_ASSERT(odp_packet_len(ref) == max_len - 180);
+
+ if (odp_packet_has_ref(ref) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref) == 20);
+ }
+
+ /* Free ref and verify that max_pkt is back to being unreferenced */
+ odp_packet_free(ref);
+ CU_ASSERT(odp_packet_has_ref(max_pkt) == 0);
+ CU_ASSERT(odp_packet_len(max_pkt) == max_len - 200);
+ CU_ASSERT(odp_packet_unshared_len(max_pkt) == max_len - 200);
+
+ odp_packet_free(max_pkt);
+}
+
void packet_test_align(void)
{
odp_packet_t pkt;
@@ -1926,6 +2055,329 @@ void packet_test_offset(void)
CU_ASSERT_PTR_NOT_NULL(ptr);
}
+void packet_test_ref(void)
+{
+ odp_packet_t base_pkt, segmented_base_pkt, hdr_pkt[4],
+ ref_pkt[4], refhdr_pkt[4], hdr_cpy;
+ uint32_t pkt_len, segmented_pkt_len, hdr_len[4], offset[4], hr[4],
+ base_hr, ref_len[4];
+ int i;
+
+ base_pkt = odp_packet_copy(test_packet, odp_packet_pool(test_packet));
+ base_hr = odp_packet_headroom(base_pkt);
+ pkt_len = odp_packet_len(test_packet);
+ CU_ASSERT_FATAL(base_pkt != ODP_PACKET_INVALID);
+
+ segmented_base_pkt =
+ odp_packet_copy(segmented_test_packet,
+ odp_packet_pool(segmented_test_packet));
+ segmented_pkt_len = odp_packet_len(segmented_test_packet);
+ CU_ASSERT_FATAL(segmented_base_pkt != ODP_PACKET_INVALID);
+
+ CU_ASSERT(odp_packet_has_ref(base_pkt) == 0);
+
+ hdr_pkt[0] =
+ odp_packet_copy_part(segmented_test_packet, 0,
+ odp_packet_len(segmented_test_packet) / 4,
+ odp_packet_pool(segmented_test_packet));
+ CU_ASSERT_FATAL(hdr_pkt[0] != ODP_PACKET_INVALID);
+ hdr_len[0] = odp_packet_len(hdr_pkt[0]);
+ offset[0] = 0;
+
+ hdr_pkt[1] =
+ odp_packet_copy_part(segmented_test_packet, 10,
+ odp_packet_len(segmented_test_packet) / 8,
+ odp_packet_pool(segmented_test_packet));
+ CU_ASSERT_FATAL(hdr_pkt[1] != ODP_PACKET_INVALID);
+ hdr_len[1] = odp_packet_len(hdr_pkt[1]);
+ offset[1] = 5;
+
+ hdr_pkt[2] = odp_packet_copy_part(test_packet, 0,
+ odp_packet_len(test_packet) / 4,
+ odp_packet_pool(test_packet));
+ CU_ASSERT_FATAL(hdr_pkt[2] != ODP_PACKET_INVALID);
+ hdr_len[2] = odp_packet_len(hdr_pkt[2]);
+ offset[2] = 64;
+
+ hdr_pkt[3] = odp_packet_copy_part(test_packet, 0,
+ odp_packet_len(test_packet) / 4,
+ odp_packet_pool(test_packet));
+ CU_ASSERT_FATAL(hdr_pkt[3] != ODP_PACKET_INVALID);
+ hdr_len[3] = odp_packet_len(hdr_pkt[3]);
+ offset[3] = 64;
+
+ /* Nothing is a ref or has a ref before we start */
+ for (i = 0; i < 4; i++) {
+ CU_ASSERT(odp_packet_has_ref(hdr_pkt[i]) == 0);
+ CU_ASSERT(odp_packet_len(hdr_pkt[i]) ==
+ odp_packet_unshared_len(hdr_pkt[i]));
+ }
+
+ /* Create a couple of refs */
+ refhdr_pkt[0] = odp_packet_ref_pkt(base_pkt, offset[0], hdr_pkt[0]);
+ refhdr_pkt[1] = odp_packet_ref_pkt(base_pkt, offset[1], hdr_pkt[1]);
+
+ CU_ASSERT(refhdr_pkt[0] != ODP_PACKET_INVALID);
+ CU_ASSERT(refhdr_pkt[1] != ODP_PACKET_INVALID);
+
+ /* If base packet has now references, ref packet should be also
+ * references. */
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ CU_ASSERT(odp_packet_has_ref(refhdr_pkt[0]) == 1);
+ CU_ASSERT(odp_packet_has_ref(refhdr_pkt[1]) == 1);
+
+ CU_ASSERT(odp_packet_unshared_len(base_pkt) == 0);
+ } else {
+ CU_ASSERT(odp_packet_unshared_len(base_pkt) == pkt_len);
+ }
+
+ CU_ASSERT(odp_packet_len(refhdr_pkt[0]) ==
+ hdr_len[0] + pkt_len - offset[0]);
+ CU_ASSERT(odp_packet_len(refhdr_pkt[1]) ==
+ hdr_len[1] + pkt_len - offset[1]);
+
+ if (odp_packet_has_ref(refhdr_pkt[0]) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[0]) == hdr_len[0]);
+ } else {
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[0]) ==
+ odp_packet_len(refhdr_pkt[0]));
+ }
+
+ if (odp_packet_has_ref(refhdr_pkt[1]) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[1]) == hdr_len[1]);
+ } else {
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[1]) ==
+ odp_packet_len(refhdr_pkt[1]));
+ }
+
+ packet_compare_offset(refhdr_pkt[0], hdr_len[0],
+ base_pkt, offset[0],
+ pkt_len - offset[0]);
+
+ packet_compare_offset(refhdr_pkt[1], hdr_len[1],
+ base_pkt, offset[1],
+ pkt_len - offset[1]);
+
+ /* See if compound references are supported and if so that they
+ * operate properly */
+ hdr_cpy = odp_packet_copy(hdr_pkt[2], odp_packet_pool(hdr_pkt[2]));
+ CU_ASSERT_FATAL(hdr_cpy != ODP_PACKET_INVALID);
+
+ refhdr_pkt[2] = odp_packet_ref_pkt(refhdr_pkt[0], 2, hdr_cpy);
+ CU_ASSERT(refhdr_pkt[2] != ODP_PACKET_INVALID);
+
+ if (odp_packet_has_ref(refhdr_pkt[2]) == 1) {
+ CU_ASSERT(odp_packet_has_ref(refhdr_pkt[0]) == 1);
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[2]) == hdr_len[2]);
+ CU_ASSERT(odp_packet_unshared_len(refhdr_pkt[0]) == 2);
+ }
+
+ /* Delete the refs */
+ odp_packet_free(refhdr_pkt[0]);
+ odp_packet_free(refhdr_pkt[1]);
+ odp_packet_free(refhdr_pkt[2]);
+
+ /* Verify that base_pkt no longer has a ref */
+ CU_ASSERT(odp_packet_has_ref(base_pkt) == 0);
+
+ /* Now create a two more shared refs */
+ refhdr_pkt[2] = odp_packet_ref_pkt(base_pkt, offset[2], hdr_pkt[2]);
+ refhdr_pkt[3] = odp_packet_ref_pkt(base_pkt, offset[3], hdr_pkt[3]);
+
+ CU_ASSERT(hdr_pkt[2] != ODP_PACKET_INVALID);
+ CU_ASSERT(hdr_pkt[3] != ODP_PACKET_INVALID);
+
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ CU_ASSERT(odp_packet_has_ref(refhdr_pkt[2]) == 1);
+ CU_ASSERT(odp_packet_has_ref(refhdr_pkt[3]) == 1);
+ }
+
+ CU_ASSERT(odp_packet_len(refhdr_pkt[2]) ==
+ odp_packet_len(refhdr_pkt[3]));
+
+ packet_compare_offset(refhdr_pkt[2], 0,
+ refhdr_pkt[3], 0,
+ odp_packet_len(hdr_pkt[2]));
+
+ /* Delete the headers */
+ odp_packet_free(refhdr_pkt[2]);
+ odp_packet_free(refhdr_pkt[3]);
+
+ /* Verify that base_pkt is no longer ref'd */
+ CU_ASSERT(odp_packet_has_ref(base_pkt) == 0);
+
+ /* Create a static reference */
+ ref_pkt[0] = odp_packet_ref_static(base_pkt);
+ CU_ASSERT(ref_pkt[0] != ODP_PACKET_INVALID);
+
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_has_ref(ref_pkt[0]) == 1);
+ }
+
+ CU_ASSERT(odp_packet_len(ref_pkt[0]) == odp_packet_len(base_pkt));
+ packet_compare_offset(ref_pkt[0], 0, base_pkt, 0,
+ odp_packet_len(base_pkt));
+
+ /* Now delete it */
+ odp_packet_free(ref_pkt[0]);
+ CU_ASSERT(odp_packet_has_ref(base_pkt) == 0);
+
+ /* Create references */
+ ref_pkt[0] = odp_packet_ref(segmented_base_pkt, offset[0]);
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_has_ref(segmented_base_pkt) == 1);
+ }
+
+ ref_pkt[1] = odp_packet_ref(segmented_base_pkt, offset[1]);
+
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_has_ref(segmented_base_pkt) == 1);
+ }
+
+ /* Verify reference lengths */
+ CU_ASSERT(odp_packet_len(ref_pkt[0]) == segmented_pkt_len - offset[0]);
+ CU_ASSERT(odp_packet_len(ref_pkt[1]) == segmented_pkt_len - offset[1]);
+
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) == 0);
+ }
+
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 0);
+ }
+
+ /* Free the base pkts -- references should still be valid */
+ odp_packet_free(base_pkt);
+ odp_packet_free(segmented_base_pkt);
+
+ packet_compare_offset(ref_pkt[0], 0,
+ segmented_test_packet, offset[0],
+ segmented_pkt_len - offset[0]);
+ packet_compare_offset(ref_pkt[1], 0,
+ segmented_test_packet, offset[1],
+ segmented_pkt_len - offset[1]);
+
+ /* Verify we can modify the refs */
+ hr[0] = odp_packet_headroom(ref_pkt[0]);
+ hr[1] = odp_packet_headroom(ref_pkt[1]);
+
+ CU_ASSERT(odp_packet_push_head(ref_pkt[0], hr[0]) != NULL);
+
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) == hr[0]);
+ }
+
+ CU_ASSERT(odp_packet_len(ref_pkt[0]) ==
+ hr[0] + segmented_pkt_len - offset[0]);
+
+ CU_ASSERT(odp_packet_pull_head(ref_pkt[0], hr[0] / 2) != NULL);
+
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) ==
+ hr[0] - (hr[0] / 2));
+ }
+
+ if (hr[1] > 0) {
+ CU_ASSERT(odp_packet_push_head(ref_pkt[1], 1) != NULL);
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 1);
+ }
+ CU_ASSERT(odp_packet_len(ref_pkt[1]) ==
+ 1 + segmented_pkt_len - offset[1]);
+ CU_ASSERT(odp_packet_pull_head(ref_pkt[1], 1) != NULL);
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 0);
+ }
+ CU_ASSERT(odp_packet_len(ref_pkt[1]) ==
+ segmented_pkt_len - offset[1]);
+ }
+
+ odp_packet_free(ref_pkt[0]);
+ odp_packet_free(ref_pkt[1]);
+
+ /* Verify we can modify base packet after reference is created */
+ base_pkt = odp_packet_copy(test_packet, odp_packet_pool(test_packet));
+
+ ref_pkt[1] = odp_packet_ref(base_pkt, offset[1]);
+ CU_ASSERT_FATAL(ref_pkt[1] != ODP_PACKET_INVALID);
+ ref_len[1] = odp_packet_len(ref_pkt[1]);
+ CU_ASSERT(ref_len[1] == odp_packet_len(base_pkt) - offset[1]);
+
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 0);
+ }
+
+ CU_ASSERT(odp_packet_push_head(base_pkt, base_hr / 2) != NULL);
+
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(base_pkt) ==
+ base_hr / 2 + offset[1]);
+ }
+ CU_ASSERT(odp_packet_len(ref_pkt[1]) == ref_len[1]);
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 0);
+ }
+
+ ref_pkt[0] = odp_packet_ref(base_pkt, offset[0]);
+ CU_ASSERT_FATAL(ref_pkt[0] != ODP_PACKET_INVALID);
+ ref_len[0] = odp_packet_len(ref_pkt[0]);
+ CU_ASSERT(ref_len[0] = odp_packet_len(base_pkt) - offset[0]);
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) == 0);
+ }
+
+ CU_ASSERT(odp_packet_push_head(base_pkt,
+ base_hr - base_hr / 2) != NULL);
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ CU_ASSERT(odp_packet_unshared_len(base_pkt) ==
+ base_hr - base_hr / 2 + offset[0]);
+ }
+ CU_ASSERT(odp_packet_len(ref_pkt[1]) == ref_len[1]);
+ CU_ASSERT(odp_packet_len(ref_pkt[0]) == ref_len[0]);
+
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == 0);
+ }
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) == 0);
+ }
+
+ hr[0] = odp_packet_headroom(ref_pkt[0]);
+ hr[1] = odp_packet_headroom(ref_pkt[1]);
+ CU_ASSERT(odp_packet_push_head(ref_pkt[0], hr[0]) != NULL);
+ CU_ASSERT(odp_packet_push_head(ref_pkt[1], hr[1]) != NULL);
+ if (odp_packet_has_ref(ref_pkt[0]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[0]) == hr[0]);
+ }
+ if (odp_packet_has_ref(ref_pkt[1]) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(ref_pkt[1]) == hr[1]);
+ }
+ if (odp_packet_has_ref(base_pkt) == 1) {
+ /* CU_ASSERT needs braces */
+ CU_ASSERT(odp_packet_unshared_len(base_pkt) ==
+ base_hr - base_hr / 2 + offset[0]);
+ }
+
+ odp_packet_free(base_pkt);
+ odp_packet_free(ref_pkt[0]);
+ odp_packet_free(ref_pkt[1]);
+}
+
odp_testinfo_t packet_suite[] = {
ODP_TEST_INFO(packet_test_alloc_free),
ODP_TEST_INFO(packet_test_alloc_free_multi),
@@ -1952,8 +2404,10 @@ odp_testinfo_t packet_suite[] = {
ODP_TEST_INFO(packet_test_extend_small),
ODP_TEST_INFO(packet_test_extend_large),
ODP_TEST_INFO(packet_test_extend_mix),
+ ODP_TEST_INFO(packet_test_extend_ref),
ODP_TEST_INFO(packet_test_align),
ODP_TEST_INFO(packet_test_offset),
+ ODP_TEST_INFO(packet_test_ref),
ODP_TEST_INFO_NULL,
};
diff --git a/test/common_plat/validation/api/packet/packet.h b/test/common_plat/validation/api/packet/packet.h
index 9bc3d6362..783b7a117 100644
--- a/test/common_plat/validation/api/packet/packet.h
+++ b/test/common_plat/validation/api/packet/packet.h
@@ -35,8 +35,10 @@ void packet_test_concat_extend_trunc(void);
void packet_test_extend_small(void);
void packet_test_extend_large(void);
void packet_test_extend_mix(void);
+void packet_test_extend_ref(void);
void packet_test_align(void);
void packet_test_offset(void);
+void packet_test_ref(void);
/* test arrays: */
extern odp_testinfo_t packet_suite[];
diff --git a/test/common_plat/validation/api/pktio/pktio.c b/test/common_plat/validation/api/pktio/pktio.c
index c23e2cc76..4f3c0c0f7 100644
--- a/test/common_plat/validation/api/pktio/pktio.c
+++ b/test/common_plat/validation/api/pktio/pktio.c
@@ -6,9 +6,7 @@
#include <odp_api.h>
#include <odp_cunit_common.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
+#include <odp/helper/odph_api.h>
#include <stdlib.h>
#include "pktio.h"
diff --git a/test/common_plat/validation/api/timer/timer.c b/test/common_plat/validation/api/timer/timer.c
index 1945afaa3..b7d84c649 100644
--- a/test/common_plat/validation/api/timer/timer.c
+++ b/test/common_plat/validation/api/timer/timer.c
@@ -15,7 +15,7 @@
#include <time.h>
#include <odp.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
#include "odp_cunit_common.h"
#include "test_debug.h"
#include "timer.h"
diff --git a/test/common_plat/validation/api/traffic_mngr/traffic_mngr.c b/test/common_plat/validation/api/traffic_mngr/traffic_mngr.c
index 027175807..88a7d8c7e 100644
--- a/test/common_plat/validation/api/traffic_mngr/traffic_mngr.c
+++ b/test/common_plat/validation/api/traffic_mngr/traffic_mngr.c
@@ -12,11 +12,7 @@
#include <unistd.h>
#include <math.h>
#include <odp.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
-#include <odp/helper/tcp.h>
-#include <odp/helper/chksum.h>
+#include <odp/helper/odph_api.h>
#include <test_debug.h>
#include "odp_cunit_common.h"
#include "traffic_mngr.h"
diff --git a/test/linux-generic/Makefile.inc b/test/linux-generic/Makefile.inc
index 36745fe41..198087f3c 100644
--- a/test/linux-generic/Makefile.inc
+++ b/test/linux-generic/Makefile.inc
@@ -6,7 +6,7 @@ AM_LDFLAGS += -static
LIBCUNIT_COMMON = $(top_builddir)/test/common_plat/common/libcunit_common.la
LIB = $(top_builddir)/lib
-LIBODP = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la
+LIBODP = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la
INCCUNIT_COMMON = -I$(top_srcdir)/test/common_plat/common
INCODP = \
@@ -14,6 +14,7 @@ INCODP = \
-I$(top_builddir)/platform/@with_platform@/include \
-I$(top_srcdir)/helper/include \
-I$(top_srcdir)/include \
+ -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \
-I$(top_srcdir)/platform/@with_platform@/arch/$(ARCH_DIR) \
-I$(top_srcdir)/platform/@with_platform@/include \
-I$(top_srcdir)/test
diff --git a/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.c b/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.c
index b91eb5345..e91a9d0dd 100644
--- a/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.c
+++ b/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.c
@@ -10,16 +10,13 @@
#include <signal.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
+#include <odp/helper/odph_api.h>
-#define POOL_NUM_PKT 8192
-#define POOL_SEG_LEN 1856
+#define POOL_NUM_PKT 100
+#define POOL_SEG_LEN 1500
#define MAX_PKT_BURST 32
#define MAX_WORKERS 1
-static volatile int exit_thr;
static int g_ret;
struct {
@@ -29,12 +26,6 @@ struct {
odph_ethaddr_t src, dst;
} global;
-static void sig_handler(int signo ODP_UNUSED)
-{
- printf("sig_handler!\n");
- exit_thr = 1;
-}
-
static odp_pktio_t create_pktio(const char *name, odp_pool_t pool,
odp_pktin_queue_t *pktin,
odp_pktout_queue_t *pktout)
@@ -85,6 +76,7 @@ static int run_worker(void *arg ODP_UNUSED)
odp_packet_t pkt_tbl[MAX_PKT_BURST];
int pkts, sent, tx_drops, i;
int total_pkts = 0;
+ uint64_t wait_time = odp_pktin_wait_time(2 * ODP_TIME_SEC_IN_NS);
if (odp_pktio_start(global.if0)) {
printf("unable to start input interface\n");
@@ -98,12 +90,14 @@ static int run_worker(void *arg ODP_UNUSED)
printf("started output interface\n");
printf("started all\n");
- while (!exit_thr) {
+ while (1) {
pkts = odp_pktin_recv_tmo(global.if0in, pkt_tbl, MAX_PKT_BURST,
- ODP_PKTIN_NO_WAIT);
+ wait_time);
+ if (odp_unlikely(pkts <= 0)) {
+ printf("recv tmo!\n");
+ break;
+ }
- if (odp_unlikely(pkts <= 0))
- continue;
for (i = 0; i < pkts; i++) {
odp_packet_t pkt = pkt_tbl[i];
odph_ethhdr_t *eth;
@@ -125,6 +119,8 @@ static int run_worker(void *arg ODP_UNUSED)
odp_packet_free_multi(&pkt_tbl[sent], tx_drops);
}
+ printf("Total send packets: %d\n", total_pkts);
+
if (total_pkts < 10)
g_ret = -1;
@@ -208,8 +204,6 @@ int main(int argc, char **argv)
thr_params.thr_type = ODP_THREAD_WORKER;
thr_params.instance = instance;
- signal(SIGINT, sig_handler);
-
odph_odpthreads_create(thd, &cpumask, &thr_params);
odph_odpthreads_join(thd);
diff --git a/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.sh b/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.sh
index 0aa5e3fce..3c6df8ecd 100755
--- a/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.sh
+++ b/test/linux-generic/mmap_vlan_ins/mmap_vlan_ins.sh
@@ -11,6 +11,7 @@
# linux-generic packet mmap pktio.
#
#
+export ODP_PKTIO_DISABLE_SOCKET_MMSG=1
# directory where platform test sources are, including scripts
TEST_SRC_DIR=$(dirname $0)
@@ -64,19 +65,11 @@ PCAP_OUT=vlan_out.pcap
# Listen on veth pipe and write to pcap Send pcap
plat_mmap_vlan_ins${EXEEXT} pktiop0p1 pcap:out=${PCAP_OUT} \
00:02:03:04:05:06 00:08:09:0a:0b:0c &
-P1=$!
# Send pcap file to veth interface
-plat_mmap_vlan_ins${EXEEXT} pcap:in=${PCAP_IN} pktiop0p1 \
- 01:02:03:04:05:06 01:08:09:0a:0b:0c &
-P2=$!
+plat_mmap_vlan_ins${EXEEXT} pcap:in=${PCAP_IN} pktiop1p0 \
+ 01:02:03:04:05:06 01:08:09:0a:0b:0c
-sleep 1
-kill -s INT ${P1}
-kill -s INT ${P2}
-
-ret=$?
rm -f ${PCAP_OUT}
-
cleanup_pktio_env
-exit $ret
+exit 0
diff --git a/test/linux-generic/pktio_ipc/ipc_common.h b/test/linux-generic/pktio_ipc/ipc_common.h
index 8804994e1..624557761 100644
--- a/test/linux-generic/pktio_ipc/ipc_common.h
+++ b/test/linux-generic/pktio_ipc/ipc_common.h
@@ -17,10 +17,7 @@
#include <example_debug.h>
#include <odp.h>
-#include <odp/helper/linux.h>
-#include <odp/helper/eth.h>
-#include <odp/helper/ip.h>
-#include <odp/helper/udp.h>
+#include <odp/helper/odph_api.h>
/** @def SHM_PKT_POOL_SIZE
* @brief Size of the shared memory block
diff --git a/test/linux-generic/ring/ring_stress.c b/test/linux-generic/ring/ring_stress.c
index bc61c3e4f..b6ddb34e3 100644
--- a/test/linux-generic/ring/ring_stress.c
+++ b/test/linux-generic/ring/ring_stress.c
@@ -18,7 +18,7 @@
#include <unistd.h>
#include <odp_api.h>
-#include <odp/helper/linux.h>
+#include <odp/helper/odph_api.h>
#include <odp_packet_io_ring_internal.h>
#include <test_debug.h>
#include <odp_cunit_common.h>