Commit 1fb0017a authored by dugupeiwen's avatar dugupeiwen
Browse files

init 0.58

parents
Supported Atomic Operations
===========================
Numba provides access to some of the atomic operations supported in CUDA. Those
that are presently implemented are as follows:
.. automodule:: numba.cuda
:members: atomic
:noindex:
Example
'''''''
The following code demonstrates the use of :class:`numba.cuda.atomic.max` to
find the maximum value in an array. Note that this is not the most efficient way
of finding a maximum in this case, but that it serves as an example::
from numba import cuda
import numpy as np
@cuda.jit
def max_example(result, values):
"""Find the maximum value in values and store in result[0]"""
tid = cuda.threadIdx.x
bid = cuda.blockIdx.x
bdim = cuda.blockDim.x
i = (bid * bdim) + tid
cuda.atomic.max(result, 0, values[i])
arr = np.random.rand(16384)
result = np.zeros(1, dtype=np.float64)
max_example[256,64](result, arr)
print(result[0]) # Found using cuda.atomic.max
print(max(arr)) # Print max(arr) for comparison (should be equal!)
Multiple dimension arrays are supported by using a tuple of ints for the index::
@cuda.jit
def max_example_3d(result, values):
"""
Find the maximum value in values and store in result[0].
Both result and values are 3d arrays.
"""
i, j, k = cuda.grid(3)
# Atomically store to result[0,1,2] from values[i, j, k]
cuda.atomic.max(result, (0, 1, 2), values[i, j, k])
arr = np.random.rand(1000).reshape(10,10,10)
result = np.zeros((3, 3, 3), dtype=np.float64)
max_example_3d[(2, 2, 2), (5, 5, 5)](result, arr)
print(result[0, 1, 2], '==', np.max(arr))
===================
Sharing CUDA Memory
===================
.. _cuda-ipc-memory:
Sharing between process
=======================
Sharing between processes is implemented using the Legacy CUDA IPC API
(functions whose names begin with ``cuIpc``), and is supported only on Linux.
Export device array to another process
--------------------------------------
A device array can be shared with another process in the same machine using
the CUDA IPC API. To do so, use the ``.get_ipc_handle()`` method on the device
array to get a ``IpcArrayHandle`` object, which can be transferred to another
process.
.. automethod:: numba.cuda.cudadrv.devicearray.DeviceNDArray.get_ipc_handle
:noindex:
.. autoclass:: numba.cuda.cudadrv.devicearray.IpcArrayHandle
:members: open, close
Import IPC memory from another process
--------------------------------------
The following function is used to open IPC handle from another process
as a device array.
.. automethod:: numba.cuda.open_ipc_array
====================
Writing CUDA Kernels
====================
Introduction
============
CUDA has an execution model unlike the traditional sequential model used
for programming CPUs. In CUDA, the code you write will be executed by
multiple threads at once (often hundreds or thousands). Your solution will
be modeled by defining a thread hierarchy of *grid*, *blocks* and *threads*.
Numba's CUDA support exposes facilities to declare and manage this
hierarchy of threads. The facilities are largely similar to those
exposed by NVidia's CUDA C language.
Numba also exposes three kinds of GPU memory: global :ref:`device memory
<cuda-device-memory>` (the large, relatively slow
off-chip memory that's connected to the GPU itself), on-chip
:ref:`shared memory <cuda-shared-memory>` and :ref:`local memory <cuda-local-memory>`.
For all but the simplest algorithms, it is important that you carefully
consider how to use and access memory in order to minimize bandwidth
requirements and contention.
Kernel declaration
==================
A *kernel function* is a GPU function that is meant to be called from CPU
code (*). It gives it two fundamental characteristics:
* kernels cannot explicitly return a value; all result data must be written
to an array passed to the function (if computing a scalar, you will
probably pass a one-element array);
* kernels explicitly declare their thread hierarchy when called: i.e.
the number of thread blocks and the number of threads per block
(note that while a kernel is compiled once, it can be called multiple
times with different block sizes or grid sizes).
At first sight, writing a CUDA kernel with Numba looks very much like
writing a :term:`JIT function` for the CPU::
@cuda.jit
def increment_by_one(an_array):
"""
Increment all array elements by one.
"""
# code elided here; read further for different implementations
(*) Note: newer CUDA devices support device-side kernel launching; this feature
is called *dynamic parallelism* but Numba does not support it currently)
.. _cuda-kernel-invocation:
Kernel invocation
=================
A kernel is typically launched in the following way::
threadsperblock = 32
blockspergrid = (an_array.size + (threadsperblock - 1)) // threadsperblock
increment_by_one[blockspergrid, threadsperblock](an_array)
We notice two steps here:
* Instantiate the kernel proper, by specifying a number of blocks
(or "blocks per grid"), and a number of threads per block. The product
of the two will give the total number of threads launched. Kernel
instantiation is done by taking the compiled kernel function
(here ``increment_by_one``) and indexing it with a tuple of integers.
* Running the kernel, by passing it the input array (and any separate
output arrays if necessary). Kernels run asynchronously: launches queue their
execution on the device and then return immediately. You can use
:func:`cuda.synchronize() <numba.cuda.synchronize>` to wait for all previous
kernel launches to finish executing.
.. note:: Passing an array that resides in host memory will implicitly cause a
copy back to the host, which will be synchronous. In this case, the kernel
launch will not return until the data is copied back, and therefore appears
to execute synchronously.
Choosing the block size
-----------------------
It might seem curious to have a two-level hierarchy when declaring the
number of threads needed by a kernel. The block size (i.e. number of
threads per block) is often crucial:
* On the software side, the block size determines how many threads
share a given area of :ref:`shared memory <cuda-shared-memory>`.
* On the hardware side, the block size must be large enough for full
occupation of execution units; recommendations can be found in the
`CUDA C Programming Guide`_.
Multi-dimensional blocks and grids
----------------------------------
To help deal with multi-dimensional arrays, CUDA allows you to specify
multi-dimensional blocks and grids. In the example above, you could
make ``blockspergrid`` and ``threadsperblock`` tuples of one, two
or three integers. Compared to 1D declarations of equivalent sizes,
this doesn't change anything to the efficiency or behaviour of generated
code, but can help you write your algorithms in a more natural way.
Thread positioning
==================
When running a kernel, the kernel function's code is executed by every
thread once. It therefore has to know which thread it is in, in order
to know which array element(s) it is responsible for (complex algorithms
may define more complex responsibilities, but the underlying principle
is the same).
One way is for the thread to determine its position in the grid and block
and manually compute the corresponding array position::
@cuda.jit
def increment_by_one(an_array):
# Thread id in a 1D block
tx = cuda.threadIdx.x
# Block id in a 1D grid
ty = cuda.blockIdx.x
# Block width, i.e. number of threads per block
bw = cuda.blockDim.x
# Compute flattened index inside the array
pos = tx + ty * bw
if pos < an_array.size: # Check array boundaries
an_array[pos] += 1
.. note:: Unless you are sure the block size and grid size is a divisor
of your array size, you **must** check boundaries as shown above.
:attr:`.threadIdx`, :attr:`.blockIdx`, :attr:`.blockDim` and :attr:`.gridDim`
are special objects provided by the CUDA backend for the sole purpose of
knowing the geometry of the thread hierarchy and the position of the
current thread within that geometry.
These objects can be 1D, 2D or 3D, depending on how the kernel was
:ref:`invoked <cuda-kernel-invocation>`. To access the value at each
dimension, use the ``x``, ``y`` and ``z`` attributes of these objects,
respectively.
.. attribute:: numba.cuda.threadIdx
:noindex:
The thread indices in the current thread block. For 1D blocks, the index
(given by the ``x`` attribute) is an integer spanning the range from 0
inclusive to :attr:`numba.cuda.blockDim` exclusive. A similar rule
exists for each dimension when more than one dimension is used.
.. attribute:: numba.cuda.blockDim
:noindex:
The shape of the block of threads, as declared when instantiating the
kernel. This value is the same for all threads in a given kernel, even
if they belong to different blocks (i.e. each block is "full").
.. attribute:: numba.cuda.blockIdx
:noindex:
The block indices in the grid of threads launched a kernel. For a 1D grid,
the index (given by the ``x`` attribute) is an integer spanning the range
from 0 inclusive to :attr:`numba.cuda.gridDim` exclusive. A similar rule
exists for each dimension when more than one dimension is used.
.. attribute:: numba.cuda.gridDim
:noindex:
The shape of the grid of blocks, i.e. the total number of blocks launched
by this kernel invocation, as declared when instantiating the kernel.
Absolute positions
------------------
Simple algorithms will tend to always use thread indices in the
same way as shown in the example above. Numba provides additional facilities
to automate such calculations:
.. function:: numba.cuda.grid(ndim)
:noindex:
Return the absolute position of the current thread in the entire
grid of blocks. *ndim* should correspond to the number of dimensions
declared when instantiating the kernel. If *ndim* is 1, a single integer
is returned. If *ndim* is 2 or 3, a tuple of the given number of
integers is returned.
.. function:: numba.cuda.gridsize(ndim)
:noindex:
Return the absolute size (or shape) in threads of the entire grid of
blocks. *ndim* has the same meaning as in :func:`.grid` above.
With these functions, the incrementation example can become::
@cuda.jit
def increment_by_one(an_array):
pos = cuda.grid(1)
if pos < an_array.size:
an_array[pos] += 1
The same example for a 2D array and grid of threads would be::
@cuda.jit
def increment_a_2D_array(an_array):
x, y = cuda.grid(2)
if x < an_array.shape[0] and y < an_array.shape[1]:
an_array[x, y] += 1
Note the grid computation when instantiating the kernel must still be
done manually, for example::
threadsperblock = (16, 16)
blockspergrid_x = math.ceil(an_array.shape[0] / threadsperblock[0])
blockspergrid_y = math.ceil(an_array.shape[1] / threadsperblock[1])
blockspergrid = (blockspergrid_x, blockspergrid_y)
increment_a_2D_array[blockspergrid, threadsperblock](an_array)
Further Reading
----------------
Please refer to the the `CUDA C Programming Guide`_ for a detailed discussion
of CUDA programming.
.. _CUDA C Programming Guide: http://docs.nvidia.com/cuda/cuda-c-programming-guide
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="760.32pt" height="427.68pt" viewBox="0 0 760.32 427.68" xmlns="http://www.w3.org/2000/svg" version="1.1">
<metadata>
<rdf:RDF 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#">
<cc:Work>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:date>2022-04-18T06:58:19.244680</dc:date>
<dc:format>image/svg+xml</dc:format>
<dc:creator>
<cc:Agent>
<dc:title>Matplotlib v3.5.1, https://matplotlib.org/</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
<defs>
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 427.68
L 760.32 427.68
L 760.32 0
L 0 0
z
" style="fill: #ffffff"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 95.04 380.6352
L 684.288 380.6352
L 684.288 51.3216
L 95.04 51.3216
z
" style="fill: #ffffff"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path id="mdea99e8948" d="M 0 0
L 0 3.5
" style="stroke: #000000; stroke-width: 0.8"/>
</defs>
<g>
<use xlink:href="#mdea99e8948" x="95.04" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_1">
<!-- 0 -->
<g transform="translate(91.85875 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-30" d="M 2034 4250
Q 1547 4250 1301 3770
Q 1056 3291 1056 2328
Q 1056 1369 1301 889
Q 1547 409 2034 409
Q 2525 409 2770 889
Q 3016 1369 3016 2328
Q 3016 3291 2770 3770
Q 2525 4250 2034 4250
z
M 2034 4750
Q 2819 4750 3233 4129
Q 3647 3509 3647 2328
Q 3647 1150 3233 529
Q 2819 -91 2034 -91
Q 1250 -91 836 529
Q 422 1150 422 2328
Q 422 3509 836 4129
Q 1250 4750 2034 4750
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use xlink:href="#mdea99e8948" x="212.771868" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_2">
<!-- 200 -->
<g transform="translate(203.228118 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-32" d="M 1228 531
L 3431 531
L 3431 0
L 469 0
L 469 531
Q 828 903 1448 1529
Q 2069 2156 2228 2338
Q 2531 2678 2651 2914
Q 2772 3150 2772 3378
Q 2772 3750 2511 3984
Q 2250 4219 1831 4219
Q 1534 4219 1204 4116
Q 875 4013 500 3803
L 500 4441
Q 881 4594 1212 4672
Q 1544 4750 1819 4750
Q 2544 4750 2975 4387
Q 3406 4025 3406 3419
Q 3406 3131 3298 2873
Q 3191 2616 2906 2266
Q 2828 2175 2409 1742
Q 1991 1309 1228 531
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-32"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use xlink:href="#mdea99e8948" x="330.503736" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_3">
<!-- 400 -->
<g transform="translate(320.959986 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-34" d="M 2419 4116
L 825 1625
L 2419 1625
L 2419 4116
z
M 2253 4666
L 3047 4666
L 3047 1625
L 3713 1625
L 3713 1100
L 3047 1100
L 3047 0
L 2419 0
L 2419 1100
L 313 1100
L 313 1709
L 2253 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-34"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use xlink:href="#mdea99e8948" x="448.235604" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_4">
<!-- 600 -->
<g transform="translate(438.691854 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-36" d="M 2113 2584
Q 1688 2584 1439 2293
Q 1191 2003 1191 1497
Q 1191 994 1439 701
Q 1688 409 2113 409
Q 2538 409 2786 701
Q 3034 994 3034 1497
Q 3034 2003 2786 2293
Q 2538 2584 2113 2584
z
M 3366 4563
L 3366 3988
Q 3128 4100 2886 4159
Q 2644 4219 2406 4219
Q 1781 4219 1451 3797
Q 1122 3375 1075 2522
Q 1259 2794 1537 2939
Q 1816 3084 2150 3084
Q 2853 3084 3261 2657
Q 3669 2231 3669 1497
Q 3669 778 3244 343
Q 2819 -91 2113 -91
Q 1303 -91 875 529
Q 447 1150 447 2328
Q 447 3434 972 4092
Q 1497 4750 2381 4750
Q 2619 4750 2861 4703
Q 3103 4656 3366 4563
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-36"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use xlink:href="#mdea99e8948" x="565.967473" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_5">
<!-- 800 -->
<g transform="translate(556.423723 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-38" d="M 2034 2216
Q 1584 2216 1326 1975
Q 1069 1734 1069 1313
Q 1069 891 1326 650
Q 1584 409 2034 409
Q 2484 409 2743 651
Q 3003 894 3003 1313
Q 3003 1734 2745 1975
Q 2488 2216 2034 2216
z
M 1403 2484
Q 997 2584 770 2862
Q 544 3141 544 3541
Q 544 4100 942 4425
Q 1341 4750 2034 4750
Q 2731 4750 3128 4425
Q 3525 4100 3525 3541
Q 3525 3141 3298 2862
Q 3072 2584 2669 2484
Q 3125 2378 3379 2068
Q 3634 1759 3634 1313
Q 3634 634 3220 271
Q 2806 -91 2034 -91
Q 1263 -91 848 271
Q 434 634 434 1313
Q 434 1759 690 2068
Q 947 2378 1403 2484
z
M 1172 3481
Q 1172 3119 1398 2916
Q 1625 2713 2034 2713
Q 2441 2713 2670 2916
Q 2900 3119 2900 3481
Q 2900 3844 2670 4047
Q 2441 4250 2034 4250
Q 1625 4250 1398 4047
Q 1172 3844 1172 3481
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-38"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use xlink:href="#mdea99e8948" x="683.699341" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_6">
<!-- 1000 -->
<g transform="translate(670.974341 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-31" d="M 794 531
L 1825 531
L 1825 4091
L 703 3866
L 703 4441
L 1819 4666
L 2450 4666
L 2450 531
L 3481 531
L 3481 0
L 794 0
L 794 531
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-31"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="text_7">
<!-- Position -->
<g transform="translate(342.95025 419.549575)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-50" d="M 1259 4147
L 1259 2394
L 2053 2394
Q 2494 2394 2734 2622
Q 2975 2850 2975 3272
Q 2975 3691 2734 3919
Q 2494 4147 2053 4147
L 1259 4147
z
M 628 4666
L 2053 4666
Q 2838 4666 3239 4311
Q 3641 3956 3641 3272
Q 3641 2581 3239 2228
Q 2838 1875 2053 1875
L 1259 1875
L 1259 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6f" d="M 1959 3097
Q 1497 3097 1228 2736
Q 959 2375 959 1747
Q 959 1119 1226 758
Q 1494 397 1959 397
Q 2419 397 2687 759
Q 2956 1122 2956 1747
Q 2956 2369 2687 2733
Q 2419 3097 1959 3097
z
M 1959 3584
Q 2709 3584 3137 3096
Q 3566 2609 3566 1747
Q 3566 888 3137 398
Q 2709 -91 1959 -91
Q 1206 -91 779 398
Q 353 888 353 1747
Q 353 2609 779 3096
Q 1206 3584 1959 3584
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-73" d="M 2834 3397
L 2834 2853
Q 2591 2978 2328 3040
Q 2066 3103 1784 3103
Q 1356 3103 1142 2972
Q 928 2841 928 2578
Q 928 2378 1081 2264
Q 1234 2150 1697 2047
L 1894 2003
Q 2506 1872 2764 1633
Q 3022 1394 3022 966
Q 3022 478 2636 193
Q 2250 -91 1575 -91
Q 1294 -91 989 -36
Q 684 19 347 128
L 347 722
Q 666 556 975 473
Q 1284 391 1588 391
Q 1994 391 2212 530
Q 2431 669 2431 922
Q 2431 1156 2273 1281
Q 2116 1406 1581 1522
L 1381 1569
Q 847 1681 609 1914
Q 372 2147 372 2553
Q 372 3047 722 3315
Q 1072 3584 1716 3584
Q 2034 3584 2315 3537
Q 2597 3491 2834 3397
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-69" d="M 603 3500
L 1178 3500
L 1178 0
L 603 0
L 603 3500
z
M 603 4863
L 1178 4863
L 1178 4134
L 603 4134
L 603 4863
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-74" d="M 1172 4494
L 1172 3500
L 2356 3500
L 2356 3053
L 1172 3053
L 1172 1153
Q 1172 725 1289 603
Q 1406 481 1766 481
L 2356 481
L 2356 0
L 1766 0
Q 1100 0 847 248
Q 594 497 594 1153
L 594 3053
L 172 3053
L 172 3500
L 594 3500
L 594 4494
L 1172 4494
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6e" d="M 3513 2113
L 3513 0
L 2938 0
L 2938 2094
Q 2938 2591 2744 2837
Q 2550 3084 2163 3084
Q 1697 3084 1428 2787
Q 1159 2491 1159 1978
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1366 3272 1645 3428
Q 1925 3584 2291 3584
Q 2894 3584 3203 3211
Q 3513 2838 3513 2113
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-50"/>
<use xlink:href="#DejaVuSans-6f" x="56.677734"/>
<use xlink:href="#DejaVuSans-73" x="117.859375"/>
<use xlink:href="#DejaVuSans-69" x="169.958984"/>
<use xlink:href="#DejaVuSans-74" x="197.742188"/>
<use xlink:href="#DejaVuSans-69" x="236.951172"/>
<use xlink:href="#DejaVuSans-6f" x="264.734375"/>
<use xlink:href="#DejaVuSans-6e" x="325.916016"/>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_7">
<defs>
<path id="mded8b8a71f" d="M 0 0
L -3.5 0
" style="stroke: #000000; stroke-width: 0.8"/>
</defs>
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_8">
<!-- 0 -->
<g transform="translate(81.6775 384.434419)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_8">
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="322.158479" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_9">
<!-- 10 -->
<g transform="translate(75.315 325.957697)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_9">
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="263.681757" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_10">
<!-- 20 -->
<g transform="translate(75.315 267.480976)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_10">
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="205.205036" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_11">
<!-- 30 -->
<g transform="translate(75.315 209.004255)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-33" d="M 2597 2516
Q 3050 2419 3304 2112
Q 3559 1806 3559 1356
Q 3559 666 3084 287
Q 2609 -91 1734 -91
Q 1441 -91 1130 -33
Q 819 25 488 141
L 488 750
Q 750 597 1062 519
Q 1375 441 1716 441
Q 2309 441 2620 675
Q 2931 909 2931 1356
Q 2931 1769 2642 2001
Q 2353 2234 1838 2234
L 1294 2234
L 1294 2753
L 1863 2753
Q 2328 2753 2575 2939
Q 2822 3125 2822 3475
Q 2822 3834 2567 4026
Q 2313 4219 1838 4219
Q 1578 4219 1281 4162
Q 984 4106 628 3988
L 628 4550
Q 988 4650 1302 4700
Q 1616 4750 1894 4750
Q 2613 4750 3031 4423
Q 3450 4097 3450 3541
Q 3450 3153 3228 2886
Q 3006 2619 2597 2516
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-33"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_11">
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="146.728315" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_12">
<!-- 40 -->
<g transform="translate(75.315 150.527533)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_12">
<g>
<use xlink:href="#mded8b8a71f" x="95.04" y="88.251593" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_13">
<!-- 50 -->
<g transform="translate(75.315 92.050812)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-35" d="M 691 4666
L 3169 4666
L 3169 4134
L 1269 4134
L 1269 2991
Q 1406 3038 1543 3061
Q 1681 3084 1819 3084
Q 2600 3084 3056 2656
Q 3513 2228 3513 1497
Q 3513 744 3044 326
Q 2575 -91 1722 -91
Q 1428 -91 1123 -41
Q 819 9 494 109
L 494 744
Q 775 591 1075 516
Q 1375 441 1709 441
Q 2250 441 2565 725
Q 2881 1009 2881 1497
Q 2881 1984 2565 2268
Q 2250 2553 1709 2553
Q 1456 2553 1204 2497
Q 953 2441 691 2322
L 691 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-35"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
</g>
</g>
</g>
<g id="text_14">
<!-- Temperature -->
<g transform="translate(66.32375 291.985275)rotate(-90)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-54" d="M -19 4666
L 3928 4666
L 3928 4134
L 2272 4134
L 2272 0
L 1638 0
L 1638 4134
L -19 4134
L -19 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-65" d="M 3597 1894
L 3597 1613
L 953 1613
Q 991 1019 1311 708
Q 1631 397 2203 397
Q 2534 397 2845 478
Q 3156 559 3463 722
L 3463 178
Q 3153 47 2828 -22
Q 2503 -91 2169 -91
Q 1331 -91 842 396
Q 353 884 353 1716
Q 353 2575 817 3079
Q 1281 3584 2069 3584
Q 2775 3584 3186 3129
Q 3597 2675 3597 1894
z
M 3022 2063
Q 3016 2534 2758 2815
Q 2500 3097 2075 3097
Q 1594 3097 1305 2825
Q 1016 2553 972 2059
L 3022 2063
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6d" d="M 3328 2828
Q 3544 3216 3844 3400
Q 4144 3584 4550 3584
Q 5097 3584 5394 3201
Q 5691 2819 5691 2113
L 5691 0
L 5113 0
L 5113 2094
Q 5113 2597 4934 2840
Q 4756 3084 4391 3084
Q 3944 3084 3684 2787
Q 3425 2491 3425 1978
L 3425 0
L 2847 0
L 2847 2094
Q 2847 2600 2669 2842
Q 2491 3084 2119 3084
Q 1678 3084 1418 2786
Q 1159 2488 1159 1978
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1356 3278 1631 3431
Q 1906 3584 2284 3584
Q 2666 3584 2933 3390
Q 3200 3197 3328 2828
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-70" d="M 1159 525
L 1159 -1331
L 581 -1331
L 581 3500
L 1159 3500
L 1159 2969
Q 1341 3281 1617 3432
Q 1894 3584 2278 3584
Q 2916 3584 3314 3078
Q 3713 2572 3713 1747
Q 3713 922 3314 415
Q 2916 -91 2278 -91
Q 1894 -91 1617 61
Q 1341 213 1159 525
z
M 3116 1747
Q 3116 2381 2855 2742
Q 2594 3103 2138 3103
Q 1681 3103 1420 2742
Q 1159 2381 1159 1747
Q 1159 1113 1420 752
Q 1681 391 2138 391
Q 2594 391 2855 752
Q 3116 1113 3116 1747
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-72" d="M 2631 2963
Q 2534 3019 2420 3045
Q 2306 3072 2169 3072
Q 1681 3072 1420 2755
Q 1159 2438 1159 1844
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1341 3275 1631 3429
Q 1922 3584 2338 3584
Q 2397 3584 2469 3576
Q 2541 3569 2628 3553
L 2631 2963
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-61" d="M 2194 1759
Q 1497 1759 1228 1600
Q 959 1441 959 1056
Q 959 750 1161 570
Q 1363 391 1709 391
Q 2188 391 2477 730
Q 2766 1069 2766 1631
L 2766 1759
L 2194 1759
z
M 3341 1997
L 3341 0
L 2766 0
L 2766 531
Q 2569 213 2275 61
Q 1981 -91 1556 -91
Q 1019 -91 701 211
Q 384 513 384 1019
Q 384 1609 779 1909
Q 1175 2209 1959 2209
L 2766 2209
L 2766 2266
Q 2766 2663 2505 2880
Q 2244 3097 1772 3097
Q 1472 3097 1187 3025
Q 903 2953 641 2809
L 641 3341
Q 956 3463 1253 3523
Q 1550 3584 1831 3584
Q 2591 3584 2966 3190
Q 3341 2797 3341 1997
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-75" d="M 544 1381
L 544 3500
L 1119 3500
L 1119 1403
Q 1119 906 1312 657
Q 1506 409 1894 409
Q 2359 409 2629 706
Q 2900 1003 2900 1516
L 2900 3500
L 3475 3500
L 3475 0
L 2900 0
L 2900 538
Q 2691 219 2414 64
Q 2138 -91 1772 -91
Q 1169 -91 856 284
Q 544 659 544 1381
z
M 1991 3584
L 1991 3584
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-54"/>
<use xlink:href="#DejaVuSans-65" x="44.083984"/>
<use xlink:href="#DejaVuSans-6d" x="105.607422"/>
<use xlink:href="#DejaVuSans-70" x="203.019531"/>
<use xlink:href="#DejaVuSans-65" x="266.496094"/>
<use xlink:href="#DejaVuSans-72" x="328.019531"/>
<use xlink:href="#DejaVuSans-61" x="369.132812"/>
<use xlink:href="#DejaVuSans-74" x="430.412109"/>
<use xlink:href="#DejaVuSans-75" x="469.621094"/>
<use xlink:href="#DejaVuSans-72" x="533"/>
<use xlink:href="#DejaVuSans-65" x="571.863281"/>
</g>
</g>
</g>
<g id="line2d_13">
<path d="M 95.04 380.6352
L 222.779077 380.529075
L 235.729582 380.282199
L 243.970813 379.915133
L 250.446066 379.406046
L 255.744 378.766883
L 260.453275 377.962709
L 264.57389 377.018844
L 268.105846 375.978796
L 271.637802 374.686465
L 274.581099 373.381548
L 277.524396 371.835995
L 280.467692 370.015621
L 283.410989 367.883451
L 285.765626 365.921436
L 288.120264 363.713694
L 290.474901 361.238701
L 292.829538 358.474235
L 295.184176 355.397908
L 297.538813 351.987431
L 299.893451 348.220835
L 302.248088 344.077154
L 304.602725 339.526635
L 306.957363 334.561291
L 309.312 329.163589
L 312.255297 321.78728
L 315.198593 313.692617
L 318.14189 304.866826
L 321.085187 295.305618
L 324.028484 285.00832
L 327.56044 271.724356
L 331.092396 257.491814
L 335.213011 239.815134
L 339.922286 218.452801
L 345.808879 190.573925
L 356.404747 140.249826
L 360.525363 121.846751
L 364.057319 107.108755
L 367.000615 95.761174
L 369.355253 87.403982
L 371.70989 79.767014
L 374.064527 72.918457
L 375.830505 68.33741
L 377.596484 64.262089
L 379.362462 60.725229
L 381.12844 57.732218
L 382.894418 55.297498
L 384.071736 53.990912
L 385.249055 52.941263
L 386.426374 52.151061
L 387.603692 51.622212
L 388.781011 51.355994
L 389.95833 51.353058
L 391.135648 51.61342
L 392.312967 52.136471
L 393.490286 52.920959
L 394.667604 53.96499
L 395.844923 55.266207
L 397.022242 56.828276
L 398.78822 59.649475
L 400.554198 63.018479
L 402.320176 66.917588
L 404.086154 71.326333
L 406.440791 77.95742
L 408.795429 85.392994
L 411.150066 93.566486
L 414.093363 104.71072
L 417.036659 116.760021
L 420.568615 132.184312
L 425.27789 153.916868
L 434.10778 196.168455
L 440.583033 226.545841
L 445.292308 247.498702
L 449.412923 264.715831
L 452.944879 278.497039
L 456.476835 291.278339
L 459.420132 301.142925
L 462.363429 310.276618
L 465.306725 318.677631
L 468.250022 326.354584
L 471.193319 333.324327
L 473.547956 338.392009
L 475.902593 343.036068
L 478.257231 347.278437
L 480.611868 351.138941
L 482.966505 354.63858
L 485.321143 357.799137
L 487.67578 360.642848
L 490.030418 363.192205
L 492.385055 365.456926
L 494.739692 367.467195
L 497.682989 369.660056
L 500.626286 371.534221
L 503.569582 373.127028
L 506.512879 374.473205
L 509.456176 375.604492
L 512.988132 376.714066
L 516.520088 377.600877
L 520.640703 378.406028
L 525.349978 379.087343
L 530.647912 379.624016
L 537.123165 380.047007
L 545.364396 380.350594
L 557.137582 380.540892
L 578.917978 380.625338
L 683.699341 380.6352
L 683.699341 380.6352
" clip-path="url(#p24d58054f1)" style="fill: none; stroke: #000000; stroke-width: 3; stroke-linecap: square"/>
<defs>
<path id="m7b5e1d1292" d="M 0 -3
L -0.673542 -0.927051
L -2.85317 -0.927051
L -1.089814 0.354102
L -1.763356 2.427051
L -0 1.145898
L 1.763356 2.427051
L 1.089814 0.354102
L 2.85317 -0.927051
L 0.673542 -0.927051
z
" style="stroke: #000000; stroke-linejoin: bevel"/>
</defs>
<g clip-path="url(#p24d58054f1)">
<use xlink:href="#m7b5e1d1292" x="95.04" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="95.628659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="96.217319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="96.805978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="97.394637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="97.983297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="98.571956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="99.160615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="99.749275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="100.337934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="100.926593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="101.515253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="102.103912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="102.692571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="103.281231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="103.86989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="104.458549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="105.047209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="105.635868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="106.224527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="106.813187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="107.401846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="107.990505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="108.579165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="109.167824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="109.756484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="110.345143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="110.933802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="111.522462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="112.111121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="112.69978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="113.28844" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="113.877099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="114.465758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="115.054418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="115.643077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="116.231736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="116.820396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="117.409055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="117.997714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="118.586374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="119.175033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="119.763692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="120.352352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="120.941011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="121.52967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="122.11833" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="122.706989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="123.295648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="123.884308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="124.472967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="125.061626" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="125.650286" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="126.238945" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="126.827604" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="127.416264" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="128.004923" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="128.593582" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="129.182242" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="129.770901" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="130.35956" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="130.94822" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="131.536879" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="132.125538" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="132.714198" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="133.302857" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="133.891516" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="134.480176" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="135.068835" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="135.657495" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="136.246154" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="136.834813" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="137.423473" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="138.012132" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="138.600791" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="139.189451" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="139.77811" y="380.635195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="140.366769" y="380.635195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="140.955429" y="380.635194" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="141.544088" y="380.635194" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="142.132747" y="380.635193" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="142.721407" y="380.635193" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="143.310066" y="380.635192" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="143.898725" y="380.635191" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="144.487385" y="380.635191" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="145.076044" y="380.63519" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="145.664703" y="380.635189" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="146.253363" y="380.635188" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="146.842022" y="380.635187" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="147.430681" y="380.635186" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="148.019341" y="380.635184" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="148.608" y="380.635183" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="149.196659" y="380.635182" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="149.785319" y="380.63518" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="150.373978" y="380.635178" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="150.962637" y="380.635177" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="151.551297" y="380.635175" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="152.139956" y="380.635172" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="152.728615" y="380.63517" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="153.317275" y="380.635168" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="153.905934" y="380.635165" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="154.494593" y="380.635162" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="155.083253" y="380.635159" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="155.671912" y="380.635155" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="156.260571" y="380.635152" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="156.849231" y="380.635148" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="157.43789" y="380.635143" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="158.026549" y="380.635139" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="158.615209" y="380.635134" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="159.203868" y="380.635128" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="159.792527" y="380.635123" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="160.381187" y="380.635116" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="160.969846" y="380.63511" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="161.558505" y="380.635102" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="162.147165" y="380.635094" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="162.735824" y="380.635086" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="163.324484" y="380.635077" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="163.913143" y="380.635067" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="164.501802" y="380.635056" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="165.090462" y="380.635045" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="165.679121" y="380.635033" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="166.26778" y="380.635019" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="166.85644" y="380.635005" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="167.445099" y="380.63499" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="168.033758" y="380.634973" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="168.622418" y="380.634956" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="169.211077" y="380.634937" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="169.799736" y="380.634916" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="170.388396" y="380.634894" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="170.977055" y="380.634871" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="171.565714" y="380.634845" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="172.154374" y="380.634818" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="172.743033" y="380.634788" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="173.331692" y="380.634757" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="173.920352" y="380.634723" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="174.509011" y="380.634687" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="175.09767" y="380.634648" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="175.68633" y="380.634606" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="176.274989" y="380.634561" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="176.863648" y="380.634513" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="177.452308" y="380.634462" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="178.040967" y="380.634406" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="178.629626" y="380.634347" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="179.218286" y="380.634284" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="179.806945" y="380.634216" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="180.395604" y="380.634143" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="180.984264" y="380.634065" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="181.572923" y="380.633982" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="182.161582" y="380.633893" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="182.750242" y="380.633798" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="183.338901" y="380.633695" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="183.92756" y="380.633586" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="184.51622" y="380.633469" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="185.104879" y="380.633345" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="185.693538" y="380.633211" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="186.282198" y="380.633068" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="186.870857" y="380.632916" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="187.459516" y="380.632753" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="188.048176" y="380.63258" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="188.636835" y="380.632394" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="189.225495" y="380.632195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="189.814154" y="380.631982" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="190.402813" y="380.631755" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="190.991473" y="380.631513" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="191.580132" y="380.631255" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="192.168791" y="380.63098" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="192.757451" y="380.630686" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="193.34611" y="380.630373" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="193.934769" y="380.63004" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="194.523429" y="380.629685" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="195.112088" y="380.629306" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="195.700747" y="380.628903" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="196.289407" y="380.628474" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="196.878066" y="380.628018" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="197.466725" y="380.627531" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="198.055385" y="380.627014" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="198.644044" y="380.626464" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="199.232703" y="380.625878" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="199.821363" y="380.625255" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="200.410022" y="380.624593" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="200.998681" y="380.623889" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="201.587341" y="380.623141" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="202.176" y="380.622346" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="202.764659" y="380.621501" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="203.353319" y="380.620604" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="203.941978" y="380.619651" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="204.530637" y="380.618639" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="205.119297" y="380.617565" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="205.707956" y="380.616424" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="206.296615" y="380.615214" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="206.885275" y="380.61393" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="207.473934" y="380.612566" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="208.062593" y="380.611117" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="208.651253" y="380.60958" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="209.239912" y="380.607949" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="209.828571" y="380.606222" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="210.417231" y="380.604392" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="211.00589" y="380.602453" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="211.594549" y="380.6004" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="212.183209" y="380.598227" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="212.771868" y="380.595926" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="213.360527" y="380.593491" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="213.949187" y="380.590915" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="214.537846" y="380.58819" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="215.126505" y="380.585307" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="215.715165" y="380.582259" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="216.303824" y="380.579037" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="216.892484" y="380.575631" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="217.481143" y="380.572031" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="218.069802" y="380.568228" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="218.658462" y="380.56421" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="219.247121" y="380.559967" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="219.83578" y="380.555487" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="220.42444" y="380.550756" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="221.013099" y="380.545764" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="221.601758" y="380.540496" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="222.190418" y="380.534937" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="222.779077" y="380.529075" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="223.367736" y="380.522892" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="223.956396" y="380.516373" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="224.545055" y="380.509501" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="225.133714" y="380.502259" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="225.722374" y="380.494626" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="226.311033" y="380.486591" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="226.899692" y="380.478067" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="227.488352" y="380.4691" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="228.077011" y="380.45966" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="228.66567" y="380.449726" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="229.25433" y="380.439273" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="229.842989" y="380.428279" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="230.431648" y="380.416715" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="231.020308" y="380.404556" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="231.608967" y="380.391773" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="232.197626" y="380.378336" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="232.786286" y="380.364216" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="233.374945" y="380.34938" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="233.963604" y="380.333796" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="234.552264" y="380.317428" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="235.140923" y="380.300242" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="235.729582" y="380.282199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="236.318242" y="380.263262" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="236.906901" y="380.243389" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="237.49556" y="380.22254" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="238.08422" y="380.200671" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="238.672879" y="380.177736" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="239.261538" y="380.15369" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="239.850198" y="380.128484" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="240.438857" y="380.102067" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="241.027516" y="380.07439" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="241.616176" y="380.045396" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="242.204835" y="380.015032" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="242.793495" y="379.983241" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="243.382154" y="379.949961" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="243.970813" y="379.915133" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="244.559473" y="379.8787" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="245.148132" y="379.840587" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="245.736791" y="379.800663" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="246.325451" y="379.758628" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="246.91411" y="379.714616" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="247.502769" y="379.668611" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="248.091429" y="379.62055" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="248.680088" y="379.57035" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="249.268747" y="379.517927" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="249.857407" y="379.463189" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="250.446066" y="379.406046" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="251.034725" y="379.346402" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="251.623385" y="379.28416" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="252.212044" y="379.219219" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="252.800703" y="379.151476" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="253.389363" y="379.080825" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="253.978022" y="379.007154" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="254.566681" y="378.930352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="255.155341" y="378.850302" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="255.744" y="378.766883" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="256.332659" y="378.679972" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="256.921319" y="378.589443" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="257.509978" y="378.495165" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="258.098637" y="378.397003" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="258.687297" y="378.29482" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="259.275956" y="378.188474" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="259.864615" y="378.07782" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="260.453275" y="377.962709" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="261.041934" y="377.842985" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="261.630593" y="377.71849" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="262.219253" y="377.58906" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="262.807912" y="377.45453" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="263.396571" y="377.314746" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="263.985231" y="377.169565" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="264.57389" y="377.018844" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="265.162549" y="376.861033" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="265.751209" y="376.697311" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="266.339868" y="376.527448" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="266.928527" y="376.351219" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="267.517187" y="376.168404" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="268.105846" y="375.978796" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="268.694505" y="375.782187" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="269.283165" y="375.578363" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="269.871824" y="375.367105" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="270.460484" y="375.14819" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="271.049143" y="374.921388" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="271.637802" y="374.686465" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="272.226462" y="374.443184" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="272.815121" y="374.1913" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="273.40378" y="373.930569" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="273.99244" y="373.660737" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="274.581099" y="373.381548" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="275.169758" y="373.092744" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="275.758418" y="372.794057" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="276.347077" y="372.48522" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="276.935736" y="372.165959" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="277.524396" y="371.835995" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="278.113055" y="371.495046" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="278.701714" y="371.142825" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="279.290374" y="370.779044" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="279.879033" y="370.403408" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="280.467692" y="370.015621" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="281.056352" y="369.615385" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="281.645011" y="369.202399" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="282.23367" y="368.776397" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="282.82233" y="368.336997" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="283.410989" y="367.883451" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="283.999648" y="367.415122" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="284.588308" y="366.932002" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="285.176967" y="366.434194" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="285.765626" y="365.921436" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="286.354286" y="365.393349" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="286.942945" y="364.849592" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="287.531604" y="364.289822" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="288.120264" y="363.713694" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="288.708923" y="363.120865" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="289.297582" y="362.510987" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="289.886242" y="361.883715" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="290.474901" y="361.238701" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="291.06356" y="360.575595" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="291.65222" y="359.894049" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="292.240879" y="359.193713" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="292.829538" y="358.474235" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="293.418198" y="357.735265" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="294.006857" y="356.976453" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="294.595516" y="356.197451" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="295.184176" y="355.397908" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="295.772835" y="354.577479" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="296.361495" y="353.735819" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="296.950154" y="352.872583" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="297.538813" y="351.987431" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="298.127473" y="351.080018" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="298.716132" y="350.150006" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="299.304791" y="349.197056" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="299.893451" y="348.220835" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="300.48211" y="347.22101" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="301.070769" y="346.197621" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="301.659429" y="345.149753" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="302.248088" y="344.077154" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="302.836747" y="342.976741" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="303.425407" y="341.852318" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="304.014066" y="340.702326" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="304.602725" y="339.526635" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="305.191385" y="338.324968" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="305.780044" y="337.097031" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="306.368703" y="335.842556" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="306.957363" y="334.561291" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="307.546022" y="333.252993" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="308.134681" y="331.917426" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="308.723341" y="330.554364" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="309.312" y="329.163589" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="309.900659" y="327.744898" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="310.489319" y="326.298097" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="311.077978" y="324.823005" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="311.666637" y="323.319451" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="312.255297" y="321.78728" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="312.843956" y="320.226348" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="313.432615" y="318.636525" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="314.021275" y="317.017695" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="314.609934" y="315.369755" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="315.198593" y="313.692617" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="315.787253" y="311.986204" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="316.375912" y="310.250455" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="316.964571" y="308.485326" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="317.553231" y="306.690786" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="318.14189" y="304.866826" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="318.730549" y="303.013449" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="319.319209" y="301.130689" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="319.907868" y="299.218588" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="320.496527" y="297.27702" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="321.085187" y="295.305618" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="321.673846" y="293.304238" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="322.262505" y="291.273326" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="322.851165" y="289.213507" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="323.439824" y="287.125119" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="324.028484" y="285.00832" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="324.617143" y="282.863303" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="325.205802" y="280.690313" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="325.794462" y="278.489622" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="326.383121" y="276.26152" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="326.97178" y="274.006321" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="327.56044" y="271.724356" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="328.149099" y="269.415978" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="328.737758" y="267.081562" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="329.326418" y="264.721504" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="329.915077" y="262.336227" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="330.503736" y="259.926175" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="331.092396" y="257.491814" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="331.681055" y="255.033639" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="332.269714" y="252.552166" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="332.858374" y="250.047935" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="333.447033" y="247.521514" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="334.035692" y="244.973492" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="334.624352" y="242.404485" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="335.213011" y="239.815134" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="335.80167" y="237.206103" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="336.39033" y="234.57808" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="336.978989" y="231.931775" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="337.567648" y="229.267917" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="338.156308" y="226.587251" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="338.744967" y="223.890552" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="339.333626" y="221.178725" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="339.922286" y="218.452801" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="340.510945" y="215.710209" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="341.099604" y="212.955256" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="341.688264" y="210.188644" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="342.276923" y="207.4112" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="342.865582" y="204.62388" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="343.454242" y="201.827662" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="344.042901" y="199.02354" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="344.63156" y="196.212522" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="345.22022" y="193.395635" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="345.808879" y="190.573925" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="346.397538" y="187.748455" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="346.986198" y="184.920308" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="347.574857" y="182.090586" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="348.163516" y="179.260406" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="348.752176" y="176.430903" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="349.340835" y="173.603227" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="349.929495" y="170.778542" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="350.518154" y="167.958026" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="351.106813" y="165.142873" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="351.695473" y="162.334287" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="352.284132" y="159.533484" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="352.872791" y="156.74169" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="353.461451" y="153.960143" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="354.05011" y="151.190087" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="354.638769" y="148.432772" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="355.227429" y="145.689452" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="355.816088" y="142.961381" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="356.404747" y="140.249826" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="356.993407" y="137.556082" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="357.582066" y="134.881526" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="358.170725" y="132.227646" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="358.759385" y="129.594563" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="359.348044" y="126.987828" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="359.936703" y="124.404411" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="360.525363" y="121.846751" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="361.114022" y="119.315961" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="361.702681" y="116.813261" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="362.291341" y="114.33992" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="362.88" y="111.897212" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="363.468659" y="109.486404" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="364.057319" y="107.108755" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="364.645978" y="104.765513" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="365.234637" y="102.457914" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="365.823297" y="100.187186" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="366.411956" y="97.954539" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="367.000615" y="95.761174" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="367.589275" y="93.608275" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="368.177934" y="91.497012" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="368.766593" y="89.428536" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="369.355253" y="87.403982" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="369.943912" y="85.424467" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="370.532571" y="83.491086" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="371.121231" y="81.604917" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="371.70989" y="79.767014" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="372.298549" y="77.978415" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="372.887209" y="76.240133" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="373.475868" y="74.553157" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="374.064527" y="72.918457" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="374.653187" y="71.336983" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="375.241846" y="69.809702" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="375.830505" y="68.33741" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="376.419165" y="66.921011" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="377.007824" y="65.561731" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="377.596484" y="64.262089" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="378.185143" y="63.023603" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="378.773802" y="61.844703" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="379.362462" y="60.725229" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="379.951121" y="59.666379" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="380.53978" y="58.668544" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="381.12844" y="57.732218" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="381.717099" y="56.857931" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="382.305758" y="56.046199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="382.894418" y="55.297498" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="383.483077" y="54.612267" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="384.071736" y="53.990912" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="384.660396" y="53.433799" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="385.249055" y="52.941263" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="385.837714" y="52.513597" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="386.426374" y="52.151061" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="387.015033" y="51.853873" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="387.603692" y="51.622212" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="388.192352" y="51.456219" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="388.781011" y="51.355994" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="389.36967" y="51.3216" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="389.95833" y="51.353058" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="390.546989" y="51.45035" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="391.135648" y="51.61342" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="391.724308" y="51.842172" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="392.312967" y="52.136471" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="392.901626" y="52.49614" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="393.490286" y="52.920959" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="394.078945" y="53.410669" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="394.667604" y="53.96499" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="395.256264" y="54.583518" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="395.844923" y="55.266207" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="396.433582" y="56.01038" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="397.022242" y="56.828276" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="397.610901" y="57.706704" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="398.19956" y="58.647396" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="398.78822" y="59.649475" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="399.376879" y="60.712435" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="399.965538" y="61.835651" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="400.554198" y="63.018479" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="401.142857" y="64.260234" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="401.731516" y="65.560191" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="402.320176" y="66.917588" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="402.908835" y="68.33163" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="403.497495" y="69.801495" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="404.086154" y="71.326333" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="404.674813" y="72.905264" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="405.263473" y="74.537382" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="405.852132" y="76.221754" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="406.440791" y="77.95742" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="407.029451" y="79.743396" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="407.61811" y="81.578675" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="408.206769" y="83.462225" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="408.795429" y="85.392994" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="409.384088" y="87.369909" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="409.972747" y="89.391875" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="410.561407" y="91.457779" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="411.150066" y="93.566486" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="411.738725" y="95.716843" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="412.327385" y="97.907671" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="412.916044" y="100.137762" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="413.504703" y="102.405852" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="414.093363" y="104.71072" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="414.682022" y="107.051049" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="415.270681" y="109.427081" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="415.859341" y="111.83916" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="416.448" y="114.284395" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="417.036659" y="116.760021" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="417.625319" y="119.264866" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="418.213978" y="121.797687" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="418.802637" y="124.357297" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="419.391297" y="126.942453" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="419.979956" y="129.551886" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="420.568615" y="132.184312" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="421.157275" y="134.838439" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="421.745934" y="137.512977" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="422.334593" y="140.206635" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="422.923253" y="142.918126" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="423.511912" y="145.646168" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="424.100571" y="148.389485" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="424.689231" y="151.146806" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="425.27789" y="153.916868" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="425.866549" y="156.698416" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="426.455209" y="159.490203" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="427.043868" y="162.290992" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="427.632527" y="165.099557" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="428.221187" y="167.914683" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="428.809846" y="170.735168" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="429.398505" y="173.559819" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="429.987165" y="176.38746" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="430.575824" y="179.216923" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="431.164484" y="182.047052" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="431.753143" y="184.876704" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="432.341802" y="187.704746" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="432.930462" y="190.530062" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="433.519121" y="193.351553" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="434.10778" y="196.168455" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="434.69644" y="198.978801" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="435.285099" y="201.782497" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="435.873758" y="204.578244" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="436.462418" y="207.365077" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="437.051077" y="210.142047" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="437.639736" y="212.908222" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="438.228396" y="215.662688" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="438.817055" y="218.404548" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="439.405714" y="221.132926" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="439.994374" y="223.846968" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="440.583033" y="226.545841" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="441.171692" y="229.228736" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="441.760352" y="231.894869" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="442.349011" y="234.543478" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="442.93767" y="237.173825" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="443.52633" y="239.785198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="444.114989" y="242.376908" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="444.703648" y="244.948289" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="445.292308" y="247.498702" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="445.880967" y="250.027529" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="446.469626" y="252.53418" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="447.058286" y="255.018086" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="447.646945" y="257.478706" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="448.235604" y="259.915523" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="448.824264" y="262.328049" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="449.412923" y="264.715831" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="450.001582" y="267.078443" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="450.590242" y="269.415509" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="451.178901" y="271.72674" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="451.76756" y="274.011574" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="452.35622" y="276.268685" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="452.944879" y="278.497039" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="453.533538" y="280.697036" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="454.122198" y="282.869371" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="454.710857" y="285.013975" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="455.299516" y="287.1305" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="455.888176" y="289.218693" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="456.476835" y="291.278339" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="457.065495" y="293.309257" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="457.654154" y="295.311293" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="458.242813" y="297.284318" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="458.831473" y="299.228224" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="459.420132" y="301.142925" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="460.008791" y="303.028353" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="460.597451" y="304.884458" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="461.18611" y="306.71121" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="461.774769" y="308.508595" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="462.363429" y="310.276618" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="462.952088" y="312.015301" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="463.540747" y="313.724681" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="464.129407" y="315.404813" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="464.718066" y="317.055768" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="465.306725" y="318.677631" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="465.895385" y="320.270503" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="466.484044" y="321.834498" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="467.072703" y="323.369748" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="467.661363" y="324.876392" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="468.250022" y="326.354584" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="468.838681" y="327.80449" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="469.427341" y="329.226273" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="470.016" y="330.620141" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="470.604659" y="331.986198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="471.193319" y="333.324327" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="471.781978" y="334.635537" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="472.370637" y="335.913578" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="472.959297" y="337.166" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="473.547956" y="338.392009" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="474.136615" y="339.591721" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="474.725275" y="340.765442" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="475.313934" y="341.913458" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="475.902593" y="343.036068" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="476.491253" y="344.133567" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="477.079912" y="345.206256" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="477.668571" y="346.254442" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="478.257231" y="347.278437" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="478.84589" y="348.27856" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="479.434549" y="349.255133" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="480.023209" y="350.208483" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="480.611868" y="351.138941" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="481.200527" y="352.046842" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="481.789187" y="352.932521" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="482.377846" y="353.79632" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="482.966505" y="354.63858" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="483.555165" y="355.459645" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="484.143824" y="356.259861" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="484.732484" y="357.039576" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="485.321143" y="357.799137" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="485.909802" y="358.538894" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="486.498462" y="359.259197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="487.087121" y="359.960398" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="487.67578" y="360.642848" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="488.26444" y="361.3069" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="488.853099" y="361.952908" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="489.441758" y="362.581226" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="490.030418" y="363.192205" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="490.619077" y="363.786196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="491.207736" y="364.359297" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="491.796396" y="364.916095" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="492.385055" y="365.456926" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="492.973714" y="365.982122" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="493.562374" y="366.492014" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="494.151033" y="366.98693" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="494.739692" y="367.467195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="495.328352" y="367.933135" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="495.917011" y="368.385072" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="496.50567" y="368.823327" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="497.09433" y="369.248217" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="497.682989" y="369.660056" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="498.271648" y="370.059154" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="498.860308" y="370.445819" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="499.448967" y="370.820353" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="500.037626" y="371.183056" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="500.626286" y="371.534221" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="501.214945" y="371.874141" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="501.803604" y="372.203101" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="502.392264" y="372.521385" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="502.980923" y="372.829269" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="503.569582" y="373.127028" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="504.158242" y="373.41493" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="504.746901" y="373.69324" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="505.33556" y="373.962219" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="505.92422" y="374.222123" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="506.512879" y="374.473205" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="507.101538" y="374.715715" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="507.690198" y="374.949898" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="508.278857" y="375.176002" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="508.867516" y="375.394199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="509.456176" y="375.604492" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="510.044835" y="375.806942" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="510.633495" y="376.00193" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="511.222154" y="376.189896" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="511.810813" y="376.37111" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="512.399473" y="376.545768" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="512.988132" y="376.714066" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="513.576791" y="376.876198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="514.165451" y="377.032352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="514.75411" y="377.182717" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="515.342769" y="377.327474" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="515.931429" y="377.466803" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="516.520088" y="377.600877" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="517.108747" y="377.729866" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="517.697407" y="377.853938" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="518.286066" y="377.973252" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="518.874725" y="378.087967" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="519.463385" y="378.198236" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="520.052044" y="378.304208" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="520.640703" y="378.406028" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="521.229363" y="378.503838" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="521.818022" y="378.597777" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="522.406681" y="378.687977" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="522.995341" y="378.774569" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="523.584" y="378.85768" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="524.172659" y="378.937434" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="524.761319" y="379.013949" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="525.349978" y="379.087343" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="525.938637" y="379.157726" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="526.527297" y="379.225209" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="527.115956" y="379.289898" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="527.704615" y="379.35188" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="528.293275" y="379.411215" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="528.881934" y="379.467976" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="529.470593" y="379.52228" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="530.059253" y="379.574259" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="530.647912" y="379.624016" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="531.236571" y="379.671635" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="531.825231" y="379.717198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="532.41389" y="379.760785" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="533.002549" y="379.802472" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="533.591209" y="379.842333" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="534.179868" y="379.88044" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="534.768527" y="379.916862" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="535.357187" y="379.951666" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="535.945846" y="379.984917" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="536.534505" y="380.016677" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="537.123165" y="380.047007" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="537.711824" y="380.075965" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="538.300484" y="380.103607" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="538.889143" y="380.129987" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="539.477802" y="380.155158" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="540.066462" y="380.179171" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="540.655121" y="380.202073" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="541.24378" y="380.223913" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="541.83244" y="380.244734" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="542.421099" y="380.26458" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="543.009758" y="380.283493" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="543.598418" y="380.301513" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="544.187077" y="380.318678" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="544.775736" y="380.335026" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="545.364396" y="380.350594" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="545.953055" y="380.365414" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="546.541714" y="380.379519" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="547.130374" y="380.392965" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="547.719033" y="380.405647" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="548.307692" y="380.41773" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="548.896352" y="380.429217" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="549.485011" y="380.440136" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="550.07367" y="380.450515" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="550.66233" y="380.460377" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="551.250989" y="380.469745" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="551.839648" y="380.478644" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="552.428308" y="380.487094" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="553.016967" y="380.495117" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="553.605626" y="380.502732" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="554.194286" y="380.50996" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="554.782945" y="380.516817" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="555.371604" y="380.523323" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="555.960264" y="380.529493" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="556.548923" y="380.535345" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="557.137582" y="380.540892" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="557.726242" y="380.54615" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="558.314901" y="380.551134" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="558.90356" y="380.555855" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="559.49222" y="380.560328" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="560.080879" y="380.564565" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="560.669538" y="380.568577" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="561.258198" y="380.572375" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="561.846857" y="380.575971" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="562.435516" y="380.579374" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="563.024176" y="380.582594" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="563.612835" y="380.585641" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="564.201495" y="380.588523" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="564.790154" y="380.591249" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="565.378813" y="380.593827" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="565.967473" y="380.596259" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="566.556132" y="380.598542" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="567.144791" y="380.600692" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="567.733451" y="380.602724" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="568.32211" y="380.604642" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="568.910769" y="380.606453" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="569.499429" y="380.608162" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="570.088088" y="380.609774" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="570.676747" y="380.611295" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="571.265407" y="380.61273" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="571.854066" y="380.614083" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="572.442725" y="380.615359" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="573.031385" y="380.616561" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="573.620044" y="380.617694" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="574.208703" y="380.618761" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="574.797363" y="380.619767" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="575.386022" y="380.620714" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="575.974681" y="380.621606" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="576.563341" y="380.622446" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="577.152" y="380.623236" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="577.740659" y="380.62398" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="578.329319" y="380.624679" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="578.917978" y="380.625338" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="579.506637" y="380.625957" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="580.095297" y="380.626539" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="580.683956" y="380.627086" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="581.272615" y="380.627601" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="581.861275" y="380.628084" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="582.449934" y="380.628539" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="583.038593" y="380.628965" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="583.627253" y="380.629366" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="584.215912" y="380.629743" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="584.804571" y="380.630096" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="585.393231" y="380.630426" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="585.98189" y="380.630735" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="586.570549" y="380.631024" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="587.159209" y="380.631296" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="587.747868" y="380.631551" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="588.336527" y="380.63179" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="588.925187" y="380.632014" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="589.513846" y="380.632223" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="590.102505" y="380.63242" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="590.691165" y="380.632604" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="591.279824" y="380.632776" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="591.868484" y="380.632938" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="592.457143" y="380.633089" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="593.045802" y="380.63323" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="593.634462" y="380.633362" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="594.223121" y="380.633486" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="594.81178" y="380.633602" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="595.40044" y="380.63371" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="595.989099" y="380.633811" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="596.577758" y="380.633906" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="597.166418" y="380.633995" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="597.755077" y="380.634077" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="598.343736" y="380.634154" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="598.932396" y="380.634226" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="599.521055" y="380.634294" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="600.109714" y="380.634357" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="600.698374" y="380.634415" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="601.287033" y="380.63447" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="601.875692" y="380.634521" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="602.464352" y="380.634569" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="603.053011" y="380.634613" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="603.64167" y="380.634655" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="604.23033" y="380.634693" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="604.818989" y="380.634729" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="605.407648" y="380.634762" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="605.996308" y="380.634794" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="606.584967" y="380.634823" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="607.173626" y="380.634849" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="607.762286" y="380.634875" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="608.350945" y="380.634898" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="608.939604" y="380.63492" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="609.528264" y="380.63494" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="610.116923" y="380.634959" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="610.705582" y="380.634976" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="611.294242" y="380.634993" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="611.882901" y="380.635008" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="612.47156" y="380.635022" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="613.06022" y="380.635035" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="613.648879" y="380.635047" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="614.237538" y="380.635058" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="614.826198" y="380.635069" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="615.414857" y="380.635078" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="616.003516" y="380.635088" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="616.592176" y="380.635096" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="617.180835" y="380.635104" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="617.769495" y="380.635111" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="618.358154" y="380.635118" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="618.946813" y="380.635124" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="619.535473" y="380.63513" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="620.124132" y="380.635135" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="620.712791" y="380.63514" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="621.301451" y="380.635144" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="621.89011" y="380.635149" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="622.478769" y="380.635153" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="623.067429" y="380.635156" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="623.656088" y="380.63516" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="624.244747" y="380.635163" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="624.833407" y="380.635166" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="625.422066" y="380.635168" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="626.010725" y="380.635171" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="626.599385" y="380.635173" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="627.188044" y="380.635175" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="627.776703" y="380.635177" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="628.365363" y="380.635179" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="628.954022" y="380.63518" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="629.542681" y="380.635182" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="630.131341" y="380.635183" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="630.72" y="380.635185" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="631.308659" y="380.635186" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="631.897319" y="380.635187" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="632.485978" y="380.635188" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="633.074637" y="380.635189" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="633.663297" y="380.63519" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="634.251956" y="380.635191" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="634.840615" y="380.635191" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="635.429275" y="380.635192" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="636.017934" y="380.635193" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="636.606593" y="380.635193" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="637.195253" y="380.635194" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="637.783912" y="380.635194" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="638.372571" y="380.635195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="638.961231" y="380.635195" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="639.54989" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="640.138549" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="640.727209" y="380.635196" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="641.315868" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="641.904527" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="642.493187" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="643.081846" y="380.635197" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="643.670505" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="644.259165" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="644.847824" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="645.436484" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="646.025143" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="646.613802" y="380.635198" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="647.202462" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="647.791121" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="648.37978" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="648.96844" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="649.557099" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="650.145758" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="650.734418" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="651.323077" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="651.911736" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="652.500396" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="653.089055" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="653.677714" y="380.635199" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="654.266374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="654.855033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="655.443692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="656.032352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="656.621011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="657.20967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="657.79833" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="658.386989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="658.975648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="659.564308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="660.152967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="660.741626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="661.330286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="661.918945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="662.507604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="663.096264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="663.684923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="664.273582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="664.862242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="665.450901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="666.03956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="666.62822" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="667.216879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="667.805538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="668.394198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="668.982857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="669.571516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="670.160176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="670.748835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="671.337495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="671.926154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="672.514813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="673.103473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="673.692132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="674.280791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="674.869451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="675.45811" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="676.046769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="676.635429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="677.224088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="677.812747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="678.401407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="678.990066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="679.578725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="680.167385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="680.756044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="681.344703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="681.933363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="682.522022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="683.110681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m7b5e1d1292" x="683.699341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
</g>
</g>
<g id="patch_3">
<path d="M 95.04 380.6352
L 95.04 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_4">
<path d="M 684.288 380.6352
L 684.288 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_5">
<path d="M 95.04 380.6352
L 684.288 380.6352
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_6">
<path d="M 95.04 51.3216
L 684.288 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="text_15">
<!-- T = 10000 -->
<g transform="translate(326.4765 45.3216)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-20" transform="scale(0.015625)"/>
<path id="DejaVuSans-3d" d="M 678 2906
L 4684 2906
L 4684 2381
L 678 2381
L 678 2906
z
M 678 1631
L 4684 1631
L 4684 1100
L 678 1100
L 678 1631
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-54"/>
<use xlink:href="#DejaVuSans-20" x="61.083984"/>
<use xlink:href="#DejaVuSans-3d" x="92.871094"/>
<use xlink:href="#DejaVuSans-20" x="176.660156"/>
<use xlink:href="#DejaVuSans-31" x="208.447266"/>
<use xlink:href="#DejaVuSans-30" x="272.070312"/>
<use xlink:href="#DejaVuSans-30" x="335.693359"/>
<use xlink:href="#DejaVuSans-30" x="399.316406"/>
<use xlink:href="#DejaVuSans-30" x="462.939453"/>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="p24d58054f1">
<rect x="95.04" y="51.3216" width="589.248" height="329.3136"/>
</clipPath>
</defs>
</svg>
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="760.32pt" height="427.68pt" viewBox="0 0 760.32 427.68" xmlns="http://www.w3.org/2000/svg" version="1.1">
<metadata>
<rdf:RDF 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#">
<cc:Work>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:date>2022-04-18T06:58:18.768147</dc:date>
<dc:format>image/svg+xml</dc:format>
<dc:creator>
<cc:Agent>
<dc:title>Matplotlib v3.5.1, https://matplotlib.org/</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
<defs>
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 427.68
L 760.32 427.68
L 760.32 0
L 0 0
z
" style="fill: #ffffff"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 95.04 380.6352
L 684.288 380.6352
L 684.288 51.3216
L 95.04 51.3216
z
" style="fill: #ffffff"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path id="mdbd2280614" d="M 0 0
L 0 3.5
" style="stroke: #000000; stroke-width: 0.8"/>
</defs>
<g>
<use xlink:href="#mdbd2280614" x="95.04" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_1">
<!-- 0 -->
<g transform="translate(91.85875 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-30" d="M 2034 4250
Q 1547 4250 1301 3770
Q 1056 3291 1056 2328
Q 1056 1369 1301 889
Q 1547 409 2034 409
Q 2525 409 2770 889
Q 3016 1369 3016 2328
Q 3016 3291 2770 3770
Q 2525 4250 2034 4250
z
M 2034 4750
Q 2819 4750 3233 4129
Q 3647 3509 3647 2328
Q 3647 1150 3233 529
Q 2819 -91 2034 -91
Q 1250 -91 836 529
Q 422 1150 422 2328
Q 422 3509 836 4129
Q 1250 4750 2034 4750
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use xlink:href="#mdbd2280614" x="212.771868" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_2">
<!-- 200 -->
<g transform="translate(203.228118 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-32" d="M 1228 531
L 3431 531
L 3431 0
L 469 0
L 469 531
Q 828 903 1448 1529
Q 2069 2156 2228 2338
Q 2531 2678 2651 2914
Q 2772 3150 2772 3378
Q 2772 3750 2511 3984
Q 2250 4219 1831 4219
Q 1534 4219 1204 4116
Q 875 4013 500 3803
L 500 4441
Q 881 4594 1212 4672
Q 1544 4750 1819 4750
Q 2544 4750 2975 4387
Q 3406 4025 3406 3419
Q 3406 3131 3298 2873
Q 3191 2616 2906 2266
Q 2828 2175 2409 1742
Q 1991 1309 1228 531
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-32"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use xlink:href="#mdbd2280614" x="330.503736" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_3">
<!-- 400 -->
<g transform="translate(320.959986 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-34" d="M 2419 4116
L 825 1625
L 2419 1625
L 2419 4116
z
M 2253 4666
L 3047 4666
L 3047 1625
L 3713 1625
L 3713 1100
L 3047 1100
L 3047 0
L 2419 0
L 2419 1100
L 313 1100
L 313 1709
L 2253 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-34"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use xlink:href="#mdbd2280614" x="448.235604" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_4">
<!-- 600 -->
<g transform="translate(438.691854 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-36" d="M 2113 2584
Q 1688 2584 1439 2293
Q 1191 2003 1191 1497
Q 1191 994 1439 701
Q 1688 409 2113 409
Q 2538 409 2786 701
Q 3034 994 3034 1497
Q 3034 2003 2786 2293
Q 2538 2584 2113 2584
z
M 3366 4563
L 3366 3988
Q 3128 4100 2886 4159
Q 2644 4219 2406 4219
Q 1781 4219 1451 3797
Q 1122 3375 1075 2522
Q 1259 2794 1537 2939
Q 1816 3084 2150 3084
Q 2853 3084 3261 2657
Q 3669 2231 3669 1497
Q 3669 778 3244 343
Q 2819 -91 2113 -91
Q 1303 -91 875 529
Q 447 1150 447 2328
Q 447 3434 972 4092
Q 1497 4750 2381 4750
Q 2619 4750 2861 4703
Q 3103 4656 3366 4563
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-36"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use xlink:href="#mdbd2280614" x="565.967473" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_5">
<!-- 800 -->
<g transform="translate(556.423723 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-38" d="M 2034 2216
Q 1584 2216 1326 1975
Q 1069 1734 1069 1313
Q 1069 891 1326 650
Q 1584 409 2034 409
Q 2484 409 2743 651
Q 3003 894 3003 1313
Q 3003 1734 2745 1975
Q 2488 2216 2034 2216
z
M 1403 2484
Q 997 2584 770 2862
Q 544 3141 544 3541
Q 544 4100 942 4425
Q 1341 4750 2034 4750
Q 2731 4750 3128 4425
Q 3525 4100 3525 3541
Q 3525 3141 3298 2862
Q 3072 2584 2669 2484
Q 3125 2378 3379 2068
Q 3634 1759 3634 1313
Q 3634 634 3220 271
Q 2806 -91 2034 -91
Q 1263 -91 848 271
Q 434 634 434 1313
Q 434 1759 690 2068
Q 947 2378 1403 2484
z
M 1172 3481
Q 1172 3119 1398 2916
Q 1625 2713 2034 2713
Q 2441 2713 2670 2916
Q 2900 3119 2900 3481
Q 2900 3844 2670 4047
Q 2441 4250 2034 4250
Q 1625 4250 1398 4047
Q 1172 3844 1172 3481
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-38"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use xlink:href="#mdbd2280614" x="683.699341" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_6">
<!-- 1000 -->
<g transform="translate(670.974341 395.233637)scale(0.1 -0.1)">
<defs>
<path id="DejaVuSans-31" d="M 794 531
L 1825 531
L 1825 4091
L 703 3866
L 703 4441
L 1819 4666
L 2450 4666
L 2450 531
L 3481 531
L 3481 0
L 794 0
L 794 531
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-31"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="text_7">
<!-- Position -->
<g transform="translate(342.95025 419.549575)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-50" d="M 1259 4147
L 1259 2394
L 2053 2394
Q 2494 2394 2734 2622
Q 2975 2850 2975 3272
Q 2975 3691 2734 3919
Q 2494 4147 2053 4147
L 1259 4147
z
M 628 4666
L 2053 4666
Q 2838 4666 3239 4311
Q 3641 3956 3641 3272
Q 3641 2581 3239 2228
Q 2838 1875 2053 1875
L 1259 1875
L 1259 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6f" d="M 1959 3097
Q 1497 3097 1228 2736
Q 959 2375 959 1747
Q 959 1119 1226 758
Q 1494 397 1959 397
Q 2419 397 2687 759
Q 2956 1122 2956 1747
Q 2956 2369 2687 2733
Q 2419 3097 1959 3097
z
M 1959 3584
Q 2709 3584 3137 3096
Q 3566 2609 3566 1747
Q 3566 888 3137 398
Q 2709 -91 1959 -91
Q 1206 -91 779 398
Q 353 888 353 1747
Q 353 2609 779 3096
Q 1206 3584 1959 3584
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-73" d="M 2834 3397
L 2834 2853
Q 2591 2978 2328 3040
Q 2066 3103 1784 3103
Q 1356 3103 1142 2972
Q 928 2841 928 2578
Q 928 2378 1081 2264
Q 1234 2150 1697 2047
L 1894 2003
Q 2506 1872 2764 1633
Q 3022 1394 3022 966
Q 3022 478 2636 193
Q 2250 -91 1575 -91
Q 1294 -91 989 -36
Q 684 19 347 128
L 347 722
Q 666 556 975 473
Q 1284 391 1588 391
Q 1994 391 2212 530
Q 2431 669 2431 922
Q 2431 1156 2273 1281
Q 2116 1406 1581 1522
L 1381 1569
Q 847 1681 609 1914
Q 372 2147 372 2553
Q 372 3047 722 3315
Q 1072 3584 1716 3584
Q 2034 3584 2315 3537
Q 2597 3491 2834 3397
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-69" d="M 603 3500
L 1178 3500
L 1178 0
L 603 0
L 603 3500
z
M 603 4863
L 1178 4863
L 1178 4134
L 603 4134
L 603 4863
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-74" d="M 1172 4494
L 1172 3500
L 2356 3500
L 2356 3053
L 1172 3053
L 1172 1153
Q 1172 725 1289 603
Q 1406 481 1766 481
L 2356 481
L 2356 0
L 1766 0
Q 1100 0 847 248
Q 594 497 594 1153
L 594 3053
L 172 3053
L 172 3500
L 594 3500
L 594 4494
L 1172 4494
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6e" d="M 3513 2113
L 3513 0
L 2938 0
L 2938 2094
Q 2938 2591 2744 2837
Q 2550 3084 2163 3084
Q 1697 3084 1428 2787
Q 1159 2491 1159 1978
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1366 3272 1645 3428
Q 1925 3584 2291 3584
Q 2894 3584 3203 3211
Q 3513 2838 3513 2113
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-50"/>
<use xlink:href="#DejaVuSans-6f" x="56.677734"/>
<use xlink:href="#DejaVuSans-73" x="117.859375"/>
<use xlink:href="#DejaVuSans-69" x="169.958984"/>
<use xlink:href="#DejaVuSans-74" x="197.742188"/>
<use xlink:href="#DejaVuSans-69" x="236.951172"/>
<use xlink:href="#DejaVuSans-6f" x="264.734375"/>
<use xlink:href="#DejaVuSans-6e" x="325.916016"/>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_7">
<defs>
<path id="maf970daf46" d="M 0 0
L -3.5 0
" style="stroke: #000000; stroke-width: 0.8"/>
</defs>
<g>
<use xlink:href="#maf970daf46" x="95.04" y="380.6352" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_8">
<!-- 0 -->
<g transform="translate(81.6775 384.434419)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_8">
<g>
<use xlink:href="#maf970daf46" x="95.04" y="314.779066" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_9">
<!-- 2000 -->
<g transform="translate(62.59 318.578284)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_9">
<g>
<use xlink:href="#maf970daf46" x="95.04" y="248.922931" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_10">
<!-- 4000 -->
<g transform="translate(62.59 252.72215)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_10">
<g>
<use xlink:href="#maf970daf46" x="95.04" y="183.066797" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_11">
<!-- 6000 -->
<g transform="translate(62.59 186.866016)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-36"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_11">
<g>
<use xlink:href="#maf970daf46" x="95.04" y="117.210662" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_12">
<!-- 8000 -->
<g transform="translate(62.59 121.009881)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-38"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_12">
<g>
<use xlink:href="#maf970daf46" x="95.04" y="51.354528" style="stroke: #000000; stroke-width: 0.8"/>
</g>
</g>
<g id="text_13">
<!-- 10000 -->
<g transform="translate(56.2275 55.153747)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use xlink:href="#DejaVuSans-30" x="63.623047"/>
<use xlink:href="#DejaVuSans-30" x="127.246094"/>
<use xlink:href="#DejaVuSans-30" x="190.869141"/>
<use xlink:href="#DejaVuSans-30" x="254.492188"/>
</g>
</g>
</g>
<g id="text_14">
<!-- Temperature -->
<g transform="translate(47.23625 291.985275)rotate(-90)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-54" d="M -19 4666
L 3928 4666
L 3928 4134
L 2272 4134
L 2272 0
L 1638 0
L 1638 4134
L -19 4134
L -19 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-65" d="M 3597 1894
L 3597 1613
L 953 1613
Q 991 1019 1311 708
Q 1631 397 2203 397
Q 2534 397 2845 478
Q 3156 559 3463 722
L 3463 178
Q 3153 47 2828 -22
Q 2503 -91 2169 -91
Q 1331 -91 842 396
Q 353 884 353 1716
Q 353 2575 817 3079
Q 1281 3584 2069 3584
Q 2775 3584 3186 3129
Q 3597 2675 3597 1894
z
M 3022 2063
Q 3016 2534 2758 2815
Q 2500 3097 2075 3097
Q 1594 3097 1305 2825
Q 1016 2553 972 2059
L 3022 2063
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6d" d="M 3328 2828
Q 3544 3216 3844 3400
Q 4144 3584 4550 3584
Q 5097 3584 5394 3201
Q 5691 2819 5691 2113
L 5691 0
L 5113 0
L 5113 2094
Q 5113 2597 4934 2840
Q 4756 3084 4391 3084
Q 3944 3084 3684 2787
Q 3425 2491 3425 1978
L 3425 0
L 2847 0
L 2847 2094
Q 2847 2600 2669 2842
Q 2491 3084 2119 3084
Q 1678 3084 1418 2786
Q 1159 2488 1159 1978
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1356 3278 1631 3431
Q 1906 3584 2284 3584
Q 2666 3584 2933 3390
Q 3200 3197 3328 2828
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-70" d="M 1159 525
L 1159 -1331
L 581 -1331
L 581 3500
L 1159 3500
L 1159 2969
Q 1341 3281 1617 3432
Q 1894 3584 2278 3584
Q 2916 3584 3314 3078
Q 3713 2572 3713 1747
Q 3713 922 3314 415
Q 2916 -91 2278 -91
Q 1894 -91 1617 61
Q 1341 213 1159 525
z
M 3116 1747
Q 3116 2381 2855 2742
Q 2594 3103 2138 3103
Q 1681 3103 1420 2742
Q 1159 2381 1159 1747
Q 1159 1113 1420 752
Q 1681 391 2138 391
Q 2594 391 2855 752
Q 3116 1113 3116 1747
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-72" d="M 2631 2963
Q 2534 3019 2420 3045
Q 2306 3072 2169 3072
Q 1681 3072 1420 2755
Q 1159 2438 1159 1844
L 1159 0
L 581 0
L 581 3500
L 1159 3500
L 1159 2956
Q 1341 3275 1631 3429
Q 1922 3584 2338 3584
Q 2397 3584 2469 3576
Q 2541 3569 2628 3553
L 2631 2963
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-61" d="M 2194 1759
Q 1497 1759 1228 1600
Q 959 1441 959 1056
Q 959 750 1161 570
Q 1363 391 1709 391
Q 2188 391 2477 730
Q 2766 1069 2766 1631
L 2766 1759
L 2194 1759
z
M 3341 1997
L 3341 0
L 2766 0
L 2766 531
Q 2569 213 2275 61
Q 1981 -91 1556 -91
Q 1019 -91 701 211
Q 384 513 384 1019
Q 384 1609 779 1909
Q 1175 2209 1959 2209
L 2766 2209
L 2766 2266
Q 2766 2663 2505 2880
Q 2244 3097 1772 3097
Q 1472 3097 1187 3025
Q 903 2953 641 2809
L 641 3341
Q 956 3463 1253 3523
Q 1550 3584 1831 3584
Q 2591 3584 2966 3190
Q 3341 2797 3341 1997
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-75" d="M 544 1381
L 544 3500
L 1119 3500
L 1119 1403
Q 1119 906 1312 657
Q 1506 409 1894 409
Q 2359 409 2629 706
Q 2900 1003 2900 1516
L 2900 3500
L 3475 3500
L 3475 0
L 2900 0
L 2900 538
Q 2691 219 2414 64
Q 2138 -91 1772 -91
Q 1169 -91 856 284
Q 544 659 544 1381
z
M 1991 3584
L 1991 3584
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-54"/>
<use xlink:href="#DejaVuSans-65" x="44.083984"/>
<use xlink:href="#DejaVuSans-6d" x="105.607422"/>
<use xlink:href="#DejaVuSans-70" x="203.019531"/>
<use xlink:href="#DejaVuSans-65" x="266.496094"/>
<use xlink:href="#DejaVuSans-72" x="328.019531"/>
<use xlink:href="#DejaVuSans-61" x="369.132812"/>
<use xlink:href="#DejaVuSans-74" x="430.412109"/>
<use xlink:href="#DejaVuSans-75" x="469.621094"/>
<use xlink:href="#DejaVuSans-72" x="533"/>
<use xlink:href="#DejaVuSans-65" x="571.863281"/>
</g>
</g>
</g>
<g id="line2d_13">
<path d="M 95.04 380.6352
L 388.781011 380.6352
L 389.36967 51.354528
L 389.95833 380.6352
L 683.699341 380.6352
L 683.699341 380.6352
" clip-path="url(#pe338a5f14f)" style="fill: none; stroke: #000000; stroke-width: 3; stroke-linecap: square"/>
<defs>
<path id="m9f78a702ea" d="M 0 -3
L -0.673542 -0.927051
L -2.85317 -0.927051
L -1.089814 0.354102
L -1.763356 2.427051
L -0 1.145898
L 1.763356 2.427051
L 1.089814 0.354102
L 2.85317 -0.927051
L 0.673542 -0.927051
z
" style="stroke: #000000; stroke-linejoin: bevel"/>
</defs>
<g clip-path="url(#pe338a5f14f)">
<use xlink:href="#m9f78a702ea" x="95.04" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="95.628659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="96.217319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="96.805978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="97.394637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="97.983297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="98.571956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="99.160615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="99.749275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="100.337934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="100.926593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="101.515253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="102.103912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="102.692571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="103.281231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="103.86989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="104.458549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="105.047209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="105.635868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="106.224527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="106.813187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="107.401846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="107.990505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="108.579165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="109.167824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="109.756484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="110.345143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="110.933802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="111.522462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="112.111121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="112.69978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="113.28844" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="113.877099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="114.465758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="115.054418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="115.643077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="116.231736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="116.820396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="117.409055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="117.997714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="118.586374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="119.175033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="119.763692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="120.352352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="120.941011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="121.52967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="122.11833" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="122.706989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="123.295648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="123.884308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="124.472967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="125.061626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="125.650286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="126.238945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="126.827604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="127.416264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="128.004923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="128.593582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="129.182242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="129.770901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="130.35956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="130.94822" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="131.536879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="132.125538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="132.714198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="133.302857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="133.891516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="134.480176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="135.068835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="135.657495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="136.246154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="136.834813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="137.423473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="138.012132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="138.600791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="139.189451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="139.77811" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="140.366769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="140.955429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="141.544088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="142.132747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="142.721407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="143.310066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="143.898725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="144.487385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="145.076044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="145.664703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="146.253363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="146.842022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="147.430681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="148.019341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="148.608" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="149.196659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="149.785319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="150.373978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="150.962637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="151.551297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="152.139956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="152.728615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="153.317275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="153.905934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="154.494593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="155.083253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="155.671912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="156.260571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="156.849231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="157.43789" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="158.026549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="158.615209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="159.203868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="159.792527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="160.381187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="160.969846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="161.558505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="162.147165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="162.735824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="163.324484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="163.913143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="164.501802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="165.090462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="165.679121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="166.26778" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="166.85644" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="167.445099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="168.033758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="168.622418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="169.211077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="169.799736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="170.388396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="170.977055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="171.565714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="172.154374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="172.743033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="173.331692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="173.920352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="174.509011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="175.09767" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="175.68633" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="176.274989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="176.863648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="177.452308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="178.040967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="178.629626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="179.218286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="179.806945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="180.395604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="180.984264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="181.572923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="182.161582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="182.750242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="183.338901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="183.92756" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="184.51622" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="185.104879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="185.693538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="186.282198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="186.870857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="187.459516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="188.048176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="188.636835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="189.225495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="189.814154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="190.402813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="190.991473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="191.580132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="192.168791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="192.757451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="193.34611" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="193.934769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="194.523429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="195.112088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="195.700747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="196.289407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="196.878066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="197.466725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="198.055385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="198.644044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="199.232703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="199.821363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="200.410022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="200.998681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="201.587341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="202.176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="202.764659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="203.353319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="203.941978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="204.530637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="205.119297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="205.707956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="206.296615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="206.885275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="207.473934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="208.062593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="208.651253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="209.239912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="209.828571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="210.417231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="211.00589" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="211.594549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="212.183209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="212.771868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="213.360527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="213.949187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="214.537846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="215.126505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="215.715165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="216.303824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="216.892484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="217.481143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="218.069802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="218.658462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="219.247121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="219.83578" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="220.42444" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="221.013099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="221.601758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="222.190418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="222.779077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="223.367736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="223.956396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="224.545055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="225.133714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="225.722374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="226.311033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="226.899692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="227.488352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="228.077011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="228.66567" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="229.25433" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="229.842989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="230.431648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="231.020308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="231.608967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="232.197626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="232.786286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="233.374945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="233.963604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="234.552264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="235.140923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="235.729582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="236.318242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="236.906901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="237.49556" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="238.08422" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="238.672879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="239.261538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="239.850198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="240.438857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="241.027516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="241.616176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="242.204835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="242.793495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="243.382154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="243.970813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="244.559473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="245.148132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="245.736791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="246.325451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="246.91411" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="247.502769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="248.091429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="248.680088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="249.268747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="249.857407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="250.446066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="251.034725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="251.623385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="252.212044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="252.800703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="253.389363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="253.978022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="254.566681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="255.155341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="255.744" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="256.332659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="256.921319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="257.509978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="258.098637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="258.687297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="259.275956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="259.864615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="260.453275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="261.041934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="261.630593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="262.219253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="262.807912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="263.396571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="263.985231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="264.57389" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="265.162549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="265.751209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="266.339868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="266.928527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="267.517187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="268.105846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="268.694505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="269.283165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="269.871824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="270.460484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="271.049143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="271.637802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="272.226462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="272.815121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="273.40378" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="273.99244" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="274.581099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="275.169758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="275.758418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="276.347077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="276.935736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="277.524396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="278.113055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="278.701714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="279.290374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="279.879033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="280.467692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="281.056352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="281.645011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="282.23367" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="282.82233" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="283.410989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="283.999648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="284.588308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="285.176967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="285.765626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="286.354286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="286.942945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="287.531604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="288.120264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="288.708923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="289.297582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="289.886242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="290.474901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="291.06356" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="291.65222" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="292.240879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="292.829538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="293.418198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="294.006857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="294.595516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="295.184176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="295.772835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="296.361495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="296.950154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="297.538813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="298.127473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="298.716132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="299.304791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="299.893451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="300.48211" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="301.070769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="301.659429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="302.248088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="302.836747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="303.425407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="304.014066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="304.602725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="305.191385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="305.780044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="306.368703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="306.957363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="307.546022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="308.134681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="308.723341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="309.312" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="309.900659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="310.489319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="311.077978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="311.666637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="312.255297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="312.843956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="313.432615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="314.021275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="314.609934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="315.198593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="315.787253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="316.375912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="316.964571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="317.553231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="318.14189" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="318.730549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="319.319209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="319.907868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="320.496527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="321.085187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="321.673846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="322.262505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="322.851165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="323.439824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="324.028484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="324.617143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="325.205802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="325.794462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="326.383121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="326.97178" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="327.56044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="328.149099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="328.737758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="329.326418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="329.915077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="330.503736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="331.092396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="331.681055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="332.269714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="332.858374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="333.447033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="334.035692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="334.624352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="335.213011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="335.80167" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="336.39033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="336.978989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="337.567648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="338.156308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="338.744967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="339.333626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="339.922286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="340.510945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="341.099604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="341.688264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="342.276923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="342.865582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="343.454242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="344.042901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="344.63156" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="345.22022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="345.808879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="346.397538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="346.986198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="347.574857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="348.163516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="348.752176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="349.340835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="349.929495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="350.518154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="351.106813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="351.695473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="352.284132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="352.872791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="353.461451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="354.05011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="354.638769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="355.227429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="355.816088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="356.404747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="356.993407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="357.582066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="358.170725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="358.759385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="359.348044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="359.936703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="360.525363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="361.114022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="361.702681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="362.291341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="362.88" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="363.468659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="364.057319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="364.645978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="365.234637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="365.823297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="366.411956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="367.000615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="367.589275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="368.177934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="368.766593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="369.355253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="369.943912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="370.532571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="371.121231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="371.70989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="372.298549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="372.887209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="373.475868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="374.064527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="374.653187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="375.241846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="375.830505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="376.419165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="377.007824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="377.596484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="378.185143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="378.773802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="379.362462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="379.951121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="380.53978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="381.12844" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="381.717099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="382.305758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="382.894418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="383.483077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="384.071736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="384.660396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="385.249055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="385.837714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="386.426374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="387.015033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="387.603692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="388.192352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="388.781011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="389.36967" y="51.354528" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="389.95833" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="390.546989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="391.135648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="391.724308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="392.312967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="392.901626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="393.490286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="394.078945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="394.667604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="395.256264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="395.844923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="396.433582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="397.022242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="397.610901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="398.19956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="398.78822" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="399.376879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="399.965538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="400.554198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="401.142857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="401.731516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="402.320176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="402.908835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="403.497495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="404.086154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="404.674813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="405.263473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="405.852132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="406.440791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="407.029451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="407.61811" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="408.206769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="408.795429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="409.384088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="409.972747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="410.561407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="411.150066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="411.738725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="412.327385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="412.916044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="413.504703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="414.093363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="414.682022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="415.270681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="415.859341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="416.448" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="417.036659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="417.625319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="418.213978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="418.802637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="419.391297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="419.979956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="420.568615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="421.157275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="421.745934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="422.334593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="422.923253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="423.511912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="424.100571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="424.689231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="425.27789" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="425.866549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="426.455209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="427.043868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="427.632527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="428.221187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="428.809846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="429.398505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="429.987165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="430.575824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="431.164484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="431.753143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="432.341802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="432.930462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="433.519121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="434.10778" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="434.69644" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="435.285099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="435.873758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="436.462418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="437.051077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="437.639736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="438.228396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="438.817055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="439.405714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="439.994374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="440.583033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="441.171692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="441.760352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="442.349011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="442.93767" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="443.52633" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="444.114989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="444.703648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="445.292308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="445.880967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="446.469626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="447.058286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="447.646945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="448.235604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="448.824264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="449.412923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="450.001582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="450.590242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="451.178901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="451.76756" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="452.35622" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="452.944879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="453.533538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="454.122198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="454.710857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="455.299516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="455.888176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="456.476835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="457.065495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="457.654154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="458.242813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="458.831473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="459.420132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="460.008791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="460.597451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="461.18611" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="461.774769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="462.363429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="462.952088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="463.540747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="464.129407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="464.718066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="465.306725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="465.895385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="466.484044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="467.072703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="467.661363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="468.250022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="468.838681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="469.427341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="470.016" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="470.604659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="471.193319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="471.781978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="472.370637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="472.959297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="473.547956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="474.136615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="474.725275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="475.313934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="475.902593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="476.491253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="477.079912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="477.668571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="478.257231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="478.84589" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="479.434549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="480.023209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="480.611868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="481.200527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="481.789187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="482.377846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="482.966505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="483.555165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="484.143824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="484.732484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="485.321143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="485.909802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="486.498462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="487.087121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="487.67578" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="488.26444" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="488.853099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="489.441758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="490.030418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="490.619077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="491.207736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="491.796396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="492.385055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="492.973714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="493.562374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="494.151033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="494.739692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="495.328352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="495.917011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="496.50567" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="497.09433" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="497.682989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="498.271648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="498.860308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="499.448967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="500.037626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="500.626286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="501.214945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="501.803604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="502.392264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="502.980923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="503.569582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="504.158242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="504.746901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="505.33556" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="505.92422" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="506.512879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="507.101538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="507.690198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="508.278857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="508.867516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="509.456176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="510.044835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="510.633495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="511.222154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="511.810813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="512.399473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="512.988132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="513.576791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="514.165451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="514.75411" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="515.342769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="515.931429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="516.520088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="517.108747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="517.697407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="518.286066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="518.874725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="519.463385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="520.052044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="520.640703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="521.229363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="521.818022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="522.406681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="522.995341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="523.584" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="524.172659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="524.761319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="525.349978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="525.938637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="526.527297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="527.115956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="527.704615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="528.293275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="528.881934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="529.470593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="530.059253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="530.647912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="531.236571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="531.825231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="532.41389" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="533.002549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="533.591209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="534.179868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="534.768527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="535.357187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="535.945846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="536.534505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="537.123165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="537.711824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="538.300484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="538.889143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="539.477802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="540.066462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="540.655121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="541.24378" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="541.83244" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="542.421099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="543.009758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="543.598418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="544.187077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="544.775736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="545.364396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="545.953055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="546.541714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="547.130374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="547.719033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="548.307692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="548.896352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="549.485011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="550.07367" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="550.66233" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="551.250989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="551.839648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="552.428308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="553.016967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="553.605626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="554.194286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="554.782945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="555.371604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="555.960264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="556.548923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="557.137582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="557.726242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="558.314901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="558.90356" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="559.49222" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="560.080879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="560.669538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="561.258198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="561.846857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="562.435516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="563.024176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="563.612835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="564.201495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="564.790154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="565.378813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="565.967473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="566.556132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="567.144791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="567.733451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="568.32211" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="568.910769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="569.499429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="570.088088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="570.676747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="571.265407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="571.854066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="572.442725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="573.031385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="573.620044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="574.208703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="574.797363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="575.386022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="575.974681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="576.563341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="577.152" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="577.740659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="578.329319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="578.917978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="579.506637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="580.095297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="580.683956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="581.272615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="581.861275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="582.449934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="583.038593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="583.627253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="584.215912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="584.804571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="585.393231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="585.98189" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="586.570549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="587.159209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="587.747868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="588.336527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="588.925187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="589.513846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="590.102505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="590.691165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="591.279824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="591.868484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="592.457143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="593.045802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="593.634462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="594.223121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="594.81178" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="595.40044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="595.989099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="596.577758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="597.166418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="597.755077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="598.343736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="598.932396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="599.521055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="600.109714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="600.698374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="601.287033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="601.875692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="602.464352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="603.053011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="603.64167" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="604.23033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="604.818989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="605.407648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="605.996308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="606.584967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="607.173626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="607.762286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="608.350945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="608.939604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="609.528264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="610.116923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="610.705582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="611.294242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="611.882901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="612.47156" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="613.06022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="613.648879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="614.237538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="614.826198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="615.414857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="616.003516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="616.592176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="617.180835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="617.769495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="618.358154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="618.946813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="619.535473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="620.124132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="620.712791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="621.301451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="621.89011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="622.478769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="623.067429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="623.656088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="624.244747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="624.833407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="625.422066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="626.010725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="626.599385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="627.188044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="627.776703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="628.365363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="628.954022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="629.542681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="630.131341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="630.72" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="631.308659" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="631.897319" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="632.485978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="633.074637" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="633.663297" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="634.251956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="634.840615" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="635.429275" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="636.017934" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="636.606593" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="637.195253" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="637.783912" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="638.372571" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="638.961231" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="639.54989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="640.138549" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="640.727209" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="641.315868" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="641.904527" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="642.493187" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="643.081846" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="643.670505" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="644.259165" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="644.847824" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="645.436484" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="646.025143" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="646.613802" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="647.202462" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="647.791121" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="648.37978" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="648.96844" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="649.557099" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="650.145758" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="650.734418" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="651.323077" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="651.911736" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="652.500396" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="653.089055" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="653.677714" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="654.266374" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="654.855033" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="655.443692" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="656.032352" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="656.621011" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="657.20967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="657.79833" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="658.386989" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="658.975648" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="659.564308" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="660.152967" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="660.741626" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="661.330286" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="661.918945" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="662.507604" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="663.096264" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="663.684923" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="664.273582" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="664.862242" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="665.450901" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="666.03956" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="666.62822" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="667.216879" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="667.805538" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="668.394198" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="668.982857" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="669.571516" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="670.160176" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="670.748835" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="671.337495" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="671.926154" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="672.514813" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="673.103473" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="673.692132" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="674.280791" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="674.869451" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="675.45811" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="676.046769" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="676.635429" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="677.224088" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="677.812747" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="678.401407" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="678.990066" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="679.578725" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="680.167385" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="680.756044" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="681.344703" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="681.933363" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="682.522022" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="683.110681" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
<use xlink:href="#m9f78a702ea" x="683.699341" y="380.6352" style="stroke: #000000; stroke-linejoin: bevel"/>
</g>
</g>
<g id="patch_3">
<path d="M 95.04 380.6352
L 95.04 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_4">
<path d="M 684.288 380.6352
L 684.288 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_5">
<path d="M 95.04 380.6352
L 684.288 380.6352
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="patch_6">
<path d="M 95.04 51.3216
L 684.288 51.3216
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
<g id="text_15">
<!-- Initial State -->
<g transform="translate(320.8815 45.3216)scale(0.24 -0.24)">
<defs>
<path id="DejaVuSans-49" d="M 628 4666
L 1259 4666
L 1259 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-6c" d="M 603 4863
L 1178 4863
L 1178 0
L 603 0
L 603 4863
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-20" transform="scale(0.015625)"/>
<path id="DejaVuSans-53" d="M 3425 4513
L 3425 3897
Q 3066 4069 2747 4153
Q 2428 4238 2131 4238
Q 1616 4238 1336 4038
Q 1056 3838 1056 3469
Q 1056 3159 1242 3001
Q 1428 2844 1947 2747
L 2328 2669
Q 3034 2534 3370 2195
Q 3706 1856 3706 1288
Q 3706 609 3251 259
Q 2797 -91 1919 -91
Q 1588 -91 1214 -16
Q 841 59 441 206
L 441 856
Q 825 641 1194 531
Q 1563 422 1919 422
Q 2459 422 2753 634
Q 3047 847 3047 1241
Q 3047 1584 2836 1778
Q 2625 1972 2144 2069
L 1759 2144
Q 1053 2284 737 2584
Q 422 2884 422 3419
Q 422 4038 858 4394
Q 1294 4750 2059 4750
Q 2388 4750 2728 4690
Q 3069 4631 3425 4513
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-49"/>
<use xlink:href="#DejaVuSans-6e" x="29.492188"/>
<use xlink:href="#DejaVuSans-69" x="92.871094"/>
<use xlink:href="#DejaVuSans-74" x="120.654297"/>
<use xlink:href="#DejaVuSans-69" x="159.863281"/>
<use xlink:href="#DejaVuSans-61" x="187.646484"/>
<use xlink:href="#DejaVuSans-6c" x="248.925781"/>
<use xlink:href="#DejaVuSans-20" x="276.708984"/>
<use xlink:href="#DejaVuSans-53" x="308.496094"/>
<use xlink:href="#DejaVuSans-74" x="371.972656"/>
<use xlink:href="#DejaVuSans-61" x="411.181641"/>
<use xlink:href="#DejaVuSans-74" x="472.460938"/>
<use xlink:href="#DejaVuSans-65" x="511.669922"/>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="pe338a5f14f">
<rect x="95.04" y="51.3216" width="589.248" height="329.3136"/>
</clipPath>
</defs>
</svg>
=================
Memory management
=================
.. _cuda-device-memory:
Data transfer
=============
Even though Numba can automatically transfer NumPy arrays to the device,
it can only do so conservatively by always transferring device memory back to
the host when a kernel finishes. To avoid the unnecessary transfer for
read-only arrays, you can use the following APIs to manually control the
transfer:
.. autofunction:: numba.cuda.device_array
:noindex:
.. autofunction:: numba.cuda.device_array_like
:noindex:
.. autofunction:: numba.cuda.to_device
:noindex:
In addition to the device arrays, Numba can consume any object that implements
:ref:`cuda array interface <cuda-array-interface>`. These objects also can be
manually converted into a Numba device array by creating a view of the GPU
buffer using the following APIs:
.. autofunction:: numba.cuda.as_cuda_array
:noindex:
.. autofunction:: numba.cuda.is_cuda_array
:noindex:
Device arrays
-------------
Device array references have the following methods. These methods are to be
called in host code, not within CUDA-jitted functions.
.. autoclass:: numba.cuda.cudadrv.devicearray.DeviceNDArray
:members: copy_to_host, is_c_contiguous, is_f_contiguous, ravel, reshape
:noindex:
.. note:: DeviceNDArray defines the :ref:`cuda array interface <cuda-array-interface>`.
Pinned memory
=============
.. autofunction:: numba.cuda.pinned
:noindex:
.. autofunction:: numba.cuda.pinned_array
:noindex:
.. autofunction:: numba.cuda.pinned_array_like
:noindex:
Mapped memory
=============
.. autofunction:: numba.cuda.mapped
:noindex:
.. autofunction:: numba.cuda.mapped_array
:noindex:
.. autofunction:: numba.cuda.mapped_array_like
:noindex:
Managed memory
==============
.. autofunction:: numba.cuda.managed_array
:noindex:
Streams
=======
Streams can be passed to functions that accept them (e.g. copies between the
host and device) and into kernel launch configurations so that the operations
are executed asynchronously.
.. autofunction:: numba.cuda.stream
:noindex:
.. autofunction:: numba.cuda.default_stream
:noindex:
.. autofunction:: numba.cuda.legacy_default_stream
:noindex:
.. autofunction:: numba.cuda.per_thread_default_stream
:noindex:
.. autofunction:: numba.cuda.external_stream
:noindex:
CUDA streams have the following methods:
.. autoclass:: numba.cuda.cudadrv.driver.Stream
:members: synchronize, auto_synchronize
:noindex:
.. _cuda-shared-memory:
Shared memory and thread synchronization
========================================
A limited amount of shared memory can be allocated on the device to speed
up access to data, when necessary. That memory will be shared (i.e. both
readable and writable) amongst all threads belonging to a given block
and has faster access times than regular device memory. It also allows
threads to cooperate on a given solution. You can think of it as a
manually-managed data cache.
The memory is allocated once for the duration of the kernel, unlike
traditional dynamic memory management.
.. function:: numba.cuda.shared.array(shape, type)
:noindex:
Allocate a shared array of the given *shape* and *type* on the device.
This function must be called on the device (i.e. from a kernel or
device function). *shape* is either an integer or a tuple of integers
representing the array's dimensions and must be a simple constant
expression. A "simple constant expression" includes, but is not limited to:
#. A literal (e.g. ``10``)
#. A local variable whose right-hand side is a literal or a simple constant
expression (e.g. ``shape``, where ``shape`` is defined earlier in the function
as ``shape = 10``)
#. A global variable that is defined in the jitted function's globals by the time
of compilation (e.g. ``shape``, where ``shape`` is defined using any expression
at global scope).
The definition must result in a Python ``int`` (i.e. not a NumPy scalar or other
scalar / integer-like type). *type* is a :ref:`Numba type <numba-types>` of the
elements needing to be stored in the array. The returned array-like object can be
read and written to like any normal device array (e.g. through indexing).
A common pattern is to have each thread populate one element in the
shared array and then wait for all threads to finish using :func:`.syncthreads`.
.. function:: numba.cuda.syncthreads()
:noindex:
Synchronize all threads in the same thread block. This function
implements the same pattern as `barriers <http://en.wikipedia.org/wiki/Barrier_%28computer_science%29>`_
in traditional multi-threaded programming: this function waits
until all threads in the block call it, at which point it returns
control to all its callers.
.. seealso::
:ref:`Matrix multiplication example <cuda-matmul>`.
Dynamic Shared Memory
---------------------
In order to use dynamic shared memory in kernel code declare a shared array of
size 0:
.. code-block:: python
@cuda.jit
def kernel_func(x):
dyn_arr = cuda.shared.array(0, dtype=np.float32)
...
and specify the size of dynamic shared memory in bytes during kernel invocation:
.. code-block:: python
kernel_func[32, 32, 0, 128](x)
In the above code the kernel launch is configured with 4 parameters:
.. code-block:: python
kernel_func[grid_dim, block_dim, stream, dyn_shared_mem_size]
**Note:** all dynamic shared memory arrays *alias*, so if you want to have
multiple dynamic shared arrays, you need to take *disjoint* views of the arrays.
For example, consider:
.. code-block:: python
from numba import cuda
import numpy as np
@cuda.jit
def f():
f32_arr = cuda.shared.array(0, dtype=np.float32)
i32_arr = cuda.shared.array(0, dtype=np.int32)
f32_arr[0] = 3.14
print(f32_arr[0])
print(i32_arr[0])
f[1, 1, 0, 4]()
cuda.synchronize()
This allocates 4 bytes of shared memory (large enough for one ``int32`` or one
``float32``) and declares dynamic shared memory arrays of type ``int32`` and of
type ``float32``. When ``f32_arr[0]`` is set, this also sets the value of
``i32_arr[0]``, because they're pointing at the same memory. So we see as
output:
.. code-block:: pycon
3.140000
1078523331
because 1078523331 is the ``int32`` represented by the bits of the ``float32``
value 3.14.
If we take disjoint views of the dynamic shared memory:
.. code-block:: python
from numba import cuda
import numpy as np
@cuda.jit
def f_with_view():
f32_arr = cuda.shared.array(0, dtype=np.float32)
i32_arr = cuda.shared.array(0, dtype=np.int32)[1:] # 1 int32 = 4 bytes
f32_arr[0] = 3.14
i32_arr[0] = 1
print(f32_arr[0])
print(i32_arr[0])
f_with_view[1, 1, 0, 8]()
cuda.synchronize()
This time we declare 8 dynamic shared memory bytes, using the first 4 for a
``float32`` value and the next 4 for an ``int32`` value. Now we can set both the
``int32`` and ``float32`` value without them aliasing:
.. code-block:: pycon
3.140000
1
.. _cuda-local-memory:
Local memory
============
Local memory is an area of memory private to each thread. Using local
memory helps allocate some scratchpad area when scalar local variables
are not enough. The memory is allocated once for the duration of the kernel,
unlike traditional dynamic memory management.
.. function:: numba.cuda.local.array(shape, type)
:noindex:
Allocate a local array of the given *shape* and *type* on the device.
*shape* is either an integer or a tuple of integers representing the array's
dimensions and must be a simple constant expression. A "simple constant expression"
includes, but is not limited to:
#. A literal (e.g. ``10``)
#. A local variable whose right-hand side is a literal or a simple constant
expression (e.g. ``shape``, where ``shape`` is defined earlier in the function
as ``shape = 10``)
#. A global variable that is defined in the jitted function's globals by the time
of compilation (e.g. ``shape``, where ``shape`` is defined using any expression
at global scope).
The definition must result in a Python ``int`` (i.e. not a NumPy scalar or other
scalar / integer-like type). *type* is a :ref:`Numba type <numba-types>`
of the elements needing to be stored in the array. The array is private to
the current thread. An array-like object is returned which can be read and
written to like any standard array (e.g. through indexing).
.. seealso:: The Local Memory section of `Device Memory Accesses
<https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory-accesses>`_
in the CUDA programming guide.
Constant memory
===============
Constant memory is an area of memory that is read only, cached and off-chip, it
is accessible by all threads and is host allocated. A method of
creating an array in constant memory is through the use of:
.. function:: numba.cuda.const.array_like(arr)
:noindex:
Allocate and make accessible an array in constant memory based on array-like
*arr*.
.. _deallocation-behavior:
Deallocation Behavior
=====================
This section describes the deallocation behaviour of Numba's internal memory
management. If an External Memory Management Plugin is in use (see
:ref:`cuda-emm-plugin`), then deallocation behaviour may differ; you may refer to the
documentation for the EMM Plugin to understand its deallocation behaviour.
Deallocation of all CUDA resources are tracked on a per-context basis.
When the last reference to a device memory is dropped, the underlying memory
is scheduled to be deallocated. The deallocation does not occur immediately.
It is added to a queue of pending deallocations. This design has two benefits:
1. Resource deallocation API may cause the device to synchronize; thus, breaking
any asynchronous execution. Deferring the deallocation could avoid latency
in performance critical code section.
2. Some deallocation errors may cause all the remaining deallocations to fail.
Continued deallocation errors can cause critical errors at the CUDA driver
level. In some cases, this could mean a segmentation fault in the CUDA
driver. In the worst case, this could cause the system GUI to freeze and
could only recover with a system reset. When an error occurs during a
deallocation, the remaining pending deallocations are cancelled. Any
deallocation error will be reported. When the process is terminated, the
CUDA driver is able to release all allocated resources by the terminated
process.
The deallocation queue is flushed automatically as soon as the following events
occur:
- An allocation failed due to out-of-memory error. Allocation is retried after
flushing all deallocations.
- The deallocation queue has reached its maximum size, which is default to 10.
User can override by setting the environment variable
`NUMBA_CUDA_MAX_PENDING_DEALLOCS_COUNT`. For example,
`NUMBA_CUDA_MAX_PENDING_DEALLOCS_COUNT=20`, increases the limit to 20.
- The maximum accumulated byte size of resources that are pending deallocation
is reached. This is default to 20% of the device memory capacity.
User can override by setting the environment variable
`NUMBA_CUDA_MAX_PENDING_DEALLOCS_RATIO`. For example,
`NUMBA_CUDA_MAX_PENDING_DEALLOCS_RATIO=0.5` sets the limit to 50% of the
capacity.
Sometimes, it is desired to defer resource deallocation until a code section
ends. Most often, users want to avoid any implicit synchronization due to
deallocation. This can be done by using the following context manager:
.. autofunction:: numba.cuda.defer_cleanup
.. _minor-version-compatibility:
CUDA Minor Version Compatiblity
===============================
CUDA `Minor Version Compatibility
<https://docs.nvidia.com/deploy/cuda-compatibility/index.html#minor-version-compatibility>`_
(MVC) enables the use of a newer CUDA toolkit version than the CUDA version
supported by the driver, provided that the toolkit and driver both have the same
major version. For example, use of CUDA toolkit 11.5 with CUDA driver 450 (CUDA
version 11.0) is supported through MVC.
Numba supports MVC for CUDA 11 on Linux using the external ``cubinlinker`` and
``ptxcompiler`` packages, subject to the following limitations:
- Linking of archives is unsupported.
- Cooperative Groups are unsupported, because they require an archive to be
linked.
MVC is not yet supported on CUDA 12 - this will be added in a future release of
Numba.
MVC is not supported on Windows.
Enabling MVC Support
--------------------
To use MVC support, the ``cubinlinker`` and ``ptxcompiler`` compiler packages
must be installed from the appropriate channels. To install using conda, use:
.. code:: bash
conda install rapidsai::cubinlinker conda-forge::ptxcompiler
To install with pip, use the NVIDIA package index:
.. code:: bash
pip install ptxcompiler-cu11 cubinlinker-cu11 --extra-index-url=https://pypi.nvidia.com
MVC support is enabled by setting the environment variable:
.. code:: bash
export NUMBA_CUDA_ENABLE_MINOR_VERSION_COMPATIBILITY=1
or by setting a configuration variable prior to using any CUDA functionality in
Numba:
.. code:: python
from numba import config
config.CUDA_ENABLE_MINOR_VERSION_COMPATIBILITY = True
References
----------
Further information about Minor Version Compatibility may be found in:
- The `CUDA Compatibility Guide
<https://docs.nvidia.com/deploy/cuda-compatibility/index.html>`_.
- The `README for ptxcompiler
<https://github.com/rapidsai/ptxcompiler/blob/main/README.md>`_.
========
Overview
========
Numba supports CUDA GPU programming by directly compiling a restricted subset
of Python code into CUDA kernels and device functions following the CUDA
execution model. Kernels written in Numba appear to have direct access
to NumPy arrays. NumPy arrays are transferred between the CPU and the
GPU automatically.
Terminology
===========
Several important terms in the topic of CUDA programming are listed here:
- *host*: the CPU
- *device*: the GPU
- *host memory*: the system main memory
- *device memory*: onboard memory on a GPU card
- *kernels*: a GPU function launched by the host and executed on the device
- *device function*: a GPU function executed on the device which can only be
called from the device (i.e. from a kernel or another device function)
Programming model
=================
Most CUDA programming facilities exposed by Numba map directly to the CUDA
C language offered by NVidia. Therefore, it is recommended you read the
official `CUDA C programming guide <http://docs.nvidia.com/cuda/cuda-c-programming-guide>`_.
Requirements
============
Supported GPUs
--------------
Numba supports CUDA-enabled GPUs with Compute Capability 3.5 or greater.
Support for devices with Compute Capability less than 5.0 is deprecated, and
will be removed in a future Numba release.
Devices with Compute Capability 5.0 or greater include (but are not limited to):
- Embedded platforms: NVIDIA Jetson Nano, Jetson Orin Nano, TX1, TX2, Xavier
NX, AGX Xavier, AGX Orin.
- Desktop / Server GPUs: All GPUs with Maxwell microarchitecture or later. E.g.
GTX 9 / 10 / 16 series, RTX 20 / 30 / 40 series, Quadro / Tesla M / P / V /
RTX series, RTX A series, RTX Ada / SFF, A / L series, H100.
- Laptop GPUs: All GPUs with Maxwell microarchitecture or later. E.g. MX series,
Quadro M / P / T series (mobile), RTX 20 / 30 series (mobile), RTX A series
(mobile).
Software
--------
Numba aims to support CUDA Toolkit versions released within the last 3 years.
Presently 11.2 is the minimum required toolkit version. An NVIDIA driver
sufficient for the toolkit version is also required (see also
:ref:`minor-version-compatibility`).
If you are using Conda, you can install the CUDA toolkit with::
$ conda install cudatoolkit
If you are not using Conda or if you want to use a different version of CUDA
toolkit, the following describes how Numba searches for a CUDA toolkit
installation.
.. _cuda-bindings:
CUDA Bindings
~~~~~~~~~~~~~
Numba supports interacting with the CUDA Driver API via the `NVIDIA CUDA Python
bindings <https://nvidia.github.io/cuda-python/>`_ and its own ctypes-based
bindings. Functionality is equivalent between the two bindings. The
ctypes-based bindings are presently the default, but the NVIDIA bindings will
be used by default (if they are available in the environment) in a future Numba
release.
You can install the NVIDIA bindings with::
$ conda install nvidia::cuda-python
if you are using Conda, or::
$ pip install cuda-python
if you are using pip.
The use of the NVIDIA bindings is enabled by setting the environment variable
:envvar:`NUMBA_CUDA_USE_NVIDIA_BINDING` to ``"1"``.
.. _cudatoolkit-lookup:
Setting CUDA Installation Path
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Numba searches for a CUDA toolkit installation in the following order:
1. Conda installed `cudatoolkit` package.
2. Environment variable ``CUDA_HOME``, which points to the directory of the
installed CUDA toolkit (i.e. ``/home/user/cuda-10``)
3. System-wide installation at exactly ``/usr/local/cuda`` on Linux platforms.
Versioned installation paths (i.e. ``/usr/local/cuda-10.0``) are intentionally
ignored. Users can use ``CUDA_HOME`` to select specific versions.
In addition to the CUDA toolkit libraries, which can be installed by conda into
an environment or installed system-wide by the `CUDA SDK installer
<(https://developer.nvidia.com/cuda-downloads)>`_, the CUDA target in Numba
also requires an up-to-date NVIDIA graphics driver. Updated graphics drivers
are also installed by the CUDA SDK installer, so there is no need to do both.
Note that on macOS, the CUDA SDK must be installed to get the required driver,
and the driver is only supported on macOS prior to 10.14 (Mojave). If the
``libcuda`` library is in a non-standard location, users can set environment
variable ``NUMBA_CUDA_DRIVER`` to the file path (not the directory path) of the
shared library file.
Missing CUDA Features
=====================
Numba does not implement all features of CUDA, yet. Some missing features
are listed below:
* dynamic parallelism
* texture memory
.. _cuda-random:
Random Number Generation
========================
Numba provides a random number generation algorithm that can be executed on
the GPU. Due to technical issues with how NVIDIA implemented cuRAND, however,
Numba's GPU random number generator is not based on cuRAND. Instead, Numba's
GPU RNG is an implementation of the `xoroshiro128+ algorithm
<http://xoroshiro.di.unimi.it/>`_. The xoroshiro128+ algorithm has a period of
``2**128 - 1``, which is shorter than the period of the XORWOW algorithm
used by default in cuRAND, but xoroshiro128+ still passes the BigCrush tests
of random number generator quality.
When using any RNG on the GPU, it is important to make sure that each thread
has its own RNG state, and they have been initialized to produce non-overlapping
sequences. The numba.cuda.random module provides a host function to do this,
as well as CUDA device functions to obtain uniformly or normally distributed
random numbers.
.. note:: Numba (like cuRAND) uses the
`Box-Muller transform <https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform>`
to generate normally distributed random numbers from a uniform generator.
However, Box-Muller generates pairs of random numbers, and the current
implementation only returns one of them. As a result, generating normally
distributed values is half the speed of uniformly distributed values.
.. automodule:: numba.cuda.random
:members: create_xoroshiro128p_states, init_xoroshiro128p_states, xoroshiro128p_uniform_float32, xoroshiro128p_uniform_float64, xoroshiro128p_normal_float32, xoroshiro128p_normal_float64
:noindex:
A simple example
''''''''''''''''
Here is a sample program that uses the random number generator::
from __future__ import print_function, absolute_import
from numba import cuda
from numba.cuda.random import create_xoroshiro128p_states, xoroshiro128p_uniform_float32
import numpy as np
@cuda.jit
def compute_pi(rng_states, iterations, out):
"""Find the maximum value in values and store in result[0]"""
thread_id = cuda.grid(1)
# Compute pi by drawing random (x, y) points and finding what
# fraction lie inside a unit circle
inside = 0
for i in range(iterations):
x = xoroshiro128p_uniform_float32(rng_states, thread_id)
y = xoroshiro128p_uniform_float32(rng_states, thread_id)
if x**2 + y**2 <= 1.0:
inside += 1
out[thread_id] = 4.0 * inside / iterations
threads_per_block = 64
blocks = 24
rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=1)
out = np.zeros(threads_per_block * blocks, dtype=np.float32)
compute_pi[blocks, threads_per_block](rng_states, 10000, out)
print('pi:', out.mean())
An example of managing RNG state size and using a 3D grid
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
The number of RNG states scales with the number of threads using the RNG, so it
is often better to use strided loops in conjunction with the RNG in order to
keep the state size manageable.
In the following example, which initializes a large 3D array with random
numbers, using one thread per output element would result in 453,617,100 RNG
states. This would take a long time to initialize and poorly utilize the GPU.
Instead, it uses a fixed size 3D grid with a total of 2,097,152 (``(16 ** 3) *
(8 ** 3)``) threads striding over the output array. The 3D thread indices
``startx``, ``starty``, and ``startz`` are linearized into a 1D index,
``tid``, to index into the 2,097,152 RNG states.
.. literalinclude:: ../../../numba/cuda/tests/doc_examples/test_random.py
:language: python
:caption: from ``test_ex_3d_grid of ``numba/cuda/tests/doc_example/test_random.py``
:start-after: magictoken.ex_3d_grid.begin
:end-before: magictoken.ex_3d_grid.end
:dedent: 8
:linenos:
GPU Reduction
==============
Writing a reduction algorithm for CUDA GPU can be tricky. Numba provides a
``@reduce`` decorator for converting a simple binary operation into a reduction
kernel. An example follows::
import numpy
from numba import cuda
@cuda.reduce
def sum_reduce(a, b):
return a + b
A = (numpy.arange(1234, dtype=numpy.float64)) + 1
expect = A.sum() # NumPy sum reduction
got = sum_reduce(A) # cuda sum reduction
assert expect == got
Lambda functions can also be used here::
sum_reduce = cuda.reduce(lambda a, b: a + b)
The Reduce class
----------------
The ``reduce`` decorator creates an instance of the ``Reduce`` class.
Currently, ``reduce`` is an alias to ``Reduce``, but this behavior is not
guaranteed.
.. autoclass:: numba.cuda.Reduce
:members: __init__, __call__
:member-order: bysource
.. _simulator:
=================================================
Debugging CUDA Python with the the CUDA Simulator
=================================================
Numba includes a CUDA Simulator that implements most of the semantics in CUDA
Python using the Python interpreter and some additional Python code. This can
be used to debug CUDA Python code, either by adding print statements to your
code, or by using the debugger to step through the execution of an individual
thread.
The simulator deliberately allows running non-CUDA code like starting a debugger
and printing arbitrary expressions for debugging purposes. Therefore, it is
best to start from code that compiles for the CUDA target, and then move over to
the simulator to investigate issues.
Execution of kernels is performed by the simulator one block at a time. One
thread is spawned for each thread in the block, and scheduling of the execution
of these threads is left up to the operating system.
Using the simulator
===================
The simulator is enabled by setting the environment variable
:envvar:`NUMBA_ENABLE_CUDASIM` to 1 prior to importing Numba. CUDA Python code
may then be executed as normal. The easiest way to use the debugger inside a
kernel is to only stop a single thread, otherwise the interaction with the
debugger is difficult to handle. For example, the kernel below will stop in
the thread ``<<<(3,0,0), (1, 0, 0)>>>``::
@cuda.jit
def vec_add(A, B, out):
x = cuda.threadIdx.x
bx = cuda.blockIdx.x
bdx = cuda.blockDim.x
if x == 1 and bx == 3:
from pdb import set_trace; set_trace()
i = bx * bdx + x
out[i] = A[i] + B[i]
when invoked with a one-dimensional grid and one-dimensional blocks.
Supported features
==================
The simulator aims to provide as complete a simulation of execution on a real
GPU as possible - in particular, the following are supported:
* Atomic operations
* Constant memory
* Local memory
* Shared memory: declarations of shared memory arrays must be on separate source
lines, since the simulator uses source line information to keep track of
allocations of shared memory across threads.
* Mapped arrays.
* Host and device memory operations: copying and setting memory.
* :func:`.syncthreads` is supported - however, in the case where divergent
threads enter different :func:`.syncthreads` calls, the launch will not fail,
but unexpected behaviour will occur. A future version of the simulator may
detect this condition.
* The stream API is supported, but all operations occur sequentially and
synchronously, unlike on a real device. Synchronising on a stream is therefore
a no-op.
* The event API is also supported, but provides no meaningful timing
information.
* Data transfer to and from the GPU - in particular, creating array objects with
:func:`.device_array` and :func:`.device_array_like`. The APIs for pinned memory
:func:`.pinned` and :func:`.pinned_array` are also supported, but no pinning
takes place.
* The driver API implementation of the list of GPU contexts (``cuda.gpus`` and
``cuda.cudadrv.devices.gpus``) is supported, and reports a single GPU context.
This context can be closed and reset as the real one would.
* The :func:`.detect` function is supported, and reports one device called
`SIMULATOR`.
* Cooperative grids: A cooperative kernel can be launched, but with only one
block - the simulator always returns ``1`` from a kernel overload's
:meth:`~numba.cuda.dispatcher._Kernel.max_cooperative_grid_blocks` method.
Some limitations of the simulator include:
* It does not perform type checking/type inference. If any argument types to a
jitted function are incorrect, or if the specification of the type of any
local variables are incorrect, this will not be detected by the simulator.
* Only one GPU is simulated.
* Multithreaded accesses to a single GPU are not supported, and will result in
unexpected behaviour.
* Most of the driver API is unimplemented.
* It is not possible to link PTX code with CUDA Python functions.
* Warps and warp-level operations are not yet implemented.
* Because the simulator executes kernels using the Python interpreter,
structured array access by attribute that works with the hardware target may
fail in the simulator - see :ref:`structured-array-access`.
* Operations directly against device arrays are only partially supported, that
is, testing equality, less than, greater than, and basic mathematical
operations are supported, but many other operations, such as the in-place
operators and bit operators are not.
* The :func:`ffs() <numba.cuda.ffs>` function only works correctly for values
that can be represented using 32-bit integers.
Obviously, the speed of the simulator is also much lower than that of a real
device. It may be necessary to reduce the size of input data and the size of the
CUDA grid in order to make debugging with the simulator tractable.
CUDA Ufuncs and Generalized Ufuncs
==================================
This page describes the CUDA ufunc-like object.
To support the programming pattern of CUDA programs, CUDA Vectorize and
GUVectorize cannot produce a conventional ufunc. Instead, a ufunc-like
object is returned. This object is a close analog but not fully
compatible with a regular NumPy ufunc. The CUDA ufunc adds support for
passing intra-device arrays (already on the GPU device) to reduce
traffic over the PCI-express bus. It also accepts a `stream` keyword
for launching in asynchronous mode.
Example: Basic Example
------------------------
::
import math
from numba import vectorize, cuda
import numpy as np
@vectorize(['float32(float32, float32, float32)',
'float64(float64, float64, float64)'],
target='cuda')
def cu_discriminant(a, b, c):
return math.sqrt(b ** 2 - 4 * a * c)
N = 10000
dtype = np.float32
# prepare the input
A = np.array(np.random.sample(N), dtype=dtype)
B = np.array(np.random.sample(N) + 10, dtype=dtype)
C = np.array(np.random.sample(N), dtype=dtype)
D = cu_discriminant(A, B, C)
print(D) # print result
Example: Calling Device Functions
----------------------------------
All CUDA ufunc kernels have the ability to call other CUDA device functions::
from numba import vectorize, cuda
# define a device function
@cuda.jit('float32(float32, float32, float32)', device=True, inline=True)
def cu_device_fn(x, y, z):
return x ** y / z
# define a ufunc that calls our device function
@vectorize(['float32(float32, float32, float32)'], target='cuda')
def cu_ufunc(x, y, z):
return cu_device_fn(x, y, z)
Generalized CUDA ufuncs
-----------------------
Generalized ufuncs may be executed on the GPU using CUDA, analogous to
the CUDA ufunc functionality. This may be accomplished as follows::
from numba import guvectorize
@guvectorize(['void(float32[:,:], float32[:,:], float32[:,:])'],
'(m,n),(n,p)->(m,p)', target='cuda')
def matmulcore(A, B, C):
...
.. comment
Example: A Chunk at a Time
---------------------------
Partitioning your data into chunks allows computation and memory transfer
to be overlapped. This can increase the throughput of your ufunc and
enables your ufunc to operate on data that is larger than the memory
capacity of your GPU. For example:
::
import math
from numba import vectorize, cuda
import numpy as np
# the ufunc kernel
def discriminant(a, b, c):
return math.sqrt(b ** 2 - 4 * a * c)
cu_discriminant = vectorize(['float32(float32, float32, float32)',
'float64(float64, float64, float64)'],
target='cuda')(discriminant)
N = int(1e+8)
dtype = np.float32
# prepare the input
A = np.array(np.random.sample(N), dtype=dtype)
B = np.array(np.random.sample(N) + 10, dtype=dtype)
C = np.array(np.random.sample(N), dtype=dtype)
D = np.empty(A.shape, dtype=A.dtype)
# create a CUDA stream
stream = cuda.stream()
chunksize = 1e+6
chunkcount = N // chunksize
# partition NumPy arrays into chunks
# no copying is performed
sA = np.split(A, chunkcount)
sB = np.split(B, chunkcount)
sC = np.split(C, chunkcount)
sD = np.split(D, chunkcount)
device_ptrs = []
with stream.auto_synchronize():
# every operation in this context with be launched asynchronously
# by using the CUDA stream
# for each chunk
for a, b, c, d in zip(sA, sB, sC, sD):
# transfer to device
dA = cuda.to_device(a, stream)
dB = cuda.to_device(b, stream)
dC = cuda.to_device(c, stream)
dD = cuda.to_device(d, stream, copy=False) # no copying
# launch kernel
cu_discriminant(dA, dB, dC, out=dD, stream=stream)
# retrieve result
dD.copy_to_host(d, stream)
# store device pointers to prevent them from freeing before
# the kernel is scheduled
device_ptrs.extend([dA, dB, dC, dD])
# data is ready at this point inside D
.. _architecture:
==================
Numba architecture
==================
Introduction
============
Numba is a compiler for Python bytecode with optional type-specialization.
Suppose you enter a function like this into the standard Python interpreter
(henceforward referred to as "CPython")::
def add(a, b):
return a + b
The interpreter will immediately parse the function and convert it into a
bytecode representation that describes how the CPython interpreter should
execute the function at a low level. For the example above, it looks
something like this::
>>> import dis
>>> dis.dis(add)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 RETURN_VALUE
CPython uses a stack-based interpreter (much like an HP calculator), so the
code first pushes two local variables onto the stack. The ``BINARY_ADD``
opcode pops the top two arguments off the stack and makes a Python C API
function call that is equivalent to calling ``a.__add__(b)``. The result is
then pushed onto the top of the interpreter stack. Finally, the
``RETURN_VALUE`` opcode returns value on the top of the stack as the result of
the function call.
Numba can take this bytecode and compile it to machine code that performs the
same operations as the CPython interpreter, treating ``a`` and ``b`` as
generic Python objects. The full semantics of Python are preserved, and the
compiled function can be used with any kind of objects that have the add
operator defined. When a Numba function is compiled this way, we say that it
has been compiled in :term:`object mode`, because the code still manipulates
Python objects.
Numba code compiled in object mode is not much faster than executing the
original Python function in the CPython interpreter. However, if we
specialize the function to only run with certain data types, Numba can
generate much shorter and more efficient code that manipulates the data
natively without any calls into the Python C API. When code has been compiled
for specific data types so that the function body no longer relies on the
Python runtime, we say the function has been compiled in :term:`nopython mode`.
Numeric code compiled in nopython mode can be hundreds of times faster
than the original Python.
Compiler architecture
=====================
Like many compilers, Numba can be conceptually divided into a
*frontend* and a *backend*.
The Numba *frontend* comprises the stages which analyze the Python bytecode,
translate it to :term:`Numba IR` and perform various transformations and
analysis steps on the IR. One of the key steps is :term:`type inference`.
The frontend must succeed in typing all variables unambiguously in order
for the backend to generate code in :term:`nopython mode`, because the
backend uses type information to match appropriate code generators with
the values they operate on.
The Numba *backend* walks the Numba IR resulting from the frontend analyses
and exploits the type information deduced by the type inference phase to
produce the right LLVM code for each encountered operation. After LLVM
code is produced, the LLVM library is asked to optimize it and generate
native processor code for the final, native function.
There are other pieces besides the compiler frontend and backend, such
as the caching machinery for JIT functions. Those pieces are not considered
in this document.
Contexts
========
Numba is quite flexible, allowing it to generate code for different hardware
architectures like CPUs and GPUs. In order to support these different
applications, Numba uses a *typing context* and a *target context*.
A *typing context* is used in the compiler frontend to perform type inference
on operations and values in the function. Similar typing contexts could be
used for many architectures because for nearly all cases, typing inference
is hardware-independent. However, Numba currently has a different typing
context for each target.
A *target context* is used to generate the specific instruction sequence
required to operate on the Numba types identified during type inference.
Target contexts are architecture-specific and are flexible in defining
the execution model and available Python APIs. For example, Numba has a "cpu"
and a "cuda" context for those two kinds of architecture, and a "parallel"
context which produces multithreaded CPU code.
Compiler stages
===============
The :func:`~numba.jit` decorator in Numba ultimately calls
``numba.compiler.compile_extra()`` which compiles the Python function in a
multi-stage process, described below.
Stage 1: Analyze bytecode
-------------------------
At the start of compilation, the function bytecode is passed to an instance of
the Numba interpreter (``numba.interpreter``). The interpreter object
analyzes the bytecode to find the control flow graph (``numba.controlflow``).
The control flow graph (CFG) describes the ways that execution can move from one
block to the next inside the function as a result of loops and branches.
The data flow analysis (``numba.dataflow``) takes the control flow graph and
traces how values get pushed and popped off the Python interpreter stack for
different code paths. This is important to understand the lifetimes of
variables on the stack, which are needed in Stage 2.
If you set the environment variable ``NUMBA_DUMP_CFG`` to 1, Numba will dump
the results of the control flow graph analysis to the screen. Our ``add()``
example is pretty boring, since there is only one statement block::
CFG adjacency lists:
{0: []}
CFG dominators:
{0: set([0])}
CFG post-dominators:
{0: set([0])}
CFG back edges: []
CFG loops:
{}
CFG node-to-loops:
{0: []}
A function with more complex flow control will have a more interesting
control flow graph. This function::
def doloops(n):
acc = 0
for i in range(n):
acc += 1
if n == 10:
break
return acc
compiles to this bytecode::
9 0 LOAD_CONST 1 (0)
3 STORE_FAST 1 (acc)
10 6 SETUP_LOOP 46 (to 55)
9 LOAD_GLOBAL 0 (range)
12 LOAD_FAST 0 (n)
15 CALL_FUNCTION 1
18 GET_ITER
>> 19 FOR_ITER 32 (to 54)
22 STORE_FAST 2 (i)
11 25 LOAD_FAST 1 (acc)
28 LOAD_CONST 2 (1)
31 INPLACE_ADD
32 STORE_FAST 1 (acc)
12 35 LOAD_FAST 0 (n)
38 LOAD_CONST 3 (10)
41 COMPARE_OP 2 (==)
44 POP_JUMP_IF_FALSE 19
13 47 BREAK_LOOP
48 JUMP_ABSOLUTE 19
51 JUMP_ABSOLUTE 19
>> 54 POP_BLOCK
14 >> 55 LOAD_FAST 1 (acc)
58 RETURN_VALUE
The corresponding CFG for this bytecode is::
CFG adjacency lists:
{0: [6], 6: [19], 19: [54, 22], 22: [19, 47], 47: [55], 54: [55], 55: []}
CFG dominators:
{0: set([0]),
6: set([0, 6]),
19: set([0, 6, 19]),
22: set([0, 6, 19, 22]),
47: set([0, 6, 19, 22, 47]),
54: set([0, 6, 19, 54]),
55: set([0, 6, 19, 55])}
CFG post-dominators:
{0: set([0, 6, 19, 55]),
6: set([6, 19, 55]),
19: set([19, 55]),
22: set([22, 55]),
47: set([47, 55]),
54: set([54, 55]),
55: set([55])}
CFG back edges: [(22, 19)]
CFG loops:
{19: Loop(entries=set([6]), exits=set([54, 47]), header=19, body=set([19, 22]))}
CFG node-to-loops:
{0: [], 6: [], 19: [19], 22: [19], 47: [], 54: [], 55: []}
The numbers in the CFG refer to the bytecode offsets shown just to the left
of the opcode names above.
.. _arch_generate_numba_ir:
Stage 2: Generate the Numba IR
------------------------------
Once the control flow and data analyses are complete, the Numba interpreter
can step through the bytecode and translate it into an Numba-internal
intermediate representation. This translation process changes the function
from a stack machine representation (used by the Python interpreter) to a
register machine representation (used by LLVM).
Although the IR is stored in memory as a tree of objects, it can be serialized
to a string for debugging. If you set the environment variable
``NUMBA_DUMP_IR`` equal to 1, the Numba IR will be dumped to the screen. For
the ``add()`` function described above, the Numba IR looks like::
label 0:
a = arg(0, name=a) ['a']
b = arg(1, name=b) ['b']
$0.3 = a + b ['$0.3', 'a', 'b']
del b []
del a []
$0.4 = cast(value=$0.3) ['$0.3', '$0.4']
del $0.3 []
return $0.4 ['$0.4']
The ``del`` instructions are produced by :ref:`live variable analysis`.
Those instructions ensure references are not leaked.
In :term:`nopython mode`, some objects are tracked by the Numba runtime and
some are not. For tracked objects, a dereference operation is emitted;
otherwise, the instruction is an no-op.
In :term:`object mode` each variable contains an owned reference to a PyObject.
.. _`rewrite-untyped-ir`:
Stage 3: Rewrite untyped IR
---------------------------
Before running type inference, it may be desired to run certain
transformations on the Numba IR. One such example is to detect ``raise``
statements which have an implicitly constant argument, so as to
support them in :term:`nopython mode`. Let's say you compile the
following function with Numba::
def f(x):
if x == 0:
raise ValueError("x cannot be zero")
If you set the :envvar:`NUMBA_DUMP_IR` environment variable to ``1``,
you'll see the IR being rewritten before the type inference phase::
REWRITING:
del $0.3 []
$12.1 = global(ValueError: <class 'ValueError'>) ['$12.1']
$const12.2 = const(str, x cannot be zero) ['$const12.2']
$12.3 = call $12.1($const12.2) ['$12.1', '$12.3', '$const12.2']
del $const12.2 []
del $12.1 []
raise $12.3 ['$12.3']
____________________________________________________________
del $0.3 []
$12.1 = global(ValueError: <class 'ValueError'>) ['$12.1']
$const12.2 = const(str, x cannot be zero) ['$const12.2']
$12.3 = call $12.1($const12.2) ['$12.1', '$12.3', '$const12.2']
del $const12.2 []
del $12.1 []
raise <class 'ValueError'>('x cannot be zero') []
.. _arch_type_inference:
Stage 4: Infer types
--------------------
Now that the Numba IR has been generated, type analysis can be performed. The
types of the function arguments can be taken either from the explicit function
signature given in the ``@jit`` decorator (such as ``@jit('float64(float64,
float64)')``), or they can be taken from the types of the actual function
arguments if compilation is happening when the function is first called.
The type inference engine is found in ``numba.typeinfer``. Its job is to
assign a type to every intermediate variable in the Numba IR. The result of
this pass can be seen by setting the :envvar:`NUMBA_DUMP_ANNOTATION`
environment variable to 1:
.. code-block:: python
-----------------------------------ANNOTATION-----------------------------------
# File: archex.py
# --- LINE 4 ---
@jit(nopython=True)
# --- LINE 5 ---
def add(a, b):
# --- LINE 6 ---
# label 0
# a = arg(0, name=a) :: int64
# b = arg(1, name=b) :: int64
# $0.3 = a + b :: int64
# del b
# del a
# $0.4 = cast(value=$0.3) :: int64
# del $0.3
# return $0.4
return a + b
If type inference fails to find a consistent type assignment for all the
intermediate variables, it will label every variable as type ``pyobject`` and
fall back to object mode. Type inference can fail when unsupported Python
types, language features, or functions are used in the function body.
.. _`rewrite-typed-ir`:
Stage 5a: Rewrite typed IR
--------------------------
This pass's purpose is to perform any high-level optimizations that still
require, or could at least benefit from, Numba IR type information.
One example of a problem domain that isn't as easily optimized once
lowered is the domain of multidimensional array operations. When
Numba lowers an array operation, Numba treats the operation like a
full ufunc kernel. During lowering a single array operation, Numba
generates an inline broadcasting loop that creates a new result array.
Then Numba generates an application loop that applies the operator
over the array inputs. Recognizing and rewriting these loops once
they are lowered into LLVM is hard, if not impossible.
An example pair of optimizations in the domain of array operators is
loop fusion and shortcut deforestation. When the optimizer
recognizes that the output of one array operator is being fed into
another array operator, and only to that array operator, it can fuse
the two loops into a single loop. The optimizer can further eliminate
the temporary array allocated for the initial operation by directly
feeding the result of the first operation into the second, skipping
the store and load to the intermediate array. This elimination is
known as shortcut deforestation. Numba currently uses the rewrite
pass to implement these array optimizations. For more information,
please consult the ":ref:`case-study-array-expressions`" subsection,
later in this document.
One can see the result of rewriting by setting the
:envvar:`NUMBA_DUMP_IR` environment variable to a non-zero value (such
as 1). The following example shows the output of the rewrite pass as
it recognizes an array expression consisting of a multiply and add,
and outputs a fused kernel as a special operator, :func:`arrayexpr`::
______________________________________________________________________
REWRITING:
a0 = arg(0, name=a0) ['a0']
a1 = arg(1, name=a1) ['a1']
a2 = arg(2, name=a2) ['a2']
$0.3 = a0 * a1 ['$0.3', 'a0', 'a1']
del a1 []
del a0 []
$0.5 = $0.3 + a2 ['$0.3', '$0.5', 'a2']
del a2 []
del $0.3 []
$0.6 = cast(value=$0.5) ['$0.5', '$0.6']
del $0.5 []
return $0.6 ['$0.6']
____________________________________________________________
a0 = arg(0, name=a0) ['a0']
a1 = arg(1, name=a1) ['a1']
a2 = arg(2, name=a2) ['a2']
$0.5 = arrayexpr(ty=array(float64, 1d, C), expr=('+', [('*', [Var(a0, test.py (14)), Var(a1, test.py (14))]), Var(a2, test.py (14))])) ['$0.5', 'a0', 'a1', 'a2']
del a0 []
del a1 []
del a2 []
$0.6 = cast(value=$0.5) ['$0.5', '$0.6']
del $0.5 []
return $0.6 ['$0.6']
______________________________________________________________________
Following this rewrite, Numba lowers the array expression into a new
ufunc-like function that is inlined into a single loop that only
allocates a single result array.
.. _`parallel-accelerator`:
Stage 5b: Perform Automatic Parallelization
-------------------------------------------
This pass is only performed if the ``parallel`` option in the :func:`~numba.jit`
decorator is set to ``True``. This pass finds parallelism implicit in the
semantics of operations in the Numba IR and replaces those operations
with explicitly parallel representations of those operations using a
special `parfor` operator. Then, optimizations are performed to maximize
the number of parfors that are adjacent to each other such that they can
then be fused together into one parfor that takes only one pass over the
data and will thus typically have better cache performance. Finally,
during lowering, these parfor operators are converted to a form similar
to guvectorize to implement the actual parallelism.
The automatic parallelization pass has a number of sub-passes, many of
which are controllable using a dictionary of options passed via the
``parallel`` keyword argument to :func:`~numba.jit`::
{ 'comprehension': True/False, # parallel comprehension
'prange': True/False, # parallel for-loop
'numpy': True/False, # parallel numpy calls
'reduction': True/False, # parallel reduce calls
'setitem': True/False, # parallel setitem
'stencil': True/False, # parallel stencils
'fusion': True/False, # enable fusion or not
}
The default is set to `True` for all of them. The sub-passes are
described in more detail in the following paragraphs.
#. CFG Simplification
Sometimes Numba IR will contain chains of blocks containing no loops which
are merged in this sub-pass into single blocks. This sub-pass simplifies
subsequent analysis of the IR.
#. Numpy canonicalization
Some Numpy operations can be written as operations on Numpy objects (e.g.
``arr.sum()``), or as calls to Numpy taking those objects (e.g.
``numpy.sum(arr)``). This sub-pass converts all such operations to the
latter form for cleaner subsequent analysis.
#. Array analysis
A critical requirement for later parfor fusion is that parfors have
identical iteration spaces and these iteration spaces typically correspond
to the sizes of the dimensions of Numpy arrays. In this sub-pass, the IR is
analyzed to determine equivalence classes for the dimensions of Numpy
arrays. Consider the example, ``a = b + 1``, where ``a`` and ``b`` are both
Numpy arrays. Here, we know that each dimension of ``a`` must have the same
equivalence class as the corresponding dimension of ``b``. Typically,
routines rich in Numpy operations will enable equivalence classes to be
fully known for all arrays created within a function.
Array analysis will also reason about size equivalence for slice selection,
and boolean array masking (one dimensional only). For example, it is able to
infer that ``a[1 : n-1]`` is of the same size as ``b[0 : n-2]``.
Array analysis may also insert safety assumptions to ensure pre-conditions
related to array sizes are met before an operation can be parallelized.
For example, ``np.dot(X, w)`` between a 2-D matrix ``X`` and a 1-D vector ``w``
requires that the second dimension of ``X`` is of the same size as ``w``.
Usually this kind of runtime check is automatically inserted, but if array
analysis can infer such equivalence, it will skip them.
Users can even help array analysis by turning implicit knowledge about
array sizes into explicit assertions. For example, in the code below:
.. code-block:: python
@numba.njit(parallel=True)
def logistic_regression(Y, X, w, iterations):
assert(X.shape == (Y.shape[0], w.shape[0]))
for i in range(iterations):
w -= np.dot(((1.0 / (1.0 + np.exp(-Y * np.dot(X, w))) - 1.0) * Y), X)
return w
Making the explicit assertion helps eliminate all bounds checks in the
rest of the function.
#. ``prange()`` to parfor
The use of prange (:ref:`numba-prange`) in a for loop is an explicit
indication from the programmer that all iterations of the for loop can
execute in parallel. In this sub-pass, we analyze the CFG to locate loops
and to convert those loops controlled by a prange object to the explicit
`parfor` operator. Each explicit parfor operator consists of:
a. A list of loop nest information that describes the iteration space of the
parfor. Each entry in the loop nest list contains an indexing variable,
the start of the range, the end of the range, and the step value for each
iteration.
#. An initialization (init) block which contains instructions to be executed
one time before the parfor begins executing.
#. A loop body comprising a set of basic blocks that correspond to the body
of the loop and compute one point in the iteration space.
#. The index variables used for each dimension of the iteration space.
For parfor `pranges`, the loop nest is a single entry where the start,
stop, and step fields come from the specified `prange`. The init block is
empty for `prange` parfors and the loop body is the set of blocks in the
loop minus the loop header.
With parallelization on, array comprehensions (:ref:`pysupported-comprehension`)
will also be translated to prange so as to run in parallel. This behavior
be disabled by setting ``parallel={'comprehension': False}``.
Likewise, the overall `prange` to `parfor` translation can be disabled by
setting ``parallel={'prange': False}``, in which case `prange` is treated the
same as `range`.
#. Numpy to parfor
In this sub-pass, Numpy functions such as ``ones``, ``zeros``, ``dot``, most
of the random number generating functions, arrayexprs (from Section
:ref:`rewrite-typed-ir`), and Numpy reductions are converted to parfors.
Generally, this conversion creates the loop nest list, whose length is equal
to the number of dimensions of the left-hand side of the assignment
instruction in the IR. The number and size of the dimensions of the
left-hand-side array is taken from the array analysis information generated
in sub-pass 3 above. An instruction to create the result Numpy array is
generated and stored in the new parfor's init block. A basic block is
created for the loop body and an instruction is generated and added to the
end of that block to store the result of the computation into the array at
the current point in the iteration space. The result stored into the array
depends on the operation that is being converted. For example, for ``ones``,
the value stored is a constant 1. For calls to generate a random array, the
value comes from a call to the same random number function but with the size
parameter dropped and therefore returning a scalar. For arrayexpr operators,
the arrayexpr tree is converted to Numba IR and the value at the root of that
expression tree is used to write into the output array. The translation from
Numpy functions and arrayexpr operators to `parfor` can be disabled by
setting ``parallel={'numpy': False}``.
For reductions, the loop nest list is similarly created using the array
analysis information for the array being reduced. In the init block, the
initial value is assigned to the reduction variable. The loop body consists
of a single block in which the next value in the iteration space is fetched
and the reduction operation is applied to that value and the current
reduction value and the result stored back into the reduction value.
The translation of reduction functions to `parfor` can be disabled by
setting ``parallel={'reduction': False}``.
Setting the :envvar:`NUMBA_DEBUG_ARRAY_OPT_STATS` environment variable to
1 will show some statistics about parfor conversions in general.
#. Setitem to parfor
Setting a range of array elements using a slice or boolean array selection
can also run in parallel. Statement such as ``A[P] = B[Q]``
(or a simpler case ``A[P] = c``, where ``c`` is a scalar) is translated to
`parfor` if one of the following conditions is met:
a. ``P`` and ``Q`` are slices or multi-dimensional selector involving
scalar and slices, and ``A[P]`` and ``B[Q]`` are considered size
equivalent by array analysis. Only 2-value slice/range is supported,
3-value with a step will not be translated to `parfor`.
#. ``P`` and ``Q`` are the same boolean array.
This translation can be disabled by setting ``parallel={'setitem': False}``.
#. Simplification
Performs a copy propagation and dead code elimination pass.
#. Fusion
This sub-pass first processes each basic block and does a reordering of the
instructions within the block with the goal of pushing parfors lower in the
block and lifting non-parfors towards the start of the block. In practice,
this approach does a good job of getting parfors adjacent to each other in
the IR, which enables more parfors to then be fused. During parfor fusion,
each basic block is repeatedly scanned until no further fusion is possible.
During this scan, each set of adjacent instructions are considered.
Adjacent instructions are fused together if:
a. they are both parfors
#. the parfors' loop nests are the same size and the array equivalence
classes for each dimension of the loop nests are the same, and
#. the first parfor does not create a reduction variable used by the
second parfor.
The two parfors are fused together by adding the second parfor's init block
to the first's, merging the two parfors' loop bodies together and replacing
the instances of the second parfor's loop index variables in the second
parfor's body with the loop index variables for the first parfor.
Fusion can be disabled by setting ``parallel={'fusion': False}``.
Setting the :envvar:`NUMBA_DEBUG_ARRAY_OPT_STATS` environment variable to
1 will show some statistics about parfor fusions.
#. Push call objects and compute parfor parameters
In the lowering phase described in Section :ref:`lowering`, each parfor
becomes a separate function executed in parallel in ``guvectorize``
(:ref:`guvectorize`) style. Since parfors may use variables defined
previously in a function, when those parfors become separate functions,
those variables must be passed to the parfor function as parameters. In
this sub-pass, a use-def scan is made over each parfor body and liveness
information is used to determine which variables are used but not defined by
the parfor. That list of variables is stored here in the parfor for use
during lowering. Function variables are a special case in this process
since function variables cannot be passed to functions compiled in nopython
mode. Instead, for function variables, this sub-pass pushes the assignment
instruction to the function variable into the parfor body so that those do
not need to be passed as parameters.
To see the intermediate IR between the above sub-passes and other debugging
information, set the :envvar:`NUMBA_DEBUG_ARRAY_OPT` environment variable to
1. For the example in Section :ref:`rewrite-typed-ir`, the following IR with
a parfor is generated during this stage::
______________________________________________________________________
label 0:
a0 = arg(0, name=a0) ['a0']
a0_sh_attr0.0 = getattr(attr=shape, value=a0) ['a0', 'a0_sh_attr0.0']
$consta00.1 = const(int, 0) ['$consta00.1']
a0size0.2 = static_getitem(value=a0_sh_attr0.0, index_var=$consta00.1, index=0) ['$consta00.1', 'a0_sh_attr0.0', 'a0size0.2']
a1 = arg(1, name=a1) ['a1']
a1_sh_attr0.3 = getattr(attr=shape, value=a1) ['a1', 'a1_sh_attr0.3']
$consta10.4 = const(int, 0) ['$consta10.4']
a1size0.5 = static_getitem(value=a1_sh_attr0.3, index_var=$consta10.4, index=0) ['$consta10.4', 'a1_sh_attr0.3', 'a1size0.5']
a2 = arg(2, name=a2) ['a2']
a2_sh_attr0.6 = getattr(attr=shape, value=a2) ['a2', 'a2_sh_attr0.6']
$consta20.7 = const(int, 0) ['$consta20.7']
a2size0.8 = static_getitem(value=a2_sh_attr0.6, index_var=$consta20.7, index=0) ['$consta20.7', 'a2_sh_attr0.6', 'a2size0.8']
---begin parfor 0---
index_var = parfor_index.9
LoopNest(index_variable=parfor_index.9, range=0,a0size0.2,1 correlation=5)
init block:
$np_g_var.10 = global(np: <module 'numpy' from '/usr/local/lib/python3.5/dist-packages/numpy/__init__.py'>) ['$np_g_var.10']
$empty_attr_attr.11 = getattr(attr=empty, value=$np_g_var.10) ['$empty_attr_attr.11', '$np_g_var.10']
$np_typ_var.12 = getattr(attr=float64, value=$np_g_var.10) ['$np_g_var.10', '$np_typ_var.12']
$0.5 = call $empty_attr_attr.11(a0size0.2, $np_typ_var.12, kws=(), func=$empty_attr_attr.11, vararg=None, args=[Var(a0size0.2, test2.py (7)), Var($np_typ_var.12, test2.py (7))]) ['$0.5', '$empty_attr_attr.11', '$np_typ_var.12', 'a0size0.2']
label 1:
$arg_out_var.15 = getitem(value=a0, index=parfor_index.9) ['$arg_out_var.15', 'a0', 'parfor_index.9']
$arg_out_var.16 = getitem(value=a1, index=parfor_index.9) ['$arg_out_var.16', 'a1', 'parfor_index.9']
$arg_out_var.14 = $arg_out_var.15 * $arg_out_var.16 ['$arg_out_var.14', '$arg_out_var.15', '$arg_out_var.16']
$arg_out_var.17 = getitem(value=a2, index=parfor_index.9) ['$arg_out_var.17', 'a2', 'parfor_index.9']
$expr_out_var.13 = $arg_out_var.14 + $arg_out_var.17 ['$arg_out_var.14', '$arg_out_var.17', '$expr_out_var.13']
$0.5[parfor_index.9] = $expr_out_var.13 ['$0.5', '$expr_out_var.13', 'parfor_index.9']
----end parfor 0----
$0.6 = cast(value=$0.5) ['$0.5', '$0.6']
return $0.6 ['$0.6']
______________________________________________________________________
.. _`lowering`:
Stage 6a: Generate nopython LLVM IR
-----------------------------------
If type inference succeeds in finding a Numba type for every intermediate
variable, then Numba can (potentially) generate specialized native code. This
process is called :term:`lowering`. The Numba IR tree is translated into
LLVM IR by using helper classes from `llvmlite <http://llvmlite.pydata.org/>`_.
The machine-generated LLVM IR can seem unnecessarily verbose, but the LLVM
toolchain is able to optimize it quite easily into compact, efficient code.
The basic lowering algorithm is generic, but the specifics of how particular
Numba IR nodes are translated to LLVM instructions is handled by the
target context selected for compilation. The default target context is
the "cpu" context, defined in ``numba.targets.cpu``.
The LLVM IR can be displayed by setting the :envvar:`NUMBA_DUMP_LLVM` environment
variable to 1. For the "cpu" context, our ``add()`` example would look like:
.. code-block:: llvm
define i32 @"__main__.add$1.int64.int64"(i64* %"retptr",
{i8*, i32}** %"excinfo",
i8* %"env",
i64 %"arg.a", i64 %"arg.b")
{
entry:
%"a" = alloca i64
%"b" = alloca i64
%"$0.3" = alloca i64
%"$0.4" = alloca i64
br label %"B0"
B0:
store i64 %"arg.a", i64* %"a"
store i64 %"arg.b", i64* %"b"
%".8" = load i64* %"a"
%".9" = load i64* %"b"
%".10" = add i64 %".8", %".9"
store i64 %".10", i64* %"$0.3"
%".12" = load i64* %"$0.3"
store i64 %".12", i64* %"$0.4"
%".14" = load i64* %"$0.4"
store i64 %".14", i64* %"retptr"
ret i32 0
}
The post-optimization LLVM IR can be output by setting
:envvar:`NUMBA_DUMP_OPTIMIZED` to 1. The optimizer shortens the code
generated above quite significantly:
.. code-block:: llvm
define i32 @"__main__.add$1.int64.int64"(i64* nocapture %retptr,
{ i8*, i32 }** nocapture readnone %excinfo,
i8* nocapture readnone %env,
i64 %arg.a, i64 %arg.b)
{
entry:
%.10 = add i64 %arg.b, %arg.a
store i64 %.10, i64* %retptr, align 8
ret i32 0
}
If created during :ref:`parallel-accelerator`, parfor operations are
lowered in the following manner. First, instructions in the parfor's init
block are lowered into the existing function using the normal lowering code.
Second, the loop body of the parfor is turned into a separate GUFunc.
Third, code is emitted for the current function to call the parallel GUFunc.
To create a GUFunc from the parfor body, the signature of the GUFunc is
created by taking the parfor parameters as identified in step 9 of
Stage :ref:`parallel-accelerator` and adding to that a special `schedule`
parameter, across which the GUFunc will be parallelized. The schedule
parameter is in effect a static schedule mapping portions of the parfor
iteration space to Numba threads and so the length of the schedule
array is the same as the number of configured Numba threads. To make
this process easier and somewhat less dependent on changes to Numba IR,
this stage creates a Python function as text that contains the parameters
to the GUFunc and iteration code that takes the current schedule entry
and loops through the specified portion of the iteration space. In the
body of that loop, a special sentinel is inserted for subsequent easy
location. This code that handles the processing of the iteration space
is then ``eval``'ed into existence and the Numba compiler's run_frontend
function is called to generate IR. That IR is scanned to locate the
sentinel and the sentinel is replaced with the loop body of the parfor.
Then, the process of creating the parallel GUFunc is completed by
compiling this merged IR with the Numba compiler's ``compile_ir`` function.
To call the parallel GUFunc, the static schedule must be created.
Code is inserted to call a function named ``do_scheduling.`` This function
is called with the size of each of the parfor's dimensions and the number
`N` of configured Numba threads (:envvar:`NUMBA_NUM_THREADS`).
The ``do_scheduling`` function will divide
the iteration space into N approximately equal sized regions (linear for
1D, rectangular for 2D, or hyperrectangles for 3+D) and the resulting
schedule is passed to the parallel GUFunc. The number of threads
dedicated to a given dimension of the full iteration space is roughly
proportional to the ratio of the size of the given dimension to the sum
of the sizes of all the dimensions of the iteration space.
Parallel reductions are not natively provided by GUFuncs but the parfor
lowering strategy allows us to use GUFuncs in a way that reductions can
be performed in parallel. To accomplish this, for each reduction variable
computed by a parfor, the parallel GUFunc and the code that calls it are
modified to make the scalar reduction variable into an array of reduction
variables whose length is equal to the number of Numba threads. In addition,
the GUFunc still contains a scalar version of the reduction variable that
is updated by the parfor body during each iteration. One time at the
end of the GUFunc this local reduction variable is copied into the
reduction array. In this way, false sharing of the reduction array is
prevented. Code is also inserted into the main
function after the parallel GUFunc has returned that does a reduction
across this smaller reduction array and this final reduction value is
then stored into the original scalar reduction variable.
The GUFunc corresponding to the example from Section :ref:`parallel-accelerator`
can be seen below::
______________________________________________________________________
label 0:
sched.29 = arg(0, name=sched) ['sched.29']
a0 = arg(1, name=a0) ['a0']
a1 = arg(2, name=a1) ['a1']
a2 = arg(3, name=a2) ['a2']
_0_5 = arg(4, name=_0_5) ['_0_5']
$3.1.24 = global(range: <class 'range'>) ['$3.1.24']
$const3.3.21 = const(int, 0) ['$const3.3.21']
$3.4.23 = getitem(value=sched.29, index=$const3.3.21) ['$3.4.23', '$const3.3.21', 'sched.29']
$const3.6.28 = const(int, 1) ['$const3.6.28']
$3.7.27 = getitem(value=sched.29, index=$const3.6.28) ['$3.7.27', '$const3.6.28', 'sched.29']
$const3.8.32 = const(int, 1) ['$const3.8.32']
$3.9.31 = $3.7.27 + $const3.8.32 ['$3.7.27', '$3.9.31', '$const3.8.32']
$3.10.36 = call $3.1.24($3.4.23, $3.9.31, kws=[], func=$3.1.24, vararg=None, args=[Var($3.4.23, <string> (2)), Var($3.9.31, <string> (2))]) ['$3.1.24', '$3.10.36', '$3.4.23', '$3.9.31']
$3.11.30 = getiter(value=$3.10.36) ['$3.10.36', '$3.11.30']
jump 1 []
label 1:
$28.2.35 = iternext(value=$3.11.30) ['$28.2.35', '$3.11.30']
$28.3.25 = pair_first(value=$28.2.35) ['$28.2.35', '$28.3.25']
$28.4.40 = pair_second(value=$28.2.35) ['$28.2.35', '$28.4.40']
branch $28.4.40, 2, 3 ['$28.4.40']
label 2:
$arg_out_var.15 = getitem(value=a0, index=$28.3.25) ['$28.3.25', '$arg_out_var.15', 'a0']
$arg_out_var.16 = getitem(value=a1, index=$28.3.25) ['$28.3.25', '$arg_out_var.16', 'a1']
$arg_out_var.14 = $arg_out_var.15 * $arg_out_var.16 ['$arg_out_var.14', '$arg_out_var.15', '$arg_out_var.16']
$arg_out_var.17 = getitem(value=a2, index=$28.3.25) ['$28.3.25', '$arg_out_var.17', 'a2']
$expr_out_var.13 = $arg_out_var.14 + $arg_out_var.17 ['$arg_out_var.14', '$arg_out_var.17', '$expr_out_var.13']
_0_5[$28.3.25] = $expr_out_var.13 ['$28.3.25', '$expr_out_var.13', '_0_5']
jump 1 []
label 3:
$const44.1.33 = const(NoneType, None) ['$const44.1.33']
$44.2.39 = cast(value=$const44.1.33) ['$44.2.39', '$const44.1.33']
return $44.2.39 ['$44.2.39']
______________________________________________________________________
Stage 6b: Generate object mode LLVM IR
--------------------------------------
If type inference fails to find Numba types for all values inside a function,
the function will be compiled in object mode. The generated LLVM will be
significantly longer, as the compiled code will need to make calls to the
`Python C API <https://docs.python.org/3/c-api/>`_ to perform basically all
operations. The optimized LLVM for our example ``add()`` function is:
.. code-block:: llvm
@PyExc_SystemError = external global i8
@".const.Numba_internal_error:_object_mode_function_called_without_an_environment" = internal constant [73 x i8] c"Numba internal error: object mode function called without an environment\00"
@".const.name_'a'_is_not_defined" = internal constant [24 x i8] c"name 'a' is not defined\00"
@PyExc_NameError = external global i8
@".const.name_'b'_is_not_defined" = internal constant [24 x i8] c"name 'b' is not defined\00"
define i32 @"__main__.add$1.pyobject.pyobject"(i8** nocapture %retptr, { i8*, i32 }** nocapture readnone %excinfo, i8* readnone %env, i8* %arg.a, i8* %arg.b) {
entry:
%.6 = icmp eq i8* %env, null
br i1 %.6, label %entry.if, label %entry.endif, !prof !0
entry.if: ; preds = %entry
tail call void @PyErr_SetString(i8* @PyExc_SystemError, i8* getelementptr inbounds ([73 x i8]* @".const.Numba_internal_error:_object_mode_function_called_without_an_environment", i64 0, i64 0))
ret i32 -1
entry.endif: ; preds = %entry
tail call void @Py_IncRef(i8* %arg.a)
tail call void @Py_IncRef(i8* %arg.b)
%.21 = icmp eq i8* %arg.a, null
br i1 %.21, label %B0.if, label %B0.endif, !prof !0
B0.if: ; preds = %entry.endif
tail call void @PyErr_SetString(i8* @PyExc_NameError, i8* getelementptr inbounds ([24 x i8]* @".const.name_'a'_is_not_defined", i64 0, i64 0))
tail call void @Py_DecRef(i8* null)
tail call void @Py_DecRef(i8* %arg.b)
ret i32 -1
B0.endif: ; preds = %entry.endif
%.30 = icmp eq i8* %arg.b, null
br i1 %.30, label %B0.endif1, label %B0.endif1.1, !prof !0
B0.endif1: ; preds = %B0.endif
tail call void @PyErr_SetString(i8* @PyExc_NameError, i8* getelementptr inbounds ([24 x i8]* @".const.name_'b'_is_not_defined", i64 0, i64 0))
tail call void @Py_DecRef(i8* %arg.a)
tail call void @Py_DecRef(i8* null)
ret i32 -1
B0.endif1.1: ; preds = %B0.endif
%.38 = tail call i8* @PyNumber_Add(i8* %arg.a, i8* %arg.b)
%.39 = icmp eq i8* %.38, null
br i1 %.39, label %B0.endif1.1.if, label %B0.endif1.1.endif, !prof !0
B0.endif1.1.if: ; preds = %B0.endif1.1
tail call void @Py_DecRef(i8* %arg.a)
tail call void @Py_DecRef(i8* %arg.b)
ret i32 -1
B0.endif1.1.endif: ; preds = %B0.endif1.1
tail call void @Py_DecRef(i8* %arg.b)
tail call void @Py_DecRef(i8* %arg.a)
tail call void @Py_IncRef(i8* %.38)
tail call void @Py_DecRef(i8* %.38)
store i8* %.38, i8** %retptr, align 8
ret i32 0
}
declare void @PyErr_SetString(i8*, i8*)
declare void @Py_IncRef(i8*)
declare void @Py_DecRef(i8*)
declare i8* @PyNumber_Add(i8*, i8*)
The careful reader might notice several unnecessary calls to ``Py_IncRef``
and ``Py_DecRef`` in the generated code. Currently Numba isn't able to
optimize those away.
Object mode compilation will also attempt to identify loops which can be
extracted and statically-typed for "nopython" compilation. This process is
called *loop-lifting*, and results in the creation of a hidden nopython mode
function just containing the loop which is then called from the original
function. Loop-lifting helps improve the performance of functions that
need to access uncompilable code (such as I/O or plotting code) but still
contain a time-intensive section of compilable code.
Stage 7: Compile LLVM IR to machine code
----------------------------------------
In both :term:`object mode` and :term:`nopython mode`, the generated LLVM IR
is compiled by the LLVM JIT compiler and the machine code is loaded into
memory. A Python wrapper is also created (defined in
``numba.dispatcher.Dispatcher``) which can do the dynamic dispatch to the
correct version of the compiled function if multiple type specializations
were generated (for example, for both ``float32`` and ``float64`` versions
of the same function).
The machine assembly code generated by LLVM can be dumped to the screen by
setting the :envvar:`NUMBA_DUMP_ASSEMBLY` environment variable to 1:
.. code-block:: gas
.globl __main__.add$1.int64.int64
.align 16, 0x90
.type __main__.add$1.int64.int64,@function
__main__.add$1.int64.int64:
addq %r8, %rcx
movq %rcx, (%rdi)
xorl %eax, %eax
retq
The assembly output will also include the generated wrapper function that
translates the Python arguments to native data types.
.. _developer-caching:
================
Notes on Caching
================
Numba supports caching of compiled functions into the filesystem for future
use of the same functions.
The Implementation
==================
Caching is done by saving the compiled *object code*, the ELF object of the
executable code. By using the *object code*, cached functions have minimal
overhead because no compilation is needed. The cached data is saved under the
cache directory (see :envvar:`NUMBA_CACHE_DIR`). The index of the cache is
stored in a ``.nbi`` file, with one index per function, and it lists all the
overloaded signatures compiled for the function. The *object code* is stored in
files with an ``.nbc`` extension, one file per overload. The data in both files
is serialized with :mod:`pickle`.
Requirements for Cacheability
-----------------------------
Developers should note the requirements of a function to permit it to be cached
to ensure that the features they are working on are compatible with caching.
Requirements for cacheable function:
- The LLVM module must be *self-contained*, meaning that it cannot rely on
other compiled units without linking to them.
- The only allowed external symbols are from the
:ref:`NRT <arch-numba-runtime>` or other common symbols from system libraries
(i.e. libc and libm).
Debugging note:
- Look for the usage of ``inttoptr`` in the LLVM IR or
``target_context.add_dynamic_add()`` in the lowering code in Python.
They indicate potential usage of runtime address. Not all uses are
problematic and some are necessary. Only the conversion of constant integers
into pointers will affect caching.
- Misuse of dynamic address or dynamic symbols will likely result in a
segfault.
- Linking order matters because unused symbols are dropped after linking.
Linking should start from the leaf nodes of the dependency graph.
Features Compatible with Caching
--------------------------------
The following features are explicitly verified to work with caching.
- ufuncs and gufuncs for the ``cpu`` and ``parallel`` target
- parallel accelerator features (i.e. ``parallel=True``)
Caching Limitations
-------------------
This is a list of known limitation of the cache:
- Cache invalidation fails to recognize changes in symbols defined in a
different file.
- Global variables are treated as constants. The cache will remember the value
of the global variable at compilation time. On cache load, the cached
function will not rebind to the new value of the global variable.
.. _cache-sharing:
Cache Sharing
-------------
It is safe to share and reuse the contents in the cache directory on a
different machine. The cache remembers the CPU model and the available
CPU features during compilation. If the CPU model and the CPU features do
not match exactly, the cache contents will not be considered.
(Also see :envvar:`NUMBA_CPU_NAME`)
If the cache directory is shared on a network filesystem, concurrent
read/write of the cache is safe only if file replacement operation is atomic
for the filesystem. Numba always writes to a unique temporary file first, it
then replaces the target cache file path with the temporary file. Numba is
tolerant against lost cache files and lost cache entries.
.. _cache-clearing:
Cache Clearing
--------------
The cache is invalidated when the corresponding source file is modified.
However, it is necessary sometimes to clear the cache directory manually.
For instance, changes in the compiler will not be recognized because the source
files are not modified.
To clear the cache, the cache directory can be simply removed.
Removing the cache directory when a Numba application is running may cause an
``OSError`` exception to be raised at the compilation site.
Related Environment Variables
-----------------------------
See :ref:`env-vars for caching <numba-envvars-caching>`.
def ex_compiler_pass():
# magictoken.ex_compiler_pass.begin
from numba import njit
from numba.core import ir
from numba.core.compiler import CompilerBase, DefaultPassBuilder
from numba.core.compiler_machinery import FunctionPass, register_pass
from numba.core.untyped_passes import IRProcessing
from numbers import Number
# Register this pass with the compiler framework, declare that it will not
# mutate the control flow graph and that it is not an analysis_only pass (it
# potentially mutates the IR).
@register_pass(mutates_CFG=False, analysis_only=False)
class ConstsAddOne(FunctionPass):
_name = "consts_add_one" # the common name for the pass
def __init__(self):
FunctionPass.__init__(self)
# implement method to do the work, "state" is the internal compiler
# state from the CompilerBase instance.
def run_pass(self, state):
func_ir = state.func_ir # get the FunctionIR object
mutated = False # used to record whether this pass mutates the IR
# walk the blocks
for blk in func_ir.blocks.values():
# find the assignment nodes in the block and walk them
for assgn in blk.find_insts(ir.Assign):
# if an assignment value is a ir.Consts
if isinstance(assgn.value, ir.Const):
const_val = assgn.value
# if the value of the ir.Const is a Number
if isinstance(const_val.value, Number):
# then add one!
const_val.value += 1
mutated |= True
return mutated # return True if the IR was mutated, False if not.
# magictoken.ex_compiler_pass.end
# magictoken.ex_compiler_defn.begin
class MyCompiler(CompilerBase): # custom compiler extends from CompilerBase
def define_pipelines(self):
# define a new set of pipelines (just one in this case) and for ease
# base it on an existing pipeline from the DefaultPassBuilder,
# namely the "nopython" pipeline
pm = DefaultPassBuilder.define_nopython_pipeline(self.state)
# Add the new pass to run after IRProcessing
pm.add_pass_after(ConstsAddOne, IRProcessing)
# finalize
pm.finalize()
# return as an iterable, any number of pipelines may be defined!
return [pm]
# magictoken.ex_compiler_defn.end
# magictoken.ex_compiler_call.begin
@njit(pipeline_class=MyCompiler) # JIT compile using the custom compiler
def foo(x):
a = 10
b = 20.2
c = x + a + b
return c
print(foo(100)) # 100 + 10 + 20.2 (+ 1 + 1), extra + 1 + 1 from the rewrite!
# magictoken.ex_compiler_call.end
# magictoken.ex_compiler_timings.begin
compile_result = foo.overloads[foo.signatures[0]]
nopython_times = compile_result.metadata['pipeline_times']['nopython']
for k in nopython_times.keys():
if ConstsAddOne._name in k:
print(nopython_times[k])
# magictoken.ex_compiler_timings.end
assert foo(100) == 132.2
ex_compiler_pass()
Contributing to Numba
=====================
We welcome people who want to make contributions to Numba, big or small!
Even simple documentation improvements are encouraged. If you have
questions, don't hesitate to ask them (see below).
Communication
-------------
Real-time Chat
''''''''''''''
Numba uses Gitter for public real-time chat. To help improve the
signal-to-noise ratio, we have two channels:
* `numba/numba <https://gitter.im/numba/numba>`_: General Numba discussion,
questions, and debugging help.
* `numba/numba-dev <https://gitter.im/numba/numba-dev>`_: Discussion of PRs,
planning, release coordination, etc.
Both channels are public, but we may ask that discussions on numba-dev move to
the numba channel. This is simply to ensure that numba-dev is easy for core
developers to keep up with.
Note that the Github issue tracker is the best place to report bugs. Bug
reports in chat are difficult to track and likely to be lost.
Forum
.....
Numba uses Discourse as a forum for longer running threads such as design
discussions and roadmap planning. There are various categories available and it
can be reached at: `numba.discourse.group <https://numba.discourse.group/>`_.
Weekly Meetings
'''''''''''''''
The core Numba developers have a weekly video conference to discuss roadmap,
feature planning, and outstanding issues. These meetings are entirely public,
details are posted on
`numba.discourse.group Announcements <https://numba.discourse.group/c/announcements/>`_
and everyone is welcome to join the discussion. Minutes will be taken and will
be posted to the
`Numba wiki <https://github.com/numba/numba/wiki/Meeting-Minutes>`_.
.. _report-numba-bugs:
Bug tracker
''''''''''''
We use the `Github issue tracker <https://github.com/numba/numba/issues>`_
to track both bug reports and feature requests. If you report an issue,
please include specifics:
* what you are trying to do;
* which operating system you have and which version of Numba you are running;
* how Numba is misbehaving, e.g. the full error traceback, or the unexpected
results you are getting;
* as far as possible, a code snippet that allows full reproduction of your
problem.
Getting set up
--------------
If you want to contribute, we recommend you fork our `Github repository
<https://github.com/numba/numba>`_, then create a branch representing
your work. When your work is ready, you should submit it as a pull
request from the Github interface.
If you want, you can submit a pull request even when you haven't finished
working. This can be useful to gather feedback, or to stress your changes
against the :ref:`continuous integration <continuous_integration_testing>`
platform. In this case, please prepend ``[WIP]`` to your pull request's title.
.. _buildenv:
Build environment
'''''''''''''''''
Numba has a number of dependencies (mostly `NumPy <http://www.numpy.org/>`_ and
`llvmlite <https://github.com/numba/llvmlite>`_) with non-trivial build
instructions. Unless you want to build those dependencies yourself, we
recommend you use `conda <http://conda.pydata.org/miniconda.html>`_ to create a
dedicated development environment and install precompiled versions of those
dependencies there. Read more about the Numba dependencies here:
`numba-source-install-check`.
When working with a source checkout of Numba you will also need a development
build of llvmlite. These are available from the ``numba/label/dev`` channel on
`anaconda.org <https://anaconda.org/numba/llvmlite>`_.
To create an environment with the required dependencies, noting the use of the
double-colon syntax (``numba/label/dev::llvmlite``) to install the latest
development version of the llvmlite library::
$ conda create -n numbaenv python=3.10 numba/label/dev::llvmlite numpy scipy jinja2 cffi
.. note::
This installs an environment based on Python 3.10, but you can of course
choose another version supported by Numba. To test additional features,
you may also need to install ``tbb`` and/or ``llvm-openmp``. Check the
dependency list above for details.
To activate the environment for the current shell session::
$ conda activate numbaenv
.. note::
These instructions are for a standard Linux shell. You may need to
adapt them for other platforms.
Once the environment is activated, you have a dedicated Python with the
required dependencies::
$ python
Python 3.10.3 (main, Mar 28 2022, 04:26:28) [Clang 12.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import llvmlite
>>> llvmlite.__version__
0.39.0dev0+61.gf27ac6f
Building Numba
''''''''''''''
For a convenient development workflow, we recommend you build Numba inside
its source checkout::
$ git clone git@github.com:numba/numba.git
$ cd numba
$ python setup.py build_ext --inplace
This assumes you have a working C compiler and runtime on your development
system. You will have to run this command again whenever you modify
C files inside the Numba source tree.
The ``build_ext`` command in Numba's setup also accepts the following
arguments:
- ``--noopt``: This disables optimization when compiling Numba's CPython
extensions, which makes debugging them much easier. Recommended in
conjunction with the standard ``build_ext`` option ``--debug``.
- ``--werror``: Compiles Numba's CPython extensions with the ``-Werror`` flag.
- ``--wall``: Compiles Numba's CPython extensions with the ``-Wall`` flag.
Note that Numba's CI and the conda recipe for Linux build with the ``--werror``
and ``--wall`` flags, so any contributions that change the CPython extensions
should be tested with these flags too.
.. _running-tests:
Running tests
'''''''''''''
Numba is validated using a test suite comprised of various kind of tests
(unit tests, functional tests). The test suite is written using the
standard :py:mod:`unittest` framework.
The tests can be executed via ``python -m numba.runtests``. If you are
running Numba from a source checkout, you can type ``./runtests.py``
as a shortcut. Various options are supported to influence test running
and reporting. Pass ``-h`` or ``--help`` to get a glimpse at those options.
Examples:
* to list all available tests::
$ python -m numba.runtests -l
* to list tests from a specific (sub-)suite::
$ python -m numba.runtests -l numba.tests.test_usecases
* to run those tests::
$ python -m numba.runtests numba.tests.test_usecases
* to run all tests in parallel, using multiple sub-processes::
$ python -m numba.runtests -m
* For a detailed list of all options::
$ python -m numba.runtests -h
The numba test suite can take a long time to complete. When you want to avoid
the long wait, it is useful to focus on the failing tests first with the
following test runner options:
* The ``--failed-first`` option is added to capture the list of failed tests
and to re-execute them first::
$ python -m numba.runtests --failed-first -m -v -b
* The ``--last-failed`` option is used with ``--failed-first`` to execute
the previously failed tests only::
$ python -m numba.runtests --last-failed -m -v -b
When debugging, it is useful to turn on logging. Numba logs using the
standard ``logging`` module. One can use the standard ways (i.e.
``logging.basicConfig``) to configure the logging behavior. To enable logging
in the test runner, there is a ``--log`` flag for convenience::
$ python -m numba.runtests --log
To enable :ref:`runtime type-checking <type_anno_check>`, set the environment
variable ``NUMBA_USE_TYPEGUARD=1`` and use `runtests.py` from the source root
instead. For example::
$ NUMBA_USE_TYPEGUARD=1 python runtests.py
Running coverage
''''''''''''''''
Coverage reports can be produced using `coverage.py
<https://coverage.readthedocs.io/en/stable/index.html>`_. To record coverage
info for the test suite, run::
coverage run -m numba.runtests <runtests args>
Next, combine coverage files (potentially for multiple runs) with::
coverage combine
The combined output can be transformed into various report formats - see the
`coverage CLI usage reference
<https://coverage.readthedocs.io/en/stable/cmd.html#command-line-usage>`_.
For example, to produce an HTML report, run::
coverage html
Following this command, the report can be viewed by opening ``htmlcov/index.html``.
Development rules
-----------------
Code reviews
''''''''''''
Any non-trivial change should go through a code review by one or several of
the core developers. The recommended process is to submit a pull request
on github.
A code review should try to assess the following criteria:
* general design and correctness
* code structure and maintainability
* coding conventions
* docstrings, comments and release notes (if necessary)
* test coverage
Policy on large scale changes to code formatting
''''''''''''''''''''''''''''''''''''''''''''''''
Please note that pull requests making large scale changes to format the code
base are in general not accepted. Such changes often increase the likelihood of
merge conflicts for other pull requests, which inevitably take time and
resources to resolve. They also require a lot of effort to check as Numba aims
to compile code that is valid even if it is not ideal. For example, in a test of
``operator.eq``::
if x == None: # Valid code, even if the recommended form is `if x is None:`
This tests Numba's compilation of comparison with ``None``, and therefore
should not be changed, even though most style checkers will suggest it should.
This policy has been adopted by the core developers so as to try and make best
use of limited resources. Whilst it would be great to have an extremely tidy
code base, priority is given to fixes and features over code formatting changes.
Coding conventions
''''''''''''''''''
All Python code should follow :pep:`8`. Our C code doesn't have a
well-defined coding style (would it be nice to follow :pep:`7`?).
Code and documentation should generally fit within 80 columns, for
maximum readability with all existing tools (such as code review UIs).
Numba uses `Flake8 <http://flake8.pycqa.org/en/latest/>`_ to ensure a consistent
Python code format throughout the project. ``flake8`` can be installed
with ``pip`` or ``conda`` and then run from the root of the Numba repository::
flake8 numba
Optionally, you may wish to setup `pre-commit hooks <https://pre-commit.com/>`_
to automatically run ``flake8`` when you make a git commit. This can be
done by installing ``pre-commit``::
pip install pre-commit
and then running::
pre-commit install
from the root of the Numba repository. Now ``flake8`` will be run each time
you commit changes. You can skip this check with ``git commit --no-verify``.
Numba has started the process of using `type hints <https://www.python.org/dev/peps/pep-0484/>`_ in its code base. This
will be a gradual process of extending the number of files that use type hints, as well as going from voluntary to
mandatory type hints for new features. `Mypy <http://mypy-lang.org/>`_ is used for automated static checking.
At the moment, only certain files are checked by mypy. The list can be found in ``mypy.ini``. When making changes to
those files, it is necessary to add the required type hints such that mypy tests will pass. Only in exceptional
circumstances should ``type: ignore`` comments be used.
If you are contributing a new feature, we encourage you to use type hints, even if the file is not currently in the
checklist. If you want to contribute type hints to enable a new file to be in the checklist, please add the file to the
``files`` variable in ``mypy.ini``, and decide what level of compliance you are targeting. Level 3 is basic static
checks, while levels 2 and 1 represent stricter checking. The levels are described in details in ``mypy.ini``.
There is potential for confusion between the Numba module ``typing`` and Python built-in module ``typing`` used for type
hints, as well as between Numba types---such as ``Dict`` or ``Literal``---and ``typing`` types of the same name.
To mitigate the risk of confusion we use a naming convention by which objects of the built-in ``typing`` module are
imported with an ``pt`` prefix. For example, ``typing.Dict`` is imported as ``from typing import Dict as ptDict``.
Release Notes
'''''''''''''
Pull Requests that add significant user-facing modifications may need to be mentioned in the release notes.
To add a release note, a short ``.rst`` file needs creating containing a summary of the change and it needs to be placed in
``docs/upcoming_changes``. The file ``docs/upcoming_changes/README.rst`` details the format
and file naming conventions.
Stability
'''''''''
The repository's ``main`` branch is expected to be stable at all times.
This translates into the fact that the test suite passes without errors
on all supported platforms (see below). This also means that a pull request
also needs to pass the test suite before it is merged in.
.. _platform_support:
Platform support
''''''''''''''''
Every commit to the main branch is automatically tested on all of the
platforms Numba supports. This includes ARMv8, POWER8, and NVIDIA GPUs.
The build system however is internal to Anaconda, so we also use
`Azure <https://dev.azure.com/numba/numba/_build>`_ to provide public continuous
integration information for as many combinations as can be supported by the
service. Azure CI automatically tests all pull requests on Windows, OS X and
Linux, as well as a sampling of different Python and NumPy versions. If you see
problems on platforms you are unfamiliar with, feel free to ask for help in your
pull request. The Numba core developers can help diagnose cross-platform
compatibility issues. Also see the :ref:`continuous integration
<continuous_integration_testing>` section on how public CI is implemented.
.. _continuous_integration_testing:
Continuous integration testing
''''''''''''''''''''''''''''''
The Numba test suite causes CI systems a lot of grief:
#. It's huge, 9000+ tests.
#. In part because of 1. and that compilers are pretty involved, the test suite
takes a long time to run.
#. There's sections of the test suite that are deliberately designed to stress
systems almost to the point of failure (tests which concurrently compile and
execute with threads and fork processes etc).
#. The combination of things that Numba has to test well exceeds the capacity of
any public CI system, (Python versions x NumPy versions x Operating systems
x Architectures x feature libraries (e.g. SVML) x threading backends
(e.g. OpenMP, TBB)) and then there's CUDA too and all its version
variants.
As a result of the above, public CI is implemented as follows:
#. The combination of OS x Python x NumPy x Various Features in the testing
matrix is designed to give a good indicative result for whether "this pull
request is probably ok".
#. When public CI runs it:
#. Looks for files that contain tests that have been altered by the proposed
change and runs these on the whole testing matrix.
#. Runs a subset of the test suite on each part of the testing matrix. i.e.
slice the test suite up by the number of combinations in the testing
matrix and each combination runs one chunk. This is done for speed,
because public CI cannot cope with the load else.
If a Pull Request (PR) changes CUDA code or will affect the CUDA target, it
needs to be run on `gpuCI <https://gpuci.gpuopenanalytics.com/job/numba/>`_.
This can be triggered by one of the Numba maintainers commenting ``run gpuCI
tests`` on the PR discussion. This runs the CUDA testsuite with various CUDA
toolkit versions on Linux, to provide some initial confidence in the
correctness of the changes with respect to CUDA. Following approval, the PR
will also be run on Numba's build farm to test other configurations with CUDA
(including Windows, which is not tested by gpuCI).
If the PR is not CUDA-related but makes changes to something that the core
developers consider risky, then it will also be run on the Numba farm just to
make sure. The Numba project's private build and test farm will actually
exercise all the applicable tests on all the combinations noted above on real
hardware!
.. _type_anno_check:
Type annotation and runtime type checking
'''''''''''''''''''''''''''''''''''''''''
Numba is slowly gaining type annotations. To facilitate the review of pull
requests that are incrementally adding type annotations, the test suite uses
`typeguard`_ to perform runtime type checking. This helps verify the validity
of type annotations.
To enable runtime type checking in the test suite, users can use
`runtests.py`_ in the source root as the test runner and set environment
variable ``NUMBA_USE_TYPEGUARD=1``. For example::
$ NUMBA_USE_TYPEGUARD=1 python runtests.py numba.tests
Things that help with pull requests
'''''''''''''''''''''''''''''''''''
Even with the mitigating design above public CI can get overloaded which causes
a backlog of builds. It's therefore really helpful when opening pull requests if
you can limit the frequency of pushing changes. Ideally, please squash commits
to reduce the number of patches and/or push as infrequently as possible. Also,
once a pull request review has started, please don't rebase/force push/squash
or do anything that rewrites history of the reviewed code as GitHub cannot track
this and it makes it very hard for reviewers to see what has changed.
The core developers thank everyone for their cooperation with the above!
Why is my pull request/issue seemingly being ignored?
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Numba is an open source project and like many similar projects it has limited
resources. As a result, it is unfortunately necessary for the core developers to
associate a priority with issues/pull requests (PR). A great way to move your
issue/PR up the priority queue is to help out somewhere else in the project so
as to free up core developer time. Examples of ways to help:
* Perform an initial review on a PR. This often doesn't require compiler
engineering knowledge and just involves checking that the proposed patch is of
good quality, fixes the problem/implements the feature, is well tested and
documented.
* Debug an issue, there are numerous issues which `"need triage" <https://github.com/numba/numba/issues?q=is%3Aissue+is%3Aopen+label%3Aneedtriage>`_
which essentially involves debugging the reported problem. Even if you cannot
get right to the bottom of a problem, leaving notes about what was discovered
for someone else is also helpful.
* Answer questions/provide help for users on `discourse <https://numba.discourse.group/>`_
and/or `gitter.im <https://gitter.im/numba/numba>`_.
The core developers thank everyone for their understanding with the above!
Documentation
-------------
The Numba documentation is split over two repositories:
* This documentation is in the ``docs`` directory inside the
`Numba repository <https://github.com/numba/numba>`_.
* The `Numba homepage <https://numba.pydata.org>`_ has its sources in a
separate repository at https://github.com/numba/numba.github.com.
Main documentation
''''''''''''''''''
This documentation is under the ``docs`` directory of the `Numba repository`_.
It is built with `Sphinx <http://sphinx-doc.org/>`_, `numpydoc
<https://numpydoc.readthedocs.io/>`_ and the
`sphinx-rtd-theme <https://sphinx-rtd-theme.readthedocs.io/en/stable/>`_.
To install all dependencies for building the documentation, use::
$ conda install sphinx numpydoc sphinx_rtd_theme
You can edit the source files under ``docs/source/``, after which you can
build and check the documentation under ``docs/``::
$ make html
$ open _build/html/index.html
Web site homepage
'''''''''''''''''
The Numba homepage on https://numba.pydata.org can be fetched from here:
https://github.com/numba/numba.github.com
.. _typeguard: https://typeguard.readthedocs.io/en/latest/
.. _runtests.py: https://github.com/numba/numba/blob/main/runtests.py
.. _arch-pipeline:
========================
Customizing the Compiler
========================
.. warning:: The custom pipeline feature is for expert use only. Modifying
the compiler behavior can invalidate internal assumptions in the
numba source code.
For library developers looking for a way to extend or modify the compiler
behavior, you can do so by defining a custom compiler by inheriting from
``numba.compiler.CompilerBase``. The default Numba compiler is defined
as ``numba.compiler.Compiler``, implementing the ``.define_pipelines()``
method, which adds the *nopython-mode*, *object-mode* and *interpreted-mode*
pipelines. For convenience these three pipelines are defined in
``numba.compiler.DefaultPassBuilder`` by the methods:
* ``.define_nopython_pipeline()``
* ``.define_objectmode_pipeline()``
* ``.define_interpreted_pipeline()``
respectively.
To use a custom subclass of ``CompilerBase``, supply it as the
``pipeline_class`` keyword argument to the ``@jit`` and ``@generated_jit``
decorators. By doing so, the effect of the custom pipeline is limited to the
function being decorated.
Implementing a compiler pass
----------------------------
Numba makes it possible to implement a new compiler pass and does so through the
use of an API similar to that of LLVM. The following demonstrates the basic
process involved.
Compiler pass classes
#####################
All passes must inherit from ``numba.compiler_machinery.CompilerPass``, commonly
used subclasses are:
* ``numba.compiler_machinery.FunctionPass`` for describing a pass that operates
on a function-at-once level and may mutate the IR state.
* ``numba.compiler_machinery.AnalysisPass`` for describing a pass that performs
analysis only.
* ``numba.compiler_machinery.LoweringPass`` for describing a pass that performs
lowering only.
In this example a new compiler pass will be implemented that will rewrite all
``ir.Const(x)`` nodes, where ``x`` is a subclass of ``numbers.Number``, such
that the value of x is incremented by one. There is no use for this pass other
than to serve as a pedagogical vehicle!
The ``numba.compiler_machinery.FunctionPass`` is appropriate for the suggested
pass behavior and so is the base class of the new pass. Further, a ``run_pass``
method is defined to do the work (this method is abstract, all compiler passes
must implement it).
First the new class:
.. literalinclude:: compiler_pass_example.py
:language: python
:dedent: 4
:start-after: magictoken.ex_compiler_pass.begin
:end-before: magictoken.ex_compiler_pass.end
Note also that the class must be registered with Numba's compiler machinery
using ``@register_pass``. This in part is to allow the declaration of whether
the pass mutates the control flow graph and whether it is an analysis only pass.
Next, define a new compiler based on the existing
``numba.compiler.CompilerBase``. The compiler pipeline is defined through the
use of an existing pipeline and the new pass declared above is added to be run
after the ``IRProcessing`` pass.
.. literalinclude:: compiler_pass_example.py
:language: python
:dedent: 4
:start-after: magictoken.ex_compiler_defn.begin
:end-before: magictoken.ex_compiler_defn.end
Finally update the ``@njit`` decorator at the call site to make use of the newly
defined compilation pipeline.
.. literalinclude:: compiler_pass_example.py
:language: python
:dedent: 4
:start-after: magictoken.ex_compiler_call.begin
:end-before: magictoken.ex_compiler_call.end
Debugging compiler passes
-------------------------
Observing IR Changes
####################
It is often useful to be able to see the changes a pass makes to the IR. Numba
conveniently permits this through the use of the environment variable
:envvar:`NUMBA_DEBUG_PRINT_AFTER`. In the case of the above pass, running the
example code with ``NUMBA_DEBUG_PRINT_AFTER="ir_processing,consts_add_one"``
gives:
.. code-block:: none
:emphasize-lines: 4, 7, 24, 27
----------------------------nopython: ir_processing-----------------------------
label 0:
x = arg(0, name=x) ['x']
$const0.1 = const(int, 10) ['$const0.1']
a = $const0.1 ['$const0.1', 'a']
del $const0.1 []
$const0.2 = const(float, 20.2) ['$const0.2']
b = $const0.2 ['$const0.2', 'b']
del $const0.2 []
$0.5 = x + a ['$0.5', 'a', 'x']
del x []
del a []
$0.7 = $0.5 + b ['$0.5', '$0.7', 'b']
del b []
del $0.5 []
c = $0.7 ['$0.7', 'c']
del $0.7 []
$0.9 = cast(value=c) ['$0.9', 'c']
del c []
return $0.9 ['$0.9']
----------------------------nopython: consts_add_one----------------------------
label 0:
x = arg(0, name=x) ['x']
$const0.1 = const(int, 11) ['$const0.1']
a = $const0.1 ['$const0.1', 'a']
del $const0.1 []
$const0.2 = const(float, 21.2) ['$const0.2']
b = $const0.2 ['$const0.2', 'b']
del $const0.2 []
$0.5 = x + a ['$0.5', 'a', 'x']
del x []
del a []
$0.7 = $0.5 + b ['$0.5', '$0.7', 'b']
del b []
del $0.5 []
c = $0.7 ['$0.7', 'c']
del $0.7 []
$0.9 = cast(value=c) ['$0.9', 'c']
del c []
return $0.9 ['$0.9']
Note the change in the values in the ``const`` nodes.
Pass execution times
####################
Numba has built-in support for timing all compiler passes, the execution times
are stored in the metadata associated with a compilation result. This
demonstrates one way of accessing this information based on the previously
defined function, ``foo``:
.. literalinclude:: compiler_pass_example.py
:language: python
:dedent: 4
:start-after: magictoken.ex_compiler_timings.begin
:end-before: magictoken.ex_compiler_timings.end
the output of which is, for example::
pass_timings(init=1.914000677061267e-06, run=4.308700044930447e-05, finalize=1.7400006981915794e-06)
this displaying the pass initialization, run and finalization times in seconds.
.. _developer-debugging:
==================
Notes on Debugging
==================
This section describes techniques that can be useful in debugging the
compilation and execution of generated code.
.. seealso::
:ref:`debugging-jit-compiled-code`
Memcheck
--------
Memcheck_ is a memory error detector implemented using Valgrind_. It is useful
for detecting memory errors in compiled code, particularly out-of-bounds
accesses and use-after-free errors. Buggy or miscompiled native code can
generate these kinds of errors. The `Memcheck documentation
<https://valgrind.org/docs/manual/mc-manual.html>`_ explains its usage; here, we
discuss only the specifics of using it with Numba.
.. _Memcheck: https://valgrind.org/docs/manual/mc-manual.html
.. _Valgrind: https://valgrind.org/
The Python interpreter and some of the libraries used by Numba can generate
false positives with Memcheck - see `this section of the manual
<https://valgrind.org/docs/manual/mc-manual.html#mc-manual.machine>`_ for more
information on why false positives occur. The false positives can make it
difficult to determine when an actual error has occurred, so it is helpful to
suppress known false positives. This can be done by supplying a suppressions
file, which instructs Memcheck to ignore errors that match the suppressions
defined in it.
The CPython source distribution includes a suppressions file, in the file
``Misc/valgrind-python.supp``. Using this file prevents a lot of spurious errors
generated by Python's memory allocation implementation. Additionally, the Numba
repository includes a suppressions file in ``contrib/valgrind-numba.supp``.
.. note:: It is important to use the suppressions files from the versions of the
Python interpreter and Numba that you are using - these files evolve over
time, so non-current versions can fail to suppress some errors, or
erroneously suppress actual errors.
To run the Python interpreter under Memcheck with both suppressions
files, it is invoked with the following command::
valgrind --tool=memcheck \
--suppressions=${CPYTHON_SRC_DIR}/Misc/valgrind-python.supp \
--suppressions=${NUMBA_SRC_DIR}/contrib/valgrind-numba.supp \
python ${PYTHON_ARGS}
where ``${CPYTHON_SRC_DIR}`` is set to the location of the CPython source
distribution, ``${NUMBA_SRC_DIR}`` is the location of the Numba source dir, and
``${PYTHON_ARGS}`` are the arguments to the Python interpreter.
If there are errors, then messages describing them will be printed to standard
error. An example of an error is::
==77113== at 0x24169A: PyLong_FromLong (longobject.c:251)
==77113== by 0x241881: striter_next (bytesobject.c:3084)
==77113== by 0x2D3C95: _PyEval_EvalFrameDefault (ceval.c:2809)
==77113== by 0x21B499: _PyEval_EvalCodeWithName (ceval.c:3930)
==77113== by 0x26B436: _PyFunction_FastCallKeywords (call.c:433)
==77113== by 0x2D3605: call_function (ceval.c:4616)
==77113== by 0x2D3605: _PyEval_EvalFrameDefault (ceval.c:3124)
==77113== by 0x21B977: _PyEval_EvalCodeWithName (ceval.c:3930)
==77113== by 0x21C2A4: _PyFunction_FastCallDict (call.c:376)
==77113== by 0x2D5129: do_call_core (ceval.c:4645)
==77113== by 0x2D5129: _PyEval_EvalFrameDefault (ceval.c:3191)
==77113== by 0x21B499: _PyEval_EvalCodeWithName (ceval.c:3930)
==77113== by 0x26B436: _PyFunction_FastCallKeywords (call.c:433)
==77113== by 0x2D46DA: call_function (ceval.c:4616)
==77113== by 0x2D46DA: _PyEval_EvalFrameDefault (ceval.c:3139)
==77113==
==77113== Use of uninitialised value of size 8
The traceback provided only outlines the C call stack, which can make it
difficult to determine what the Python interpreter was doing at the time of the
error. One can learn more about the state of the stack by looking at the
backtrace in the `GNU Debugger (GDB) <https://www.gnu.org/software/gdb/>`_.
Launch ``valgrind`` with an additional argument, ``--vgdb-error=0`` and attach
to the process using GDB as instructed by the output. Once an error is
encountered, GDB will stop at the error and the stack can be inspected.
GDB does provide support for backtracing through the Python stack, but this
requires symbols which may not be easily available in your Python distribution.
In this case, it is still possible to determine some information about what was
happening in Python, but this depends on examining the backtrace closely. For
example, in a backtrace corresponding to the above error, we see items such as:
.. code-block::
#18 0x00000000002722da in slot_tp_call (
self=<_wrap_impl(_callable=<_wrap_missing_loc(func=<function at remote
0x1cf66c20>) at remote 0x1d200bd0>, _imp=<function at remote 0x1d0e7440>,
_context=<CUDATargetContext(address_size=64,
typing_context=<CUDATypingContext(_registries={<Registry(functions=[<type
at remote 0x65be5e0>, <type at remote 0x65be9d0>, <type at remote
0x65bedc0>, <type at remote 0x65bf1b0>, <type at remote 0x8b78000>, <type
at remote 0x8b783f0>, <type at remote 0x8b787e0>, <type at remote
0x8b78bd0>, <type at remote 0x8b78fc0>, <type at remote 0x8b793b0>, <type
at remote 0x8b797a0>, <type at remote 0x8b79b90>, <type at remote
0x8b79f80>, <type at remote 0x8b7a370>, <type at remote 0x8b7a760>, <type
at remote 0x8b7ab50>, <type at remote 0x8b7af40>, <type at remote
0x8b7b330>, <type at remote 0x8b7b720>, <type at remote 0x8b7bf00>, <type
at remote 0x8b7c2f0>, <type at remote 0x8b7c6e0>], attributes=[<type at
remote 0x8b7cad0>, <type at remote 0x8b7cec0>, <type at remote
0x8b7d2b0>, <type at remote 0x8b7d6a0>, <type at remote 0x8b7da90>,
<t...(truncated),
args=(<Builder(_block=<Block(parent=<Function(parent=<Module(context=<Context(scope=<NameScope(_useset={''},
_basenamemap={}) at remote 0xbb5ae10>, identified_types={}) at remote
0xbb5add0>, name='cuconstRecAlign$7',
data_layout='e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64',
scope=<NameScope(_useset={'',
'_ZN08NumbaEnv5numba4cuda5tests6cudapy13test_constmem19cuconstRecAlign$247E5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE',
'_ZN5numba4cuda5tests6cudapy13test_constmem19cuconstRecAlign$247E5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE'},
_basenamemap={}) at remote 0x1d27bf10>, triple='nvptx64-nvidia-cuda',
globals={'_ZN08NumbaEnv5numba4cuda5tests6cudapy13test_constmem19cuconstRecAlign$247E5ArrayIdLi1E1C7mutable7ali...(truncated),
kwds=0x0)
We can see some of the arguments, in particular the names of the compiled functions, e.g::
_ZN5numba4cuda5tests6cudapy13test_constmem19cuconstRecAlign$247E5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE5ArrayIdLi1E1C7mutable7alignedE
We can run this through ``c++filt`` to see a more human-readable representation::
numba::cuda::tests::cudapy::test_constmem::cuconstRecAlign$247(
Array<double, 1, C, mutable, aligned>,
Array<double, 1, C, mutable, aligned>,
Array<double, 1, C, mutable, aligned>,
Array<double, 1, C, mutable, aligned>,
Array<double, 1, C, mutable, aligned>)
which is the fully qualified name of a jitted function and the types with which
it was called.
=======================
Polymorphic dispatching
=======================
Functions compiled using :func:`~numba.jit` or :func:`~numba.vectorize`
are open-ended: they can be called with many different input types and
have to select (possibly compile on-the-fly) the right low-level
specialization. We hereby explain how this mechanism is implemented.
Requirements
============
JIT-compiled functions can take several arguments and each of them is
taken into account when selecting a specialization. Thus it is a
form of multiple dispatch, more complex than single dispatch.
Each argument weighs in the selection based on its :ref:`Numba type
<numba-types>`. Numba types are often more granular than Python types:
for example, Numba types Numpy arrays differently depending on their
dimensionality and their layout (C-contiguous, etc.).
Once a Numba type is inferred for each argument, a specialization must
be chosen amongst the available ones; or, if not suitable specialization
is found, a new one must be compiled. This is not a trivial decision:
there can be multiple specializations compatible with a given concrete
signature (for example, say a two-argument function has compiled
specializations for ``(float64, float64)`` and ``(complex64, complex64)``,
and it is called with ``(float32, float32)``).
Therefore, there are two crucial steps in the dispatch mechanism:
1. infer the Numba types of the concrete arguments
2. select the best available specialization (or choose to compile a new one)
for the inferred Numba types
Compile-time vs. run-time
-------------------------
This document discusses dispatching when it is done at runtime, i.e.
when a JIT-compiled function is called from pure Python. In that context,
performance is important. To stay in the realm of normal function call
overhead in Python, the overhead of dispatching should stay under a
microsecond. Of course, *the faster the better*...
When a JIT-compiled function is called from another JIT-compiled
function (in :term:`nopython mode`), the polymorphism is resolved at
compile-time, using a non-performance critical mechanism, bearing zero
runtime performance overhead.
.. note::
In practice, the performance-critical parts described here are coded in C.
Type resolution
===============
The first step is therefore to infer, at call-time, a Numba type for each
of the function's concrete arguments. Given the finer granularity of
Numba types compared to Python types, one cannot simply lookup an object's
class and key a dictionary with it to obtain the corresponding Numba type.
Instead, there is a machinery to inspect the object and, based on its
Python type, query various properties to infer the appropriate Numba
type. This can be more or less complex: for example, a Python ``int``
argument will always infer to a Numba ``intp`` (a pointer-sized integer),
but a Python ``tuple`` argument can infer to multiple Numba types (depending
on the tuple's size and the concrete type of each of its elements).
The Numba type system is high-level and written in pure Python; there is
a pure Python machinery, based on a generic function, to do said inference
(in :mod:`numba.typing.typeof`). That machinery is used for compile-time
inference, e.g. on constants. Unfortunately, it is too slow for run-time
value-based dispatching. It is only used as a fallback for rarely used
(or difficult to infer) types, and exhibits multiple-microsecond overhead.
Typecodes
---------
The Numba type system is really too high-level to be manipulated efficiently
from C code. Therefore, the C dispatching layer uses another representation
based on integer typecodes. Each Numba type gets a unique integer typecode
when constructed; also, an interning system ensure no two instances of same
type are created. The dispatching layer is therefore able to *eschew*
the overhead of the Numba type system by working with simple integer
typecodes, amenable to well-known optimizations (fast hash tables, etc.).
The goal of the type resolution step becomes: infer a Numba *typecode*
for each of the function's concrete arguments. Ideally, it doesn't deal
with Numba types anymore...
Hard-coded fast paths
---------------------
While eschewing the abstraction and object-orientation overhead of the type
system, the integer typecodes still have the same conceptual complexity.
Therefore, an important technique to speed up inference is to first go
through checks for the most important types, and hard-code a fast resolution
for each of them.
Several types benefit from such an optimization, notably:
* basic Python scalars (``bool``, ``int``, ``float``, ``complex``);
* basic Numpy scalars (the various kinds of integer, floating-point,
complex numbers);
* Numpy arrays of certain dimensionalities and basic element types.
Each of those fast paths ideally uses a hard-coded result value or a direct
table lookup after a few simple checks.
However, we can't apply that technique to all argument types; there would
be an explosion of ad-hoc internal caches, and it would become difficult to
maintain. Besides, the recursive application of hard-coded fast paths
would not necessarily combine into a low overhead (in the nested tuple
case, for example).
Fingerprint-based typecode cache
--------------------------------
For non-so-trivial types (imagine a tuple, or a Numpy ``datetime64`` array,
for example), the hard-coded fast paths don't match. Another mechanism
then kicks in, more generic.
The principle here is to examine each argument value, as the pure Python
machinery would do, and to describe its Numba type unambiguously. The
difference is that *we don't actually compute a Numba type*. Instead, we
compute a simple bytestring, a low-level possible denotation of that
Numba type: a *fingerprint*. The fingerprint format is designed to be
short and extremely simple to compute from C code (in practice, it has
a bytecode-like format).
Once the fingerprint is computed, it is looked up in a cache mapping
fingerprints to typecodes. The cache is a hash table, and the lookup
is fast thanks to the fingerprints being generally very short (rarely
more than 20 bytes).
If the cache lookup fails, the typecode must first be computed using the
slow pure Python machinery. Luckily, this would only happen once: on
subsequent calls, the cached typecode would be returned for the given
fingerprint.
In rare cases, a fingerprint cannot be computed efficiently. This is
the case for some types which cannot be easily inspected from C: for
example ``cffi`` function pointers. Then, the slow Pure Python machinery
is invoked at each function call with such an argument.
.. note::
Two fingerprints may denote a single Numba type. This does not make
the mechanism incorrect; it only creates more cache entries.
Summary
-------
Type resolution of a function argument involves the following mechanisms
in order:
* Try a few hard-coded fast paths, for common simple types.
* If the above failed, compute a fingerprint for the argument and lookup
its typecode in a cache.
* If all the above failed, invoke the pure Python machinery which will
determine a Numba type for the argument (and look up its typecode).
Specialization selection
========================
At the previous step, an integer typecode has been determined for each
concrete argument to the JIT-compiled function. Now it remains to match
that concrete signature against each of the available specializations for
the function. There can be three outcomes:
* There is a satisfying best match: the corresponding specialization
is then invoked (it will handle argument unboxing and other details).
* There is a tie between two or more "best matches": an exception is raised,
refusing to solve the ambiguity.
* There is no satisfying match: a new specialization is compiled tailored
for the concrete argument types that were inferred.
The selection works by looping over all available specializations, and
computing the compatibility of each concrete argument type with the
corresponding type in the specialization's intended signature. Specifically,
we are interested in:
1. Whether the concrete argument type is allowed to convert implicitly to
the specialization's argument type;
2. If so, at what semantic (user-visible) cost the conversion comes.
Implicit conversion rules
-------------------------
There are five possible kinds of implicit conversion from a source type
to a destination type (note this is an asymmetric relationship):
1. *exact match*: the two types are identical; this is the ideal case,
since the specialization would behave exactly as intended;
2. *same-kind promotion*: the two types belong to the same "kind" (for
example ``int32`` and ``int64`` are two integer types), and the source
type can be converted losslessly to the destination type (e.g. from
``int32`` to ``int64``, but not the reverse);
3. *safe conversion*: the two types belong to different kinds, but the
source type can be reasonably converted to the destination type
(e.g. from ``int32`` to ``float64``, but not the reverse);
4. *unsafe conversion*: a conversion is available from the source type
to the destination type, but it may lose precision, magnitude, or
another desirable quality.
5. *no conversion*: there is no correct or reasonably efficient way to
convert between the two types (for example between an ``int64`` and a
``datetime64``, or a C-contiguous array and a Fortran-contiguous array).
When a specialization is examined, the latter two cases eliminate it from
the final choice: i.e. when at least one argument has *no conversion* or
only an *unsafe conversion* to the signature's argument type.
.. note::
However, if the function is compiled with explicit signatures
in the :func:`~numba.jit` call (and therefore it is not allowed to compile
new specializations), *unsafe conversion* is allowed.
Candidates and best match
-------------------------
If a specialization is not eliminated by the rule above, it enters the
list of *candidates* for the final choice. Those candidates are ranked
by an ordered 4-uple of integers: ``(number of unsafe conversions,
number of safe conversions, number of same-kind promotions, number of
exact matches)`` (note the sum of the tuple's elements is equal to the
number of arguments). The best match is then the #1 result in sorted
ascending order, thereby preferring exact matches over promotions,
promotions over safe conversions, safe conversions over unsafe conversions.
Implementation
--------------
The above-described mechanism works on integer typecodes, not on Numba
types. It uses an internal hash table storing the possible conversion
kind for each pair of compatible types. The internal hash table is in part
built at startup (for built-in trivial types such as ``int32``, ``int64``
etc.), in part filled dynamically (for arbitrarily complex types such
as array types: for example to allow using a C-contiguous 2D array where
a function expects a non-contiguous 2D array).
Summary
-------
Selecting the right specialization involves the following steps:
* Examine each available specialization and match it against the concrete
argument types.
* Eliminate any specialization where at least one argument doesn't offer
sufficient compatibility.
* If there are remaining candidates, choose the best one in terms of
preserving the types' semantics.
Miscellaneous
=============
Some `benchmarks of dispatch performance
<https://github.com/numba/numba-benchmark/blob/master/benchmarks/bench_dispatch.py>`_
exist in the `Numba benchmarks <https://github.com/numba/numba-benchmark>`_
repository.
Some unit tests of specific aspects of the machinery are available
in :mod:`numba.tests.test_typeinfer` and :mod:`numba.tests.test_typeof`.
Higher-level dispatching tests are in :mod:`numba.tests.test_dispatcher`.
==================
Environment Object
==================
The Environment object (Env) is used to maintain references to python objects
that are needed to support compiled functions for both object-mode and
nopython-mode.
In nopython-mode, the Env is used for:
* Storing pyobjects for reconstruction from native values,
such as:
* for printing native values of NumPy arrays;
* for returning or yielding native values back to the interpreter.
In object-mode, the Env is used for:
* storing constant values referenced in the code.
* storing a reference to the function's global dictionary to load global
values.
The Implementation
==================
The Env is implemented in two parts. In ``_dynfunc.c``, the Env is defined
as ``EnvironmentObject`` as a Python C-extension type. In ``lowering.py``,
the `EnvironmentObject`` (exported as ``_dynfunc.Environment``) is extended
to support necessary operations needed at lowering.
Serialization
-------------
The Env supports being pickled. Compilation cache files and ahead-of-time
compiled modules serialize all the used Envs for recreation at the runtime.
Usage
-----
At the start of the lowering for a function or a generator, an Env is created.
Throughout the compilation, the Env is mutated to attach additional
information. The compiled code references an Env via a global variable in
the emitted LLVM IR. The global variable is zero-initialized with "common"
linkage, which is the default linkage for C global values. The use of this
linkage allows multiple definitions of the global variable to be merged into
a single definition when the modules are linked together. The name of the
global variable is computed from the name of the function
(see ``FunctionDescriptor.env_name`` and ``.get_env_name()`` of the target
context).
The Env is initialized when the compiled-function is loaded. The JIT engine
finds the address of the associated global variable for the Env and stores the
address of the Env into it. For cached functions, the same process applies.
For ahead-of-time compiled functions, the module initializer in the generated
library is responsible for initializing the global variables of all the Envs
in the module.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment