Re: Considerations in the design of a ShortTimeFFT window?

Dietrich Brunn via SciPy-Dev <[email protected]> Mon, 04 Mar 2024 16:51:51 +0100
Newsgroups gmane.comp.python.scientific.devel
Message-ID <4203513.1IzOArtZ34@rechentux>
--===============4139670325402463384==
Content-Type: multipart/signed; boundary="nextPart1804542.TLkxdtWsSY";
 micalg="pgp-sha512"; protocol="application/pgp-signature"

--nextPart1804542.TLkxdtWsSY
Content-Type: multipart/alternative; boundary="nextPart2670133.BddDVKsqQX";
 protected-headers="v1"
Content-Transfer-Encoding: 7Bit
From: Dietrich Brunn <[email protected]>
To: [email protected]
Cc: [email protected], Edward Richards <[email protected]>
Date: Mon, 04 Mar 2024 16:51:42 +0100
Message-ID: <4203513.1IzOArtZ34@rechentux>
MIME-Version: 1.0

This is a multi-part message in MIME format.

--nextPart2670133.BddDVKsqQX
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="UTF-8"

Hi Ned,
I took the time to think about this a little bit: Unfortunately I am not aw=
are of useful=20
literature for choosing STFT windows. Note that the concept of a dual windo=
w for the=20
ISTFT does not seem to be widely known in the signal processing community. =
The only=20
other implementation I know, which provides a dual window is LTFAT [1]=20

Designing a STFT based differentiator is a bit involving, so let's discuss =
an FFT based one=20
first: The continuous-time signal representation of a sampled signal of fin=
ite length can be=20
expressed by a complex-valued Fourier series  E. g., for signal of duration=
 one, we can=20
write

x(t) =3D Sum[  X[l]  exp(2j=CF=80(l =CE=94 f) t ) ] with l being the summat=
ion index.=20

The coefficients X[l] can be calculated with an FFT ([2] discusses this fro=
m a different=20
angle). Differentiation with respect to time gives=20

d/dt x(t) =3D Sum[  X[l]  2j=CF=80(l =CE=94 f) exp(2j=CF=80(l =CE=94 f) t) =
] .

Note that x(t) is assumed to be periodic. Hence a discontinuity between sta=
rt and end of=20
signal produces ringing due to Gibb's phenomenon.


The key insight of the ShortTimeFFT implementation is that any signal can b=
e represented=20
by a series expansion of time- and frequency-shifted dual windows, i.e.,

x(t) =3D Sum[  S[q, p] d(t - p =CE=94t) exp(2j=CF=80(q =CE=94 f) t ) ]=20

with (p =CE=94t) representing the time shift,  (q =CE=94 f) the frequency s=
hift, d(t) the dual window and=20
S[p, q] the STFT coefficient (consult [3] for details).
Differentiation with respect to time gives=20

d/dt x(t) =3D Sum[ S[q, p] 2j=CF=80(q =CE=94 f)  d(t - p =CE=94t) exp(2j=CF=
=80(q =CE=94 f) t ) ]  +=20
                            S[q, p] exp(2j=CF=80(q =CE=94 f) t )  d/dt d(t =
=2D p =CE=94t) ]=20

Note that:

* The window dependent term is parameterized by the derivative of the  dual=
 window d/dt=20
d(t - p =CE=94t).

* If the signal is not periodic in each slice which is stenciled out by the=
 sliding window,=20
Gibb's phenomenon will strike again (this is what you probably observe in y=
our=20
simulation). Hence it is a good idea to choose a dual window, like the Hann=
 window, which=20
suppresses discontinuities at the beginning and end of the signal slice. =20

* Not only the dual window but also its derivative needs to suppress those =
discontinuities.=20

The following example shows an example of STFT based differentiation. The h=
op width is=20
chosen small enough to supress Gibb's phenomenon in the dual window derivat=
ive. Note =20
that Gibb's phenomenon  can be observed at the beginning and the end of the=
 signal.

import matplotlib.pyplot as plt

import numpy as np

from scipy.signal import ShortTimeFFT

from scipy.signal import windows

from scipy.fft import rfft, rfftfreq, irfft


# Create periodic test signal and its derivative:

n, T =3D 1000, 1/1000  # samples and sampling interval for 1 second signal

t =3D np.arange(n) * T  # time stamps
# Create single frequency signal and derivative:

f =3D rfftfreq(n, T)
k_c =3D f.searchsorted(7)
omega_c =3D 2*np.pi*f[k_c]
X =3D np.zeros(len(f))
X[k_c] =3D n/2/omega_c
x =3D irfft(X, n=3Dn)
y =3D irfft(2j*np.pi*f*X, n=3Dn)  # dx / dt

# Two ShortTimeFFT instances are needed:

kw =3D dict(hop=3D10, fs=3D1/T,fft_mode=3D'onesided', phase_shift=3DNone)
SFT =3D ShortTimeFFT.from_dual(windows.hann(32, sym=3DFalse), **kw)

# Differentiate dual window per FFT:

diff_dual_win =3D irfft(rfft(SFT.dual_win) * 2j*np.pi*rfftfreq(SFT.m_num))
dSFT =3D ShortTimeFFT.from_dual(diff_dual_win, **kw)


# Perform the filtering:

S_x =3D SFT.stft(x)
dS_x =3D 2j*np.pi*SFT.f[:, np.newaxis] * S_x
dx =3D SFT.istft(dS_x, k1=3Dn) + dSFT.istft(S_x, k1=3Dn)


# Plot windows:

fg0, axx0 =3D plt.subplots(2, 1, sharex=3D'all', tight_layout=3DTrue)
axx0[0].set(title=3D"Windows")
axx0[1].set(title=3D"Dual Windows")
axx0[0].plot(SFT.win, '.-', alpha=3D0.5, label=3D'SFT')
axx0[0].plot(dSFT.win, '.-', alpha=3D0.5, label=3D'dSFT')
axx0[1].plot(SFT.dual_win, '.-', alpha=3D0.5, label=3D'SFT')
axx0[1].plot(dSFT.dual_win, '.-', alpha=3D0.5, label=3D'dSFT')


# Plot signal:

fg1, ax1 =3D plt.subplots()
ax1.set(title=3Drf"STFT-based Differentiator for $f_c=3D{f[k_c]}\,$Hz Signa=
l",
        xlabel=3D"Time $t$", ylabel=3D"Amplitude")
ax1.plot(t, omega_c * x, alpha=3D0.5, label=3Dr"$x(t) \cdot 2\pi f_c$")
ax1.plot(t, y, '--', alpha=3D0.5, label=3D"$y =3D dx/dt$")
--nextPart2670133.BddDVKsqQX
Content-Transfer-Encoding: base64
Content-Type: text/html; charset="UTF-8"

PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRl
eHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CjwvaGVhZD4KPGJvZHk+PHAgc3R5bGU9Im1hcmdpbi10
b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPkhpIE5l
ZCw8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0
OjA7bWFyZ2luLXJpZ2h0OjA7Ij5JIHRvb2sgdGhlIHRpbWUgdG8gdGhpbmsgYWJvdXQgdGhpcyBh
IGxpdHRsZSBiaXQ6IFVuZm9ydHVuYXRlbHkgSSBhbSBub3QgYXdhcmUgb2YgdXNlZnVsIGxpdGVy
YXR1cmUgZm9yIGNob29zaW5nIFNURlQgd2luZG93cy4gTm90ZSB0aGF0IHRoZSBjb25jZXB0IG9m
IGEgZHVhbCB3aW5kb3cgZm9yIHRoZSBJU1RGVCBkb2VzIG5vdCBzZWVtIHRvIGJlIHdpZGVseSBr
bm93biBpbiB0aGUgc2lnbmFsIHByb2Nlc3NpbmcgY29tbXVuaXR5LiBUaGUgb25seSBvdGhlciBp
bXBsZW1lbnRhdGlvbiBJIGtub3csIHdoaWNoIHByb3ZpZGVzIGEgZHVhbCB3aW5kb3cgaXMgTFRG
QVQgWzFdIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7
bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPkRlc2lnbmluZyBhIFNURlQgYmFzZWQgZGlm
ZmVyZW50aWF0b3IgaXMgYSBiaXQgaW52b2x2aW5nLCBzbyBsZXQncyBkaXNjdXNzIGFuIEZGVCBi
YXNlZCBvbmUgZmlyc3Q6IFRoZSBjb250aW51b3VzLXRpbWUgc2lnbmFsIHJlcHJlc2VudGF0aW9u
IG9mIGEgc2FtcGxlZCBzaWduYWwgb2YgZmluaXRlIGxlbmd0aCBjYW4gYmUgZXhwcmVzc2VkIGJ5
IGEgY29tcGxleC12YWx1ZWQgRm91cmllciBzZXJpZXMmbmJzcDsgRS4gZy4sIGZvciBzaWduYWwg
b2YgZHVyYXRpb24gb25lLCB3ZSBjYW4gd3JpdGU8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4t
dG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij54KHQp
ID0gU3VtWyZuYnNwOyBYW2xdJm5ic3A7IGV4cCgyas+AKGwgzpQgZikgdCApIF0gd2l0aCBsIGJl
aW5nIHRoZSBzdW1tYXRpb24gaW5kZXguIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6
MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBjb2Vm
ZmljaWVudHMgWFtsXSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIGFuIEZGVCAoWzJdIGRpc2N1c3Nl
cyB0aGlzIGZyb20gYSBkaWZmZXJlbnQgYW5nbGUpLiBEaWZmZXJlbnRpYXRpb24gd2l0aCByZXNw
ZWN0IHRvIHRpbWUgZ2l2ZXMgPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdp
bi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+ZC9kdCB4KHQpID0gU3Vt
WyZuYnNwOyBYW2xdJm5ic3A7IDJqz4AobCDOlCBmKSBleHAoMmrPgChsIM6UIGYpIHQpIF0gLjwv
cD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxl
ZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPk5vdGUgdGhhdCB4KHQpIGlzIGFzc3VtZWQgdG8gYmUgcGVy
aW9kaWMuIEhlbmNlIGEgZGlzY29udGludWl0eSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgb2Ygc2ln
bmFsIHByb2R1Y2VzIHJpbmdpbmcgZHVlIHRvIEdpYmIncyBwaGVub21lbm9uLjwvcD4KPGJyIC8+
PGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6
MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBrZXkgaW5zaWdodCBvZiB0aGUgU2hvcnRUaW1lRkZUIGlt
cGxlbWVudGF0aW9uIGlzIHRoYXQgYW55IHNpZ25hbCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBz
ZXJpZXMgZXhwYW5zaW9uIG9mIHRpbWUtIGFuZCBmcmVxdWVuY3ktc2hpZnRlZCBkdWFsIHdpbmRv
d3MsIGkuZS4sPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206
MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+eCh0KSA9IFN1bVsmbmJzcDsgU1txLCBw
XSBkKHQgLSBwIM6UdCkgZXhwKDJqz4AocSDOlCBmKSB0ICkgXSA8L3A+CjxiciAvPjxwIHN0eWxl
PSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0
OjA7Ij53aXRoIChwIM6UdCkgcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNoaWZ0LCZuYnNwOyAocSDO
lCBmKSB0aGUgZnJlcXVlbmN5IHNoaWZ0LCBkKHQpIHRoZSBkdWFsIHdpbmRvdyBhbmQgU1twLCBx
XSB0aGUgU1RGVCBjb2VmZmljaWVudCAoY29uc3VsdCBbM10gZm9yIGRldGFpbHMpLjwvcD4KPHAg
c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t
cmlnaHQ6MDsiPkRpZmZlcmVudGlhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGltZSBnaXZlcyA8L3A+
CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0
OjA7bWFyZ2luLXJpZ2h0OjA7Ij5kL2R0IHgodCkgPSBTdW1bIFNbcSwgcF0gMmrPgChxIM6UIGYp
Jm5ic3A7IGQodCAtIHAgzpR0KSBleHAoMmrPgChxIM6UIGYpIHQgKSBdJm5ic3A7ICsgPC9wPgo8
cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdp
bi1yaWdodDowOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7IFNbcSwgcF0gZXhwKDJqz4AocSDOlCBmKSB0ICkmbmJzcDsgZC9kdCBkKHQgLSBwIM6UdCkg
XSA8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdp
bi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5Ob3RlIHRoYXQ6PC9wPgo8YnIgLz48cCBzdHlsZT0i
bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDow
OyI+KiBUaGUgd2luZG93IGRlcGVuZGVudCB0ZXJtIGlzIHBhcmFtZXRlcml6ZWQgYnkgdGhlIGRl
cml2YXRpdmUgb2YgdGhlJm5ic3A7IGR1YWwgd2luZG93IGQvZHQgZCh0IC0gcCDOlHQpLjwvcD4K
PGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6
MDttYXJnaW4tcmlnaHQ6MDsiPiogSWYgdGhlIHNpZ25hbCBpcyBub3QgcGVyaW9kaWMgaW4gZWFj
aCBzbGljZSB3aGljaCBpcyBzdGVuY2lsZWQgb3V0IGJ5IHRoZSBzbGlkaW5nIHdpbmRvdywgR2li
YidzIHBoZW5vbWVub24gd2lsbCBzdHJpa2UgYWdhaW4gKHRoaXMgaXMgd2hhdCB5b3UgcHJvYmFi
bHkgb2JzZXJ2ZSBpbiB5b3VyIHNpbXVsYXRpb24pLiBIZW5jZSBpdCBpcyBhIGdvb2QgaWRlYSB0
byBjaG9vc2UgYSBkdWFsIHdpbmRvdywgbGlrZSB0aGUgSGFubiB3aW5kb3csIHdoaWNoIHN1cHBy
ZXNzZXMgZGlzY29udGludWl0aWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgc2ln
bmFsIHNsaWNlLiZuYnNwOyA8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2lu
LWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4qIE5vdCBvbmx5IHRoZSBk
dWFsIHdpbmRvdyBidXQgYWxzbyBpdHMgZGVyaXZhdGl2ZSBuZWVkcyB0byBzdXBwcmVzcyB0aG9z
ZSBkaXNjb250aW51aXRpZXMuIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJn
aW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBmb2xsb3dpbmcg
ZXhhbXBsZSBzaG93cyBhbiBleGFtcGxlIG9mIFNURlQgYmFzZWQgZGlmZmVyZW50aWF0aW9uLiBU
aGUgaG9wIHdpZHRoIGlzIGNob3NlbiBzbWFsbCBlbm91Z2ggdG8gc3VwcmVzcyBHaWJiJ3MgcGhl
bm9tZW5vbiBpbiB0aGUgZHVhbCB3aW5kb3cgZGVyaXZhdGl2ZS4gTm90ZSZuYnNwOyB0aGF0IEdp
YmIncyBwaGVub21lbm9uJm5ic3A7IGNhbiBiZSBvYnNlcnZlZCBhdCB0aGUgYmVnaW5uaW5nIGFu
ZCB0aGUgZW5kIG9mIHRoZSBzaWduYWwuPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDow
O21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+PHNwYW4gc3R5
bGU9ImZvbnQtZmFtaWx5OkpldEJyYWlucyBNb25vOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhl
NmQ7Ij5pbXBvcnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+bWF0cGxvdGxp
Yi5weXBsb3QgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+YXMgPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+cGx0PC9wPgo8cD4mbmJzcDs8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5pbXBvcnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj
YmNiZWM0OyI+bnVtcHkgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+YXMgPC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+bnA8L3A+CjxwPiZuYnNwOzwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZyb20gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjojYmNiZWM0OyI+c2NpcHkuc2lnbmFsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2
ZDsiPmltcG9ydCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5TaG9ydFRpbWVG
RlQ8L3A+CjxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZyb20g
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+c2NpcHkuc2lnbmFsIDwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmltcG9ydCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNiY2JlYzQ7Ij53aW5kb3dzPC9wPgo8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNjZjhlNmQ7Ij5mcm9tIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPnNj
aXB5LmZmdCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5pbXBvcnQgPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+cmZmdCwgcmZmdGZyZXEsIGlyZmZ0PC9wPgo8
cD4mbmJzcDs8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM3YTdlODU7Ij4jIENy
ZWF0ZSBwZXJpb2RpYyB0ZXN0IHNpZ25hbCBhbmQgaXRzIGRlcml2YXRpdmU6PC9wPgo8cD4mbmJz
cDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5uLCBUID0gPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MTAwMDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Jj
YmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MTwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPi88L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFj
Yjg7Ij4xMDAwJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzdhN2U4NTsiPiMgc2Ft
cGxlcyBhbmQgc2FtcGxpbmcgaW50ZXJ2YWwgZm9yIDEgc2Vjb25kIHNpZ25hbDwvcD4KPHA+Jm5i
c3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+dCA9IG5wLmFyYW5nZShuKSAq
IFQmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojN2E3ZTg1OyI+IyB0aW1lIHN0YW1w
czxiciAvPiMgQ3JlYXRlIHNpbmdsZSBmcmVxdWVuY3kgc2lnbmFsIGFuZCBkZXJpdmF0aXZlOjwv
cD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+ZiA9IHJmZnRm
cmVxKG4sIFQpPGJyIC8+a19jID0gZi5zZWFyY2hzb3J0ZWQoPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjojMmFhY2I4OyI+Nzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIg
Lz5vbWVnYV9jID0gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+Mjwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPipucC5waSpmW2tfY108YnIgLz5YID0gbnAuemVy
b3MoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojODg4OGM2OyI+bGVuPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojYmNiZWM0OyI+KGYpKTxiciAvPlhba19jXSA9IG4vPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojMmFhY2I4OyI+Mjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi
Pi9vbWVnYV9jPGJyIC8+eCA9IGlyZmZ0KFgsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Fh
NDkyNjsiPm48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49bik8YnIgLz55ID0g
aXJmZnQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+Mmo8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4qbnAucGkqZipYLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNhYTQ5MjY7Ij5uPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pJm5i
c3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzdhN2U4NTsiPiMgZHggLyBkdDwvcD4KPHA+
Jm5ic3A7PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6
MDttYXJnaW4tcmlnaHQ6MDsiPiMgVHdvIFNob3J0VGltZUZGVCBpbnN0YW5jZXMgYXJlIG5lZWRl
ZDo8L3A+CjxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPmt3ID0g
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojODg4OGM2OyI+ZGljdDwvc3Bhbj48c3BhbiBzdHls
ZT0iY29sb3I6I2JjYmVjNDsiPig8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5o
b3A8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojMmFhY2I4OyI+MTA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4s
IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmZzPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjE8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4vVCw8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOiNhYTQ5MjY7Ij5mZnRfbW9kZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj
NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nb25lc2lkZWQnPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OiNhYTQ5MjY7Ij5waGFzZV9zaGlmdDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi
Pj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5Ob25lPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPlNGVCA9IFNob3J0VGltZUZGVC5mcm9tX2R1YWwo
d2luZG93cy5oYW5uKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjMyPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OiNhYTQ5MjY7Ij5zeW08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+RmFsc2U8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNiY2JlYzQ7Ij4pLCAqKmt3KTwvcD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjojN2E3ZTg1OyI+IyBEaWZmZXJlbnRpYXRlIGR1YWwgd2luZG93IHBlciBGRlQ6PC9wPgo8
cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5kaWZmX2R1YWxfd2lu
ID0gaXJmZnQocmZmdChTRlQuZHVhbF93aW4pICogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj
MmFhY2I4OyI+Mmo8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4qbnAucGkqcmZm
dGZyZXEoU0ZULm1fbnVtKSk8YnIgLz5kU0ZUID0gU2hvcnRUaW1lRkZULmZyb21fZHVhbChkaWZm
X2R1YWxfd2luLCAqKmt3KTwvcD4KPHA+Jm5ic3A7PHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojN2E3ZTg1OyI+IyBQZXJmb3JtIHRoZSBmaWx0ZXJpbmc6PC9wPgo8cD4mbmJzcDs8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5TX3ggPSBTRlQuc3RmdCh4KTxiciAv
PmRTX3ggPSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4yajwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPipucC5waSpTRlQuZls6LCBucC5uZXdheGlzXSAqIFNf
eDxiciAvPmR4ID0gU0ZULmlzdGZ0KGRTX3gsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Fh
NDkyNjsiPmsxPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pICsgZFNGVC5p
c3RmdChTX3gsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmsxPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pPC9wPgo8cD4mbmJzcDs8cD4mbmJzcDs8L3Nw
YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM3YTdlODU7Ij4jIFBsb3Qgd2luZG93czo8L3A+CjxwPiZu
YnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPmZnMCwgYXh4MCA9IHBsdC5z
dWJwbG90cyg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4yPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFj
Yjg7Ij4xPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5zaGFyZXg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNi
Y2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+J2FsbCc8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
I2FhNDkyNjsiPnRpZ2h0X2xheW91dDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi
Pj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5UcnVlPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjojMmFhY2I4OyI+MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPl0uc2V0KDwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPnRpdGxlPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPiZx
dW90O1dpbmRvd3MmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4pPGJy
IC8+YXh4MFs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4xPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+XS5zZXQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj
YWE0OTI2OyI+dGl0bGU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+JnF1b3Q7RHVhbCBXaW5kb3dzJnF1b3Q7PC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj
NDsiPl0ucGxvdChTRlQud2luLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4n
Li0nPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj
NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDky
NjsiPmxhYmVsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPidTRlQnPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj
YmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+
MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPl0ucGxvdChkU0ZULndpbiwgPC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+Jy4tJzwvc3Bhbj48c3BhbiBzdHlsZT0i
Y29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+YWxw
aGE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojMmFhY2I4OyI+MC41PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+
LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5sYWJlbDwvc3Bhbj48c3BhbiBz
dHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7
Ij4nZFNGVCc8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4pPGJyIC8+YXh4MFs8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4xPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjojYmNiZWM0OyI+XS5wbG90KFNGVC5kdWFsX3dpbiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjojNmFhYjczOyI+Jy4tJzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwg
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+YWxwaGE8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+
MC41PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOiNhYTQ5MjY7Ij5sYWJlbDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj
NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nU0ZUJzwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIgLz5heHgwWzwvc3Bhbj48c3BhbiBzdHlsZT0i
Y29sb3I6IzJhYWNiODsiPjE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5dLnBs
b3QoZFNGVC5kdWFsX3dpbiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+Jy4t
Jzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojYWE0OTI2OyI+YWxwaGE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7
Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MC41PC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7
Ij5sYWJlbDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nZFNGVCc8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNi
Y2JlYzQ7Ij4pPC9wPgo8cD4mbmJzcDs8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OiM3YTdlODU7Ij4jIFBsb3Qgc2lnbmFsOjwvcD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojYmNiZWM0OyI+ZmcxLCBheDEgPSBwbHQuc3VicGxvdHMoKTxiciAvPmF4MS5zZXQo
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+dGl0bGU8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+
cmYmcXVvdDtTVEZULWJhc2VkIERpZmZlcmVudGlhdG9yIGZvciAkZl9jPTwvc3Bhbj48c3BhbiBz
dHlsZT0iY29sb3I6I2NmOGU2ZDsiPns8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7
Ij5mW2tfY108L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij59PC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjojNmFhYjczOyI+XCwkSHogU2lnbmFsJnF1b3Q7PC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjojYmNiZWM0OyI+LDxiciAvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij54bGFiZWw8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjojNmFhYjczOyI+JnF1b3Q7VGltZSAkdCQmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPnlsYWJl
bDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOiM2YWFiNzM7Ij4mcXVvdDtBbXBsaXR1ZGUmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOiNiY2JlYzQ7Ij4pPGJyIC8+YXgxLnBsb3QodCwgb21lZ2FfYyAqIHgsIDwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmFscGhhPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjAuNTwvc3Bh
bj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjojYWE0OTI2OyI+bGFiZWw8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+ciZxdW90OyR4KHQpIFxjZG90IDJccGkg
Zl9jJCZxdW90Ozwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIgLz5heDEu
cGxvdCh0LCB5LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nLS0nPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3Nw
YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmxhYmVs
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0i
Y29sb3I6IzZhYWI3MzsiPiZxdW90OyR5ID0gZHgvZHQkJnF1b3Q7PC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4MS5wbG90KHQsIGR4LCA8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj
NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDky
NjsiPmxhYmVsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPiZxdW90O1NURlQtYmFzZWQgJGR4L2R0JCZxdW90Ozwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8L3A+CjxwPiZuYnNwOzxwPiZuYnNw
OzxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZvciA8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5heF8gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjojY2Y4ZTZkOyI+aW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+KCpheHgw
LCBheDEpOjxiciAvPiZuYnNwOyZuYnNwOyZuYnNwOyBheF8ubGVnZW5kKCk8YnIgLz4mbmJzcDsm
bmJzcDsmbmJzcDsgYXhfLmdyaWQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+
VHJ1ZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8L3A+CjxwPiZuYnNwOzxw
IHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2lu
LXJpZ2h0OjA7Ij5wbHQuc2hvdygpPC9wPgo8cD4mbmJzcDs8L3NwYW4+PC9zcGFuPjwvcD4KPGJy
IC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDtt
YXJnaW4tcmlnaHQ6MDsiPkNoZWVycywgZGlldHJpY2g8L3A+CjxiciAvPjxiciAvPjxiciAvPjxw
IHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2lu
LXJpZ2h0OjA7Ij5bMV0gPGEgaHJlZj0iaHR0cHM6Ly9sdGZhdC5vcmcvZG9jL2dhYm9yLyI+aHR0
cHM6Ly9sdGZhdC5vcmcvZG9jL2dhYm9yLzwvYT48L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7
bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5bMl0gPGEgaHJl
Zj0iaHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlhbC9zaWduYWwuaHRtbCNz
cGVjdHJhbC1hbmFseXNpcyI+aHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlh
bC9zaWduYWwuaHRtbCNzcGVjdHJhbC1hbmFseXNpczwvYT48L3A+CjxwIHN0eWxlPSJtYXJnaW4t
dG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5bM10g
PGEgaHJlZj0iaHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlhbC9zaWduYWwu
aHRtbCNzaG9ydC10aW1lLWZvdXJpZXItdHJhbnNmb3JtIj5odHRwczovL3NjaXB5LmdpdGh1Yi5p
by9kZXZkb2NzL3R1dG9yaWFsL3NpZ25hbC5odG1sI3Nob3J0LXRpbWUtZm91cmllci10cmFuc2Zv
cm08L2E+PC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtt
YXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+T24gU2F0dXJkYXksIDIgTWFyY2ggMjAyNCAy
MjoxMDo0NSBDRVQgRWR3YXJkIFJpY2hhcmRzIHdyb3RlOjwvcD4KPHAgc3R5bGU9Im1hcmdpbi10
b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg
VGhhbmsgeW91IGZvciB5b3VyIHJlc3BvbnNlLCBEaWV0cmljaC48L3A+CjxwIHN0eWxlPSJtYXJn
aW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4m
Z3Q7IDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxl
ZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgV2UgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRpbmcg
dGhlIGRpZmZlcmVudGlhdGlvbiBhcyB5b3Ugc3VnZ2VzdGVkOiAoMSk8L3A+CjxwIHN0eWxlPSJt
YXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7
Ij4mZ3Q7IFNURlQgdGhlIHNpZ25hbCwgKDIpIG11bHRpcGx5IGVhY2ggc2xpY2UgYnkgajLPgGYs
ICgzKSBJU1RGVC4gV2UgYXJlIG5vdDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4t
Ym90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgdXNpbmcgYSByZWN0
YW5ndWxhciB3aW5kb3csIHRob3VnaCBJIGNhbiBzZWUgaG93IGl0IHBlcmZvcm1zLiBJIGRlZmF1
bHQgdG88L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1s
ZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IGEgbnV0dGFsbCBmb3IgRFNQLCBhbmQgaXRzIHJl
bGF0aXZlbHkgcG9vciBwZXJmb3JtYW5jZSBsZWFkIHRvIG15IHF1ZXN0aW9uLjwvcD4KPHAgc3R5
bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmln
aHQ6MDsiPiZndDsgSXMgdGhlcmUgYSB3YXkgb2YgcHJlZGljdGluZyBpZiBhbiBvcGVyYXRpb24g
ZG9lcyBkZXBlbmQgb24gdGhlIHdpbmRvdz8gSWY8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7
bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IHNvLCBp
cyB0aGVyZSBhIHN0YW5kYXJkIHByYWN0aWNlIGZvciBzZWxlY3Rpb24/PC9wPgo8cCBzdHlsZT0i
bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDow
OyI+Jmd0OyA8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdp
bi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IFRoaXMgcHJvY2VkdXJlIGRvZXMgc2hvdyBw
cm9taXNlLiBUaGUgaW50ZWdyYXRpb24gc3RlcCBpcyBtdWNoIHNpbXBsZXIgd2l0aDwvcD4KPHAg
c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t
cmlnaHQ6MDsiPiZndDsgdGhlIFNURlQgdGhhbiBhIHNpbXBsZSBGRlQvSUZGVC48L3A+CjxwIHN0
eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJp
Z2h0OjA7Ij4mZ3Q7IDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7
bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgT24gU2F0LCBNYXIgMiwgMjAyNCBh
dCAxOjQ54oCvQU0gRGlldHJpY2ggQnJ1bm4gJmx0O0RpZXRyaWNoLkJydW5uQHdlYi5kZSZndDsg
d3JvdGU6PC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4t
bGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IEhpIE5lZCw8L3A+CjxwIHN0eWxlPSJt
YXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7
Ij4mZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtt
YXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IGl0IGlzIG5pY2UgdG8gc2Vl
IHRoYXQgdGhlIG5ldyBTVEZUIGZ1bmN0aW9uYWxpdHkgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZC48
L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7
bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21h
cmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZn
dDsgT3VyIGZpcnN0IHVzZSBjYXNlIGlzIGFuIGludGVncmF0b3IgYW5kIGRpZmZlcmVudGlhdG9y
LiBXZSBpbXBsZW1lbnQ8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTow
O21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgJmd0OyB0aGlzPC9wPgo8
cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdp
bi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21h
cmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZn
dDsgd2l0aCBhIGZvcndhcmQvaW52ZXJzZSBzdGZ0IHBhaXIsIGFuZCB0aGUgZnJlcXVlbmN5IGRv
bWFpbiBjYWxjdWx1czwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7
bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgJmd0OyAmZ3Q7IDwvcD4KPHAgc3R5
bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmln
aHQ6MDsiPiZndDsgJmd0OyAmZ3Q7IGRlZmluaXRpb25zLjwvcD4KPHAgc3R5bGU9Im1hcmdpbi10
b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg
Jmd0OyA8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1s
ZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgTWF5IEkgYXNrIGhvdyB5b3UgaW1wbGVt
ZW50ZWQgdGhlIGRpZmZlcmVudGlhdGlvbiBpbiB0aGUgU1RGVCBzcGFjZT8gTm90ZTwvcD4KPHAg
c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t
cmlnaHQ6MDsiPiZndDsgJmd0OyB0aGF0IGRpZmZlcmVudGlhdGlvbiAqaXMqIHdpbmRvdyBkZXBl
bmRlbnQuIEFuIGFkLWhvYyBhcHByb2FjaCB3b3VsZCBiZTwvcD4KPHAgc3R5bGU9Im1hcmdpbi10
b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg
Jmd0OyB1c2luZyBhIHJlY3Rhbmd1bGFyIGR1YWwgd2luZG93ICh1dGlsaXppbmcgYFNob3J0VGlt
ZUZGVC5mcm9tX2R1YWxgKSBhbmQ8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJv
dHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgbXVsdGlwbHlp
bmcgdGhlIFNURlQgYnkgajLPgGYuPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1i
b3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IDwvcD4KPHAg
c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t
cmlnaHQ6MDsiPiZndDsgJmd0OyBDaGVlcnMsIGRpZXRyaWNoPC9wPgo8YnIgLz48YnIgLz48L2Jv
ZHk+CjwvaHRtbD4=


--nextPart2670133.BddDVKsqQX--

--nextPart1804542.TLkxdtWsSY
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part.
Content-Transfer-Encoding: 7Bit

-----BEGIN PGP SIGNATURE-----

iQEzBAABCgAdFiEE2SZhCS7+RzbiScjDpKQpg4NlCTYFAmXl7g8ACgkQpKQpg4Nl
CTZuLAgAgdiIjbVqas2HOBU3l0cCfX1WkHK5ssDGCroOAhNx8xqdhdD9hVhnuX1A
WLXe+G3mRvFLoRb7pxsWCvsO0T22F9owvsb394sC86823isC94GOWcVIqQAb1FjH
uzWwUw/uVvazjD6SUs8gJfHEUfM8Dr3dDw1hG9qr2/ULD5EosPydsWemwexsiGoA
DdgwKeODz6IMhHmI0MqQ5BSzQMnv0gN2iTySKCpcoxLU3UQ9XAOiH7g+g2JMAtSG
dsC26wY1sigDqrdRzgOQyaBF14A7PqM9+zvhJT7NQ7Qt4MEW2tU0oq1ft8ZTM6os
dQbw7qTfYkzxMtMrLh41arnfWK6m+g==
=aRFH
-----END PGP SIGNATURE-----

--nextPart1804542.TLkxdtWsSY--




--===============4139670325402463384==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
SciPy-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/scipy-dev.python.org/
Member address: [email protected]

--===============4139670325402463384==--