<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">All,</p>
<p style="margin:0px 0px 1.2em!important">Sorry for the delay, was on break then adjusting to a new workspace as I expect many of us are.</p>
<p style="margin:0px 0px 1.2em!important">I have attached the prepossessed file you asked for.</p>
<p style="margin:0px 0px 1.2em!important">Balázs was correct about the code triggering the bug.  It is from a project that I wrote/maintain called <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">libpressio</code>.</p>
<p style="margin:0px 0px 1.2em!important">You can also reproduce build with the following script.  The default build features the bug, and it doesn't have any dependencies outside a relatively recent standard library (c++17)<br></p>
<p style="margin:0px 0px 1.2em!important"><strong>First</strong>, remove the reference to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">-clang-analyzer-optin.portability.UnixAPI</code> in the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">.clang-tidy</code> file.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-sh" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%">git clone <a href="https://github.com/robertu94/libpressio">https://github.com/robertu94/libpressio</a>
mkdir build
<span class="hljs-built_in" style="color:rgb(0,134,179)">cd</span> build
cmake .. -DUSE_CLANG_TIDY=ON
<span class="hljs-built_in" style="color:rgb(0,134,179)">cd</span> ..
cmake --build ./build
</code></pre>
<p style="margin:0px 0px 1.2em!important">You can then run clang-tidy for an offending file with:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-sh" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%">clang-tidy -p build ./src/pressio_options.cc
</code></pre>
<p style="margin:0px 0px 1.2em!important">On Mon, Mar 16, 2020 at 3:22 PM Artem Dergachev <a href="http://mailto:noqnoqneo@gmail.com">noqnoqneo@gmail.com</a> wrote:<br>></p>
<blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">Yeah but it doesn’t help much, i’m more interested in intermediate<br>events across the path.</p>
<p style="margin:0px 0px 1.2em!important">On 3/16/20 8:50 PM, Balázs Benics wrote:</p>
<blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">I might be wrong, but probably this is the line which triggered the<br>warning.<br><a href="https://github.com/robertu94/libpressio/blob/master/include/libpressio_ext/cpp/data.h#L247">https://github.com/robertu94/libpressio/blob/master/include/libpressio_ext/cpp/data.h#L247</a></p>
<p style="margin:0px 0px 1.2em!important">On Mon, Mar 16, 2020, 05:35 Artem Dergachev via cfe-dev</p>
<p style="margin:0px 0px 1.2em!important">> wrote:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">It looks like we don't understand that size_in_bytes() always returns
the same value. There may be multiple reasons for this. I'd like
to see
the whole code in order to understand what's going on. Could you
produce
a preprocessed file and attach it together with the analyzer
invocation?

As a workaround / suppression you should be able to do something
like this:

   static void *make_data_ptr(RHS rhs) {
     if (!rhs.has_data())
       return nullptr;

     size_t size = rhs.size_in_bytes();
     return size ? malloc(size) : nullptr;
   }

   Ctor(RHS rhs): data_ptr(make_data_ptr(rhs)) {}

This would prevent the analyzer (and, well, your actual generated
code)
from calling size_in_bytes() twice and believing that it may
return two
different values.

On 2/28/20 5:41 PM, Robert Underwood via cfe-dev wrote:
>
> To whom it may concern,
>
> tl;dr I think I found a bug in the clang static analyzer. Could
> someone please help me find a workaround/where to properly
report the bug?
>
> I have a statement in a class initializer list:
>
> |data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)?
> malloc(rhs.size_in_bytes()) : nullptr)|
>
> rhs.has_data() is a const function that returns t/f if
rhs.data_ptr !=
> null
>
> rhs.size_in_bytes() a const function that returns the number of
bytes
> in the structure *if has_data was true*
>
> i.e. it is possible that rhs.has_data() is false, and
> rhs.size_in_bytes() > 0
>
> However the clang static analyzer seems to get a false positive
here.
>
>
|/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/include/g++-v8/bits/unique_ptr.h:831:34:

> note: Calling copy constructor for 'pressio_data'
> ../include/libpressio_ext/cpp/data.h:247:15: note: Left side of
'&&'
> is true data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)?
> malloc(rhs.size_in_bytes()) : nullptr), ^
> ../include/libpressio_ext/cpp/data.h:247:33: note: Assuming the
> condition is true data_ptr((rhs.has_data() && rhs.size_in_bytes() >
> 0)? malloc(rhs.size_in_bytes()) : nullptr), ^
> ../include/libpressio_ext/cpp/data.h:247:14: note: '?' condition is
> true data_ptr((rhs.has_data() && rhs.size_in_bytes() > 0)?
> malloc(rhs.size_in_bytes()) : nullptr), ^
> ../include/libpressio_ext/cpp/data.h:247:66: note: Calling
> 'pressio_data::size_in_bytes' data_ptr((rhs.has_data() &&
> rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr), ^
> ../include/libpressio_ext/cpp/data.h:384:12: note: Calling
> 'data_size_in_bytes<unsigned long>' return
> data_size_in_bytes(data_dtype, num_dimensions(), dims.data()); ^
> ../include/libpressio_ext/cpp/data.h:31:5: note: Returning zero
return
> data_size_in_elements(dimensions, dims) *
pressio_dtype_size(type); ^
> ../include/libpressio_ext/cpp/data.h:384:12: note: Returning from
> 'data_size_in_bytes<unsigned long>' return
> data_size_in_bytes(data_dtype, num_dimensions(), dims.data()); ^
> ../include/libpressio_ext/cpp/data.h:384:5: note: Returning zero
> return data_size_in_bytes(data_dtype, num_dimensions(),
dims.data());
> ^ ../include/libpressio_ext/cpp/data.h:247:66: note: Returning from
> 'pressio_data::size_in_bytes' data_ptr((rhs.has_data() &&
> rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr), ^
> ../include/libpressio_ext/cpp/data.h:247:59: note: Call to 'malloc'
> has an allocation size of 0 bytes data_ptr((rhs.has_data() &&
> rhs.size_in_bytes() > 0)? malloc(rhs.size_in_bytes()) : nullptr), |
>
> Is there a way to instruct the static analyzer that malloc
cannot be
> called with size_in_bytes == 0 because saying
(rhs.size_in_bytes() >
> 0) isn’t enough. I’m using clang-9.0.1 on gentoo.
>
> Respectfully,
> Robert Underwood
>
>
> _______________________________________________
> cfe-dev mailing list
> <a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a> <mailto:<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>

_______________________________________________
cfe-dev mailing list
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a> <mailto:<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</code></pre></blockquote>
</blockquote>
<div title="MDH:QWxsLDxicj48YnI+PGRpdj5Tb3JyeSBmb3IgdGhlIGRlbGF5LCB3YXMgb24gYnJlYWsgdGhlbiBh
ZGp1c3RpbmcgdG8gYSBuZXcgd29ya3NwYWNlLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBo
YXZlIGF0dGFjaGVkIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB5b3UgYXNrZWQgZm9yLjxicj48L2Rp
dj48YnI+PGJyPjxkaXY+QmFsw6F6cyB3YXMgY29ycmVjdCBhYm91dCB0aGUgY29kZSB0cmlnZ2Vy
aW5nIHRoZSBidWcuICZuYnNwO0l0IGlzIGZyb20gYSBwcm9qZWN0IHRoYXQgSSB3cm90ZS9tYWlu
dGFpbiBjYWxsZWQgYGxpYnByZXNzaW9gLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pllv
dSBjYW4gYWxzbyByZXByb2R1Y2UgYnVpbGQgd2l0aCB0aGUgZm9sbG93aW5nIHNjcmlwdDwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+KipGaXJzdCoqLCByZW1vdmUgdGhlIHJlZmVyZW5jZSB0byBg
LWNsYW5nLWFuYWx5emVyLW9wdGluLnBvcnRhYmlsaXR5LlVuaXhBUElgIGluIHRoZSBgLmNsYW5n
LXRpZHlgIGZpbGUuPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PmBgYHNoPGJyPmdpdCBjbG9uZSBo
dHRwczovL2dpdGh1Yi5jb20vcm9iZXJ0dTk0L2xpYnByZXNzaW88YnI+bWtkaXIgYnVpbGQ8YnI+
Y2QgYnVpbGQ8YnI+PGRpdj5jbWFrZSAuLiAtRFVTRV9DTEFOR19USURZPU9OPC9kaXY+PGRpdj5j
ZCAuLjxicj48L2Rpdj5jbWFrZSAtLWJ1aWxkIC4vYnVpbGQ8YnI+PGRpdj5gYGA8L2Rpdj48ZGl2
Pjxicj48L2Rpdj48ZGl2PllvdSBjYW4gdGhlbiBydW4gY2xhbmctdGlkeSBmb3IgYW4gb2ZmZW5k
aW5nIGZpbGUgd2l0aDo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYHNoPC9kaXY+PGRpdj5j
bGFuZy10aWR5IC1wIGJ1aWxkIC4vc3JjL3ByZXNzaW9fb3B0aW9ucy5jYzwvZGl2PjxkaXY+YGBg
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGJyPk9uIE1vbiwgTWFyIDE2LCAyMDIwIGF0IDM6MjIgUE0g
QXJ0ZW0gRGVyZ2FjaGV2ICZsdDtub3Fub3FuZW9AZ21haWwuY29tJmd0OyB3cm90ZTo8YnI+Jmd0
Ozxicj4mZ3Q7IFllYWggYnV0IGl0IGRvZXNuJ3QgaGVscCBtdWNoLCA8c3BhbiB6ZXVtNGMwPSJQ
Ul82XzAiIGRhdGEtZGRud2FiPSJQUl82XzAiIGRhdGEtd3BrZ3Y9InRydWUiPmknbTwvc3Bhbj4g
bW9yZSBpbnRlcmVzdGVkIGluIGludGVybWVkaWF0ZTxicj4mZ3Q7IGV2ZW50cyBhY3Jvc3MgdGhl
IHBhdGguPGJyPiZndDs8YnI+Jmd0OyBPbiAzLzE2LzIwIDg6NTAgUE0sIEJhbMOhenMgQmVuaWNz
IHdyb3RlOjxicj4mZ3Q7ICZndDsgSSBtaWdodCBiZSB3cm9uZywgYnV0IDxzcGFuIHpldW00YzA9
IlBSXzdfMCIgZGF0YS1kZG53YWI9IlBSXzdfMCIgZGF0YS13cGtndj0idHJ1ZSI+cHJvYmFibHkg
dGhpcyBpczwvc3Bhbj4gdGhlIGxpbmUgd2hpY2ggdHJpZ2dlcmVkIHRoZTxicj4mZ3Q7ICZndDsg
d2FybmluZy48YnI+Jmd0OyAmZ3Q7IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnR1OTQvbGlicHJl
c3Npby9ibG9iL21hc3Rlci9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmgjTDI0Nzxi
cj4mZ3Q7ICZndDs8YnI+Jmd0OyAmZ3Q7PGJyPiZndDsgJmd0OyBPbiBNb24sIE1hciAxNiwgMjAy
MCwgMDU6MzUgQXJ0ZW0gRGVyZ2FjaGV2IHZpYSBjZmUtZGV2PGJyPiZndDsgJmd0OyAmbHQ7Y2Zl
LWRldkBsaXN0cy5sbHZtLm9yZyAmbHQ7bWFpbHRvOmNmZS1kZXZAbGlzdHMubGx2bS5vcmcmZ3Q7
Jmd0OyB3cm90ZTo8YnI+Jmd0OyAmZ3Q7PGJyPiZndDsgJmd0OyDCoCDCoCBJdCBsb29rcyBsaWtl
IHdlIGRvbid0IHVuZGVyc3RhbmQgdGhhdCBzaXplX2luX2J5dGVzKCkgYWx3YXlzIHJldHVybnM8
YnI+Jmd0OyAmZ3Q7IMKgIMKgIHRoZSBzYW1lIHZhbHVlLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUg
cmVhc29ucyBmb3IgdGhpcy4gSSdkIGxpa2U8YnI+Jmd0OyAmZ3Q7IMKgIMKgIHRvIHNlZTxicj4m
Z3Q7ICZndDsgwqAgwqAgdGhlIHdob2xlIGNvZGUgaW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB3aGF0
J3MgZ29pbmcgb24uIENvdWxkIHlvdTxicj4mZ3Q7ICZndDsgwqAgwqAgcHJvZHVjZTxicj4mZ3Q7
ICZndDsgwqAgwqAgYSBwcmVwcm9jZXNzZWQgZmlsZSBhbmQgYXR0YWNoIGl0IHRvZ2V0aGVyIHdp
dGggdGhlIGFuYWx5emVyPGJyPiZndDsgJmd0OyDCoCDCoCBpbnZvY2F0aW9uPzxicj4mZ3Q7ICZn
dDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIEFzIGEgd29ya2Fyb3VuZCAvIHN1cHByZXNzaW9uIHlvdSBz
aG91bGQgYmUgYWJsZSB0byBkbyBzb21ldGhpbmc8YnI+Jmd0OyAmZ3Q7IMKgIMKgIGxpa2UgdGhp
czo8YnI+Jmd0OyAmZ3Q7PGJyPiZndDsgJmd0OyDCoCDCoCDCoCDCoHN0YXRpYyB2b2lkICptYWtl
X2RhdGFfcHRyKFJIUyByaHMpIHs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIMKgIMKgIMKgaWYgKCFyaHMu
aGFzX2RhdGEoKSk8YnI+Jmd0OyAmZ3Q7IMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIG51bGxwdHI7
PGJyPiZndDsgJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgwqAgwqAgwqBzaXplX3Qgc2l6ZSA9IHJo
cy5zaXplX2luX2J5dGVzKCk7PGJyPiZndDsgJmd0OyDCoCDCoCDCoCDCoCDCoHJldHVybiBzaXpl
ID8gbWFsbG9jKHNpemUpIDogbnVsbHB0cjs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIMKgIMKgfTxicj4m
Z3Q7ICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIMKgIMKgQ3RvcihSSFMgcmhzKTogZGF0YV9wdHIo
bWFrZV9kYXRhX3B0cihyaHMpKSB7fTxicj4mZ3Q7ICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIFRo
aXMgd291bGQgcHJldmVudCB0aGUgYW5hbHl6ZXIgKGFuZCwgd2VsbCwgeW91ciBhY3R1YWwgZ2Vu
ZXJhdGVkPGJyPiZndDsgJmd0OyDCoCDCoCBjb2RlKTxicj4mZ3Q7ICZndDsgwqAgwqAgZnJvbSBj
YWxsaW5nIHNpemVfaW5fYnl0ZXMoKSB0d2ljZSBhbmQgYmVsaWV2aW5nIHRoYXQgaXQgbWF5PGJy
PiZndDsgJmd0OyDCoCDCoCByZXR1cm4gdHdvPGJyPiZndDsgJmd0OyDCoCDCoCBkaWZmZXJlbnQg
dmFsdWVzLjxicj4mZ3Q7ICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgIE9uIDIvMjgvMjAgNTo0MSBQ
TSwgUm9iZXJ0IFVuZGVyd29vZCB2aWEgY2ZlLWRldiB3cm90ZTo8YnI+Jmd0OyAmZ3Q7IMKgIMKg
ICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgVG8gd2hvbSBpdCBtYXkgY29uY2Vybiw8YnI+
Jmd0OyAmZ3Q7IMKgIMKgICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgdGw7ZHIgSSB0aGlu
ayBJIGZvdW5kIGEgYnVnIGluIHRoZSBjbGFuZyBzdGF0aWMgYW5hbHl6ZXIuIENvdWxkPGJyPiZn
dDsgJmd0OyDCoCDCoCAmZ3Q7IHNvbWVvbmUgcGxlYXNlIGhlbHAgbWUgZmluZCBhIHdvcmthcm91
bmQvd2hlcmUgdG8gcHJvcGVybHk8YnI+Jmd0OyAmZ3Q7IMKgIMKgIHJlcG9ydCB0aGUgYnVnPzxi
cj4mZ3Q7ICZndDsgwqAgwqAgJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyBJIGhhdmUgYSBz
dGF0ZW1lbnQgaW4gYSBjbGFzcyBpbml0aWFsaXplciBsaXN0Ojxicj4mZ3Q7ICZndDsgwqAgwqAg
Jmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyB8ZGF0YV9wdHIoKHJocy5oYXNfZGF0YSgpICZh
bXA7JmFtcDsgcmhzLnNpemVfaW5fYnl0ZXMoKSAmZ3Q7IDApPzxicj4mZ3Q7ICZndDsgwqAgwqAg
Jmd0OyBtYWxsb2MocmhzLnNpemVfaW5fYnl0ZXMoKSkgOiBudWxscHRyKXw8YnI+Jmd0OyAmZ3Q7
IMKgIMKgICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgcmhzLmhhc19kYXRhKCkgaXMgYSA8
c3BhbiB6ZXVtNGMwPSJQUl84XzAiIGRhdGEtZGRud2FiPSJQUl84XzAiIGRhdGEtd3BrZ3Y9InRy
dWUiPmNvbnN0PC9zcGFuPiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdC9mIGlmPGJyPiZndDsgJmd0
OyDCoCDCoCByaHMuZGF0YV9wdHIgIT08YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgbnVsbDxicj4m
Z3Q7ICZndDsgwqAgwqAgJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyByaHMuc2l6ZV9pbl9i
eXRlcygpIGEgY29uc3QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBudW1iZXIgb2Y8YnI+Jmd0
OyAmZ3Q7IMKgIMKgIGJ5dGVzPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IGluIHRoZSBzdHJ1Y3R1
cmUgKmlmIGhhc19kYXRhIHdhcyB0cnVlKjxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0Ozxicj4mZ3Q7
ICZndDsgwqAgwqAgJmd0OyBpLmUuIGl0IGlzIHBvc3NpYmxlIHRoYXQgcmhzLmhhc19kYXRhKCkg
aXMgZmFsc2UsIGFuZDxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyByaHMuc2l6ZV9pbl9ieXRlcygp
ICZndDsgMDxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyBI
b3dldmVyIHRoZSBjbGFuZyBzdGF0aWMgYW5hbHl6ZXIgc2VlbXMgdG8gZ2V0IGEgZmFsc2UgcG9z
aXRpdmU8YnI+Jmd0OyAmZ3Q7IMKgIMKgIGhlcmUuPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7PGJy
PiZndDsgJmd0OyDCoCDCoCAmZ3Q7PGJyPiZndDsgJmd0OyDCoCDCoCB8L3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvOC4zLjAvaW5jbHVkZS9nKystdjgvYml0cy91bmlxdWVfcHRyLmg6
ODMxOjM0Ojxicj4mZ3Q7ICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgbm90ZTogQ2FsbGlu
ZyBjb3B5IGNvbnN0cnVjdG9yIGZvciAncHJlc3Npb19kYXRhJzxicj4mZ3Q7ICZndDsgwqAgwqAg
Jmd0OyAuLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3OjE1OiBub3RlOiBM
ZWZ0IHNpZGUgb2Y8YnI+Jmd0OyAmZ3Q7IMKgIMKgICcmYW1wOyZhbXA7Jzxicj4mZ3Q7ICZndDsg
wqAgwqAgJmd0OyBpcyB0cnVlIGRhdGFfcHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7IHJo
cy5zaXplX2luX2J5dGVzKCkgJmd0OyAwKT88YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgbWFsbG9j
KHJocy5zaXplX2luX2J5dGVzKCkpIDogbnVsbHB0ciksIF48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZn
dDsgLi4vaW5jbHVkZS9saWJwcmVzc2lvX2V4dC9jcHAvZGF0YS5oOjI0NzozMzogbm90ZTogQXNz
dW1pbmcgdGhlPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IGNvbmRpdGlvbiBpcyB0cnVlIGRhdGFf
cHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7IHJocy5zaXplX2luX2J5dGVzKCkgJmd0Ozxi
cj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyAwKT8gbWFsbG9jKHJocy5zaXplX2luX2J5dGVzKCkpIDog
bnVsbHB0ciksIF48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgLi4vaW5jbHVkZS9saWJwcmVzc2lv
X2V4dC9jcHAvZGF0YS5oOjI0NzoxNDogbm90ZTogJz8nIGNvbmRpdGlvbiBpczxicj4mZ3Q7ICZn
dDsgwqAgwqAgJmd0OyB0cnVlIGRhdGFfcHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7IHJo
cy5zaXplX2luX2J5dGVzKCkgJmd0OyAwKT88YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgbWFsbG9j
KHJocy5zaXplX2luX2J5dGVzKCkpIDogbnVsbHB0ciksIF48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZn
dDsgLi4vaW5jbHVkZS9saWJwcmVzc2lvX2V4dC9jcHAvZGF0YS5oOjI0Nzo2Njogbm90ZTogQ2Fs
bGluZzxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyAncHJlc3Npb19kYXRhOjpzaXplX2luX2J5dGVz
JyBkYXRhX3B0cigocmhzLmhhc19kYXRhKCkgJmFtcDsmYW1wOzxicj4mZ3Q7ICZndDsgwqAgwqAg
Jmd0OyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/IG1hbGxvYyhyaHMuc2l6ZV9pbl9ieXRl
cygpKSA6IG51bGxwdHIpLCBePGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IC4uL2luY2x1ZGUvbGli
cHJlc3Npb19leHQvY3BwL2RhdGEuaDozODQ6MTI6IG5vdGU6IENhbGxpbmc8YnI+Jmd0OyAmZ3Q7
IMKgIMKgICZndDsgJ2RhdGFfc2l6ZV9pbl9ieXRlcyZsdDt1bnNpZ25lZCBsb25nJmd0OycgcmV0
dXJuPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IGRhdGFfc2l6ZV9pbl9ieXRlcyhkYXRhX2R0eXBl
LCBudW1fZGltZW5zaW9ucygpLCBkaW1zLmRhdGEoKSk7IF48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZn
dDsgLi4vaW5jbHVkZS9saWJwcmVzc2lvX2V4dC9jcHAvZGF0YS5oOjMxOjU6IG5vdGU6IFJldHVy
bmluZyB6ZXJvPGJyPiZndDsgJmd0OyDCoCDCoCByZXR1cm48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZn
dDsgZGF0YV9zaXplX2luX2VsZW1lbnRzKGRpbWVuc2lvbnMsIGRpbXMpICo8YnI+Jmd0OyAmZ3Q7
IMKgIMKgIHByZXNzaW9fZHR5cGVfc2l6ZSh0eXBlKTsgXjxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0
OyAuLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6Mzg0OjEyOiBub3RlOiBSZXR1
cm5pbmcgZnJvbTxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyAnZGF0YV9zaXplX2luX2J5dGVzJmx0
O3Vuc2lnbmVkIGxvbmcmZ3Q7JyByZXR1cm48YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgZGF0YV9z
aXplX2luX2J5dGVzKGRhdGFfZHR5cGUsIG51bV9kaW1lbnNpb25zKCksIGRpbXMuZGF0YSgpKTsg
Xjxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyAuLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9k
YXRhLmg6Mzg0OjU6IG5vdGU6IFJldHVybmluZyB6ZXJvPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7
IHJldHVybiBkYXRhX3NpemVfaW5fYnl0ZXMoZGF0YV9kdHlwZSwgbnVtX2RpbWVuc2lvbnMoKSw8
YnI+Jmd0OyAmZ3Q7IMKgIMKgIGRpbXMuZGF0YSgpKTs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsg
XiAuLi9pbmNsdWRlL2xpYnByZXNzaW9fZXh0L2NwcC9kYXRhLmg6MjQ3OjY2OiBub3RlOiBSZXR1
cm5pbmcgZnJvbTxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyAncHJlc3Npb19kYXRhOjpzaXplX2lu
X2J5dGVzJyBkYXRhX3B0cigocmhzLmhhc19kYXRhKCkgJmFtcDsmYW1wOzxicj4mZ3Q7ICZndDsg
wqAgwqAgJmd0OyByaHMuc2l6ZV9pbl9ieXRlcygpICZndDsgMCk/IG1hbGxvYyhyaHMuc2l6ZV9p
bl9ieXRlcygpKSA6IG51bGxwdHIpLCBePGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IC4uL2luY2x1
ZGUvbGlicHJlc3Npb19leHQvY3BwL2RhdGEuaDoyNDc6NTk6IG5vdGU6IENhbGwgdG8gJ21hbGxv
Yyc8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgaGFzIGFuIGFsbG9jYXRpb24gc2l6ZSBvZiAwIGJ5
dGVzIGRhdGFfcHRyKChyaHMuaGFzX2RhdGEoKSAmYW1wOyZhbXA7PGJyPiZndDsgJmd0OyDCoCDC
oCAmZ3Q7IHJocy5zaXplX2luX2J5dGVzKCkgJmd0OyAwKT8gbWFsbG9jKHJocy5zaXplX2luX2J5
dGVzKCkpIDogbnVsbHB0ciksIHw8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDs8YnI+Jmd0OyAmZ3Q7
IMKgIMKgICZndDsgSXMgdGhlcmUgYSB3YXkgdG8gaW5zdHJ1Y3QgdGhlIHN0YXRpYyBhbmFseXpl
ciB0aGF0IG1hbGxvYzxicj4mZ3Q7ICZndDsgwqAgwqAgY2Fubm90IGJlPGJyPiZndDsgJmd0OyDC
oCDCoCAmZ3Q7IGNhbGxlZCB3aXRoIHNpemVfaW5fYnl0ZXMgPT0gMCBiZWNhdXNlIHNheWluZzxi
cj4mZ3Q7ICZndDsgwqAgwqAgKHJocy5zaXplX2luX2J5dGVzKCkgJmd0Ozxicj4mZ3Q7ICZndDsg
wqAgwqAgJmd0OyAwKSBpc27igJl0IGVub3VnaC4gSeKAmW0gdXNpbmcgY2xhbmctOS4wLjEgb24g
Z2VudG9vLjxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgJmd0OyBS
ZXNwZWN0ZnVsbHksPGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IFJvYmVydCBVbmRlcndvb2Q8YnI+
Jmd0OyAmZ3Q7IMKgIMKgICZndDs8YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDs8YnI+Jmd0OyAmZ3Q7
IMKgIMKgICZndDsgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X188YnI+Jmd0OyAmZ3Q7IMKgIMKgICZndDsgY2ZlLWRldiBtYWlsaW5nIGxpc3Q8YnI+Jmd0OyAm
Z3Q7IMKgIMKgICZndDsgY2ZlLWRldkBsaXN0cy5sbHZtLm9yZyAmbHQ7bWFpbHRvOmNmZS1kZXZA
bGlzdHMubGx2bS5vcmcmZ3Q7PGJyPiZndDsgJmd0OyDCoCDCoCAmZ3Q7IGh0dHBzOi8vbGlzdHMu
bGx2bS5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL2NmZS1kZXY8YnI+Jmd0OyAmZ3Q7PGJy
PiZndDsgJmd0OyDCoCDCoCBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXzxicj4mZ3Q7ICZndDsgwqAgwqAgY2ZlLWRldiBtYWlsaW5nIGxpc3Q8YnI+Jmd0OyAm
Z3Q7IMKgIMKgIGNmZS1kZXZAbGlzdHMubGx2bS5vcmcgJmx0O21haWx0bzpjZmUtZGV2QGxpc3Rz
Lmxsdm0ub3JnJmd0Ozxicj4mZ3Q7ICZndDsgwqAgwqAgaHR0cHM6Ly9saXN0cy5sbHZtLm9yZy9j
Z2ktYmluL21haWxtYW4vbGlzdGluZm8vY2ZlLWRldjxicj4mZ3Q7ICZndDs8YnI+Jmd0Ozxicj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>