<div dir="ltr"><div dir="ltr"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Sat, Oct 27, 2018 at 6:37 PM Eric Wieser <<a href="mailto:wieser.eric%2Bnumpy@gmail.com">wieser.eric+numpy@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-1501938976356914019markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:medium none;line-height:1.2"><blockquote style="margin:1em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:1em 0px">in order to be used prior to calling C or Fortran code that expected at least a 1-d array </p>
</blockquote>
<p style="margin:1em 0px">I’d argue that the behavior for these functions should have just been to raise an error saying “this function does not support 0d arrays”, rather than silently inserting extra dimensions. <span style="font-size:1em">As a bonus, that would push the function developers to add support for 0d. Obviously we can’t make it do that now, but what we can do is have it emit a warning in those cases.</span></p><p style="margin:1em 0px">I think our options are:</p>
<ol style="padding-left:2em;margin:1em 0px">
<li style="margin:1em 0px">Deprecate the entire function</li>
<li style="margin:1em 0px">Deprecate and eventually(?) throw an error upon calling the function on 0d arrays, with a message like <i>“in future using ascontiguousarray to promote 0d arrays to 1d arrays will not be supported. If promotion is intentional, use <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ascontiguousarray(atleast1d(x))</code> to silence this warning and keep the old behavior, and if not use <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">asarray(x, order='C')</code> to preserve 0d arrays”</i></li>
<li style="margin:1em 0px">Deprecate (future-warning) when passed 0d arrays, and eventually skip the upcast to 1d.<br>If the calling code really needed a 1d array, then it will probably fail, which is not really different to 2, but has the advantage that the names are less surprising.</li>
<li style="margin:1em 0px">Only improve the documentation</li>
</ol>
<p style="margin:1em 0px">My preference would be 3</p></div></div></blockquote><div>I'd go for 4, or alternatively for the warning in 2 (which can be left in place indefinitely). 1 is unwarranted, and 3 will change behavior which is worse than just warning or stopping to support existing behavior (= 2).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-1501938976356914019markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:medium none;line-height:1.2"><p style="margin:1em 0px">Eric</p>
<p style="margin:1em 0px">On Fri, 26 Oct 2018 at 17:35 Travis Oliphant <<a href="mailto:teoliphant@gmail.com" style="color:rgb(51,51,238);text-decoration:none" target="_blank">teoliphant@gmail.com</a>> wrote:</p>
<p style="margin:1em 0px"></p><div class="gmail-m_-1501938976356914019markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Fri, Oct 26, 2018 at 7:14 PM Alex Rogozhnikov <<a href="mailto:alex.rogozhnikov@yandex.ru" target="_blank">alex.rogozhnikov@yandex.ru</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>> If the desire is to shrink the API of NumPy, I could see that.</div><div> </div><div>Very good desire, but my goal was different. </div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div> </div><div>> For some users this is exactly what is wanted.</div><div> </div><div>Maybe so, but I didn't face such example (and nobody mentioned those so far in the discussion).</div><div>The opposite (according to the issue) happened. Mxnet example is sufficient in my opinion.</div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I agree that the old motivation of APIs that would make it easy to create SciPy is no longer a major motivation for most users and even developers and so these reasons would not be very present (as well as why it wasn't even mentioned in the documentation).  </div></div></div><div dir="ltr"><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div> </div><div>Simple example:</div><div><span style="font-family:courier new,monospace">x = np.zeros([])</span></div><div><span style="font-family:courier new,monospace">assert(x.flags.c_contiguous)</span></div><div><span style="font-family:courier new,monospace">assert(np.ascontiguousarray(x).shape == x.shape)</span></div><div> </div><div><span style="font-family:courier new,monospace">Behavior contradicts to documentation (shape is changed) and to name (flags are saying - it is already c_contiguous)</span></div><div> </div><div>If you insist, that keeping ndmin=1 is important (I am not yet convinced, but I am ready to believe your autority),</div><div>we can add ndmin=1 to functions' signatures, this way explicitly notifying users about expected dimension.</div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I understand the lack of being convinced.  This is ultimately a problem of 0-d arrays not being fully embraced and accepted by the Numeric community originally (which NumPy inherited during the early days).   Is there a way to document functions that will be removed on a major version increase which don't print warnings on use? I would support this.</div></div></div></blockquote></div></div></div></blockquote><div><br></div><div>No, there's no such thing at the moment - the closest thing is <a href="https://github.com/numpy/numpy/wiki/Backwards-incompatible-ideas-for-a-major-release">https://github.com/numpy/numpy/wiki/Backwards-incompatible-ideas-for-a-major-release</a>. I doubt we want such a thing anyway - removing functions without deprecation warnings first doesn't seem quite right.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-1501938976356914019markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:medium none;line-height:1.2"><div class="gmail-m_-1501938976356914019markdown-here-exclude"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>I'm a big supporter of making a NumPy 2.0 and have been for several years. Now that Python 3 transition has happened, I think we could seriously discuss this.</div></div></div></blockquote></div></div></div></blockquote><div><br></div><div>I think it's more helpful to discuss goals and concrete plans for those, rather than a "NumPy 2.0" label. The latter never worked in the past, and not just because of lack of time/funding - it just means different things to different people. We now have a good start on what our major goals are (<a href="http://www.numpy.org/neps/#roadmap">http://www.numpy.org/neps/#roadmap</a>), let's build on that.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-1501938976356914019markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:medium none;line-height:1.2"><div class="gmail-m_-1501938976356914019markdown-here-exclude"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>  I'm trying to raise funding for maintenance and progress for NumPy and SciPy right now via Quansight Labs <a href="http://www.quansight.com/labs" target="_blank">http://www.quansight.com/labs</a> and I hope to be able to help find grants to support the wonderful efforts that have been happening for some time. <br></div></div></div></blockquote></div></div></div></blockquote><div><br></div><div>The NumPy grant and having Tyler/Matti/Stefan at BIDS is a great start to funded development; more and more diverse funding sources would be awesome.</div><div><br></div><div>Cheers,<br></div><div>Ralf</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-1501938976356914019markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:medium none;line-height:1.2"><div class="gmail-m_-1501938976356914019markdown-here-exclude"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div></div><div><br></div><div>While I'm thrilled and impressed by the number of amazing devs who have kept NumPy and SciPy going in mostly their spare time, it has created challenges that we have not had continuous maintenance funding to allow continuous paid development so that several people who know about the early decisions could not be retained to spend time on helping the transition.  </div><div><br></div><div>Your bringing the problem of mxnet devs is most appreciated.  I will make a documentation PR.</div></div></div><div dir="ltr"><div class="gmail_quote"><div><br></div><div>-Travis</div></div></div><div dir="ltr"><div class="gmail_quote"><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div> </div><div>Alex.</div><div> </div><div> </div><div>27.10.2018, 02:27, "Travis Oliphant" <<a href="mailto:teoliphant@gmail.com" target="_blank">teoliphant@gmail.com</a>>:</div><blockquote type="cite"><div>What is the justification for deprecation exactly?  These functions have been well documented and have had the intended behavior of producing arrays with dimension at least 1 for some time.  Why is it unexpected to produce arrays of at least 1 dimension?  For some users this is exactly what is wanted.  I don't understand the statement that behavior with 0-d arrays is unexpected.<div> </div><div>If the desire is to shrink the API of NumPy, I could see that.   But, it seems odd to me to remove a much-used function with an established behavior except as part of a wider API-shrinkage effort. </div><div> </div><div>0-d arrays in NumPy are a separate conversation.  At this point, I think it was a mistake not to embrace 0-d arrays in NumPy from day one.  In some sense 0-d arrays *are* scalars at least conceptually and for JIT-producing systems that exist now and will be growing in the future, they can be equivalent to scalars.  </div><div> </div><div>The array scalars should become how you define what is *in* a NumPy array making them true Python types, rather than Python 1-style "instances" of a single "Dtype" object.  You would then have 0-d arrays and these Python "memory" types describing what is *in* the array.  </div><div> </div><div>There is a clear way to do this, some of which has been outlined by Nathaniel, and the rest I have an outline for how to implement.  I can advise someone on how to do this.  </div><div> </div><div>-Travis</div><div> </div><div> </div><div> </div></div> <div><div>On Thu, Oct 25, 2018 at 3:17 PM Alex Rogozhnikov <<a rel="noopener noreferrer" href="mailto:alex.rogozhnikov@yandex.ru" target="_blank">alex.rogozhnikov@yandex.ru</a>> wrote:</div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Dear numpy community,</div><div> </div><div>I'm planning to depreciate np.asfortranarray and np.ascontiguousarray</div><div>functions due to their misbehavior on scalar (0-D tensors) with PR <span>#12244</span>.</div><div> </div><div>Current behavior (converting scalars to 1-d array with single element)</div><div>- is unexpected and contradicts to documentation</div><div>- probably, can't be changed without breaking external code</div><div>- I believe, this was a cause for poor support of 0-d arrays in mxnet.</div><div>- both functions are easily replaced with asarray(..., order='...'), which has expected behavior</div><div> </div><div>There is no timeline for removal - we just need to discourage from using this functions in new code.</div><div> </div><div>Function naming may be related to how numpy treats 0-d tensors specially,  </div><div>and those probably should not be called arrays.</div><div><div><a rel="noopener noreferrer" href="https://www.numpy.org/neps/nep-0027-zero-rank-arrarys.html" target="_blank">https://www.numpy.org/neps/nep-0027-zero-rank-arrarys.html</a></div><div>However, as a user I never thought about 0-d arrays being special and being "not arrays".</div><div> </div></div><div> </div><div>Please see original discussion at github for more details</div><div><a rel="noopener noreferrer" href="https://github.com/numpy/numpy/issues/5300" target="_blank">https://github.com/numpy/numpy/issues/5300</a></div><div> </div><div>Your comments welcome,</div><div>Alex Rogozhnikov<br> </div>_______________________________________________<br>NumPy-Discussion mailing list<br><a rel="noopener noreferrer" href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br><a rel="noopener noreferrer" href="https://mail.python.org/mailman/listinfo/numpy-discussion" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a></blockquote></div>,<p>_______________________________________________<br>NumPy-Discussion mailing list<br><a rel="noopener noreferrer" href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br><a rel="noopener noreferrer" href="https://mail.python.org/mailman/listinfo/numpy-discussion" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a></p></blockquote>_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div></div>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote><p></p></div><p style="margin:1em 0px"></p>
<div title="MDH:Jmd0O8KgPHNwYW4gc3R5bGU9ImNvbG9yOnJnYigzMywzMywzMykiPmluIG9yZGVyIHRvIGJlIHVz
ZWQgcHJpb3IgdG8gY2FsbGluZyBDIG9yIEZvcnRyYW4gY29kZSB0aGF0IGV4cGVjdGVkIGF0IGxl
YXN0IGEgMS1kIGFycmF5PC9zcGFuPsKgPGRpdj48YnI+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGRp
dj5JJ2QgYXJndWUgdGhhdCB0aGUgYmVoYXZpb3IgZm9yIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQg
aGF2ZSBqdXN0IGJlZW4gdG8gcmFpc2UgYW4gZXJyb3Igc2F5aW5nICJ0aGlzIGZ1bmN0aW9uIGRv
ZXMgbm90IHN1cHBvcnQgMGQgYXJyYXlzIiwgcmF0aGVyIHRoYW4gc2lsZW50bHkgaW5zZXJ0aW5n
IGV4dHJhIGRpbWVuc2lvbnMuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BcyBhIGJvbnVzLCB0
aGF0IHdvdWxkIHB1c2ggdGhlIGZ1bmN0aW9uIGRldmVsb3BlcnMgdG8gYWRkIHN1cHBvcnQgZm9y
IDBkLiBPYnZpb3VzbHkgd2UgY2FuJ3QgbWFrZSBpdCBkbyB0aGF0IG5vdywgYnV0IHdoYXQgd2Ug
Y2FuIGRvIGlzIGhhdmUgaXQgZW1pdCBhIHdhcm5pbmcgaW4gdGhvc2UgY2FzZXMuIEkgdGhpbmsg
b3VyIG9wdGlvbnMgYXJlOjxicj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDMzLDMzLDMzKSI+PGJy
PjEuIERlcHJlY2F0ZSB0aGUgZW50aXJlIGZ1bmN0aW9uPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigzMywzMywzMykiPjIuIERlcHJlY2F0ZSBhbmQgZXZlbnR1YWxseSg/
KSB0aHJvdyBhbiBlcnJvciB1cG9uIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIDBkIGFycmF5cywg
d2l0aCBhIG1lc3NhZ2UgbGlrZSBfImFzY29udGlndW91c2FycmF5IHByb21vdGVzIDBkIGFycmF5
cyB0byAxZCBhcnJheXMuIElmIHRoaXMgaXMgaW50ZW50aW9uYWwsIHVzZSBgYXNjb250aWd1b3Vz
YXJyYXkoYXRsZWFzdDFkKHgpKWAgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcgYW5kIGtlZXAgdGhl
IG9sZCBiZWhhdmlvciwgYW5kIGlmIG5vdCB1c2UgYGFzYXJyYXkoeCwgb3JkZXI9J0MnKWAgdG8g
cHJlc2VydmUgMGQgYXJyYXlzIl88L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDMzLDMzLDMzKSI+My4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMzMs
IDMzLCAzMyk7Ij5EZXByZWNhdGUgKGZ1dHVyZS13YXJuaW5nKSB3aGVuIHBhc3NlZCAwZCBhcnJh
eXMsIGFuZCBldmVudHVhbGx5IHNraXAgdGhlIHVwY2FzdCB0byAxZC48L3NwYW4+PC9kaXY+PGRp
dj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigzMywgMzMsIDMzKTsiPiZuYnNwOyAmbmJzcDtJZiB0
aGUgY2FsbGluZyBjb2RlIHJlYWxseSBuZWVkZWQgYSAxZCBhcnJheSwgdGhlbiBpdCB3aWxsIHBy
b2JhYmx5IGZhaWwsIHdoaWNoIGlzIG5vdCByZWFsbHkgZGlmZmVyZW50IHRvIDIsIGJ1dCBoYXMg
dGhlIGFkdmFudGFnZSB0aGF0IHRoZSBuYW1lcyBhcmUgbGVzcyBzdXJwcmlzaW5nPC9zcGFuPjwv
ZGl2PjxkaXY+NC4gT25seSBpbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uPC9kaXY+PGRpdj48YnI+
PC9kaXY+PGRpdj5NeSBwcmVmZXJlbmNlIHdvdWxkIGJlIDM8L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0
ciI+T24gRnJpLCAyNiBPY3QgMjAxOCBhdCAxNzozNSBUcmF2aXMgT2xpcGhhbnQgJmx0OzxhIGhy
ZWY9Im1haWx0bzp0ZW9saXBoYW50QGdtYWlsLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPnRlb2xpcGhh
bnRAZ21haWwuY29tPC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJn
bWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2Nj
IHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgZGlyPSJsdHIiPjxkaXYgY2xhc3M9ImdtYWls
X3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBGcmksIE9jdCAyNiwgMjAxOCBhdCA3OjE0IFBNIEFs
ZXggUm9nb3pobmlrb3YgJmx0OzxhIGhyZWY9Im1haWx0bzphbGV4LnJvZ296aG5pa292QHlhbmRl
eC5ydSIgdGFyZ2V0PSJfYmxhbmsiPmFsZXgucm9nb3pobmlrb3ZAeWFuZGV4LnJ1PC9hPiZndDsg
d3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1h
cmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDox
ZXgiPjxkaXY+Jmd0OyBJZiB0aGUgZGVzaXJlIGlzIHRvIHNocmluayB0aGUgQVBJIG9mIE51bVB5
LCBJIGNvdWxkIHNlZSB0aGF0LjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj5WZXJ5IGdvb2Qg
ZGVzaXJlLCBidXQgbXkgZ29hbCB3YXMgZGlmZmVyZW50LiZuYnNwOzwvZGl2PjwvYmxvY2txdW90
ZT48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhl
eDtib3JkZXItbGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2PiZuYnNw
OzwvZGl2PjxkaXY+Jmd0OyBGb3Igc29tZSB1c2VycyB0aGlzIGlzIGV4YWN0bHkgd2hhdCBpcyB3
YW50ZWQuPC9kaXY+PGRpdj4mbmJzcDs8L2Rpdj48ZGl2Pk1heWJlIHNvLCBidXQgSSBkaWRuJ3Qg
ZmFjZSBzdWNoIGV4YW1wbGUgKGFuZCBub2JvZHkgbWVudGlvbmVkIHRob3NlIHNvIGZhciBpbiB0
aGUgZGlzY3Vzc2lvbikuPC9kaXY+PGRpdj5UaGUgb3Bwb3NpdGUgKGFjY29yZGluZyB0byB0aGUg
aXNzdWUpIGhhcHBlbmVkLiBNeG5ldCBleGFtcGxlIGlzIHN1ZmZpY2llbnQgaW4gbXkgb3Bpbmlv
bi48L2Rpdj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBkaXI9
Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXY+SSBhZ3JlZSB0aGF0IHRoZSBvbGQg
bW90aXZhdGlvbiBvZiBBUElzIHRoYXQgd291bGQgbWFrZSBpdCBlYXN5IHRvIGNyZWF0ZSBTY2lQ
eSBpcyBubyBsb25nZXIgYSBtYWpvciBtb3RpdmF0aW9uIGZvciBtb3N0IHVzZXJzIGFuZCBldmVu
IGRldmVsb3BlcnMgYW5kIHNvIHRoZXNlIHJlYXNvbnMgd291bGQgbm90IGJlIHZlcnkgcHJlc2Vu
dCAoYXMgd2VsbCBhcyB3aHkgaXQgd2Fzbid0IGV2ZW4gbWVudGlvbmVkIGluIHRoZSBkb2N1bWVu
dGF0aW9uKS4mbmJzcDsmbmJzcDs8L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGRpcj0ibHRyIj48ZGl2
IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj48YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9Imdt
YWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mg
c29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRpdj4mbmJzcDs8L2Rpdj48ZGl2PlNpbXBsZSBleGFt
cGxlOjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3LG1vbm9z
cGFjZSI+eCA9IG5wLnplcm9zKFtdKTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJmb250
LWZhbWlseTpjb3VyaWVyIG5ldyxtb25vc3BhY2UiPmFzc2VydCh4LmZsYWdzLmNfY29udGlndW91
cyk8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6Y291cmllciBuZXcs
bW9ub3NwYWNlIj5hc3NlcnQobnAuYXNjb250aWd1b3VzYXJyYXkoeCk8d2JyPi5zaGFwZSA9PSB4
LnNoYXBlKTwvc3Bhbj48L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZv
bnQtZmFtaWx5OmNvdXJpZXIgbmV3LG1vbm9zcGFjZSI+QmVoYXZpb3IgY29udHJhZGljdHMgdG8g
ZG9jdW1lbnRhdGlvbiAoc2hhcGUgaXMgY2hhbmdlZCkgYW5kIHRvIG5hbWUgKGZsYWdzIGFyZSBz
YXlpbmcgLSBpdCBpcyBhbHJlYWR5IGNfY29udGlndW91cyk8L3NwYW4+PC9kaXY+PGRpdj4mbmJz
cDs8L2Rpdj48ZGl2PklmIHlvdSBpbnNpc3QsIHRoYXQga2VlcGluZyBuZG1pbj0xIGlzIGltcG9y
dGFudCAoSSBhbSBub3QgeWV0IGNvbnZpbmNlZCwgYnV0IEkgYW0gcmVhZHkgdG8gYmVsaWV2ZSB5
b3VyIGF1dG9yaXR5KSw8L2Rpdj48ZGl2PndlIGNhbiBhZGQgbmRtaW49MSB0byBmdW5jdGlvbnMn
IHNpZ25hdHVyZXMsIHRoaXMgd2F5IGV4cGxpY2l0bHkgbm90aWZ5aW5nIHVzZXJzIGFib3V0IGV4
cGVjdGVkIGRpbWVuc2lvbi48L2Rpdj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9kaXY+
PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXY+SSB1bmRl
cnN0YW5kIHRoZSBsYWNrIG9mIGJlaW5nIGNvbnZpbmNlZC4mbmJzcDsgVGhpcyBpcyB1bHRpbWF0
ZWx5IGEgcHJvYmxlbSBvZiAwLWQgYXJyYXlzIG5vdCBiZWluZyBmdWxseSBlbWJyYWNlZCBhbmQg
YWNjZXB0ZWQgYnkgdGhlIE51bWVyaWMgY29tbXVuaXR5IG9yaWdpbmFsbHkgKHdoaWNoIE51bVB5
IGluaGVyaXRlZCBkdXJpbmcgdGhlIGVhcmx5IGRheXMpLiZuYnNwOyAmbmJzcDtJcyB0aGVyZSBh
IHdheSB0byBkb2N1bWVudCBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIHJlbW92ZWQgb24gYSBtYWpv
ciB2ZXJzaW9uIGluY3JlYXNlIHdoaWNoIGRvbid0IHByaW50IHdhcm5pbmdzIG9uIHVzZT8gSSB3
b3VsZCBzdXBwb3J0IHRoaXMuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JJ20gYSBiaWcgc3Vw
cG9ydGVyIG9mIG1ha2luZyBhIE51bVB5IDIuMCBhbmQgaGF2ZSBiZWVuIGZvciBzZXZlcmFsIHll
YXJzLiBOb3cgdGhhdCBQeXRob24gMyB0cmFuc2l0aW9uIGhhcyBoYXBwZW5lZCwgSSB0aGluayB3
ZSBjb3VsZCBzZXJpb3VzbHkgZGlzY3VzcyB0aGlzLiZuYnNwOyBJJ20gdHJ5aW5nIHRvIHJhaXNl
IGZ1bmRpbmcgZm9yIG1haW50ZW5hbmNlIGFuZCBwcm9ncmVzcyBmb3IgTnVtUHkgYW5kIFNjaVB5
IHJpZ2h0IG5vdyB2aWEgUXVhbnNpZ2h0IExhYnMgPGEgaHJlZj0iaHR0cDovL3d3dy5xdWFuc2ln
aHQuY29tL2xhYnMiIHRhcmdldD0iX2JsYW5rIiBkYXRhLXNhZmVyZWRpcmVjdHVybD0iaHR0cHM6
Ly93d3cuZ29vZ2xlLmNvbS91cmw/cT1odHRwOi8vd3d3LnF1YW5zaWdodC5jb20vbGFicyZhbXA7
c291cmNlPWdtYWlsJmFtcDt1c3Q9MTU0MDcwNDQxNDQ5MzAwMCZhbXA7dXNnPUFGUWpDTkVqX2RI
OVByb0ppcDhvVXdFQ2xkR2YwR2h2WEEiPmh0dHA6Ly93d3cucXVhbnNpZ2h0LmNvbS9sYWJzPC9h
PiBhbmQgSSBob3BlIHRvIGJlIGFibGUgdG8gaGVscCBmaW5kIGdyYW50cyB0byBzdXBwb3J0IHRo
ZSB3b25kZXJmdWwgZWZmb3J0cyB0aGF0IGhhdmUgYmVlbiBoYXBwZW5pbmcgZm9yIHNvbWUgdGlt
ZS4mbmJzcDs8YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5XaGlsZSBJJ20gdGhyaWxsZWQg
YW5kIGltcHJlc3NlZCBieSB0aGUgbnVtYmVyIG9mIGFtYXppbmcgZGV2cyB3aG8gaGF2ZSBrZXB0
IE51bVB5IGFuZCBTY2lQeSBnb2luZyBpbiBtb3N0bHkgdGhlaXIgc3BhcmUgdGltZSwgaXQgaGFz
IGNyZWF0ZWQgY2hhbGxlbmdlcyB0aGF0IHdlIGhhdmUgbm90IGhhZCBjb250aW51b3VzIG1haW50
ZW5hbmNlIGZ1bmRpbmcgdG8gYWxsb3cgY29udGludW91cyBwYWlkIGRldmVsb3BtZW50IHNvIHRo
YXQgc2V2ZXJhbCBwZW9wbGUgd2hvIGtub3cgYWJvdXQgdGhlIGVhcmx5IGRlY2lzaW9ucyBjb3Vs
ZCBub3QgYmUgcmV0YWluZWQgdG8gc3BlbmQgdGltZSBvbiBoZWxwaW5nIHRoZSB0cmFuc2l0aW9u
LiZuYnNwOyZuYnNwOzwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+WW91ciBicmluZ2luZyB0aGUg
cHJvYmxlbSBvZiBteG5ldCBkZXZzIGlzIG1vc3QgYXBwcmVjaWF0ZWQuJm5ic3A7IEkgd2lsbCBt
YWtlIGEgZG9jdW1lbnRhdGlvbiBQUi48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGRpcj0ibHRyIj48
ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj48YnI+PC9kaXY+PGRpdj4tVHJhdmlzPC9kaXY+
PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXY+
PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNz
PSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAj
Y2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj5BbGV4Ljwv
ZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj4mbmJzcDs8L2Rpdj48ZGl2PjI3LjEwLjIwMTgsIDAy
OjI3LCAiVHJhdmlzIE9saXBoYW50IiAmbHQ7PGEgaHJlZj0ibWFpbHRvOnRlb2xpcGhhbnRAZ21h
aWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+dGVvbGlwaGFudEBnbWFpbC5jb208L2E+Jmd0Ozo8L2Rp
dj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj48ZGl2PldoYXQgaXMgdGhlIGp1c3RpZmljYXRpb24g
Zm9yIGRlcHJlY2F0aW9uIGV4YWN0bHk/Jm5ic3A7IFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4g
d2VsbCBkb2N1bWVudGVkIGFuZCBoYXZlIGhhZCB0aGUgaW50ZW5kZWQgYmVoYXZpb3Igb2YgcHJv
ZHVjaW5nIGFycmF5cyB3aXRoIGRpbWVuc2lvbiBhdCBsZWFzdCAxIGZvciBzb21lIHRpbWUuJm5i
c3A7IFdoeSBpcyBpdCB1bmV4cGVjdGVkIHRvIHByb2R1Y2UgYXJyYXlzIG9mIGF0IGxlYXN0IDEg
ZGltZW5zaW9uPyZuYnNwOyBGb3Igc29tZSB1c2VycyB0aGlzIGlzIGV4YWN0bHkgd2hhdCBpcyB3
YW50ZWQuJm5ic3A7IEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgc3RhdGVtZW50IHRoYXQgYmVoYXZp
b3Igd2l0aCAwLWQgYXJyYXlzIGlzIHVuZXhwZWN0ZWQuPGRpdj4mbmJzcDs8L2Rpdj48ZGl2Pklm
IHRoZSBkZXNpcmUgaXMgdG8gc2hyaW5rIHRoZSBBUEkgb2YgTnVtUHksIEkgY291bGQgc2VlIHRo
YXQuJm5ic3A7ICZuYnNwO0J1dCwgaXQgc2VlbXMgb2RkIHRvIG1lIHRvIHJlbW92ZSBhIG11Y2gt
dXNlZCBmdW5jdGlvbiB3aXRoIGFuIGVzdGFibGlzaGVkIGJlaGF2aW9yIGV4Y2VwdCBhcyBwYXJ0
IG9mIGEgd2lkZXIgQVBJLXNocmlua2FnZSBlZmZvcnQuJm5ic3A7PC9kaXY+PGRpdj4mbmJzcDs8
L2Rpdj48ZGl2PjAtZCBhcnJheXMgaW4gTnVtUHkgYXJlIGEgc2VwYXJhdGUgY29udmVyc2F0aW9u
LiZuYnNwOyBBdCB0aGlzIHBvaW50LCBJIHRoaW5rIGl0IHdhcyBhIG1pc3Rha2Ugbm90IHRvIGVt
YnJhY2UgMC1kIGFycmF5cyBpbiBOdW1QeSBmcm9tIGRheSBvbmUuJm5ic3A7IEluIHNvbWUgc2Vu
c2UgMC1kIGFycmF5cyAqYXJlKiBzY2FsYXJzIGF0IGxlYXN0IGNvbmNlcHR1YWxseSBhbmQgZm9y
IEpJVC1wcm9kdWNpbmcgc3lzdGVtcyB0aGF0IGV4aXN0IG5vdyBhbmQgd2lsbCBiZSBncm93aW5n
IGluIHRoZSBmdXR1cmUsIHRoZXkgY2FuIGJlIGVxdWl2YWxlbnQgdG8gc2NhbGFycy4mbmJzcDsm
bmJzcDs8L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjxkaXY+VGhlIGFycmF5IHNjYWxhcnMgc2hvdWxk
IGJlY29tZSBob3cgeW91IGRlZmluZSB3aGF0IGlzICppbiogYSBOdW1QeSBhcnJheSBtYWtpbmcg
dGhlbSB0cnVlIFB5dGhvbiB0eXBlcywgcmF0aGVyIHRoYW4gUHl0aG9uIDEtc3R5bGUgImluc3Rh
bmNlcyIgb2YgYSBzaW5nbGUgIkR0eXBlIiBvYmplY3QuJm5ic3A7IFlvdSB3b3VsZCB0aGVuIGhh
dmUgMC1kIGFycmF5cyBhbmQgdGhlc2UgUHl0aG9uICJtZW1vcnkiIHR5cGVzIGRlc2NyaWJpbmcg
d2hhdCBpcyAqaW4qIHRoZSBhcnJheS4mbmJzcDsmbmJzcDs8L2Rpdj48ZGl2PiZuYnNwOzwvZGl2
PjxkaXY+VGhlcmUgaXMgYSBjbGVhciB3YXkgdG8gZG8gdGhpcywgc29tZSBvZiB3aGljaCBoYXMg
YmVlbiBvdXRsaW5lZCBieSBOYXRoYW5pZWwsIGFuZCB0aGUgcmVzdCBJIGhhdmUgYW4gb3V0bGlu
ZSBmb3IgaG93IHRvIGltcGxlbWVudC4mbmJzcDsgSSBjYW4gYWR2aXNlIHNvbWVvbmUgb24gaG93
IHRvIGRvIHRoaXMuJm5ic3A7Jm5ic3A7PC9kaXY+PGRpdj4mbmJzcDs8L2Rpdj48ZGl2Pi1UcmF2
aXM8L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj4mbmJzcDs8L2Rp
dj48L2Rpdj4mbmJzcDs8ZGl2PjxkaXY+T24gVGh1LCBPY3QgMjUsIDIwMTggYXQgMzoxNyBQTSBB
bGV4IFJvZ296aG5pa292ICZsdDs8YSByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIGhyZWY9Im1h
aWx0bzphbGV4LnJvZ296aG5pa292QHlhbmRleC5ydSIgdGFyZ2V0PSJfYmxhbmsiPmFsZXgucm9n
b3pobmlrb3ZAeWFuZGV4LnJ1PC9hPiZndDsgd3JvdGU6PC9kaXY+PGJsb2NrcXVvdGUgc3R5bGU9
Im1hcmdpbjowIDAgMCAwLjhleDtib3JkZXItbGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxl
ZnQ6MWV4Ij48ZGl2PkRlYXIgbnVtcHkgY29tbXVuaXR5LDwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+
PGRpdj5JJ20gcGxhbm5pbmcgdG8gZGVwcmVjaWF0ZSBucC5hc2ZvcnRyYW5hcnJheSBhbmQgbnAu
YXNjb250aWd1b3VzYXJyYXk8L2Rpdj48ZGl2PmZ1bmN0aW9ucyBkdWUgdG8gdGhlaXIgbWlzYmVo
YXZpb3Igb24gc2NhbGFyICgwLUQgdGVuc29ycykgd2l0aCBQUiA8c3Bhbj4jMTIyNDQ8L3NwYW4+
LjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj5DdXJyZW50IGJlaGF2aW9yIChjb252ZXJ0aW5n
IHNjYWxhcnMgdG8gMS1kIGFycmF5IHdpdGggc2luZ2xlIGVsZW1lbnQpPC9kaXY+PGRpdj4tIGlz
IHVuZXhwZWN0ZWQgYW5kIGNvbnRyYWRpY3RzIHRvIGRvY3VtZW50YXRpb248L2Rpdj48ZGl2Pi0g
cHJvYmFibHksIGNhbid0IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyBleHRlcm5hbCBjb2Rl
PC9kaXY+PGRpdj4tIEkgYmVsaWV2ZSwgdGhpcyB3YXMgYSBjYXVzZSBmb3IgcG9vciBzdXBwb3J0
IG9mIDAtZCBhcnJheXMgaW4gbXhuZXQuPC9kaXY+PGRpdj4tIGJvdGggZnVuY3Rpb25zIGFyZSBl
YXNpbHkgcmVwbGFjZWQgd2l0aCBhc2FycmF5KC4uLiwgb3JkZXI9Jy4uLicpLCB3aGljaCBoYXMg
ZXhwZWN0ZWQgYmVoYXZpb3I8L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjxkaXY+VGhlcmUgaXMgbm8g
dGltZWxpbmUgZm9yIHJlbW92YWwgLSB3ZSBqdXN0IG5lZWQgdG8gZGlzY291cmFnZSBmcm9tIHVz
aW5nIHRoaXMgZnVuY3Rpb25zIGluIG5ldyBjb2RlLjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRp
dj5GdW5jdGlvbiBuYW1pbmcgbWF5IGJlIHJlbGF0ZWQgdG8gaG93IG51bXB5IHRyZWF0cyAwLWQg
dGVuc29ycyBzcGVjaWFsbHksICZuYnNwOzwvZGl2PjxkaXY+YW5kIHRob3NlIHByb2JhYmx5IHNo
b3VsZCBub3QgYmUgY2FsbGVkIGFycmF5cy48L2Rpdj48ZGl2PjxkaXY+PGEgcmVsPSJub29wZW5l
ciBub3JlZmVycmVyIiBocmVmPSJodHRwczovL3d3dy5udW1weS5vcmcvbmVwcy9uZXAtMDAyNy16
ZXJvLXJhbmstYXJyYXJ5cy5odG1sIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJlY3R1
cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0cHM6Ly93d3cubnVtcHkub3JnL25l
cHMvbmVwLTAwMjctemVyby1yYW5rLWFycmFyeXMuaHRtbCZhbXA7c291cmNlPWdtYWlsJmFtcDt1
c3Q9MTU0MDcwNDQxNDQ5MzAwMCZhbXA7dXNnPUFGUWpDTkhtTzg3OUhjak54eEpEZUJoN0RFWDR4
S2JtNEEiPmh0dHBzOi8vd3d3Lm51bXB5Lm9yZy9uZXBzLzx3YnI+bmVwLTAwMjctemVyby1yYW5r
LWFycmFyeXMuPHdicj5odG1sPC9hPjwvZGl2PjxkaXY+SG93ZXZlciwgYXMgYSB1c2VyIEkgbmV2
ZXIgdGhvdWdodCBhYm91dCAwLWQgYXJyYXlzIGJlaW5nIHNwZWNpYWwgYW5kIGJlaW5nICJub3Qg
YXJyYXlzIi48L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRp
dj5QbGVhc2Ugc2VlIG9yaWdpbmFsIGRpc2N1c3Npb24gYXQgZ2l0aHViIGZvciBtb3JlIGRldGFp
bHM8L2Rpdj48ZGl2PjxhIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgaHJlZj0iaHR0cHM6Ly9n
aXRodWIuY29tL251bXB5L251bXB5L2lzc3Vlcy81MzAwIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1z
YWZlcmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0cHM6Ly9naXRo
dWIuY29tL251bXB5L251bXB5L2lzc3Vlcy81MzAwJmFtcDtzb3VyY2U9Z21haWwmYW1wO3VzdD0x
NTQwNzA0NDE0NDkzMDAwJmFtcDt1c2c9QUZRakNORVh3UHBQU0R4WUN2UWhCTjRtTHVmVDlxd0hL
dyI+aHR0cHM6Ly9naXRodWIuY29tL251bXB5Lzx3YnI+bnVtcHkvaXNzdWVzLzUzMDA8L2E+PC9k
aXY+PGRpdj4mbmJzcDs8L2Rpdj48ZGl2PllvdXIgY29tbWVudHMgd2VsY29tZSw8L2Rpdj48ZGl2
PkFsZXggUm9nb3pobmlrb3Y8YnI+Jm5ic3A7PC9kaXY+X19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fPHdicj5fX19fX19fX19fX19fX19fXzxicj5OdW1QeS1EaXNjdXNzaW9uIG1haWxpbmcg
bGlzdDxicj48YSByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIGhyZWY9Im1haWx0bzpOdW1QeS1E
aXNjdXNzaW9uQHB5dGhvbi5vcmciIHRhcmdldD0iX2JsYW5rIj5OdW1QeS1EaXNjdXNzaW9uQHB5
dGhvbi5vcmc8L2E+PGJyPjxhIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgaHJlZj0iaHR0cHM6
Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNjdXNzaW9uIiB0YXJn
ZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20v
dXJsP3E9aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNj
dXNzaW9uJmFtcDtzb3VyY2U9Z21haWwmYW1wO3VzdD0xNTQwNzA0NDE0NDkzMDAwJmFtcDt1c2c9
QUZRakNOSFZfY1BfMklsMndqTl9PcnJEQjdEX3hMclpmZyI+aHR0cHM6Ly9tYWlsLnB5dGhvbi5v
cmcvPHdicj5tYWlsbWFuL2xpc3RpbmZvL251bXB5LTx3YnI+ZGlzY3Vzc2lvbjwvYT48L2Jsb2Nr
cXVvdGU+PC9kaXY+LDxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzx3YnI+X19fX19f
X19fX19fX19fX188YnI+TnVtUHktRGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3Q8YnI+PGEgcmVsPSJu
b29wZW5lciBub3JlZmVycmVyIiBocmVmPSJtYWlsdG86TnVtUHktRGlzY3Vzc2lvbkBweXRob24u
b3JnIiB0YXJnZXQ9Il9ibGFuayI+TnVtUHktRGlzY3Vzc2lvbkBweXRob24ub3JnPC9hPjxicj48
YSByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIGhyZWY9Imh0dHBzOi8vbWFpbC5weXRob24ub3Jn
L21haWxtYW4vbGlzdGluZm8vbnVtcHktZGlzY3Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEt
c2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL3VybD9xPWh0dHBzOi8vbWFp
bC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vbnVtcHktZGlzY3Vzc2lvbiZhbXA7c291cmNl
PWdtYWlsJmFtcDt1c3Q9MTU0MDcwNDQxNDQ5MzAwMCZhbXA7dXNnPUFGUWpDTkhWX2NQXzJJbDJ3
ak5fT3JyREI3RF94THJaZmciPmh0dHBzOi8vbWFpbC5weXRob24ub3JnLzx3YnI+bWFpbG1hbi9s
aXN0aW5mby9udW1weS08d2JyPmRpc2N1c3Npb248L2E+PC9wPjwvYmxvY2txdW90ZT5fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJyPgpOdW1QeS1E
aXNjdXNzaW9uIG1haWxpbmcgbGlzdDxicj4KPGEgaHJlZj0ibWFpbHRvOk51bVB5LURpc2N1c3Np
b25AcHl0aG9uLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk51bVB5LURpc2N1c3Npb25AcHl0aG9uLm9y
ZzwvYT48YnI+CjxhIGhyZWY9Imh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGlu
Zm8vbnVtcHktZGlzY3Vzc2lvbiIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayIgZGF0
YS1zYWZlcmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0cHM6Ly9t
YWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNjdXNzaW9uJmFtcDtzb3Vy
Y2U9Z21haWwmYW1wO3VzdD0xNTQwNzA0NDE0NDkzMDAwJmFtcDt1c2c9QUZRakNOSFZfY1BfMkls
MndqTl9PcnJEQjdEX3hMclpmZyI+aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvPHdicj5tYWlsbWFu
L2xpc3RpbmZvL251bXB5LTx3YnI+ZGlzY3Vzc2lvbjwvYT48YnI+CjwvYmxvY2txdW90ZT48L2Rp
dj48L2Rpdj4KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPHdicj5fX19fX19fX19fX19f
X19fXzxicj4KTnVtUHktRGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3Q8YnI+CjxhIGhyZWY9Im1haWx0
bzpOdW1QeS1EaXNjdXNzaW9uQHB5dGhvbi5vcmciIHRhcmdldD0iX2JsYW5rIj5OdW1QeS1EaXNj
dXNzaW9uQHB5dGhvbi5vcmc8L2E+PGJyPgo8YSBocmVmPSJodHRwczovL21haWwucHl0aG9uLm9y
Zy9tYWlsbWFuL2xpc3RpbmZvL251bXB5LWRpc2N1c3Npb24iIHJlbD0ibm9yZWZlcnJlciIgdGFy
Z2V0PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29t
L3VybD9xPWh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vbnVtcHktZGlz
Y3Vzc2lvbiZhbXA7c291cmNlPWdtYWlsJmFtcDt1c3Q9MTU0MDcwNDQxNDQ5MzAwMCZhbXA7dXNn
PUFGUWpDTkhWX2NQXzJJbDJ3ak5fT3JyREI3RF94THJaZmciPmh0dHBzOi8vbWFpbC5weXRob24u
b3JnLzx3YnI+bWFpbG1hbi9saXN0aW5mby9udW1weS08d2JyPmRpc2N1c3Npb248L2E+PGJyPgo8
L2Jsb2NrcXVvdGU+PC9kaXY+" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px"></div></div></div>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div></div></div></div>