<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="" markdown-here-wrapper-content-modified="true">
      <p style="margin: 0px 0px 1.2em !important;">Hi Johannes,<br>
        without knowing more high-level information on what the usage
        patterns for the methods in your code is it’s hard for me to
        provide guidance, or to try and explain why heap allocation is
        more pronounced than before. I will try nevertheless :-)<br>
      </p>
      <p style="margin: 0px 0px 1.2em !important;">Eyeballing your code,
        I only see three places where segments are created:</p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">KeyValueLeafPage constructor
          (because of allocate)</li>
        <li style="margin: 0.5em 0px;">resize (because of allocate)</li>
        <li style="margin: 0.5em 0px;">setSlot (because of
          MemorySegment::ofArray)</li>
        <li style="margin: 0.5em 0px;">setDeweyId (because of
          MemorySegment::ofArray)</li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">So, it doesn’t seem
        like you are creating tons of heap objects. But all the setXYZ
        methods seem to create new heap objects (a new memory segment)
        while before you just stored the incoming byte array into some
        field of the class. So, if your application is sensitive to that
        kind of thing (e.g. these set methods are called a lot), that
        could explain the increase in heap pressure.</p>
      <p style="margin: 0px 0px 1.2em !important;">In general, looking
        at the before/after code, there is now more code in the set/get
        code path - as you have to go from byte[] to segment and then
        back. If your public-facing API is taking byte[], you might not
        have many other options than to change your internal
        representation to match that.</p>
      <p style="margin: 0px 0px 1.2em !important;">(in saying that, I’d
        note that the “before” implementation doesn’t perform defensive
        copies of the incoming byte arrays, and that might also affect
        performance).</p>
      <p style="margin: 0px 0px 1.2em !important;">Another reason where
        performance might be lost is in the resize method. Every now and
        then, when you call setdata, the memory segment might not be big
        enough, so the code allocates a new one, and copies all the data
        over. This is not going to be fast (even igoring the heap
        pressure problem, even though the two could be related).</p>
      <p style="margin: 0px 0px 1.2em !important;">The reality here is
        that it is going to be hard to match the performance of
        somtething like this:</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;">  public void setSlot(byte[] recordData, int offset) {
    slots[offset] = recordData;
  }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">There’s no moving of
        the data off-heap, no need for resizing ever, and this sets you
        up for avoiding deserialiation altogether:</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;">  public byte[] getSlot(int slotNumber) {
    return slots[slotNumber];
  }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">Anything you change
        here is added cost. Memory segment is the tip of the iceberg
        here, I think (you’d face exactly the same problems trying to
        use ByteBuffer, or any other such API).</p>
      <p style="margin: 0px 0px 1.2em !important;">Something that would
        be more “apple to apple” would be if you could avoid resizing -
        after all in the old code you always allocate a number of
        slots/records/deweyIds equal to some known constant
        (Constants.NDP_NODE_COUNT). Maybe this constant is super high
        (seems 1024), so you cannot afford to have the equivalent bytes
        to be pre-allocated when you allocate a page (but that’s another
        “shortcut” you can take because you’re exploiting an on-heap
        representation). But even if you pre-allocated big-enough
        segments, you’d still have to convert the input data into a
        segment, and then extracting the output data into a byte array
        (instead of simply setting a pointer/getting a pointer - another
        on-heap-oriented assumption).</p>
      <p style="margin: 0px 0px 1.2em !important;">To sum up, I think in
        order for the switch to off-heap/segments to be beneficial there
        has to be some use case you want to address that cannot be
        addressed in the current setup. Your setup is currently highly
        optimized under the assumption that data lives on-heap (and that
        you don’t care too much about data being manipulated via the
        array instances being fed to the API <em>after</em> said arrays
        have been stored in the page). If those assumptions work well
        for you, given they also provide best possible performance, why
        to change? Of course, if you want to pass the page data to some
        native function you will run into a road-block, as now you will
        have to collect all your page data by chasing pointers and
        copying it in some contiguous memory region. But if you don’t
        need that, why bother? Sometimes the simplest design is also the
        best. That’s not to say that there aren’t way to perhaps use
        memory segments more effectively to do what you want to do. For
        instance, if you "squint" your old code is really creating a
        page with a fixed size of (Constants.NDP_NODE_COUNT) data
        pointers. So, you could create a page with an array of N memory
        segments, to be filled later. Each page will be associated with
        an _arena_ so that all the segment data you create will
        effectively share the same lifetime. This will allow you to
        avoid resizing, while still only "allocating as you need". But
        you will need to copy data in/out of heap, so this will add
        serialization cost compared to your original solution.<br>
      </p>
      <p style="margin: 0px 0px 1.2em !important;">Just trying to be
        honest here, and set the right expectations. Going off-heap is
        not a “make me go fast” kind of toggle. It often requires
        compromises, to make the Java and the off-heap side of the world
        “align” somehow.</p>
      <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;">On 14/09/2024 15:17,
        Johannes Lichtenberger wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:CAGXNUvbJ8izsd+kOm4y1_yPigf0fX0-nuJLnc757m3fC=OLrgg@mail.gmail.com">
          
          <div dir="auto">
            <div dir="auto"><span style="font-size:12.8px">Hello,</span>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">I'm currently
                refactoring my little database project in my spare time
                from using a very simple byte[][] slots array of
                byte-arrays to a single MemorySegment (or two depending
                on if DeweyIDs are stored or not (usually not)):</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">from</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto"><a href="https://github.com/sirixdb/sirix/blob/main/bundles/sirix-core/src/main/java/io/sirix/page/KeyValueLeafPage.java" style="text-decoration-line:none;color:rgb(66,133,244)" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/sirixdb/sirix/blob/main/bundles/sirix-core/src/main/java/io/sirix/page/KeyValueLeafPage.java</a><br>
              </div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">to</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto"><a href="https://github.com/sirixdb/sirix/blob/1aaafd13693c0cf7e073d400766525eed7a24ad6/bundles/sirix-core/src/main/java/io/sirix/page/KeyValueLeafPage.java" style="text-decoration-line:none;color:rgb(66,133,244)" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/sirixdb/sirix/blob/1aaafd13693c0cf7e073d400766525eed7a24ad6/bundles/sirix-core/src/main/java/io/sirix/page/KeyValueLeafPage.java</a><br>
              </div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">However, now I
                had to introduce reference counting / pinning/unpinning
                of the pages, and they have to be closed, for instance,
                once they are evicted from cache(s).</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">Implementing a
                "real" slotted page with shifting and resizing... has
                gotten much more complicated. Furthermore (besides that,
                pinning/unpinning and deterministic closing is tricky
                ;-)) I'm also facing much worse GC performance
                (attached).</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">Of course, I'm in
                the middle of refactoring, and I'd give the
                nodes/records in the page a slice from the MemorySegment
                of the page. Currently, I have to convert back and forth
                for serialization/deserialization from byte-arrays to
                MemorySegments, then copying these to the page
                MemorySegment... which is currently one issue, but I'm
                not sure if that's all.</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">All in all I'm
                not sure if there's other stuff I'm missing because I'm
                now using `Arena.ofShared()` and I think this stuff is a
                bit strange:<br>
                <br>
                [3,127s][info   ][gc      ] GC(7) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                645M->455M(5124M) 9,563ms<br>
                [3,253s][info   ][gc      ] GC(8) Pause Young (Normal)
                (G1 Evacuation Pause) 783M->460M(5124M) 4,580ms<br>
                [5,094s][info   ][gc      ] GC(9) Pause Young (Normal)
                (G1 Evacuation Pause) 3524M->897M(5124M) 40,103ms<br>
                [5,200s][info   ][gc      ] GC(10) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                1381M->947M(5124M) 29,005ms<br>
                [5,696s][info   ][gc      ] GC(11) Pause Young (Normal)
                (G1 Evacuation Pause) 1499M->1191M(5124M) 25,405ms<br>
                [5,942s][info   ][gc      ] GC(12) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                1647M->1379M(5124M) 22,006ms<br>
                [5,979s][info   ][gc      ] GC(13) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                1899M->1411M(5124M) 7,634ms<br>
                [6,628s][info   ][gc      ] GC(14) Pause Young (Normal)
                (G1 Evacuation Pause) 2243M->1801M(5124M) 36,093ms<br>
                [6,725s][info   ][gc      ] GC(15) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                2469M->1873M(5124M) 13,836ms<br>
                [7,436s][info   ][gc      ] GC(16) Pause Young (Normal)
                (G1 Evacuation Pause) 2857M->2283M(5740M) 64,219ms<br>
                [7,525s][info   ][gc      ] GC(17) Pause Young (Normal)
                (G1 Evacuation Pause) (Evacuation Failure: Pinned)
                3115M->2343M(5740M) 14,110ms<br>
                [8,274s][info   ][gc      ] GC(18) Pause Young (Normal)
                (G1 Evacuation Pause) 3659M->2783M(5740M) 42,159ms<br>
                [9,011s][info   ][gc      ] GC(19) Pause Young
                (Concurrent Start) (G1 Evacuation Pause) (Evacuation
                Failure: Pinned) 4027M->3239M(5740M) 51,686ms<br>
                [9,011s][info   ][gc      ] GC(20) Concurrent Mark Cycle<br>
                [9,165s][info   ][gc      ] GC(20) Pause Remark
                4171M->2535M(5360M) 3,315ms<br>
                [9,446s][info   ][gc      ] GC(20) Pause Cleanup
                2759M->2759M(5360M) 0,253ms<br>
                [9,448s][info   ][gc      ] GC(20) Concurrent Mark Cycle
                436,601ms<br>
                [9,500s][info   ][gc      ] GC(21) Pause Young (Prepare
                Mixed) (G1 Evacuation Pause) 2783M->1789M(5360M)
                30,267ms<br>
                [10,575s][info   ][gc      ] GC(22) Pause Young (Mixed)
                (G1 Evacuation Pause) 3745M->2419M(5360M) 73,025ms<br>
                [11,266s][info   ][gc      ] GC(23) Pause Young (Normal)
                (G1 Evacuation Pause) 3987M->2829M(5360M) 55,028ms<br>
                [11,762s][info   ][gc      ] GC(24) Pause Young
                (Concurrent Start) (G1 Evacuation Pause)
                4149M->3051M(6012M) 65,550ms<br>
                [11,762s][info   ][gc      ] GC(25) Concurrent Mark
                Cycle<br>
                [11,869s][info   ][gc      ] GC(25) Pause Remark
                3143M->1393M(5120M) 4,415ms<br>
                [12,076s][info   ][gc      ] GC(25) Pause Cleanup
                1593M->1593M(5120M) 0,240ms<br>
                [12,078s][info   ][gc      ] GC(25) Concurrent Mark
                Cycle 316,410ms<br>
                <br>
                I've rarely had these "Evacuation Failure: Pinned" log
                entries regarding the current "master" branch on Github,
                but now it's even worse. Plus, I think I'm still missing
                to close/clear pages in all cases (to close the arenas),
                which turned out to be tricky. I'm also storing the two
                most recently accessed pages in fields; sometimes, they
                are not read/put into a cache; there are page
                "fragments" that must be recombined for a full page...</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">So maybe you know
                why the GC is much worse now (I guess even if I fail to
                close a page, I'd get an OutOfMemoryError or something
                like that, as the segments are off-heap (despite my
                array-based memory segments (ofArray), which may be a
                problem, hmm).</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">All in all I
                faced a much worse performance with N-read only trxs
                traversing a large file in parallel, likely due to
                ~2,7Gb object allocation rate for a single trx already
                (and maybe not that much read from the page caches),
                that's why I thought I'd have to try the single
                MemorySegment approach for each page.</div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">
                <div dir="auto" style="font-size:large">
                  <div dir="auto" style="color:rgb(136,136,136);font-size:12.8px">
                    <div dir="auto">The G1 log:</div>
                  </div>
                </div>
                <div dir="auto" style="font-size:large"><br>
                </div>
                <span style="font-size:large"><a href="https://raw.githubusercontent.com/sirixdb/sirix/main/g1.log.4" moz-do-not-send="true" class="moz-txt-link-freetext">https://raw.githubusercontent.com/sirixdb/sirix/main/g1.log.4</a></span><br>
              </div>
              <div style="font-size:12.8px" dir="auto"><br>
              </div>
              <div style="font-size:12.8px" dir="auto">kind regards</div>
              <div style="color:rgb(136,136,136);font-size:12.8px" dir="auto">
                <div>Johannes</div>
                <div dir="auto"><br>
                </div>
                <div dir="auto"><br>
                </div>
              </div>
            </div>
          </div>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div title="MDH:PHA+SGkgSm9oYW5uZXMsPGJyPndpdGhvdXQga25vd2luZyBtb3JlIGhpZ2gtbGV2ZWwgaW5mb3Jt
YXRpb24gb24gaG93IHlvdXIgYXBwbGljYXRpb24gd29ya3MgaXQncyBoYXJkIGZvciBtZSB0byBw
cm92aWRlIGd1aWRhbmNlLCBvciB0byB0cnkgYW5kIGV4cGxhaW4gd2h5IGhlYXAgYWxsb2NhdGlv
biBpcyBtb3JlIHByb25vdW5jZWQgdGhhbiBiZWZvcmUuPC9wPjxwPkV5ZWJhbGxpbmcgeW91ciBj
b2RlLCBJIG9ubHkgc2VlIHRocmVlIHBsYWNlcyB3aGVyZSBzZWdtZW50cyBhcmUgY3JlYXRlZDo8
L3A+PHA+KiBLZXlWYWx1ZUxlYWZQYWdlIGNvbnN0cnVjdG9yIChiZWNhdXNlIG9mIGFsbG9jYXRl
KTxicj4qIHJlc2l6ZSAoYmVjYXVzZSBvZiBhbGxvY2F0ZSk8YnI+KiBzZXRTbG90IChiZWNhdXNl
IG9mIE1lbW9yeVNlZ21lbnQ6Om9mQXJyYXkpPGJyPiogc2V0RGV3ZXlJZCAoYmVjYXVzZSBvZiBN
ZW1vcnlTZWdtZW50OjpvZkFycmF5KTwvcD48cD5TbywgaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91
IGFyZSBjcmVhdGluZyB0b25zIG9mIGhlYXAgb2JqZWN0cy4gQnV0IGFsbCB0aGUgc2V0WFlaIG1l
dGhvZHMgc2VlbSB0byBjcmVhdGUgbmV3IGhlYXAgb2JqZWN0cyAoYSBuZXcgbWVtb3J5IHNlZ21l
bnQpIHdoaWxlIGJlZm9yZSB5b3UganVzdCBzdG9yZWQgdGhlIGluY29taW5nIGJ5dGUgYXJyYXkg
aW50byBzb21lIGZpZWxkIG9mIHRoZSBjbGFzcy4gU28sIGlmIHlvdXIgYXBwbGljYXRpb24gaXMg
c2Vuc2l0aXZlIHRvIHRoYXQga2luZCBvZiB0aGluZyAoZS5nLiB0aGVzZSBzZXQgbWV0aG9kcyBh
cmUgY2FsbGVkIGEgbG90KSwgdGhhdCBjb3VsZCBleHBsYWluIHRoZSBpbmNyZWFzZSBpbiBoZWFw
IHByZXNzdXJlLjwvcD48cD5JbiBnZW5lcmFsLCBsb29raW5nIGF0IHRoZSBiZWZvcmUvYWZ0ZXIg
Y29kZSwgdGhlcmUgaXMgbm93IG1vcmUgY29kZSBpbiB0aGUgc2V0L2dldCBjb2RlIHBhdGggLSBh
cyB5b3UgaGF2ZSB0byBnbyBmcm9tIGJ5dGVbXSB0byBzZWdtZW50IGFuZCB0aGVuIGJhY2suIElm
IHlvdXIgcHVibGljLWZhY2luZyBBUEkgaXMgdGFraW5nIGJ5dGVbXSwgeW91IG1pZ2h0IG5vdCBo
YXZlIG1hbnkgb3RoZXIgb3B0aW9ucyB0aGFuIHRvIGNoYW5nZSB5b3VyIGludGVybmFsIHJlcHJl
c2VudGF0aW9uIHRvIG1hdGNoIHRoYXQuPC9wPjxwPihpbiBzYXlpbmcgdGhhdCwgSSdkIG5vdGUg
dGhhdCB0aGUgImJlZm9yZSIgaW1wbGVtZW50YXRpb24gZG9lc24ndCBwZXJmb3JtIGRlZmVuc2l2
ZSBjb3BpZXMgb2YgdGhlIGluY29taW5nIGJ5dGUgYXJyYXlzLCBhbmQgdGhhdCBtaWdodCBhbHNv
IGFmZmVjdCBwZXJmb3JtYW5jZSkuPC9wPjxwPkFub3RoZXIgcmVhc29uIHdoZXJlIHBlcmZvcm1h
bmNlIG1pZ2h0IGJlIGxvc3QgaXMgaW4gdGhlIHJlc2l6ZSBtZXRob2QuIEV2ZXJ5IG5vdyBhbmQg
dGhlbiwgd2hlbiB5b3UgY2FsbCBzZXRkYXRhLCB0aGUgbWVtb3J5IHNlZ21lbnQgbWlnaHQgbm90
IGJlIGJpZyBlbm91Z2gsIHNvIHRoZSBjb2RlIGFsbG9jYXRlcyBhIG5ldyBvbmUsIGFuZCBjb3Bp
ZXMgYWxsIHRoZSBkYXRhIG92ZXIuIFRoaXMgaXMgbm90IGdvaW5nIHRvIGJlIGZhc3QgKGV2ZW4g
aWdvcmluZyB0aGUgaGVhcCBwcmVzc3VyZSBwcm9ibGVtLCBldmVuIHRob3VnaCB0aGUgdHdvIGNv
dWxkIGJlIHJlbGF0ZWQpLjwvcD48cD5UaGUgcmVhbGl0eSBoZXJlIGlzIHRoYXQgaXQgaXMgZ29p
bmcgdG8gYmUgaGFyZCB0byBtYXRjaCB0aGUgcGVyZm9ybWFuY2Ugb2Ygc29tdGV0aGluZyBsaWtl
IHRoaXM6PC9wPjxwPmBgYDxicj4mbmJzcDsgcHVibGljIHZvaWQgc2V0U2xvdChieXRlW10gcmVj
b3JkRGF0YSwgaW50IG9mZnNldCkgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc2xvdHNbb2Zmc2V0
XSA9IHJlY29yZERhdGE7PGJyPiZuYnNwOyB9PGJyPmBgYDwvcD48cD5UaGVyZSdzIG5vIG1vdmlu
ZyBvZiB0aGUgZGF0YSBvZmYtaGVhcCwgbm8gbmVlZCBmb3IgcmVzaXppbmcgZXZlciwgYW5kIHRo
aXMgc2V0cyB5b3UgdXAgZm9yIGF2b2lkaW5nIGRlc2VyaWFsaWF0aW9uIGFsdG9nZXRoZXI6PC9w
PjxwPmBgYDxicj4mbmJzcDsgcHVibGljIGJ5dGVbXSBnZXRTbG90KGludCBzbG90TnVtYmVyKSB7
PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gc2xvdHNbc2xvdE51bWJlcl07PGJyPiZuYnNw
OyB9PGJyPmBgYDxicj48L3A+PHA+QW55dGhpbmcgeW91IGNoYW5nZSBoZXJlIGlzIGFkZGVkIGNv
c3QuIE1lbW9yeSBzZWdtZW50IGlzIHRoZSB0aXAgb2YgdGhlIGljZWJlcmcgaGVyZSwgSSB0aGlu
ayAoeW91J2QgZmFjZSBleGFjdGx5IHRoZSBzYW1lIHByb2JsZW1zIHRyeWluZyB0byB1c2UgQnl0
ZUJ1ZmZlciwgb3IgYW55IG90aGVyIHN1Y2ggQVBJKS48YnI+PC9wPjxwPlNvbWV0aGluZyB0aGF0
IHdvdWxkIGJlIG1vcmUgImFwcGxlIHRvIGFwcGxlIiB3b3VsZCBiZSBpZiB5b3UgY291bGQgYXZv
aWQgcmVzaXppbmcgLSBhZnRlciBhbGwgaW4gdGhlIG9sZCBjb2RlIHlvdSBhbHdheXMgYWxsb2Nh
dGUgYSBudW1iZXIgb2Ygc2xvdHMvcmVjb3Jkcy9kZXdleUlkcyBlcXVhbCB0byBzb21lIGtub3du
IGNvbnN0YW50IChDb25zdGFudHMuTkRQX05PREVfQ09VTlQpLiBNYXliZSB0aGlzIGNvbnN0YW50
IGlzIHN1cGVyIGhpZ2ggKHNlZW1zIDEwMjQpLCBzbyB5b3UgY2Fubm90IGFmZm9yZCB0byBoYXZl
IHRoZSBlcXVpdmFsZW50IGJ5dGVzIHRvIGJlIHByZS1hbGxvY2F0ZWQgd2hlbiB5b3UgYWxsb2Nh
dGUgYSBwYWdlIChidXQgdGhhdCdzIGFub3RoZXIgInNob3J0Y3V0IiB5b3UgY2FuIHRha2UgYmVj
YXVzZSB5b3UncmUgZXhwbG9pdGluZyBhbiBvbi1oZWFwIHJlcHJlc2VudGF0aW9uKS4gQnV0IGV2
ZW4gaWYgeW91IHByZS1hbGxvY2F0ZWQgYmlnLWVub3VnaCBzZWdtZW50cywgeW91J2Qgc3RpbGwg
aGF2ZSB0byBjb252ZXJ0IHRoZSBpbnB1dCBkYXRhIGludG8gYSBzZWdtZW50LCBhbmQgdGhlbiBl
eHRyYWN0aW5nIHRoZSBvdXRwdXQgZGF0YSBpbnRvIGEgYnl0ZSBhcnJheSAoaW5zdGVhZCBvZiBz
aW1wbHkgc2V0dGluZyBhIHBvaW50ZXIvZ2V0dGluZyBhIHBvaW50ZXIgLSBhbm90aGVyIG9uLWhl
YXAtb3JpZW50ZWQgYXNzdW1wdGlvbikuPC9wPjxwPlRvIHN1bSB1cCwgSSB0aGluayBpbiBvcmRl
ciBmb3IgdGhlIHN3aXRjaCB0byBvZmYtaGVhcC9zZWdtZW50cyB0byBiZSBiZW5lZmljaWFsIHRo
ZXJlIGhhcyB0byBiZSBzb21lIHVzZSBjYXNlIHlvdSB3YW50IHRvIGFkZHJlc3MgdGhhdCBjYW5u
b3QgYmUgYWRkcmVzc2VkIGluIHRoZSBjdXJyZW50IHNldHVwLiBZb3VyIHNldHVwIGlzIGN1cnJl
bnRseSBoaWdobHkgb3B0aW1pemVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgZGF0YSBsaXZl
cyBvbi1oZWFwIChhbmQgdGhhdCB5b3UgZG9uJ3QgY2FyZSB0b28gbXVjaCBhYm91dCBkYXRhIGJl
aW5nIG1hbmlwdWxhdGVkIHZpYSB0aGUgYXJyYXkgaW5zdGFuY2VzIGJlaW5nIGZlZCB0byB0aGUg
QVBJIF9hZnRlcl8gc2FpZCBhcnJheXMgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgcGFnZSkuIElm
IHRob3NlIGFzc3VtcHRpb25zIHdvcmsgd2VsbCBmb3IgeW91LCBnaXZlbiB0aGV5IGFsc28gcHJv
dmlkZSBiZXN0IHBvc3NpYmxlIHBlcmZvcm1hbmNlLCB3aHkgdG8gY2hhbmdlPyBPZiBjb3Vyc2Us
IGlmIHlvdSB3YW50IHRvIHBhc3MgdGhlIHBhZ2UgZGF0YSB0byBzb21lIG5hdGl2ZSBmdW5jdGlv
biB5b3Ugd2lsbCBydW4gaW50byBhIHJvYWQtYmxvY2ssIGFzIG5vdyB5b3Ugd2lsbCBoYXZlIHRv
IGNvbGxlY3QgYWxsIHlvdXIgcGFnZSBkYXRhIGJ5IGNoYXNpbmcgcG9pbnRlcnMgYW5kIGNvcHlp
bmcgaXQgaW4gc29tZSBjb250aWd1b3VzIG1lbW9yeSByZWdpb24uIEJ1dCBpZiB5b3UgZG9uJ3Qg
bmVlZCB0aGF0LCB3aHkgYm90aGVyPyBTb21ldGltZXMgdGhlIHNpbXBsZXN0IGRlc2lnbiBpcyBh
bHNvIHRoZSBiZXN0LiBUaGF0J3Mgbm90IHRvIHNheSB0aGF0IHRoZXJlIGFyZW4ndCB3YXkgdG8g
cGVyaGFwcyB1c2UgbWVtb3J5IHNlZ21lbnRzIG1vcmUgZWZmZWN0aXZlbHkgdG8gZG8gd2hhdCB5
b3Ugd2FudCB0byBkbyAoZS5nLiBtYXliZSBwcmUtcmVzZXJ2ZSBhIGJpZ2dpZSBjaHVuayBvZiBt
ZW1vcnksIGJ1dCBvbmx5ICJjb21taXQiIGl0IG9uZSBwYWdlIGF0IGEgdGltZSwgYXMgbmVlZGVk
KSAtIGJ1dCB0aGVzZSB3b24ndCBtYWtlIHlvdXIgY29kZSBhbnkgc2ltcGxlciB0byByZWFkIChh
bmQgd2lsbCBzdGlsbCBwcm9iYWJseSBiZSBzbG93ZXIgdGhhbiB3aGF0IHlvdSBoYXZlKS48L3A+
PHA+SnVzdCB0cnlpbmcgdG8gYmUgaG9uZXN0IGhlcmUsIGFuZCBzZXQgdGhlIHJpZ2h0IGV4cGVj
dGF0aW9ucy4gR29pbmcgb2ZmLWhlYXAgaXMgbm90IGEgIm1ha2UgbWUgZ28gZmFzdCIga2luZCBv
ZiB0b2dnbGUuIEl0IG9mdGVuIHJlcXVpcmVzIGNvbXByb21pc2VzLCB0byBtYWtlIHRoZSBKYXZh
IGFuZCB0aGUgb2ZmLWhlYXAgc2lkZSBvZiB0aGUgd29ybGQgImFsaWduIiBzb21laG93Ljxicj48
L3A+PHA+TWF1cml6aW88YnI+PC9wPjxkaXYgY2xhc3M9Im1vei1jaXRlLXByZWZpeCI+T24gMTQv
MDkvMjAyNCAxNToxNywgSm9oYW5uZXMgTGljaHRlbmJlcmdlciB3cm90ZTo8YnI+PC9kaXY+PGJs
b2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkNBR1hOVXZiSjhpenNkK2tPbTR5MV95UGln
ZjBmWDAtbnVKTG5jNzU3bTNmQz1PTHJnZ0BtYWlsLmdtYWlsLmNvbSI+PG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+PGRpdiBkaXI9ImF1dG8iPjxk
aXYgZGlyPSJhdXRvIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjhweCI+SGVsbG8sPC9zcGFu
PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYg
c3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+SSdtIGN1cnJlbnRseSByZWZhY3Rv
cmluZyBteSBsaXR0bGUgZGF0YWJhc2UgcHJvamVjdCBpbiBteSBzcGFyZSB0aW1lIGZyb20gdXNp
bmcgYSB2ZXJ5IHNpbXBsZSBieXRlW11bXSBzbG90cyBhcnJheSBvZiBieXRlLWFycmF5cyB0byBh
IHNpbmdsZSBNZW1vcnlTZWdtZW50IChvciB0d28gZGVwZW5kaW5nIG9uIGlmIERld2V5SURzIGFy
ZSBzdG9yZWQgb3Igbm90ICh1c3VhbGx5IG5vdCkpOjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6
ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44
cHgiIGRpcj0iYXV0byI+ZnJvbTwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRp
cj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0
byI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Npcml4ZGIvc2lyaXgvYmxvYi9tYWluL2J1
bmRsZXMvc2lyaXgtY29yZS9zcmMvbWFpbi9qYXZhL2lvL3Npcml4L3BhZ2UvS2V5VmFsdWVMZWFm
UGFnZS5qYXZhIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTtjb2xvcjpyZ2IoNjYs
MTMzLDI0NCkiIG1vei1kby1ub3Qtc2VuZD0idHJ1ZSIgY2xhc3M9Im1vei10eHQtbGluay1mcmVl
dGV4dCI+aHR0cHM6Ly9naXRodWIuY29tL3Npcml4ZGIvc2lyaXgvYmxvYi9tYWluL2J1bmRsZXMv
c2lyaXgtY29yZS9zcmMvbWFpbi9qYXZhL2lvL3Npcml4L3BhZ2UvS2V5VmFsdWVMZWFmUGFnZS5q
YXZhPC9hPjxicj48L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTIuOHB4IiBkaXI9ImF1dG8i
Pjxicj48L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTIuOHB4IiBkaXI9ImF1dG8iPnRvPC9k
aXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEyLjhweCIgZGlyPSJhdXRvIj48YnI+PC9kaXY+PGRp
diBzdHlsZT0iZm9udC1zaXplOjEyLjhweCIgZGlyPSJhdXRvIj48YSBocmVmPSJodHRwczovL2dp
dGh1Yi5jb20vc2lyaXhkYi9zaXJpeC9ibG9iLzFhYWFmZDEzNjkzYzBjZjdlMDczZDQwMDc2NjUy
NWVlZDdhMjRhZDYvYnVuZGxlcy9zaXJpeC1jb3JlL3NyYy9tYWluL2phdmEvaW8vc2lyaXgvcGFn
ZS9LZXlWYWx1ZUxlYWZQYWdlLmphdmEiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb24tbGluZTpub25l
O2NvbG9yOnJnYig2NiwxMzMsMjQ0KSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBjbGFzcz0ibW96
LXR4dC1saW5rLWZyZWV0ZXh0Ij5odHRwczovL2dpdGh1Yi5jb20vc2lyaXhkYi9zaXJpeC9ibG9i
LzFhYWFmZDEzNjkzYzBjZjdlMDczZDQwMDc2NjUyNWVlZDdhMjRhZDYvYnVuZGxlcy9zaXJpeC1j
b3JlL3NyYy9tYWluL2phdmEvaW8vc2lyaXgvcGFnZS9LZXlWYWx1ZUxlYWZQYWdlLmphdmE8L2E+
PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwv
ZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+SG93ZXZlciwgbm93
IEkgaGFkIHRvIGludHJvZHVjZSByZWZlcmVuY2UgY291bnRpbmcgLyBwaW5uaW5nL3VucGlubmlu
ZyBvZiB0aGUgcGFnZXMsIGFuZCB0aGV5IGhhdmUgdG8gYmUgY2xvc2VkLCBmb3IgaW5zdGFuY2Us
IG9uY2UgdGhleSBhcmUgZXZpY3RlZCBmcm9tIGNhY2hlKHMpLjwvZGl2PjxkaXYgc3R5bGU9ImZv
bnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6
ZToxMi44cHgiIGRpcj0iYXV0byI+SW1wbGVtZW50aW5nIGEgInJlYWwiIHNsb3R0ZWQgcGFnZSB3
aXRoIHNoaWZ0aW5nIGFuZCByZXNpemluZy4uLiBoYXMgZ290dGVuIG11Y2ggbW9yZSBjb21wbGlj
YXRlZC4gRnVydGhlcm1vcmUgKGJlc2lkZXMgdGhhdCwgcGlubmluZy91bnBpbm5pbmcgYW5kIGRl
dGVybWluaXN0aWMgY2xvc2luZyBpcyB0cmlja3kgOy0pKSBJJ20gYWxzbyBmYWNpbmcgbXVjaCB3
b3JzZSBHQyBwZXJmb3JtYW5jZSAoYXR0YWNoZWQpLjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6
ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44
cHgiIGRpcj0iYXV0byI+T2YgY291cnNlLCBJJ20gaW4gdGhlIG1pZGRsZSBvZiByZWZhY3Rvcmlu
ZywgYW5kIEknZCBnaXZlIHRoZSBub2Rlcy9yZWNvcmRzIGluIHRoZSBwYWdlIGEgc2xpY2UgZnJv
bSB0aGUgTWVtb3J5U2VnbWVudCBvZiB0aGUgcGFnZS4gQ3VycmVudGx5LCBJIGhhdmUgdG8gY29u
dmVydCBiYWNrIGFuZCBmb3J0aCBmb3Igc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gZnJv
bSBieXRlLWFycmF5cyB0byBNZW1vcnlTZWdtZW50cywgdGhlbiBjb3B5aW5nIHRoZXNlIHRvIHRo
ZSBwYWdlIE1lbW9yeVNlZ21lbnQuLi4gd2hpY2ggaXMgY3VycmVudGx5IG9uZSBpc3N1ZSwgYnV0
IEknbSBub3Qgc3VyZSBpZiB0aGF0J3MgYWxsLjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZTox
Mi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgi
IGRpcj0iYXV0byI+QWxsIGluIGFsbCBJJ20gbm90IHN1cmUgaWYgdGhlcmUncyBvdGhlciBzdHVm
ZiBJJ20gbWlzc2luZyBiZWNhdXNlIEknbSBub3cgdXNpbmcgYEFyZW5hLm9mU2hhcmVkKClgIGFu
ZCBJIHRoaW5rIHRoaXMgc3R1ZmYgaXMgYSBiaXQgc3RyYW5nZTo8YnI+PGJyPlszLDEyN3NdW2lu
Zm8gJm5ic3A7IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDcpIFBhdXNlIFlvdW5nIChO
b3JtYWwpIChHMSBFdmFjdWF0aW9uIFBhdXNlKSAoRXZhY3VhdGlvbiBGYWlsdXJlOiBQaW5uZWQp
IDY0NU0tJmd0OzQ1NU0oNTEyNE0pIDksNTYzbXM8YnI+WzMsMjUzc11baW5mbyAmbmJzcDsgXVtn
YyAmbmJzcDsgJm5ic3A7ICZuYnNwO10gR0MoOCkgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2
YWN1YXRpb24gUGF1c2UpIDc4M00tJmd0OzQ2ME0oNTEyNE0pIDQsNTgwbXM8YnI+WzUsMDk0c11b
aW5mbyAmbmJzcDsgXVtnYyAmbmJzcDsgJm5ic3A7ICZuYnNwO10gR0MoOSkgUGF1c2UgWW91bmcg
KE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2UpIDM1MjRNLSZndDs4OTdNKDUxMjRNKSA0MCwx
MDNtczxicj5bNSwyMDBzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBH
QygxMCkgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2UpIChFdmFjdWF0
aW9uIEZhaWx1cmU6IFBpbm5lZCkgMTM4MU0tJmd0Ozk0N00oNTEyNE0pIDI5LDAwNW1zPGJyPls1
LDY5NnNdW2luZm8gJm5ic3A7IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDExKSBQYXVz
ZSBZb3VuZyAoTm9ybWFsKSAoRzEgRXZhY3VhdGlvbiBQYXVzZSkgMTQ5OU0tJmd0OzExOTFNKDUx
MjRNKSAyNSw0MDVtczxicj5bNSw5NDJzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsg
Jm5ic3A7XSBHQygxMikgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2Up
IChFdmFjdWF0aW9uIEZhaWx1cmU6IFBpbm5lZCkgMTY0N00tJmd0OzEzNzlNKDUxMjRNKSAyMiww
MDZtczxicj5bNSw5NzlzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBH
QygxMykgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2UpIChFdmFjdWF0
aW9uIEZhaWx1cmU6IFBpbm5lZCkgMTg5OU0tJmd0OzE0MTFNKDUxMjRNKSA3LDYzNG1zPGJyPls2
LDYyOHNdW2luZm8gJm5ic3A7IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDE0KSBQYXVz
ZSBZb3VuZyAoTm9ybWFsKSAoRzEgRXZhY3VhdGlvbiBQYXVzZSkgMjI0M00tJmd0OzE4MDFNKDUx
MjRNKSAzNiwwOTNtczxicj5bNiw3MjVzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsg
Jm5ic3A7XSBHQygxNSkgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2Up
IChFdmFjdWF0aW9uIEZhaWx1cmU6IFBpbm5lZCkgMjQ2OU0tJmd0OzE4NzNNKDUxMjRNKSAxMyw4
MzZtczxicj5bNyw0MzZzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBH
QygxNikgUGF1c2UgWW91bmcgKE5vcm1hbCkgKEcxIEV2YWN1YXRpb24gUGF1c2UpIDI4NTdNLSZn
dDsyMjgzTSg1NzQwTSkgNjQsMjE5bXM8YnI+WzcsNTI1c11baW5mbyAmbmJzcDsgXVtnYyAmbmJz
cDsgJm5ic3A7ICZuYnNwO10gR0MoMTcpIFBhdXNlIFlvdW5nIChOb3JtYWwpIChHMSBFdmFjdWF0
aW9uIFBhdXNlKSAoRXZhY3VhdGlvbiBGYWlsdXJlOiBQaW5uZWQpIDMxMTVNLSZndDsyMzQzTSg1
NzQwTSkgMTQsMTEwbXM8YnI+WzgsMjc0c11baW5mbyAmbmJzcDsgXVtnYyAmbmJzcDsgJm5ic3A7
ICZuYnNwO10gR0MoMTgpIFBhdXNlIFlvdW5nIChOb3JtYWwpIChHMSBFdmFjdWF0aW9uIFBhdXNl
KSAzNjU5TS0mZ3Q7Mjc4M00oNTc0ME0pIDQyLDE1OW1zPGJyPls5LDAxMXNdW2luZm8gJm5ic3A7
IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDE5KSBQYXVzZSBZb3VuZyAoQ29uY3VycmVu
dCBTdGFydCkgKEcxIEV2YWN1YXRpb24gUGF1c2UpIChFdmFjdWF0aW9uIEZhaWx1cmU6IFBpbm5l
ZCkgNDAyN00tJmd0OzMyMzlNKDU3NDBNKSA1MSw2ODZtczxicj5bOSwwMTFzXVtpbmZvICZuYnNw
OyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBHQygyMCkgQ29uY3VycmVudCBNYXJrIEN5Y2xl
PGJyPls5LDE2NXNdW2luZm8gJm5ic3A7IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDIw
KSBQYXVzZSBSZW1hcmsgNDE3MU0tJmd0OzI1MzVNKDUzNjBNKSAzLDMxNW1zPGJyPls5LDQ0NnNd
W2luZm8gJm5ic3A7IF1bZ2MgJm5ic3A7ICZuYnNwOyAmbmJzcDtdIEdDKDIwKSBQYXVzZSBDbGVh
bnVwIDI3NTlNLSZndDsyNzU5TSg1MzYwTSkgMCwyNTNtczxicj5bOSw0NDhzXVtpbmZvICZuYnNw
OyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBHQygyMCkgQ29uY3VycmVudCBNYXJrIEN5Y2xl
IDQzNiw2MDFtczxicj5bOSw1MDBzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5i
c3A7XSBHQygyMSkgUGF1c2UgWW91bmcgKFByZXBhcmUgTWl4ZWQpIChHMSBFdmFjdWF0aW9uIFBh
dXNlKSAyNzgzTS0mZ3Q7MTc4OU0oNTM2ME0pIDMwLDI2N21zPGJyPlsxMCw1NzVzXVtpbmZvICZu
YnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBHQygyMikgUGF1c2UgWW91bmcgKE1peGVk
KSAoRzEgRXZhY3VhdGlvbiBQYXVzZSkgMzc0NU0tJmd0OzI0MTlNKDUzNjBNKSA3MywwMjVtczxi
cj5bMTEsMjY2c11baW5mbyAmbmJzcDsgXVtnYyAmbmJzcDsgJm5ic3A7ICZuYnNwO10gR0MoMjMp
IFBhdXNlIFlvdW5nIChOb3JtYWwpIChHMSBFdmFjdWF0aW9uIFBhdXNlKSAzOTg3TS0mZ3Q7Mjgy
OU0oNTM2ME0pIDU1LDAyOG1zPGJyPlsxMSw3NjJzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAm
bmJzcDsgJm5ic3A7XSBHQygyNCkgUGF1c2UgWW91bmcgKENvbmN1cnJlbnQgU3RhcnQpIChHMSBF
dmFjdWF0aW9uIFBhdXNlKSA0MTQ5TS0mZ3Q7MzA1MU0oNjAxMk0pIDY1LDU1MG1zPGJyPlsxMSw3
NjJzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBHQygyNSkgQ29uY3Vy
cmVudCBNYXJrIEN5Y2xlPGJyPlsxMSw4NjlzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJz
cDsgJm5ic3A7XSBHQygyNSkgUGF1c2UgUmVtYXJrIDMxNDNNLSZndDsxMzkzTSg1MTIwTSkgNCw0
MTVtczxicj5bMTIsMDc2c11baW5mbyAmbmJzcDsgXVtnYyAmbmJzcDsgJm5ic3A7ICZuYnNwO10g
R0MoMjUpIFBhdXNlIENsZWFudXAgMTU5M00tJmd0OzE1OTNNKDUxMjBNKSAwLDI0MG1zPGJyPlsx
MiwwNzhzXVtpbmZvICZuYnNwOyBdW2djICZuYnNwOyAmbmJzcDsgJm5ic3A7XSBHQygyNSkgQ29u
Y3VycmVudCBNYXJrIEN5Y2xlIDMxNiw0MTBtczxicj48YnI+SSd2ZSByYXJlbHkgaGFkIHRoZXNl
ICJFdmFjdWF0aW9uIEZhaWx1cmU6IFBpbm5lZCIgbG9nIGVudHJpZXMgcmVnYXJkaW5nIHRoZSBj
dXJyZW50ICJtYXN0ZXIiIGJyYW5jaCBvbiBHaXRodWIsIGJ1dCBub3cgaXQncyBldmVuIHdvcnNl
LiBQbHVzLCBJIHRoaW5rIEknbSBzdGlsbCBtaXNzaW5nIHRvIGNsb3NlL2NsZWFyIHBhZ2VzIGlu
IGFsbCBjYXNlcyAodG8gY2xvc2UgdGhlIGFyZW5hcyksIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUg
dHJpY2t5LiBJJ20gYWxzbyBzdG9yaW5nIHRoZSB0d28gbW9zdCByZWNlbnRseSBhY2Nlc3NlZCBw
YWdlcyBpbiBmaWVsZHM7IHNvbWV0aW1lcywgdGhleSBhcmUgbm90IHJlYWQvcHV0IGludG8gYSBj
YWNoZTsgdGhlcmUgYXJlIHBhZ2UgImZyYWdtZW50cyIgdGhhdCBtdXN0IGJlIHJlY29tYmluZWQg
Zm9yIGEgZnVsbCBwYWdlLi4uPC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEyLjhweCIgZGly
PSJhdXRvIj48YnI+PC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEyLjhweCIgZGlyPSJhdXRv
Ij5TbyBtYXliZSB5b3Uga25vdyB3aHkgdGhlIEdDIGlzIG11Y2ggd29yc2Ugbm93IChJIGd1ZXNz
IGV2ZW4gaWYgSSBmYWlsIHRvIGNsb3NlIGEgcGFnZSwgSSdkIGdldCBhbiBPdXRPZk1lbW9yeUVy
cm9yIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQsIGFzIHRoZSBzZWdtZW50cyBhcmUgb2ZmLWhlYXAg
KGRlc3BpdGUgbXkgYXJyYXktYmFzZWQgbWVtb3J5IHNlZ21lbnRzIChvZkFycmF5KSwmbmJzcDt3
aGljaCBtYXkgYmUgYSBwcm9ibGVtLCBobW0pLjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZTox
Mi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgi
IGRpcj0iYXV0byI+QWxsIGluIGFsbCBJIGZhY2VkIGEgbXVjaCB3b3JzZSBwZXJmb3JtYW5jZSB3
aXRoIE4tcmVhZCBvbmx5IHRyeHMgdHJhdmVyc2luZyBhIGxhcmdlIGZpbGUgaW4gcGFyYWxsZWws
IGxpa2VseSBkdWUgdG8gfjIsN0diIG9iamVjdCBhbGxvY2F0aW9uIHJhdGUgZm9yIGEgc2luZ2xl
IHRyeCBhbHJlYWR5IChhbmQgbWF5YmUgbm90IHRoYXQgbXVjaCByZWFkIGZyb20gdGhlIHBhZ2Ug
Y2FjaGVzKSwgdGhhdCdzIHdoeSBJIHRob3VnaHQgSSdkIGhhdmUgdG8gdHJ5IHRoZSBzaW5nbGUg
TWVtb3J5U2VnbWVudCBhcHByb2FjaCBmb3IgZWFjaCBwYWdlLjwvZGl2PjxkaXYgc3R5bGU9ImZv
bnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6
ZToxMi44cHgiIGRpcj0iYXV0byI+PGRpdiBkaXI9ImF1dG8iIHN0eWxlPSJmb250LXNpemU6bGFy
Z2UiPjxkaXYgZGlyPSJhdXRvIiBzdHlsZT0iY29sb3I6cmdiKDEzNiwxMzYsMTM2KTtmb250LXNp
emU6MTIuOHB4Ij48ZGl2IGRpcj0iYXV0byI+VGhlIEcxIGxvZzo8L2Rpdj48L2Rpdj48L2Rpdj48
ZGl2IGRpcj0iYXV0byIgc3R5bGU9ImZvbnQtc2l6ZTpsYXJnZSI+PGJyPjwvZGl2PjxzcGFuIHN0
eWxlPSJmb250LXNpemU6bGFyZ2UiPjxhIGhyZWY9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250
ZW50LmNvbS9zaXJpeGRiL3Npcml4L21haW4vZzEubG9nLjQiIG1vei1kby1ub3Qtc2VuZD0idHJ1
ZSIgY2xhc3M9Im1vei10eHQtbGluay1mcmVldGV4dCI+aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNv
bnRlbnQuY29tL3Npcml4ZGIvc2lyaXgvbWFpbi9nMS5sb2cuNDwvYT48L3NwYW4+PGJyPjwvZGl2
PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYg
c3R5bGU9ImZvbnQtc2l6ZToxMi44cHgiIGRpcj0iYXV0byI+a2luZCByZWdhcmRzPC9kaXY+PGRp
diBzdHlsZT0iY29sb3I6cmdiKDEzNiwxMzYsMTM2KTtmb250LXNpemU6MTIuOHB4IiBkaXI9ImF1
dG8iPjxkaXY+Sm9oYW5uZXM8L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGJyPjwvZGl2PjxkaXYgZGly
PSJhdXRvIj48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8L2Jsb2NrcXVvdGU+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>