<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>26366</bug_id>
          
          <creation_ts>2009-06-12 21:21:35 -0700</creation_ts>
          <short_desc>[V8] Teach V8 bindings about isolated worlds</short_desc>
          <delta_ts>2009-06-26 01:13:16 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>aa</cc>
    
    <cc>abarth</cc>
    
    <cc>dglazkov</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>125594</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-12 21:21:35 -0700</bug_when>
    <thetext>To make chromium extensions more secure, they want to run extension user scripts in their own &quot;isolated world&quot; with their own DOM wrappers.  This patch teaches V8DOMMap how to keep separate DOM wrappers for different worlds.  (There is a downstream patch that actually hooks this into the extension system.)

Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125595</commentid>
    <comment_count>1</comment_count>
      <attachid>31227</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-12 21:25:32 -0700</bug_when>
    <thetext>Created attachment 31227
Patch

I&apos;ll add a ChangeLog before landing.  (I created this patch in my Chromium tree, which doesn&apos;t have WebKitTools.)

Some preliminary review comments here: http://codereview.chromium.org/118189</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126009</commentid>
    <comment_count>2</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-15 12:58:38 -0700</bug_when>
    <thetext>The downstream half of this patch is under review here: http://codereview.chromium.org/118188</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126017</commentid>
    <comment_count>3</comment_count>
      <attachid>31227</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-06-15 13:39:53 -0700</bug_when>
    <thetext>Comment on attachment 31227
Patch

Holy moly! You rewrote the world! I think I understand what the patch is doing, especially with the Reitveld companion.

My concerns are:

* v8_isolated_world should live upstream, in bindings/v8.
* How does this affect bindings performance?
* Make sure there are no layout test regressions.

Review comments:

No ChangeLog? :)

&gt; +    private:
&gt; +      DOMData* m_domData;

4 spaces?

&gt; +    static void handleWeakObject(DOMDataStore::DOMWrapperMapType mapType,
&gt; +                                 v8::Handle&lt;v8::Object&gt; v8Object,
&gt; +                                 T* domObject);

No need to wrap here -- it&apos;s WebKit-land :)

&gt; +DOMDataStoreHandle::DOMDataStoreHandle()
&gt; +    : m_store(new ScopedDOMDataStore(DOMData::getCurrent()))  // TODO: Fix!

FIXME: and What?

&gt; +void visitDOMNodesInCurrentThread(DOMWrapperMap&lt;Node&gt;::Visitor* visitor) {

Brace on new line.

&gt; +void visitDOMObjectsInCurrentThread(DOMWrapperMap&lt;void&gt;::Visitor* visitor) {

Ditto.

&gt; +void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap&lt;void&gt;::Visitor* visitor) {

Ditto.

&gt; +void visitDOMSVGElementInstancesInCurrentThread(DOMWrapperMap&lt;SVGElementInstance&gt;::Visitor* visitor) {

Ditto.

&gt; +void visitSVGObjectsInCurrentThread(DOMWrapperMap&lt;void&gt;::Visitor* visitor) {

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126084</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-15 16:44:33 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Holy moly! You rewrote the world!

Yeah, sorry about that.  It&apos;s possible that we could have hacked this in with a smaller change, but it seemed better to separate the concerns more clearly (i.e., a thread as a bundle of isolated wrapper maps).  I&apos;m hoping to spend some more time beautifying this code once we&apos;ve got Aaron&apos;s use cases down.

&gt; * v8_isolated_world should live upstream, in bindings/v8.

Yes.  I&apos;ll move this in a follow-up patch.

&gt; * How does this affect bindings performance?

As we discussed on gchat, I&apos;ll run some benchmarks on Thursday.

&gt; * Make sure there are no layout test regressions.

I ran the Chromium test_shell_tests in Debug mode and they passed.  If I&apos;ve screwed things up, the tree will go red and I&apos;ll revert.  :)

&gt; No ChangeLog? :)

I&apos;ll add a ChangeLog before landing.  I don&apos;t have WebKitTools up and running in my Chromium tree yet, but I&apos;ll have them when I land through my webkit.org tree.

&gt; &gt; +    private:
&gt; &gt; +      DOMData* m_domData;
&gt; 
&gt; 4 spaces?

Fixed.

&gt; &gt; +    static void handleWeakObject(DOMDataStore::DOMWrapperMapType mapType,
&gt; &gt; +                                 v8::Handle&lt;v8::Object&gt; v8Object,
&gt; &gt; +                                 T* domObject);
&gt; 
&gt; No need to wrap here -- it&apos;s WebKit-land :)

Fixed.

&gt; &gt; +DOMDataStoreHandle::DOMDataStoreHandle()
&gt; &gt; +    : m_store(new ScopedDOMDataStore(DOMData::getCurrent()))  // TODO: Fix!
&gt; 
&gt; FIXME: and What?

Oops.  This was a not to myself to test this code.  It&apos;s working properly, so I&apos;ve removed the comment.

&gt; &gt; +void visitDOMNodesInCurrentThread(DOMWrapperMap&lt;Node&gt;::Visitor* visitor) {
&gt; 
&gt; Brace on new line.

Fixed x5.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126085</commentid>
    <comment_count>5</comment_count>
      <attachid>31319</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-15 16:46:28 -0700</bug_when>
    <thetext>Created attachment 31319
updated patch

Here&apos;s the updated patch.  I&apos;m not marking this for review until we can run the benchmarks (hopefully Thursday).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127331</commentid>
    <comment_count>6</comment_count>
      <attachid>31640</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-22 01:49:32 -0700</bug_when>
    <thetext>Created attachment 31640
updated patch

This patch passes the benchmarks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127332</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-22 02:02:16 -0700</bug_when>
    <thetext>To save you some work Dimitri, this patch is virtually identical to second patch (which addressed your comments from the first patch).  The changes are:

1) Now with ChangeLog that doesn&apos;t link to the bug.  (I&apos;ll fix this before landing.)
2) V8IsolatedWorld is now in this patch instead of the downstream patch.
3) V8IsolatedWorld::getEntered() is now optimized for the &quot;no isolated worlds&quot; case.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127370</commentid>
    <comment_count>8</comment_count>
      <attachid>31640</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-06-22 10:06:24 -0700</bug_when>
    <thetext>Comment on attachment 31640
updated patch

Just a few styling nits:

&gt; +static char kIsolatedWorldKey[] = &quot;IsolatedWorld&quot;;

You don&apos;t have to have prefixes (k* or g_*) for statics.

&gt; +static int g_isolatedWorldCount = 0;

&gt; +    // Using the default security token means that the canAccess is always
&gt; +    // called, which is slow.
&gt; +    // TODO(aa): Use tokens where possible. This will mean keeping track of all
&gt; +    // created contexts so that they can all be updated when the document domain
&gt; +    // changes.

FIXME?

&gt; +    // TODO(abarth): Move this statement above proxy-&gt;evaluate?  It seems like
&gt; +    //               we should set up the token before running the script.

FIXME?

&gt; +V8IsolatedWorld* V8IsolatedWorld::getEntered()
&gt; +        return NULL;

return 0;

&gt; +        return NULL;

ditto.

&gt; +        return NULL;

ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127569</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-22 22:00:48 -0700</bug_when>
    <thetext>I&apos;ll land this once the integration builder is green.  It&apos;s been red all day.  :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128426</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-06-26 01:13:16 -0700</bug_when>
    <thetext>This landed, but i forgot to mark the bug as fixed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31227</attachid>
            <date>2009-06-12 21:25:32 -0700</date>
            <delta_ts>2009-06-15 16:46:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>upstreamnewworld.patch</filename>
            <type>text/plain</type>
            <size>34680</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuaA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGJp
bmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuaAkocmV2aXNpb24gNDQ1OTcpDQorKysgYmluZGlu
Z3MvdjgvU2NyaXB0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpDQpAQCAtNjQsNiArNjQsMTIg
QEANCiAgICAgICAgIC8vIGFzIGEgc3RyaW5nLgogICAgICAgICBTY3JpcHRWYWx1ZSBldmFsdWF0
ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJik7CiAKKyAgICAgICAgLy8gRXhlY3V0ZXMgSmF2YVNj
cmlwdCBpbiBhIG5ldyB3b3JsZCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYiBmcmFtZS4gVGhlCisg
ICAgICAgIC8vIHNjcmlwdCBnZXRzIGl0cyBvd24gZ2xvYmFsIHNjb3BlLCBpdHMgb3duIHByb3Rv
dHlwZXMgZm9yIGludHJpbnNpYworICAgICAgICAvLyBKYXZhU2NyaXB0IG9iamVjdHMgKFN0cmlu
ZywgQXJyYXksIGFuZCBzby1vbiksIGFuZCBpdHMgb3duIHdyYXBwZXJzIGZvcgorICAgICAgICAv
LyBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgorICAgICAgICB2b2lkIGV2YWx1
YXRlSW5OZXdXb3JsZChjb25zdCBWZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mKTsKKwogICAgICAg
ICAvLyBFeGVjdXRlcyBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRleHQgYXNzb2NpYXRlZCB3aXRo
IHRoZSB3ZWIgZnJhbWUuIFRoZQogICAgICAgICAvLyBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2Jh
bCBzY29wZSBhbmQgaXRzIG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMKICAgICAgICAgLy8g
SmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcsIEFycmF5LCBhbmQgc28tb24pLiBJdCBzaGFyZXMg
dGhlIHdyYXBwZXJzIGZvcgpJbmRleDogYmluZGluZ3MvdjgvVjhET01NYXAuaA0KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQ0KLS0tIGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmgJKHJldmlzaW9uIDQ0NTk3KQ0KKysrIGJpbmRp
bmdzL3Y4L1Y4RE9NTWFwLmgJKHdvcmtpbmcgY29weSkNCkBAIC0zMiw2ICszMiw3IEBADQogI2Rl
ZmluZSBWOERPTU1hcF9oCiAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx2OC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC04
OSwyMyArOTAsNDUgQEANCiAgICAgICAgIHY4OjpXZWFrUmVmZXJlbmNlQ2FsbGJhY2sgbV93ZWFr
UmVmZXJlbmNlQ2FsbGJhY2s7CiAgICAgfTsKIAotCiAgICAgdGVtcGxhdGUgPGNsYXNzIEtleVR5
cGU+IGNsYXNzIERPTVdyYXBwZXJNYXAgOiBwdWJsaWMgV2Vha1JlZmVyZW5jZU1hcDxLZXlUeXBl
LCB2ODo6T2JqZWN0PiB7CiAgICAgcHVibGljOgogICAgICAgICBET01XcmFwcGVyTWFwKHY4OjpX
ZWFrUmVmZXJlbmNlQ2FsbGJhY2sgY2FsbGJhY2spIDogV2Vha1JlZmVyZW5jZU1hcDxLZXlUeXBl
LCB2ODo6T2JqZWN0PihjYWxsYmFjaykgeyB9CisKKyAgICAgICAgY2xhc3MgVmlzaXRvciB7Cisg
ICAgICAgIHB1YmxpYzoKKyAgICAgICAgICB2aXJ0dWFsIHZvaWQgdmlzaXRET01XcmFwcGVyKEtl
eVR5cGUqIGtleSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gb2JqZWN0KSA9IDA7CisgICAg
ICAgIH07CiAgICAgfTsKIAorICAgIC8vIEFuIG9wYXF1ZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMg
YSBzZXQgb2YgRE9NIHdyYXBwZXJzLgorICAgIGNsYXNzIERPTURhdGFTdG9yZTsKKworICAgIC8v
IEEgdXRpbGl0eSBjbGFzcyB0byBtYW5hZ2UgdGhlIGxpZmV0aW1lIG9mIHNldCBvZiBET00gd3Jh
cHBlcnMuCisgICAgY2xhc3MgRE9NRGF0YVN0b3JlSGFuZGxlIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIERPTURhdGFTdG9yZUhhbmRsZSgpOworICAgICAgICB+RE9NRGF0YVN0b3JlSGFuZGxlKCk7
CisKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBnZXRTdG9yZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3Rv
cmUuZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIE93blB0cjxET01EYXRhU3RvcmU+
IG1fc3RvcmU7CisgICAgfTsKKwogICAgIC8vIENhbGxiYWNrIHdoZW4gSlMgd3JhcHBlciBvZiBh
Y3RpdmUgRE9NIG9iamVjdCBpcyBkZWFkLgogICAgIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVj
dCk7CiAKICAgICAvLyBBIG1hcCBmcm9tIERPTSBub2RlIHRvIGl0cyBKUyB3cmFwcGVyLgogICAg
IERPTVdyYXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAoKTsKKyAgICB2b2lkIHZpc2l0RE9N
Tm9kZXNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDxOb2RlPjo6VmlzaXRvciopOwogCiAg
ICAgLy8gQSBtYXAgZnJvbSBhIERPTSBvYmplY3QgKG5vbi1ub2RlKSB0byBpdHMgSlMgd3JhcHBl
ci4gVGhpcyBtYXAgZG9lcyBub3QgY29udGFpbiB0aGUgRE9NIG9iamVjdHMgd2hpY2ggY2FuIGhh
dmUgcGVuZGluZyBhY3Rpdml0eSAoYWN0aXZlIGRvbSBvYmplY3RzKS4KICAgICBET01XcmFwcGVy
TWFwPHZvaWQ+JiBnZXRET01PYmplY3RNYXAoKTsKKyAgICB2b2lkIHZpc2l0RE9NT2JqZWN0c0lu
Q3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNpdG9yKik7CiAKICAgICAvLyBB
IG1hcCBmcm9tIGEgRE9NIG9iamVjdCB0byBpdHMgSlMgd3JhcHBlciBmb3IgRE9NIG9iamVjdHMg
d2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eS4KICAgICBET01XcmFwcGVyTWFwPHZvaWQ+
JiBnZXRBY3RpdmVET01PYmplY3RNYXAoKTsKKyAgICB2b2lkIHZpc2l0QWN0aXZlRE9NT2JqZWN0
c0luQ3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNpdG9yKik7CiAKICAgICAv
LyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgdG8gcmVtb3ZlIGFsbCBET00gb2JqZWN0cyBhc3NvY2lh
dGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkIHdoZW4gaXQgaXMgdGVhcmluZyBkb3duLgogICAg
IHZvaWQgcmVtb3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZCgpOwpAQCAtMTEzLDkgKzEz
NiwxMSBAQA0KICNpZiBFTkFCTEUoU1ZHKQogICAgIC8vIEEgbWFwIGZvciBTVkdFbGVtZW50SW5z
dGFuY2VzIHRvIGl0cyBKUyB3cmFwcGVyLgogICAgIERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudElu
c3RhbmNlPiYgZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCk7CisgICAgdm9pZCB2aXNpdFNW
R0VsZW1lbnRJbnN0YW5jZXNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50
SW5zdGFuY2U+OjpWaXNpdG9yKik7CiAKICAgICAvLyBNYXAgb2YgU1ZHIG9iamVjdHMgd2l0aCBj
b250ZXh0cyB0byBWOCBvYmplY3RzLgogICAgIERPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTVNW
R09iamVjdFdpdGhDb250ZXh0TWFwKCk7CisgICAgdm9pZCB2aXNpdERPTVNWR09iamVjdHNJbkN1
cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDx2b2lkPjo6VmlzaXRvciopOwogI2VuZGlmCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIu
Y3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09DQotLS0gYmluZGluZ3MvdjgvU2NyaXB0Q29udHJvbGxlci5jcHAJKHJl
dmlzaW9uIDQ0NTk3KQ0KKysrIGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpDQpAQCAtMTc4LDYgKzE3OCwxMSBAQA0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAK
K3ZvaWQgU2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbk5ld1dvcmxkKGNvbnN0IFZlY3RvcjxT
Y3JpcHRTb3VyY2VDb2RlPiYgc291cmNlcykKK3sKKyAgICBtX3Byb3h5LT5ldmFsdWF0ZUluTmV3
V29ybGQoc291cmNlcyk7Cit9CisKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbk5l
d0NvbnRleHQoY29uc3QgVmVjdG9yPFNjcmlwdFNvdXJjZUNvZGU+JiBzb3VyY2VzKQogewogICAg
IG1fcHJveHktPmV2YWx1YXRlSW5OZXdDb250ZXh0KHNvdXJjZXMpOwpJbmRleDogYmluZGluZ3Mv
djgvVjhET01NYXAuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gYmluZGluZ3MvdjgvVjhET01NYXAuY3Bw
CShyZXZpc2lvbiA0NDU5NykNCisrKyBiaW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHdvcmtpbmcg
Y29weSkNCkBAIC00Miw2ICs0Miw4IEBADQogI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5o
PgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAorI2luY2x1ZGUgInY4X2lzb2xhdGVkX3dvcmxk
LmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogLy8gRE9NIGJpbmRpbmcgYWxnb3JpdGhtOgpA
QCAtOTAsMzggKzkyLDI5IEBADQogLy8gICAgYWxsIG9iamVjdHMgaW4gdGhlIGRlbGF5ZWQgcXVl
dWUgYW5kIHRoZSB0aHJlYWQgbWFwIGFuZCBkZXJlZiBhbGwgb2YKIC8vICAgIHRoZW0uCiAKK3N0
YXRpYyB2b2lkIHdlYWtOb2RlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9i
amVjdCwgdm9pZCogZG9tT2JqZWN0KTsKIHN0YXRpYyB2b2lkIHdlYWtET01PYmplY3RDYWxsYmFj
ayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwot
c3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4
T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwotCit2b2lkIHdlYWtBY3RpdmVET01PYmplY3RDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3Qp
OwogI2lmIEVOQUJMRShTVkcpCiBzdGF0aWMgdm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2Fs
bGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0
KTsKLQogLy8gU1ZHIG5vbi1ub2RlIGVsZW1lbnRzIG1heSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEg
Y29udGV4dCBub2RlIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbGVtZW50IGlz
IGNoYW5nZS4KIHN0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CiAjZW5k
aWYKIAotLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmplY3Rz
IGZyb20gdGhlIG93bmluZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkLgotLy8gVGhlIGhlbHBl
ciBmdW5jdGlvbiB3aWxsIGJlIHNjaGVkdWxlZCBieSB0aGUgR0MgdGhyZWFkIHRvIGdldCBjYWxs
ZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KLXN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVj
dHNJbkN1cnJlbnRUaHJlYWQodm9pZCopOworY2xhc3MgRE9NRGF0YTsKK2NsYXNzIERPTURhdGFT
dG9yZTsKK3R5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YUxpc3Q7CiAK
LS8vIEEgbGlzdCBvZiBhbGwgVGhyZWFkU3BlY2lmaWMgRE9NIERhdGEgb2JqZWN0cy4gVHJhdmVy
c2VkIGR1cmluZyBHQyB0byBmaW5kIGEgdGhyZWFkLXNwZWNpZmljIG1hcCB0aGF0Ci0vLyBjb250
YWlucyB0aGUgb2JqZWN0IC0gc28gd2UgY2FuIHNjaGVkdWxlIHRoZSBvYmplY3QgdG8gYmUgZGVs
ZXRlZCBvbiB0aGUgdGhyZWFkIHdoaWNoIGNyZWF0ZWQgaXQuCi1jbGFzcyBUaHJlYWRTcGVjaWZp
Y0RPTURhdGE7Ci10eXBlZGVmIFdURjo6VmVjdG9yPFRocmVhZFNwZWNpZmljRE9NRGF0YSo+IERP
TURhdGFMaXN0Owotc3RhdGljIERPTURhdGFMaXN0JiBkb21EYXRhTGlzdCgpCi17Ci0gICAgREVG
SU5FX1NUQVRJQ19MT0NBTChET01EYXRhTGlzdCwgc3RhdGljRE9NRGF0YUxpc3QsICgpKTsKLSAg
ICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3Q7Ci19Ci0KLS8vIE11dGV4IHRvIHByb3RlY3QgYWdh
aW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBET01EYXRhTGlzdC4KLXN0YXRpYyBXVEY6Ok11dGV4
JiBkb21EYXRhTGlzdE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdURjo6TXV0
ZXgsIHN0YXRpY0RPTURhdGFMaXN0TXV0ZXgsICgpKTsKLSAgICByZXR1cm4gc3RhdGljRE9NRGF0
YUxpc3RNdXRleDsKLX0KLQotY2xhc3MgVGhyZWFkU3BlY2lmaWNET01EYXRhIDogTm9uY29weWFi
bGUgeworLy8gRE9NRGF0YVN0b3JlCisvLworLy8gRE9NRGF0YVN0b3JlIGlzIHRoZSBiYWNraW5n
IHN0b3JlIHRoYXQgaG9sZHMgdGhlIG1hcHMgYmV0d2VlbiBET00gb2JqZWN0cworLy8gYW5kIEph
dmFTY3JpcHQgb2JqZWN0cy4gIEluIGdlbmVyYWwsIGVhY2ggdGhyZWFkIGNhbiBoYXZlIG11bHRp
cGxlIGJhY2tpbmcKKy8vIHN0b3Jlcywgb25lIHBlciBpc29sYXRlZCB3b3JsZC4KKy8vCisvLyBU
aGlzIGNsYXNzIGRvZXNuJ3QgbWFuYWdlIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUuICBUaGUg
ZGF0YSBzdG9yZQorLy8gbGlmZXRpbWUgaXMgbWFuYWdlZCBieSBzdWJjbGFzc2VzLgorLy8KK2Ns
YXNzIERPTURhdGFTdG9yZSA6IE5vbmNvcHlhYmxlIHsKIHB1YmxpYzoKICAgICBlbnVtIERPTVdy
YXBwZXJNYXBUeXBlIHsKICAgICAgICAgRE9NTm9kZU1hcCwKQEAgLTEzMywxMyArMTI2LDEyIEBA
DQogI2VuZGlmCiAgICAgfTsKIAotICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7Ci0KICAgICB0ZW1wbGF0
ZSA8Y2xhc3MgS2V5VHlwZT4KICAgICBjbGFzcyBJbnRlcm5hbERPTVdyYXBwZXJNYXAgOiBwdWJs
aWMgRE9NV3JhcHBlck1hcDxLZXlUeXBlPiB7CiAgICAgcHVibGljOgotICAgICAgICBJbnRlcm5h
bERPTVdyYXBwZXJNYXAodjg6OldlYWtSZWZlcmVuY2VDYWxsYmFjayBjYWxsYmFjaykKLSAgICAg
ICAgICAgIDogRE9NV3JhcHBlck1hcDxLZXlUeXBlPihjYWxsYmFjaykgeyB9CisgICAgICAgIElu
dGVybmFsRE9NV3JhcHBlck1hcChET01EYXRhKiBkb21EYXRhLCB2ODo6V2Vha1JlZmVyZW5jZUNh
bGxiYWNrIGNhbGxiYWNrKQorICAgICAgICAgICAgOiBET01XcmFwcGVyTWFwPEtleVR5cGU+KGNh
bGxiYWNrKQorICAgICAgICAgICAgLCBtX2RvbURhdGEoZG9tRGF0YSkgeyB9CiAKICAgICAgICAg
dmlydHVhbCB2b2lkIGZvcmdldChLZXlUeXBlKik7CiAKQEAgLTE0NywyOSArMTM5LDMxIEBADQog
ICAgICAgICB7CiAgICAgICAgICAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3JnZXQob2Jq
ZWN0KTsKICAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIERPTURhdGEqIG1fZG9tRGF0
YTsKICAgICB9OwogCi0gICAgVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKLSAgICAgICAgOiBtX2Rv
bU5vZGVNYXAoMCkKLSAgICAgICAgLCBtX2RvbU9iamVjdE1hcCgwKQotICAgICAgICAsIG1fYWN0
aXZlRG9tT2JqZWN0TWFwKDApCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLCBtX2RvbVN2Z0Vs
ZW1lbnRJbnN0YW5jZU1hcCgwKQotICAgICAgICAsIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRN
YXAoMCkKLSNlbmRpZgotICAgICAgICAsIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFs
c2UpCi0gICAgICAgICwgbV9pc01haW5UaHJlYWQoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAv
LyBBIGxpc3Qgb2YgYWxsIERPTURhdGFTdG9yZSBvYmplY3RzLiAgVHJhdmVyc2VkIGR1cmluZyBH
QyB0byBmaW5kIGEgdGhyZWFkLXNwZWNpZmljIG1hcCB0aGF0CisgICAgLy8gY29udGFpbnMgdGhl
IG9iamVjdCAtIHNvIHdlIGNhbiBzY2hlZHVsZSB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQgb24g
dGhlIHRocmVhZCB3aGljaCBjcmVhdGVkIGl0LgorICAgIHN0YXRpYyBET01EYXRhTGlzdCYgYWxs
U3RvcmVzKCkKICAgICB7Ci0gICAgICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKGRvbURhdGFM
aXN0TXV0ZXgoKSk7Ci0gICAgICAgIGRvbURhdGFMaXN0KCkuYXBwZW5kKHRoaXMpOworICAgICAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKERPTURhdGFMaXN0LCBzdGF0aWNET01EYXRhTGlzdCwgKCkp
OworICAgICAgICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3Q7CiAgICAgfQogCi0gICAgdmlydHVh
bCB+VGhyZWFkU3BlY2lmaWNET01EYXRhKCkKKyAgICAvLyBNdXRleCB0byBwcm90ZWN0IGFnYWlu
c3QgY29uY3VycmVudCBhY2Nlc3Mgb2YgRE9NRGF0YUxpc3QuCisgICAgc3RhdGljIFdURjo6TXV0
ZXgmIGFsbFN0b3Jlc011dGV4KCkKICAgICB7Ci0gICAgICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9j
a2VyKGRvbURhdGFMaXN0TXV0ZXgoKSk7Ci0gICAgICAgIGRvbURhdGFMaXN0KCkucmVtb3ZlKGRv
bURhdGFMaXN0KCkuZmluZCh0aGlzKSk7CisgICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwoV1RG
OjpNdXRleCwgc3RhdGljRE9NRGF0YUxpc3RNdXRleCwgKCkpOworICAgICAgICByZXR1cm4gc3Rh
dGljRE9NRGF0YUxpc3RNdXRleDsKICAgICB9CiAKKyAgICBET01EYXRhU3RvcmUoRE9NRGF0YSog
ZG9tRGF0YSk7CisgICAgdmlydHVhbCB+RE9NRGF0YVN0b3JlKCk7CisKKyAgICBET01EYXRhKiBk
b21EYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kb21EYXRhOyB9CisKICAgICB2b2lkKiBnZXRET01X
cmFwcGVyTWFwKERPTVdyYXBwZXJNYXBUeXBlIHR5cGUpCiAgICAgewogICAgICAgICBzd2l0Y2gg
KHR5cGUpIHsKQEAgLTE5OSwxMSArMTkzLDYgQEANCiAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+JiBkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgpIHsgcmV0dXJuICptX2RvbVN2Z09i
amVjdFdpdGhDb250ZXh0TWFwOyB9CiAjZW5kaWYKIAotICAgIERlbGF5ZWRPYmplY3RNYXAmIGRl
bGF5ZWRPYmplY3RNYXAoKSB7IHJldHVybiBtX2RlbGF5ZWRPYmplY3RNYXA7IH0KLSAgICBib29s
IGRlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxheWVkUHJv
Y2Vzc2luZ1NjaGVkdWxlZDsgfQotICAgIHZvaWQgc2V0RGVsYXllZFByb2Nlc3NpbmdTY2hlZHVs
ZWQoYm9vbCB2YWx1ZSkgeyBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkID0gdmFsdWU7IH0K
LSAgICBib29sIGlzTWFpblRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNNYWluVGhyZWFkOyB9
Ci0KIHByb3RlY3RlZDoKICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4qIG1fZG9tTm9k
ZU1hcDsKICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fZG9tT2JqZWN0TWFwOwpA
QCAtMjEzLDMyICsyMDIsMzQgQEANCiAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBt
X2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwogI2VuZGlmCiAKLSAgICAvLyBTdG9yZXMgYWxs
IHRoZSBET00gb2JqZWN0cyB0aGF0IGFyZSBkZWxheWVkIHRvIGJlIHByb2Nlc3NlZCB3aGVuIHRo
ZSBvd25pbmcgdGhyZWFkIGdhaW5zIGNvbnRyb2wuCi0gICAgRGVsYXllZE9iamVjdE1hcCBtX2Rl
bGF5ZWRPYmplY3RNYXA7Ci0KLSAgICAvLyBUaGUgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgdGFz
ayB0byBkbyB0aGUgZGVsYXllZCBwcm9jZXNzIGhhcyBhbHJlYWR5IGJlZW4gcG9zdGVkLgotICAg
IGJvb2wgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZDsKLQotICAgIGJvb2wgbV9pc01haW5U
aHJlYWQ7Citwcml2YXRlOgorICAgIC8vIEEgYmFjay1wb2ludGVyIHRvIHRoZSBET01EYXRhIHRv
IHdoaWNoIHdlIGJlbG9uZy4KKyAgICBET01EYXRhKiBtX2RvbURhdGE7CiB9OwogCi0vLyBUaGlz
IGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIG5vbi1tYWluIHRocmVh
ZC4gQWxsIHRoZSBtYXBzIGluIGl0IGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5LgotY2xhc3MgTm9u
TWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSA6IHB1YmxpYyBUaHJlYWRTcGVjaWZpY0RPTURhdGEg
eworLy8gU2NvcGVkRE9NRGF0YVN0b3JlCisvLworLy8gU2NvcGVkRE9NRGF0YVN0b3JlIGlzIGEg
RE9NRGF0YVN0b3JlIHRoYXQgY29udHJvbHMgbGltaXRzIHRoZSBsaWZldGltZSBvZgorLy8gdGhl
IHN0b3JlIHRvIHRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0IGl0c2VsZi4gIEluIG90aGVyIHdv
cmRzLCB3aGVuIHRoZQorLy8gU2NvcGVkRE9NRGF0YVN0b3JlIG9iamVjdCBpcyBkZWFsbG9jYXRl
ZCwgdGhlIG1hcHMgdGhhdCBiZWxvbmcgdG8gdGhlIHN0b3JlCisvLyBhcmUgZGVhbGxvY2F0ZWQg
YXMgd2VsbC4KKy8vCitjbGFzcyBTY29wZWRET01EYXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0
b3JlIHsKIHB1YmxpYzoKLSAgICBOb25NYWluVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKKyAgICBT
Y29wZWRET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkgOiBET01EYXRhU3RvcmUoZG9tRGF0
YSkKICAgICB7Ci0gICAgICAgIG1fZG9tTm9kZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8Tm9kZT4oJndlYWtOb2RlQ2FsbGJhY2spOwotICAgICAgICBtX2RvbU9iamVjdE1hcCA9IG5l
dyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4od2Vha0RPTU9iamVjdENhbGxiYWNrKTsKLSAg
ICAgICAgbV9hY3RpdmVEb21PYmplY3RNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZv
aWQ+KHdlYWtBY3RpdmVET01PYmplY3RDYWxsYmFjayk7CisgICAgICAgIG1fZG9tTm9kZU1hcCA9
IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4oZG9tRGF0YSwgd2Vha05vZGVDYWxsYmFj
ayk7CisgICAgICAgIG1fZG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2
b2lkPihkb21EYXRhLCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOworICAgICAgICBtX2FjdGl2ZURv
bU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4oZG9tRGF0YSwgd2Vh
a0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKTsKICNpZiBFTkFCTEUoU1ZHKQotICAgICAgICBtX2Rv
bVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxl
bWVudEluc3RhbmNlPih3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spOwotICAgICAgICBt
X2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2
b2lkPih3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjayk7CisgICAgICAgIG1fZG9tU3Zn
RWxlbWVudEluc3RhbmNlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50
SW5zdGFuY2U+KGRvbURhdGEsIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk7CisgICAg
ICAgIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVy
TWFwPHZvaWQ+KGRvbURhdGEsIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKTsKICNl
bmRpZgogICAgIH0KIAotICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gV1RGIHRocmVhZCBpcyB0
ZWFyaW5nIGRvd24uCisgICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIHdoZW4gV1RGIHRocmVhZCBp
cyB0ZWFyaW5nIGRvd24uCiAgICAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIGNoaWxkIHRocmVhZHMg
cnVubmluZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkgV1RGLgotICAgIHZpcnR1YWwgfk5v
bk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgIHZpcnR1YWwgflNjb3BlZERPTURhdGFT
dG9yZSgpCiAgICAgewogICAgICAgICBkZWxldGUgbV9kb21Ob2RlTWFwOwogICAgICAgICBkZWxl
dGUgbV9kb21PYmplY3RNYXA7CkBAIC0yNTAsMTggKzI0MSwyMyBAQA0KICAgICB9CiB9OwogCi0v
LyBUaGlzIGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIHRoZSBtYWlu
IHRocmVhZC4gQWxsIHRoZSBtYXBzIGluIGl0IGFyZSBzdGF0aWMuCi0vLyBUaGlzIGlzIGJlY2F1
c2Ugd2UgYXJlIHVuYWJsZSB0byByZWx5IG9uIFdURjo6VGhyZWFkU3BlY2lmaWNUaHJlYWRFeGl0
IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlCi0vLyB0aGUgcGxhY2UgdGhhdCB0ZWFycyBkb3duIHRo
ZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlvbnMuCi1jbGFzcyBNYWlu
VGhyZWFkU3BlY2lmaWNET01EYXRhIDogcHVibGljIFRocmVhZFNwZWNpZmljRE9NRGF0YSB7Cisv
LyBTdGF0aWNET01EYXRhU3RvcmUKKy8vCisvLyBTdGF0aWNET01EYXRhU3RvcmUgaXMgYSBET01E
YXRhU3RvcmUgdGhhdCBtYW5hZ2VzIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUKKy8vIHN0YXRp
Y2FsbHkuICBUaGlzIGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIHRo
ZSBtYWluCisvLyB0aHJlYWQuICBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4gIFRoaXMg
aXMgYmVjYXVzZSB3ZSBhcmUgdW5hYmxlIHRvCisvLyByZWx5IG9uIFdURjo6VGhyZWFkU3BlY2lm
aWNUaHJlYWRFeGl0IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlIHRoZSBwbGFjZSB0aGF0CisvLyB0
ZWFycyBkb3duIHRoZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlvbnMu
CitjbGFzcyBTdGF0aWNET01EYXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0b3JlIHsKIHB1Ymxp
YzoKLSAgICBNYWluVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKLSAgICAgICAgOiBtX3N0YXRpY0Rv
bU5vZGVNYXAod2Vha05vZGVDYWxsYmFjaykKLSAgICAgICAgLCBtX3N0YXRpY0RvbU9iamVjdE1h
cCh3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spCi0gICAgICAgICwgbV9zdGF0aWNBY3RpdmVEb21PYmpl
Y3RNYXAod2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKQorICAgIFN0YXRpY0RPTURhdGFTdG9y
ZShET01EYXRhKiBkb21EYXRhKQorICAgICAgICA6IERPTURhdGFTdG9yZShkb21EYXRhKQorICAg
ICAgICAsIG1fc3RhdGljRG9tTm9kZU1hcChkb21EYXRhLCB3ZWFrTm9kZUNhbGxiYWNrKQorICAg
ICAgICAsIG1fc3RhdGljRG9tT2JqZWN0TWFwKGRvbURhdGEsIHdlYWtET01PYmplY3RDYWxsYmFj
aykKKyAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9iamVjdE1hcChkb21EYXRhLCB3ZWFrQWN0
aXZlRE9NT2JqZWN0Q2FsbGJhY2spCiAjaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLCBtX3N0YXRp
Y0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCh3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sp
Ci0gICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCh3ZWFrU1ZHT2Jq
ZWN0V2l0aENvbnRleHRDYWxsYmFjaykKKyAgICAgICAgLCBtX3N0YXRpY0RvbVN2Z0VsZW1lbnRJ
bnN0YW5jZU1hcChkb21EYXRhLCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spCisgICAg
ICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcChkb21EYXRhLCB3ZWFrU1ZH
T2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKICNlbmRpZgogICAgIHsKICAgICAgICAgbV9kb21O
b2RlTWFwID0gJm1fc3RhdGljRG9tTm9kZU1hcDsKQEAgLTI4MSw5OCArMjc3LDE2OSBAQA0KICAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29u
dGV4dE1hcDsKIH07CiAKLURFRklORV9TVEFUSUNfTE9DQUwoV1RGOjpUaHJlYWRTcGVjaWZpYzxO
b25NYWluVGhyZWFkU3BlY2lmaWNET01EYXRhPiwgdGhyZWFkU3BlY2lmaWNET01EYXRhLCAoKSk7
Cit0eXBlZGVmIFdURjo6VmVjdG9yPERPTURhdGFTdG9yZSo+IERPTURhdGFTdG9yZUxpc3Q7CiAK
LXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCBoYW5kbGVXZWFrT2JqZWN0SW5Pd25p
bmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBl
LCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgb2JqZWN0VHlwZSwgVCopOworLy8gRE9NRGF0
YQorLy8KKy8vIERPTURhdGEgcmVwcmVzZW50cyB0aGUgYWxsIHRoZSBET00gd3JhcHBlcnMgZm9y
IGEgZ2l2ZW4gdGhyZWFkLiAgSW4KKy8vIHBhcnRpY3VsYXIsIERPTURhdGEgaG9sZHMgd3JhcHBl
cnMgZm9yIGFsbCB0aGUgaXNvbGF0ZWQgd29ybGRzIGluIHRoZQorLy8gdGhyZWFkLiAgVGhlIERP
TURhdGEgZm9yIHRoZSBtYWluIHRocmVhZCBhbmQgdGhlIERPTURhdGEgZm9yIGNoaWxkIHRocmVh
ZHMKKy8vIHVzZSBkaWZmZXJlbnQgc3ViY2xhc3Nlcy4KKy8vCitjbGFzcyBET01EYXRhOiBOb25j
b3B5YWJsZSB7CitwdWJsaWM6CisgICAgRE9NRGF0YSgpCisgICAgICAgIDogbV9kZWxheWVkUHJv
Y2Vzc2luZ1NjaGVkdWxlZChmYWxzZSkKKyAgICAgICAgLCBtX2lzTWFpblRocmVhZChXVEY6Omlz
TWFpblRocmVhZCgpKQorICAgICAgICAsIG1fb3duaW5nVGhyZWFkKFdURjo6Y3VycmVudFRocmVh
ZCgpKQorICAgIHsKKyAgICB9CiAKLVRocmVhZFNwZWNpZmljRE9NRGF0YSYgZ2V0VGhyZWFkU3Bl
Y2lmaWNET01EYXRhKCkKKyAgICBzdGF0aWMgRE9NRGF0YSogZ2V0Q3VycmVudCgpOworICAgIHZp
cnR1YWwgRE9NRGF0YVN0b3JlJiBnZXRTdG9yZSgpID0gMDsKKworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRP
TVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHY4T2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgVCogZG9tT2JqZWN0KTsKKworICAgIHZvaWQgZm9yZ2V0RGVsYXllZE9iamVj
dCh2b2lkKiBvYmplY3QpIHsgbV9kZWxheWVkT2JqZWN0TWFwLnRha2Uob2JqZWN0KTsgfQorCisg
ICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmplY3RzIGZy
b20gdGhlIG93bmluZyB0aHJlYWQsCisgICAgLy8gbm90IHRoZSBHQyB0aHJlYWQuICBUaGUgaGVs
cGVyIGZ1bmN0aW9uIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZSBHQworICAgIC8vIHRocmVhZCB0
byBnZXQgY2FsbGVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgZGVy
ZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKik7CisgICAgdm9pZCBkZXJlZkRl
bGF5ZWRPYmplY3RzKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2
b2lkIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXAp
OworCisgICAgVGhyZWFkSWRlbnRpZmllciBvd25pbmdUaHJlYWQoKSBjb25zdCB7IHJldHVybiBt
X293bmluZ1RocmVhZDsgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZv
aWQqLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7CisKKyAg
ICB2b2lkIGVuc3VyZURlcmVmKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lk
KiBkb21PYmplY3QpOworICAgIHN0YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpOworCisgICAgLy8gU3RvcmVzIGFs
bCB0aGUgRE9NIG9iamVjdHMgdGhhdCBhcmUgZGVsYXllZCB0byBiZSBwcm9jZXNzZWQgd2hlbiB0
aGUgb3duaW5nIHRocmVhZCBnYWlucyBjb250cm9sLgorICAgIERlbGF5ZWRPYmplY3RNYXAgbV9k
ZWxheWVkT2JqZWN0TWFwOworCisgICAgLy8gVGhlIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHRh
c2sgdG8gZG8gdGhlIGRlbGF5ZWQgcHJvY2VzcyBoYXMgYWxyZWFkeSBiZWVuIHBvc3RlZC4KKyAg
ICBib29sIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQ7CisKKyAgICBib29sIG1faXNNYWlu
VGhyZWFkOworICAgIFRocmVhZElkZW50aWZpZXIgbV9vd25pbmdUaHJlYWQ7Cit9OworCitjbGFz
cyBNYWluVGhyZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKK3B1YmxpYzoKKyAgICBNYWlu
VGhyZWFkRE9NRGF0YSgpIDogbV9kZWZhdWx0U3RvcmUodGhpcykgeyB9CisKKyAgICBET01EYXRh
U3RvcmUmIGdldFN0b3JlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVh
ZCgpKTsKKyAgICAgICAgVjhJc29sYXRlZFdvcmxkKiB3b3JsZCA9IFY4SXNvbGF0ZWRXb3JsZDo6
Z2V0RW50ZXJlZCgpOworICAgICAgICBpZiAod29ybGQpCisgICAgICAgICAgICByZXR1cm4gKndv
cmxkLT5nZXRET01EYXRhU3RvcmUoKTsKKyAgICAgICAgcmV0dXJuIG1fZGVmYXVsdFN0b3JlOwor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBTdGF0aWNET01EYXRhU3RvcmUgbV9kZWZhdWx0U3RvcmU7
CisgICAgLy8gTm90ZTogVGhlIERPTURhdGFTdG9yZXMgZm9yIGlzb2xhdGVkIHdvcmxkIGFyZSBv
d25lZCBieSB0aGUgd29ybGQgb2JqZWN0LgorfTsKKworY2xhc3MgQ2hpbGRUaHJlYWRET01EYXRh
IDogcHVibGljIERPTURhdGEgeworcHVibGljOgorICAgIENoaWxkVGhyZWFkRE9NRGF0YSgpIDog
bV9kZWZhdWx0U3RvcmUodGhpcykgeyB9CisKKyAgICBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkg
eworICAgICAgICBBU1NFUlQoIVdURjo6aXNNYWluVGhyZWFkKCkpOworICAgICAgICAvLyBDdXJy
ZW50bHksIGNoaWxkIHRocmVhZHMgaGF2ZSBvbmx5IG9uZSB3b3JsZC4KKyAgICAgICAgcmV0dXJu
IG1fZGVmYXVsdFN0b3JlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTY29wZWRET01EYXRhU3Rv
cmUgbV9kZWZhdWx0U3RvcmU7Cit9OworCitET01EYXRhU3RvcmU6OkRPTURhdGFTdG9yZShET01E
YXRhKiBkb21EYXRhKQorICAgIDogbV9kb21Ob2RlTWFwKDApCisgICAgLCBtX2RvbU9iamVjdE1h
cCgwKQorICAgICwgbV9hY3RpdmVEb21PYmplY3RNYXAoMCkKKyNpZiBFTkFCTEUoU1ZHKQorICAg
ICwgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoMCkKKyAgICAsIG1fZG9tU3ZnT2JqZWN0V2l0
aENvbnRleHRNYXAoMCkKKyNlbmRpZgorICAgICwgbV9kb21EYXRhKGRvbURhdGEpCiB7Ci0gICAg
aWYgKFdURjo6aXNNYWluVGhyZWFkKCkpIHsKLSAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChN
YWluVGhyZWFkU3BlY2lmaWNET01EYXRhLCBtYWluVGhyZWFkU3BlY2lmaWNET01EYXRhLCAoKSk7
Ci0gICAgICAgIHJldHVybiBtYWluVGhyZWFkU3BlY2lmaWNET01EYXRhOwotICAgIH0KLSAgICBy
ZXR1cm4gKnRocmVhZFNwZWNpZmljRE9NRGF0YTsKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tl
cihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFTdG9yZTo6YWxs
U3RvcmVzKCkuYXBwZW5kKHRoaXMpOwogfQogCitET01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUo
KQoreworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVz
TXV0ZXgoKSk7CisgICAgRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKS5yZW1vdmUoRE9NRGF0YVN0
b3JlOjphbGxTdG9yZXMoKS5maW5kKHRoaXMpKTsKK30KKworRE9NRGF0YVN0b3JlSGFuZGxlOjpE
T01EYXRhU3RvcmVIYW5kbGUoKQorICAgIDogbV9zdG9yZShuZXcgU2NvcGVkRE9NRGF0YVN0b3Jl
KERPTURhdGE6OmdldEN1cnJlbnQoKSkpICAvLyBUT0RPOiBGaXghCit7Cit9CisKK0RPTURhdGFT
dG9yZUhhbmRsZTo6fkRPTURhdGFTdG9yZUhhbmRsZSgpCit7Cit9CisKIHRlbXBsYXRlIDxjbGFz
cyBLZXlUeXBlPgotdm9pZCBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBl
ck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KEtleVR5cGUqIG9iamVjdCkKK3ZvaWQgRE9NRGF0YVN0b3Jl
OjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8S2V5VHlwZT46OmZvcmdldChLZXlUeXBlKiBvYmplY3Qp
CiB7CiAgICAgRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7Ci0KLSAgICBU
aHJlYWRTcGVjaWZpY0RPTURhdGE6OkRlbGF5ZWRPYmplY3RNYXAmIGRlbGF5ZWRPYmplY3RNYXAg
PSBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kZWxheWVkT2JqZWN0TWFwKCk7Ci0gICAgZGVs
YXllZE9iamVjdE1hcC50YWtlKG9iamVjdCk7CisgICAgbV9kb21EYXRhLT5mb3JnZXREZWxheWVk
T2JqZWN0KG9iamVjdCk7CiB9CiAKIERPTVdyYXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAo
KQogewotICAgIHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kb21Ob2RlTWFwKCk7
CisgICAgcmV0dXJuIERPTURhdGE6OmdldEN1cnJlbnQoKS0+Z2V0U3RvcmUoKS5kb21Ob2RlTWFw
KCk7CiB9CiAKIERPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTU9iamVjdE1hcCgpCiB7Ci0gICAg
cmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmRvbU9iamVjdE1hcCgpOworICAgIHJl
dHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdldFN0b3JlKCkuZG9tT2JqZWN0TWFwKCk7CiB9
CiAKIERPTVdyYXBwZXJNYXA8dm9pZD4mIGdldEFjdGl2ZURPTU9iamVjdE1hcCgpCiB7Ci0gICAg
cmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmFjdGl2ZURvbU9iamVjdE1hcCgpOwor
ICAgIHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdldFN0b3JlKCkuYWN0aXZlRG9tT2Jq
ZWN0TWFwKCk7CiB9CiAKICNpZiBFTkFCTEUoU1ZHKQorCiBET01XcmFwcGVyTWFwPFNWR0VsZW1l
bnRJbnN0YW5jZT4mIGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCgpCiB7Ci0gICAgcmV0dXJu
IGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpOwor
ICAgIHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdldFN0b3JlKCkuZG9tU3ZnRWxlbWVu
dEluc3RhbmNlTWFwKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VD
YWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmpl
Y3QpCi17Ci0gICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9IHN0YXRpY19jYXN0PFNW
R0VsZW1lbnRJbnN0YW5jZSo+KGRvbU9iamVjdCk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURh
dGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+JiBtYXAgPSBzdGF0
aWNfY2FzdDxUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxTVkdF
bGVtZW50SW5zdGFuY2U+Jj4oZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkpOwotICAgIGlm
IChtYXAuY29udGFpbnMoaW5zdGFuY2UpKSB7Ci0gICAgICAgIGluc3RhbmNlLT5kZXJlZigpOwot
ICAgICAgICBtYXAuZm9yZ2V0T25seShpbnN0YW5jZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhh
bmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVNW
R0VsZW1lbnRJbnN0YW5jZU1hcCwgVjhDbGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIGlu
c3RhbmNlKTsKLX0KLQogLy8gTWFwIG9mIFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjgg
b2JqZWN0cwogRE9NV3JhcHBlck1hcDx2b2lkPiYgZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRN
YXAoKQogewotICAgIHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kb21TdmdPYmpl
Y3RXaXRoQ29udGV4dE1hcCgpOworICAgIHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdl
dFN0b3JlKCkuZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKTsKIH0KIAotc3RhdGljIHZvaWQg
d2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVl
PiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQorI2VuZGlmIC8vIEVOQUJMRShTVkcpCisKKy8v
IHN0YXRpYworRE9NRGF0YSogRE9NRGF0YTo6Z2V0Q3VycmVudCgpCiB7Ci0gICAgdjg6OkhhbmRs
ZVNjb3BlIHNjb3BlOwotICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7Ci0KLSAgICBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJU
eXBlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpKTsKLQotICAgIFRocmVh
ZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+JiBtYXAgPSBzdGF0
aWNfY2FzdDxUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lk
PiY+KGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkpOwotICAgIGlmIChtYXAuY29udGFp
bnMoZG9tT2JqZWN0KSkgewotICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMg
b2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCi0gICAgICAgIG1h
cC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0jZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6dHlwZTogc3RhdGljX2Nhc3Q8bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFr
OwotICAgICAgICBTVkdfT0JKRUNUX1RZUEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNlCi0j
ZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6dHlwZTogICAgXAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9E
VHlwZVdyYXBwZXI8bmFtZT4qPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICAgICAg
U1ZHX1BPRF9OQVRJVkVfVFlQRVMoTWFrZUNhc2UpCi0jdW5kZWYgTWFrZUNhc2UKLSAgICAgICAg
ZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgaGFuZGxlV2Vha09iamVjdElu
T3duaW5nVGhyZWFkKFRocmVhZFNwZWNpZmljRE9NRGF0YTo6RE9NU1ZHT2JqZWN0V2l0aENvbnRl
eHRNYXAsIHR5cGUsIGRvbU9iamVjdCk7CisgICAgaWYgKFdURjo6aXNNYWluVGhyZWFkKCkpIHsK
KyAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChNYWluVGhyZWFkRE9NRGF0YSwgbWFpblRocmVh
ZERPTURhdGEsICgpKTsKKyAgICAgICAgcmV0dXJuICZtYWluVGhyZWFkRE9NRGF0YTsKKyAgICB9
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6OlRocmVhZFNwZWNpZmljPENoaWxkVGhyZWFk
RE9NRGF0YT4sIGNoaWxkVGhyZWFkRE9NRGF0YSwgKCkpOworICAgIHJldHVybiBjaGlsZFRocmVh
ZERPTURhdGE7CiB9Ci0jZW5kaWYgLy8gRU5BQkxFKFNWRykKIAogLy8gQ2FsbGVkIHdoZW4gdGhl
IGRlYWQgb2JqZWN0IGlzIG5vdCBpbiBHQyB0aHJlYWQncyBtYXAuIEdvIHRocm91Z2ggYWxsIHRo
cmVhZCBtYXBzIHRvIGZpbmQgdGhlIG9uZSBjb250YWluaW5nIGl0LgogLy8gVGhlbiBjbGVhciB0
aGUgSlMgcmVmZXJlbmNlIGFuZCBwdXNoIHRoZSBET00gb2JqZWN0IGludG8gdGhlIGRlbGF5ZWQg
cXVldWUgZm9yIGl0IHRvIGJlIGRlcmVmLWVkIGF0IGxhdGVyIHRpbWUgZnJvbSB0aGUgb3duaW5n
IHRocmVhZC4KQEAgLTM4MCwzMSArNDQ3LDQzIEBADQogLy8gKiBUaGlzIGNhbiBiZSBjYWxsZWQg
b24gYW55IHRocmVhZCB0aGF0IGhhcyBHQyBydW5uaW5nLgogLy8gKiBPbmx5IG9uZSBWOCBpbnN0
YW5jZSBpcyBydW5uaW5nIGF0IGEgdGltZSBkdWUgdG8gVjg6OkxvY2tlci4gU28gd2UgZG9uJ3Qg
bmVlZCB0byB3b3JyeSBhYm91dCBjb25jdXJyZW5jeS4KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1z
dGF0aWMgdm9pZCBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNE
T01EYXRhOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgb2JqZWN0VHlwZSwgVCogb2JqZWN0KQorLy8gc3RhdGljCit2b2lkIERPTURhdGE6Omhh
bmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHY4T2JqZWN0LCBUKiBkb21PYmplY3QpCiB7Ci0gICAgV1RG
OjpNdXRleExvY2tlciBsb2NrZXIoZG9tRGF0YUxpc3RNdXRleCgpKTsKLSAgICBET01EYXRhTGlz
dCYgbGlzdCA9IGRvbURhdGFMaXN0KCk7CisKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihE
T01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFMaXN0JiBsaXN0ID0g
RE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxp
c3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhKiB0aHJlYWRE
YXRhID0gbGlzdFtpXTsKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBzdG9yZSA9IGxpc3RbaV07CiAK
LSAgICAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4q
IGRvbU1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01X
cmFwcGVyTWFwPFQ+Kj4odGhyZWFkRGF0YS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBlKSk7Ci0g
ICAgICAgIGlmIChkb21NYXAtPmNvbnRhaW5zKG9iamVjdCkpIHsKKyAgICAgICAgRE9NRGF0YVN0
b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qIGRvbU1hcCA9IHN0YXRpY19jYXN0PERPTURh
dGFTdG9yZTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPFQ+Kj4oc3RvcmUtPmdldERPTVdyYXBwZXJN
YXAobWFwVHlwZSkpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9
IGRvbU1hcC0+Z2V0KGRvbU9iamVjdCk7CisgICAgICAgIGlmICgqd3JhcHBlciA9PSAqdjhPYmpl
Y3QpIHsKICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBKUyByZWZlcmVuY2UuCi0gICAgICAgICAg
ICBkb21NYXAtPmZvcmdldE9ubHkob2JqZWN0KTsKKyAgICAgICAgICAgIGRvbU1hcC0+Zm9yZ2V0
T25seShkb21PYmplY3QpOworICAgICAgICAgICAgc3RvcmUtPmRvbURhdGEoKS0+ZW5zdXJlRGVy
ZWYoVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjhPYmplY3QpLCBkb21PYmplY3QpOworICAg
ICAgICB9CisgICAgfQorfQogCi0gICAgICAgICAgICAvLyBQdXNoIGludG8gdGhlIGRlbGF5ZWQg
cXVldWUuCi0gICAgICAgICAgICB0aHJlYWREYXRhLT5kZWxheWVkT2JqZWN0TWFwKCkuc2V0KG9i
amVjdCwgb2JqZWN0VHlwZSk7Cit2b2lkIERPTURhdGE6OmVuc3VyZURlcmVmKFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKG1fb3du
aW5nVGhyZWFkID09IFdURjo6Y3VycmVudFRocmVhZCgpKSB7CisgICAgICAgIC8vIE5vIG5lZWQg
dG8gZGVsYXkgdGhlIHdvcmsuICBXZSBjYW4gZGVyZWYgcmlnaHQgbm93LgorICAgICAgICBkZXJl
Zk9iamVjdCh0eXBlLCBkb21PYmplY3QpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAg
ICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgb3duaW5nIHRocmVhZCBpbiBvcmRlciB0byBw
cm9jZXNzIHRoZSBkZWxheWVkIHF1ZXVlLgotICAgICAgICAgICAgLy8gRklYTUU6IEZvciBub3cs
IHdlIGNhbiBvbmx5IHBvc3QgdG8gbWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3Rpbmcg
bGltaXRhdGlvbi4gV2Ugd2lsbCBmaXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdvcmtl
ci4KLSAgICAgICAgICAgIGlmICghdGhyZWFkRGF0YS0+ZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVs
ZWQoKSkgewotICAgICAgICAgICAgICAgIHRocmVhZERhdGEtPnNldERlbGF5ZWRQcm9jZXNzaW5n
U2NoZWR1bGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICh0aHJlYWREYXRhLT5pc01haW5U
aHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFkKCZkZXJl
ZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkLCAwKTsKLSAgICAgICAgICAgIH0KKyAgICAv
LyBXZSBuZWVkIHRvIGRvIHRoZSBkZXJlZiBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCisgICAgbV9k
ZWxheWVkT2JqZWN0TWFwLnNldChkb21PYmplY3QsIHR5cGUpOwogCi0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQorICAgIC8vIFBvc3QgYSB0YXNrIHRvIHRoZSBvd25pbmcgdGhyZWFkIGlu
IG9yZGVyIHRvIHByb2Nlc3MgdGhlIGRlbGF5ZWQgcXVldWUuCisgICAgLy8gRklYTUU6IEZvciBu
b3csIHdlIGNhbiBvbmx5IHBvc3QgdG8gbWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3Rp
bmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBmaXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdv
cmtlci4KKyAgICBpZiAoIW1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQpIHsKKyAgICAgICAg
bV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCA9IHRydWU7CisgICAgICAgIGlmIChpc01haW5U
aHJlYWQoKSkKKyAgICAgICAgICAgIFdURjo6Y2FsbE9uTWFpblRocmVhZCgmZGVyZWZEZWxheWVk
T2JqZWN0c0luQ3VycmVudFRocmVhZCwgMCk7CiAgICAgfQogfQogCkBAIC00MTQsNjUgKzQ5Myw0
MyBAQA0KIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0
LT5Jc09iamVjdCgpKTsKLQotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0g
VjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2
OE9iamVjdCkpOwotCi0gICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4mIG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50
ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+Jj4oZ2V0RE9NT2JqZWN0TWFwKCkpOwotICAgIGlmICht
YXAuY29udGFpbnMoZG9tT2JqZWN0KSkgewotICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9u
IHJlbW92ZXMgb2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCi0g
ICAgICAgIG1hcC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBl
KSB7Ci0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAotICAgICAgICAgICAgY2FzZSBW
OENsYXNzSW5kZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigp
OyBicmVhazsKLSAgICAgICAgRE9NX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkKLSN1bmRlZiBNYWtl
Q2FzZQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBoYW5k
bGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01PYmpl
Y3RNYXAsIHR5cGUsIGRvbU9iamVjdCk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChE
T01EYXRhU3RvcmU6OkRPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2
OE9iamVjdCksIGRvbU9iamVjdCk7CiB9CiAKIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxi
YWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkK
IHsKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09i
amVjdCgpKTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6QWN0
aXZlRE9NT2JqZWN0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwg
ZG9tT2JqZWN0KTsKK30KIAotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0g
VjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2
OE9iamVjdCkpOworc3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0
YTo6aGFuZGxlV2Vha09iamVjdDxOb2RlPihET01EYXRhU3RvcmU6OkRPTU5vZGVNYXAsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0aWNfY2FzdDxOb2RlKj4oZG9t
T2JqZWN0KSk7Cit9CiAKLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3Jh
cHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJ
bnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRBY3RpdmVET01PYmplY3RNYXAoKSk7Ci0g
ICAgaWYgKG1hcC5jb250YWlucyhkb21PYmplY3QpKSB7Ci0gICAgICAgIC8vIFRoZSBmb3JnZXQg
ZnVuY3Rpb24gcmVtb3ZlcyBvYmplY3QgZnJvbSB0aGUgbWFwIGFuZCBkaXNwb3NlcyB0aGUgd3Jh
cHBlci4KLSAgICAgICAgbWFwLmZvcmdldE9ubHkoZG9tT2JqZWN0KTsKKyNpZiBFTkFCTEUoU1ZH
KQogCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotI2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1l
KSAgIFwKLSAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBzdGF0aWNfY2FzdDxu
YW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7Ci0gICAgICAgIEFDVElWRV9ET01fT0JK
RUNUX1RZUEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNlCi0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVh
ZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkFjdGl2ZURPTU9iamVjdE1hcCwgdHlwZSwgZG9tT2Jq
ZWN0KTsKK3N0YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayh2ODo6UGVy
c2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgdjg6
OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7Cisg
ICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVNWR0VsZW1lbnRJ
bnN0YW5jZU1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIHN0YXRp
Y19jYXN0PFNWR0VsZW1lbnRJbnN0YW5jZSo+KGRvbU9iamVjdCkpOwogfQogCi1zdGF0aWMgdm9p
ZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZv
aWQqIGRvbU9iamVjdCkKK3N0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxi
YWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkK
IHsKLSAgICBOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCk7Ci0KLSAg
ICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiYgbWFw
ID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJN
YXA8Tm9kZT4mPihnZXRET01Ob2RlTWFwKCkpOwotICAgIGlmIChtYXAuY29udGFpbnMobm9kZSkp
IHsKLSAgICAgICAgbWFwLmZvcmdldE9ubHkobm9kZSk7Ci0gICAgICAgIG5vZGUtPmRlcmVmKCk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZDxOb2Rl
PihUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTU5vZGVNYXAsIFY4Q2xhc3NJbmRleDo6Tk9ERSwg
bm9kZSk7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+
SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6
OkRPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0
KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVyZWZPYmplY3QoVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKKyNlbmRpZiAg
Ly8gRU5BQkxFKFNWRykKKworLy8gc3RhdGljCit2b2lkIERPTURhdGE6OmRlcmVmT2JqZWN0KFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCiB7CiAgICAg
c3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREU6CkBAIC01MDMsMjYg
KzU2MCwyNyBAQA0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHMo
KQordm9pZCBET01EYXRhOjpkZXJlZkRlbGF5ZWRPYmplY3RzKCkKIHsKLSAgICBXVEY6Ok11dGV4
TG9ja2VyIGxvY2tlcihkb21EYXRhTGlzdE11dGV4KCkpOworICAgIFdURjo6TXV0ZXhMb2NrZXIg
bG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CiAKLSAgICBnZXRUaHJlYWRT
cGVjaWZpY0RPTURhdGEoKS5zZXREZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZChmYWxzZSk7Cisg
ICAgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCA9IGZhbHNlOwogCi0gICAgVGhyZWFkU3Bl
Y2lmaWNET01EYXRhOjpEZWxheWVkT2JqZWN0TWFwJiBkZWxheWVkT2JqZWN0TWFwID0gZ2V0VGhy
ZWFkU3BlY2lmaWNET01EYXRhKCkuZGVsYXllZE9iamVjdE1hcCgpOwotICAgIGZvciAoVGhyZWFk
U3BlY2lmaWNET01EYXRhOjpEZWxheWVkT2JqZWN0TWFwOjppdGVyYXRvciBpdGVyKGRlbGF5ZWRP
YmplY3RNYXAuYmVnaW4oKSk7IGl0ZXIgIT0gZGVsYXllZE9iamVjdE1hcC5lbmQoKTsgKytpdGVy
KSB7CisgICAgZm9yIChEZWxheWVkT2JqZWN0TWFwOjppdGVyYXRvciBpdGVyKG1fZGVsYXllZE9i
amVjdE1hcC5iZWdpbigpKTsgaXRlciAhPSBtX2RlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsraXRl
cikKICAgICAgICAgZGVyZWZPYmplY3QoaXRlci0+c2Vjb25kLCBpdGVyLT5maXJzdCk7Ci0gICAg
fQotICAgIGRlbGF5ZWRPYmplY3RNYXAuY2xlYXIoKTsKKworICAgIG1fZGVsYXllZE9iamVjdE1h
cC5jbGVhcigpOwogfQogCi1zdGF0aWMgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50
VGhyZWFkKHZvaWQqKQorLy8gc3RhdGljCit2b2lkIERPTURhdGE6OmRlcmVmRGVsYXllZE9iamVj
dHNJbkN1cnJlbnRUaHJlYWQodm9pZCopCiB7Ci0gICAgZGVyZWZEZWxheWVkT2JqZWN0cygpOwor
ICAgIGdldEN1cnJlbnQoKS0+ZGVyZWZEZWxheWVkT2JqZWN0cygpOwogfQogCisvLyBzdGF0aWMK
IHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCByZW1vdmVPYmplY3RzRnJvbVdyYXBw
ZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFwKQordm9pZCBET01EYXRhOjpyZW1vdmVPYmpl
Y3RzRnJvbVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFwKQogewogICAgIGZvciAo
dHlwZW5hbWUgV1RGOjpIYXNoTWFwPFQqLCB2ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXIoZG9t
TWFwLmltcGwoKS5iZWdpbigpKTsgaXRlciAhPSBkb21NYXAuaW1wbCgpLmVuZCgpOyArK2l0ZXIp
IHsKICAgICAgICAgVCogZG9tT2JqZWN0ID0gc3RhdGljX2Nhc3Q8VCo+KGl0ZXItPmZpcnN0KTsK
QEAgLTU0NCwyMyArNjAyLDIzIEBADQogICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKIAogICAg
IC8vIERlcmVmIGFsbCBvYmplY3RzIGluIHRoZSBkZWxheWVkIHF1ZXVlLgotICAgIGRlcmVmRGVs
YXllZE9iamVjdHMoKTsKKyAgICBET01EYXRhOjpnZXRDdXJyZW50KCktPmRlcmVmRGVsYXllZE9i
amVjdHMoKTsKIAogICAgIC8vIFJlbW92ZSBhbGwgRE9NIG5vZGVzLgotICAgIHJlbW92ZU9iamVj
dHNGcm9tV3JhcHBlck1hcDxOb2RlPihnZXRET01Ob2RlTWFwKCkpOworICAgIERPTURhdGE6OnJl
bW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDxOb2RlPihnZXRET01Ob2RlTWFwKCkpOwogCiAgICAg
Ly8gUmVtb3ZlIGFsbCBET00gb2JqZWN0cyBpbiB0aGUgd3JhcHBlciBtYXAuCi0gICAgcmVtb3Zl
T2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldERPTU9iamVjdE1hcCgpKTsKKyAgICBET01E
YXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8dm9pZD4oZ2V0RE9NT2JqZWN0TWFwKCkp
OwogCiAgICAgLy8gUmVtb3ZlIGFsbCBhY3RpdmUgRE9NIG9iamVjdHMgaW4gdGhlIHdyYXBwZXIg
bWFwLgotICAgIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDx2b2lkPihnZXRBY3RpdmVET01P
YmplY3RNYXAoKSk7CisgICAgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZv
aWQ+KGdldEFjdGl2ZURPTU9iamVjdE1hcCgpKTsKIAogI2lmIEVOQUJMRShTVkcpCiAgICAgLy8g
UmVtb3ZlIGFsbCBTVkcgZWxlbWVudCBpbnN0YW5jZXMgaW4gdGhlIHdyYXBwZXIgbWFwLgotICAg
IHJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+KGdldERPTVNW
R0VsZW1lbnRJbnN0YW5jZU1hcCgpKTsKKyAgICBET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdy
YXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPihnZXRET01TVkdFbGVtZW50SW5zdGFuY2VNYXAo
KSk7CiAKICAgICAvLyBSZW1vdmUgYWxsIFNWRyBvYmplY3RzIHdpdGggY29udGV4dCBpbiB0aGUg
d3JhcHBlciBtYXAuCi0gICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldERP
TVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkpOworICAgIERPTURhdGE6OnJlbW92ZU9iamVjdHNG
cm9tV3JhcHBlck1hcDx2b2lkPihnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKICNl
bmRpZgogfQogCkBAIC01NzQsNCArNjMyLDg5IEBADQogICAgICAgICByZW1vdmVBbGxET01PYmpl
Y3RzSW5DdXJyZW50VGhyZWFkSGVscGVyKCk7CiB9CiAKKwordm9pZCB2aXNpdERPTU5vZGVzSW5D
dXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8Tm9kZT46OlZpc2l0b3IqIHZpc2l0b3IpIHsKKyAg
ICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihE
T01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFMaXN0JiBsaXN0ID0g
RE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxp
c3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBzdG9yZSA9IGxpc3RbaV07
CisgICAgICAgIGlmICghc3RvcmUtPmRvbURhdGEoKS0+b3duaW5nVGhyZWFkKCkgPT0gV1RGOjpj
dXJyZW50VGhyZWFkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBIYXNoTWFw
PE5vZGUqLCB2ODo6T2JqZWN0Kj4mIG1hcCA9IHN0b3JlLT5kb21Ob2RlTWFwKCkuaW1wbCgpOwor
ICAgICAgICBmb3IgKEhhc2hNYXA8Tm9kZSosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXQgPSBt
YXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0KQorICAgICAgICAgICAgdmlzaXRvci0+
dmlzaXRET01XcmFwcGVyKGl0LT5maXJzdCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQt
PnNlY29uZCkpOworICAgIH0KK30KKwordm9pZCB2aXNpdERPTU9iamVjdHNJbkN1cnJlbnRUaHJl
YWQoRE9NV3JhcHBlck1hcDx2b2lkPjo6VmlzaXRvciogdmlzaXRvcikgeworICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKKworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9y
ZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CisgICAgRE9NRGF0YUxpc3QmIGxpc3QgPSBET01EYXRhU3Rv
cmU6OmFsbFN0b3JlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7
ICsraSkgeworICAgICAgICBET01EYXRhU3RvcmUqIHN0b3JlID0gbGlzdFtpXTsKKyAgICAgICAg
aWYgKCFzdG9yZS0+ZG9tRGF0YSgpLT5vd25pbmdUaHJlYWQoKSA9PSBXVEY6OmN1cnJlbnRUaHJl
YWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIEhhc2hNYXA8dm9pZCosIHY4
OjpPYmplY3QqPiAmIG1hcCA9IHN0b3JlLT5kb21PYmplY3RNYXAoKS5pbXBsKCk7CisgICAgICAg
IGZvciAoSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBpdCA9IG1hcC5iZWdp
bigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpCisgICAgICAgICAgICB2aXNpdG9yLT52aXNpdERP
TVdyYXBwZXIoaXQtPmZpcnN0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+c2Vjb25k
KSk7CisgICAgfQorfQorCit2b2lkIHZpc2l0QWN0aXZlRE9NT2JqZWN0c0luQ3VycmVudFRocmVh
ZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNpdG9yKiB2aXNpdG9yKSB7CisgICAgdjg6OkhhbmRs
ZVNjb3BlIHNjb3BlOworCisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3Jl
OjphbGxTdG9yZXNNdXRleCgpKTsKKyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9y
ZTo6YWxsU3RvcmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsg
KytpKSB7CisgICAgICAgIERPTURhdGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBp
ZiAoIXN0b3JlLT5kb21EYXRhKCktPm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVh
ZCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgSGFzaE1hcDx2b2lkKiwgdjg6
Ok9iamVjdCo+JiBtYXAgPSBzdG9yZS0+YWN0aXZlRG9tT2JqZWN0TWFwKCkuaW1wbCgpOworICAg
ICAgICBmb3IgKEhhc2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXQgPSBtYXAu
YmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0KQorICAgICAgICAgICAgdmlzaXRvci0+dmlz
aXRET01XcmFwcGVyKGl0LT5maXJzdCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNl
Y29uZCkpOworICAgIH0KK30KKworI2lmIEVOQUJMRShTVkcpCisKK3ZvaWQgdmlzaXRET01TVkdF
bGVtZW50SW5zdGFuY2VzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudElu
c3RhbmNlPjo6VmlzaXRvciogdmlzaXRvcikgeworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsK
KworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0
ZXgoKSk7CisgICAgRE9NRGF0YUxpc3QmIGxpc3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3Jlcygp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAg
ICBET01EYXRhU3RvcmUqIHN0b3JlID0gbGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdG9yZS0+ZG9t
RGF0YSgpLT5vd25pbmdUaHJlYWQoKSA9PSBXVEY6OmN1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIEhhc2hNYXA8U1ZHRWxlbWVudEluc3RhbmNlKiwgdjg6
Ok9iamVjdCo+ICYgbWFwID0gc3RvcmUtPmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpLmltcGwo
KTsKKyAgICAgICAgZm9yIChIYXNoTWFwPFNWR0VsZW1lbnRJbnN0YW5jZSosIHY4OjpPYmplY3Qq
Pjo6aXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0KQorICAg
ICAgICAgICAgdmlzaXRvci0+dmlzaXRET01XcmFwcGVyKGl0LT5maXJzdCwgdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCkpOworICAgIH0KK30KKwordm9pZCB2aXNpdFNWR09i
amVjdHNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDx2b2lkPjo6VmlzaXRvciogdmlzaXRv
cikgeworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKworICAgIFdURjo6TXV0ZXhMb2NrZXIg
bG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CisgICAgRE9NRGF0YUxpc3Qm
IGxpc3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBET01EYXRhU3RvcmUqIHN0b3JlID0g
bGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdG9yZS0+ZG9tRGF0YSgpLT5vd25pbmdUaHJlYWQoKSA9
PSBXVEY6OmN1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
IEhhc2hNYXA8dm9pZCosIHY4OjpPYmplY3QqPiYgbWFwID0gc3RvcmUtPmRvbVN2Z09iamVjdFdp
dGhDb250ZXh0TWFwKCkuaW1wbCgpOworICAgICAgICBmb3IgKEhhc2hNYXA8dm9pZCosIHY4OjpP
YmplY3QqPjo6aXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0
KQorICAgICAgICAgICAgdmlzaXRvci0+dmlzaXRET01XcmFwcGVyKGl0LT5maXJzdCwgdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCkpOworICAgIH0KK30KKworI2VuZGlmCisK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="15928"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31319</attachid>
            <date>2009-06-15 16:46:28 -0700</date>
            <delta_ts>2009-06-22 01:49:32 -0700</delta_ts>
            <desc>updated patch</desc>
            <filename>upstreamnewworld.patch</filename>
            <type>text/plain</type>
            <size>34604</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuaA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGJp
bmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuaAkocmV2aXNpb24gNDQ2NjgpDQorKysgYmluZGlu
Z3MvdjgvU2NyaXB0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpDQpAQCAtNjQsNiArNjQsMTIg
QEANCiAgICAgICAgIC8vIGFzIGEgc3RyaW5nLgogICAgICAgICBTY3JpcHRWYWx1ZSBldmFsdWF0
ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJik7CiAKKyAgICAgICAgLy8gRXhlY3V0ZXMgSmF2YVNj
cmlwdCBpbiBhIG5ldyB3b3JsZCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYiBmcmFtZS4gVGhlCisg
ICAgICAgIC8vIHNjcmlwdCBnZXRzIGl0cyBvd24gZ2xvYmFsIHNjb3BlLCBpdHMgb3duIHByb3Rv
dHlwZXMgZm9yIGludHJpbnNpYworICAgICAgICAvLyBKYXZhU2NyaXB0IG9iamVjdHMgKFN0cmlu
ZywgQXJyYXksIGFuZCBzby1vbiksIGFuZCBpdHMgb3duIHdyYXBwZXJzIGZvcgorICAgICAgICAv
LyBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgorICAgICAgICB2b2lkIGV2YWx1
YXRlSW5OZXdXb3JsZChjb25zdCBWZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mKTsKKwogICAgICAg
ICAvLyBFeGVjdXRlcyBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRleHQgYXNzb2NpYXRlZCB3aXRo
IHRoZSB3ZWIgZnJhbWUuIFRoZQogICAgICAgICAvLyBzY3JpcHQgZ2V0cyBpdHMgb3duIGdsb2Jh
bCBzY29wZSBhbmQgaXRzIG93biBwcm90b3R5cGVzIGZvciBpbnRyaW5zaWMKICAgICAgICAgLy8g
SmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcsIEFycmF5LCBhbmQgc28tb24pLiBJdCBzaGFyZXMg
dGhlIHdyYXBwZXJzIGZvcgpJbmRleDogYmluZGluZ3MvdjgvVjhET01NYXAuaA0KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQ0KLS0tIGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmgJKHJldmlzaW9uIDQ0NjY4KQ0KKysrIGJpbmRp
bmdzL3Y4L1Y4RE9NTWFwLmgJKHdvcmtpbmcgY29weSkNCkBAIC0zMiw2ICszMiw3IEBADQogI2Rl
ZmluZSBWOERPTU1hcF9oCiAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx2OC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC04
OSwyMyArOTAsNDUgQEANCiAgICAgICAgIHY4OjpXZWFrUmVmZXJlbmNlQ2FsbGJhY2sgbV93ZWFr
UmVmZXJlbmNlQ2FsbGJhY2s7CiAgICAgfTsKIAotCiAgICAgdGVtcGxhdGUgPGNsYXNzIEtleVR5
cGU+IGNsYXNzIERPTVdyYXBwZXJNYXAgOiBwdWJsaWMgV2Vha1JlZmVyZW5jZU1hcDxLZXlUeXBl
LCB2ODo6T2JqZWN0PiB7CiAgICAgcHVibGljOgogICAgICAgICBET01XcmFwcGVyTWFwKHY4OjpX
ZWFrUmVmZXJlbmNlQ2FsbGJhY2sgY2FsbGJhY2spIDogV2Vha1JlZmVyZW5jZU1hcDxLZXlUeXBl
LCB2ODo6T2JqZWN0PihjYWxsYmFjaykgeyB9CisKKyAgICAgICAgY2xhc3MgVmlzaXRvciB7Cisg
ICAgICAgIHB1YmxpYzoKKyAgICAgICAgICB2aXJ0dWFsIHZvaWQgdmlzaXRET01XcmFwcGVyKEtl
eVR5cGUqIGtleSwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gb2JqZWN0KSA9IDA7CisgICAg
ICAgIH07CiAgICAgfTsKIAorICAgIC8vIEFuIG9wYXF1ZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMg
YSBzZXQgb2YgRE9NIHdyYXBwZXJzLgorICAgIGNsYXNzIERPTURhdGFTdG9yZTsKKworICAgIC8v
IEEgdXRpbGl0eSBjbGFzcyB0byBtYW5hZ2UgdGhlIGxpZmV0aW1lIG9mIHNldCBvZiBET00gd3Jh
cHBlcnMuCisgICAgY2xhc3MgRE9NRGF0YVN0b3JlSGFuZGxlIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIERPTURhdGFTdG9yZUhhbmRsZSgpOworICAgICAgICB+RE9NRGF0YVN0b3JlSGFuZGxlKCk7
CisKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBnZXRTdG9yZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3Rv
cmUuZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIE93blB0cjxET01EYXRhU3RvcmU+
IG1fc3RvcmU7CisgICAgfTsKKwogICAgIC8vIENhbGxiYWNrIHdoZW4gSlMgd3JhcHBlciBvZiBh
Y3RpdmUgRE9NIG9iamVjdCBpcyBkZWFkLgogICAgIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVj
dCk7CiAKICAgICAvLyBBIG1hcCBmcm9tIERPTSBub2RlIHRvIGl0cyBKUyB3cmFwcGVyLgogICAg
IERPTVdyYXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAoKTsKKyAgICB2b2lkIHZpc2l0RE9N
Tm9kZXNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDxOb2RlPjo6VmlzaXRvciopOwogCiAg
ICAgLy8gQSBtYXAgZnJvbSBhIERPTSBvYmplY3QgKG5vbi1ub2RlKSB0byBpdHMgSlMgd3JhcHBl
ci4gVGhpcyBtYXAgZG9lcyBub3QgY29udGFpbiB0aGUgRE9NIG9iamVjdHMgd2hpY2ggY2FuIGhh
dmUgcGVuZGluZyBhY3Rpdml0eSAoYWN0aXZlIGRvbSBvYmplY3RzKS4KICAgICBET01XcmFwcGVy
TWFwPHZvaWQ+JiBnZXRET01PYmplY3RNYXAoKTsKKyAgICB2b2lkIHZpc2l0RE9NT2JqZWN0c0lu
Q3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNpdG9yKik7CiAKICAgICAvLyBB
IG1hcCBmcm9tIGEgRE9NIG9iamVjdCB0byBpdHMgSlMgd3JhcHBlciBmb3IgRE9NIG9iamVjdHMg
d2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eS4KICAgICBET01XcmFwcGVyTWFwPHZvaWQ+
JiBnZXRBY3RpdmVET01PYmplY3RNYXAoKTsKKyAgICB2b2lkIHZpc2l0QWN0aXZlRE9NT2JqZWN0
c0luQ3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNpdG9yKik7CiAKICAgICAv
LyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgdG8gcmVtb3ZlIGFsbCBET00gb2JqZWN0cyBhc3NvY2lh
dGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkIHdoZW4gaXQgaXMgdGVhcmluZyBkb3duLgogICAg
IHZvaWQgcmVtb3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZCgpOwpAQCAtMTEzLDkgKzEz
NiwxMSBAQA0KICNpZiBFTkFCTEUoU1ZHKQogICAgIC8vIEEgbWFwIGZvciBTVkdFbGVtZW50SW5z
dGFuY2VzIHRvIGl0cyBKUyB3cmFwcGVyLgogICAgIERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudElu
c3RhbmNlPiYgZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCk7CisgICAgdm9pZCB2aXNpdFNW
R0VsZW1lbnRJbnN0YW5jZXNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50
SW5zdGFuY2U+OjpWaXNpdG9yKik7CiAKICAgICAvLyBNYXAgb2YgU1ZHIG9iamVjdHMgd2l0aCBj
b250ZXh0cyB0byBWOCBvYmplY3RzLgogICAgIERPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTVNW
R09iamVjdFdpdGhDb250ZXh0TWFwKCk7CisgICAgdm9pZCB2aXNpdERPTVNWR09iamVjdHNJbkN1
cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDx2b2lkPjo6VmlzaXRvciopOwogI2VuZGlmCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIu
Y3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09DQotLS0gYmluZGluZ3MvdjgvU2NyaXB0Q29udHJvbGxlci5jcHAJKHJl
dmlzaW9uIDQ0NjY4KQ0KKysrIGJpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpDQpAQCAtMTc4LDYgKzE3OCwxMSBAQA0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAK
K3ZvaWQgU2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbk5ld1dvcmxkKGNvbnN0IFZlY3RvcjxT
Y3JpcHRTb3VyY2VDb2RlPiYgc291cmNlcykKK3sKKyAgICBtX3Byb3h5LT5ldmFsdWF0ZUluTmV3
V29ybGQoc291cmNlcyk7Cit9CisKIHZvaWQgU2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbk5l
d0NvbnRleHQoY29uc3QgVmVjdG9yPFNjcmlwdFNvdXJjZUNvZGU+JiBzb3VyY2VzKQogewogICAg
IG1fcHJveHktPmV2YWx1YXRlSW5OZXdDb250ZXh0KHNvdXJjZXMpOwpJbmRleDogYmluZGluZ3Mv
djgvVjhET01NYXAuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gYmluZGluZ3MvdjgvVjhET01NYXAuY3Bw
CShyZXZpc2lvbiA0NDY2OCkNCisrKyBiaW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHdvcmtpbmcg
Y29weSkNCkBAIC00Miw2ICs0Miw4IEBADQogI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5o
PgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAorI2luY2x1ZGUgInY4X2lzb2xhdGVkX3dvcmxk
LmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogLy8gRE9NIGJpbmRpbmcgYWxnb3JpdGhtOgpA
QCAtOTAsMzggKzkyLDI5IEBADQogLy8gICAgYWxsIG9iamVjdHMgaW4gdGhlIGRlbGF5ZWQgcXVl
dWUgYW5kIHRoZSB0aHJlYWQgbWFwIGFuZCBkZXJlZiBhbGwgb2YKIC8vICAgIHRoZW0uCiAKK3N0
YXRpYyB2b2lkIHdlYWtOb2RlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9i
amVjdCwgdm9pZCogZG9tT2JqZWN0KTsKIHN0YXRpYyB2b2lkIHdlYWtET01PYmplY3RDYWxsYmFj
ayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwot
c3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4
T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwotCit2b2lkIHdlYWtBY3RpdmVET01PYmplY3RDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3Qp
OwogI2lmIEVOQUJMRShTVkcpCiBzdGF0aWMgdm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2Fs
bGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0
KTsKLQogLy8gU1ZHIG5vbi1ub2RlIGVsZW1lbnRzIG1heSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEg
Y29udGV4dCBub2RlIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbGVtZW50IGlz
IGNoYW5nZS4KIHN0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CiAjZW5k
aWYKIAotLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmplY3Rz
IGZyb20gdGhlIG93bmluZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkLgotLy8gVGhlIGhlbHBl
ciBmdW5jdGlvbiB3aWxsIGJlIHNjaGVkdWxlZCBieSB0aGUgR0MgdGhyZWFkIHRvIGdldCBjYWxs
ZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KLXN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVj
dHNJbkN1cnJlbnRUaHJlYWQodm9pZCopOworY2xhc3MgRE9NRGF0YTsKK2NsYXNzIERPTURhdGFT
dG9yZTsKK3R5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YUxpc3Q7CiAK
LS8vIEEgbGlzdCBvZiBhbGwgVGhyZWFkU3BlY2lmaWMgRE9NIERhdGEgb2JqZWN0cy4gVHJhdmVy
c2VkIGR1cmluZyBHQyB0byBmaW5kIGEgdGhyZWFkLXNwZWNpZmljIG1hcCB0aGF0Ci0vLyBjb250
YWlucyB0aGUgb2JqZWN0IC0gc28gd2UgY2FuIHNjaGVkdWxlIHRoZSBvYmplY3QgdG8gYmUgZGVs
ZXRlZCBvbiB0aGUgdGhyZWFkIHdoaWNoIGNyZWF0ZWQgaXQuCi1jbGFzcyBUaHJlYWRTcGVjaWZp
Y0RPTURhdGE7Ci10eXBlZGVmIFdURjo6VmVjdG9yPFRocmVhZFNwZWNpZmljRE9NRGF0YSo+IERP
TURhdGFMaXN0Owotc3RhdGljIERPTURhdGFMaXN0JiBkb21EYXRhTGlzdCgpCi17Ci0gICAgREVG
SU5FX1NUQVRJQ19MT0NBTChET01EYXRhTGlzdCwgc3RhdGljRE9NRGF0YUxpc3QsICgpKTsKLSAg
ICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3Q7Ci19Ci0KLS8vIE11dGV4IHRvIHByb3RlY3QgYWdh
aW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBET01EYXRhTGlzdC4KLXN0YXRpYyBXVEY6Ok11dGV4
JiBkb21EYXRhTGlzdE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdURjo6TXV0
ZXgsIHN0YXRpY0RPTURhdGFMaXN0TXV0ZXgsICgpKTsKLSAgICByZXR1cm4gc3RhdGljRE9NRGF0
YUxpc3RNdXRleDsKLX0KLQotY2xhc3MgVGhyZWFkU3BlY2lmaWNET01EYXRhIDogTm9uY29weWFi
bGUgeworLy8gRE9NRGF0YVN0b3JlCisvLworLy8gRE9NRGF0YVN0b3JlIGlzIHRoZSBiYWNraW5n
IHN0b3JlIHRoYXQgaG9sZHMgdGhlIG1hcHMgYmV0d2VlbiBET00gb2JqZWN0cworLy8gYW5kIEph
dmFTY3JpcHQgb2JqZWN0cy4gIEluIGdlbmVyYWwsIGVhY2ggdGhyZWFkIGNhbiBoYXZlIG11bHRp
cGxlIGJhY2tpbmcKKy8vIHN0b3Jlcywgb25lIHBlciBpc29sYXRlZCB3b3JsZC4KKy8vCisvLyBU
aGlzIGNsYXNzIGRvZXNuJ3QgbWFuYWdlIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUuICBUaGUg
ZGF0YSBzdG9yZQorLy8gbGlmZXRpbWUgaXMgbWFuYWdlZCBieSBzdWJjbGFzc2VzLgorLy8KK2Ns
YXNzIERPTURhdGFTdG9yZSA6IE5vbmNvcHlhYmxlIHsKIHB1YmxpYzoKICAgICBlbnVtIERPTVdy
YXBwZXJNYXBUeXBlIHsKICAgICAgICAgRE9NTm9kZU1hcCwKQEAgLTEzMywxMyArMTI2LDEyIEBA
DQogI2VuZGlmCiAgICAgfTsKIAotICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7Ci0KICAgICB0ZW1wbGF0
ZSA8Y2xhc3MgS2V5VHlwZT4KICAgICBjbGFzcyBJbnRlcm5hbERPTVdyYXBwZXJNYXAgOiBwdWJs
aWMgRE9NV3JhcHBlck1hcDxLZXlUeXBlPiB7CiAgICAgcHVibGljOgotICAgICAgICBJbnRlcm5h
bERPTVdyYXBwZXJNYXAodjg6OldlYWtSZWZlcmVuY2VDYWxsYmFjayBjYWxsYmFjaykKLSAgICAg
ICAgICAgIDogRE9NV3JhcHBlck1hcDxLZXlUeXBlPihjYWxsYmFjaykgeyB9CisgICAgICAgIElu
dGVybmFsRE9NV3JhcHBlck1hcChET01EYXRhKiBkb21EYXRhLCB2ODo6V2Vha1JlZmVyZW5jZUNh
bGxiYWNrIGNhbGxiYWNrKQorICAgICAgICAgICAgOiBET01XcmFwcGVyTWFwPEtleVR5cGU+KGNh
bGxiYWNrKQorICAgICAgICAgICAgLCBtX2RvbURhdGEoZG9tRGF0YSkgeyB9CiAKICAgICAgICAg
dmlydHVhbCB2b2lkIGZvcmdldChLZXlUeXBlKik7CiAKQEAgLTE0NywyOSArMTM5LDMxIEBADQog
ICAgICAgICB7CiAgICAgICAgICAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3JnZXQob2Jq
ZWN0KTsKICAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRE9NRGF0YSogbV9kb21E
YXRhOwogICAgIH07CiAKLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGEoKQotICAgICAgICA6IG1f
ZG9tTm9kZU1hcCgwKQotICAgICAgICAsIG1fZG9tT2JqZWN0TWFwKDApCi0gICAgICAgICwgbV9h
Y3RpdmVEb21PYmplY3RNYXAoMCkKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAsIG1fZG9tU3Zn
RWxlbWVudEluc3RhbmNlTWFwKDApCi0gICAgICAgICwgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcCgwKQotI2VuZGlmCi0gICAgICAgICwgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZChm
YWxzZSkKLSAgICAgICAgLCBtX2lzTWFpblRocmVhZChXVEY6OmlzTWFpblRocmVhZCgpKQorICAg
IC8vIEEgbGlzdCBvZiBhbGwgRE9NRGF0YVN0b3JlIG9iamVjdHMuICBUcmF2ZXJzZWQgZHVyaW5n
IEdDIHRvIGZpbmQgYSB0aHJlYWQtc3BlY2lmaWMgbWFwIHRoYXQKKyAgICAvLyBjb250YWlucyB0
aGUgb2JqZWN0IC0gc28gd2UgY2FuIHNjaGVkdWxlIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZCBv
biB0aGUgdGhyZWFkIHdoaWNoIGNyZWF0ZWQgaXQuCisgICAgc3RhdGljIERPTURhdGFMaXN0JiBh
bGxTdG9yZXMoKQogICAgIHsKLSAgICAgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoZG9tRGF0
YUxpc3RNdXRleCgpKTsKLSAgICAgICAgZG9tRGF0YUxpc3QoKS5hcHBlbmQodGhpcyk7CisgICAg
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoRE9NRGF0YUxpc3QsIHN0YXRpY0RPTURhdGFMaXN0LCAo
KSk7CisgICAgICAgIHJldHVybiBzdGF0aWNET01EYXRhTGlzdDsKICAgICB9CiAKLSAgICB2aXJ0
dWFsIH5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgIC8vIE11dGV4IHRvIHByb3RlY3QgYWdh
aW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBET01EYXRhTGlzdC4KKyAgICBzdGF0aWMgV1RGOjpN
dXRleCYgYWxsU3RvcmVzTXV0ZXgoKQogICAgIHsKLSAgICAgICAgV1RGOjpNdXRleExvY2tlciBs
b2NrZXIoZG9tRGF0YUxpc3RNdXRleCgpKTsKLSAgICAgICAgZG9tRGF0YUxpc3QoKS5yZW1vdmUo
ZG9tRGF0YUxpc3QoKS5maW5kKHRoaXMpKTsKKyAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChX
VEY6Ok11dGV4LCBzdGF0aWNET01EYXRhTGlzdE11dGV4LCAoKSk7CisgICAgICAgIHJldHVybiBz
dGF0aWNET01EYXRhTGlzdE11dGV4OwogICAgIH0KIAorICAgIERPTURhdGFTdG9yZShET01EYXRh
KiBkb21EYXRhKTsKKyAgICB2aXJ0dWFsIH5ET01EYXRhU3RvcmUoKTsKKworICAgIERPTURhdGEq
IGRvbURhdGEoKSBjb25zdCB7IHJldHVybiBtX2RvbURhdGE7IH0KKwogICAgIHZvaWQqIGdldERP
TVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcFR5cGUgdHlwZSkKICAgICB7CiAgICAgICAgIHN3aXRj
aCAodHlwZSkgewpAQCAtMTk5LDExICsxOTMsNiBAQA0KICAgICBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4mIGRvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKCkgeyByZXR1cm4gKm1fZG9tU3Zn
T2JqZWN0V2l0aENvbnRleHRNYXA7IH0KICNlbmRpZgogCi0gICAgRGVsYXllZE9iamVjdE1hcCYg
ZGVsYXllZE9iamVjdE1hcCgpIHsgcmV0dXJuIG1fZGVsYXllZE9iamVjdE1hcDsgfQotICAgIGJv
b2wgZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoKSBjb25zdCB7IHJldHVybiBtX2RlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkOyB9Ci0gICAgdm9pZCBzZXREZWxheWVkUHJvY2Vzc2luZ1NjaGVk
dWxlZChib29sIHZhbHVlKSB7IG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQgPSB2YWx1ZTsg
fQotICAgIGJvb2wgaXNNYWluVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbV9pc01haW5UaHJlYWQ7
IH0KLQogcHJvdGVjdGVkOgogICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiogbV9kb21O
b2RlTWFwOwogICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9kb21PYmplY3RNYXA7
CkBAIC0yMTMsMzIgKzIwMiwzNCBAQA0KICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4q
IG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CiAjZW5kaWYKIAotICAgIC8vIFN0b3JlcyBh
bGwgdGhlIERPTSBvYmplY3RzIHRoYXQgYXJlIGRlbGF5ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4g
dGhlIG93bmluZyB0aHJlYWQgZ2FpbnMgY29udHJvbC4KLSAgICBEZWxheWVkT2JqZWN0TWFwIG1f
ZGVsYXllZE9iamVjdE1hcDsKLQotICAgIC8vIFRoZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB0
YXNrIHRvIGRvIHRoZSBkZWxheWVkIHByb2Nlc3MgaGFzIGFscmVhZHkgYmVlbiBwb3N0ZWQuCi0g
ICAgYm9vbCBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkOwotCi0gICAgYm9vbCBtX2lzTWFp
blRocmVhZDsKK3ByaXZhdGU6CisgICAgLy8gQSBiYWNrLXBvaW50ZXIgdG8gdGhlIERPTURhdGEg
dG8gd2hpY2ggd2UgYmVsb25nLgorICAgIERPTURhdGEqIG1fZG9tRGF0YTsKIH07CiAKLS8vIFRo
aXMgZW5jYXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3Igbm9uLW1haW4gdGhy
ZWFkLiBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIGNyZWF0ZWQgZHluYW1pY2FsbHkuCi1jbGFzcyBO
b25NYWluVGhyZWFkU3BlY2lmaWNET01EYXRhIDogcHVibGljIFRocmVhZFNwZWNpZmljRE9NRGF0
YSB7CisvLyBTY29wZWRET01EYXRhU3RvcmUKKy8vCisvLyBTY29wZWRET01EYXRhU3RvcmUgaXMg
YSBET01EYXRhU3RvcmUgdGhhdCBjb250cm9scyBsaW1pdHMgdGhlIGxpZmV0aW1lIG9mCisvLyB0
aGUgc3RvcmUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgSW4gb3RoZXIg
d29yZHMsIHdoZW4gdGhlCisvLyBTY29wZWRET01EYXRhU3RvcmUgb2JqZWN0IGlzIGRlYWxsb2Nh
dGVkLCB0aGUgbWFwcyB0aGF0IGJlbG9uZyB0byB0aGUgc3RvcmUKKy8vIGFyZSBkZWFsbG9jYXRl
ZCBhcyB3ZWxsLgorLy8KK2NsYXNzIFNjb3BlZERPTURhdGFTdG9yZSA6IHB1YmxpYyBET01EYXRh
U3RvcmUgewogcHVibGljOgotICAgIE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAg
IFNjb3BlZERPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKSA6IERPTURhdGFTdG9yZShkb21E
YXRhKQogICAgIHsKLSAgICAgICAgbV9kb21Ob2RlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBl
ck1hcDxOb2RlPigmd2Vha05vZGVDYWxsYmFjayk7Ci0gICAgICAgIG1fZG9tT2JqZWN0TWFwID0g
bmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPih3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOwot
ICAgICAgICBtX2FjdGl2ZURvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
dm9pZD4od2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKTsKKyAgICAgICAgbV9kb21Ob2RlTWFw
ID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPihkb21EYXRhLCB3ZWFrTm9kZUNhbGxi
YWNrKTsKKyAgICAgICAgbV9kb21PYmplY3RNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+KGRvbURhdGEsIHdlYWtET01PYmplY3RDYWxsYmFjayk7CisgICAgICAgIG1fYWN0aXZl
RG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCB3
ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spOwogI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIG1f
ZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdF
bGVtZW50SW5zdGFuY2U+KHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk7Ci0gICAgICAg
IG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+KHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKTsKKyAgICAgICAgbV9kb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1l
bnRJbnN0YW5jZT4oZG9tRGF0YSwgd2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKTsKKyAg
ICAgICAgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4oZG9tRGF0YSwgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spOwog
I2VuZGlmCiAgICAgfQogCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBXVEYgdGhyZWFkIGlz
IHRlYXJpbmcgZG93bi4KKyAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgd2hlbiBXVEYgdGhyZWFk
IGlzIHRlYXJpbmcgZG93bi4KICAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2hpbGQgdGhyZWFk
cyBydW5uaW5nIFY4IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBXVEYuCi0gICAgdmlydHVhbCB+
Tm9uTWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSgpCisgICAgdmlydHVhbCB+U2NvcGVkRE9NRGF0
YVN0b3JlKCkKICAgICB7CiAgICAgICAgIGRlbGV0ZSBtX2RvbU5vZGVNYXA7CiAgICAgICAgIGRl
bGV0ZSBtX2RvbU9iamVjdE1hcDsKQEAgLTI1MCwxOCArMjQxLDIzIEBADQogICAgIH0KIH07CiAK
LS8vIFRoaXMgZW5jYXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3IgdGhlIG1h
aW4gdGhyZWFkLiBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4KLS8vIFRoaXMgaXMgYmVj
YXVzZSB3ZSBhcmUgdW5hYmxlIHRvIHJlbHkgb24gV1RGOjpUaHJlYWRTcGVjaWZpY1RocmVhZEV4
aXQgdG8gZG8gdGhlIGNsZWFudXAgc2luY2UKLS8vIHRoZSBwbGFjZSB0aGF0IHRlYXJzIGRvd24g
dGhlIG1haW4gdGhyZWFkIGNhbiBub3QgY2FsbCBhbnkgV1RGIGZ1bmN0aW9ucy4KLWNsYXNzIE1h
aW5UaHJlYWRTcGVjaWZpY0RPTURhdGEgOiBwdWJsaWMgVGhyZWFkU3BlY2lmaWNET01EYXRhIHsK
Ky8vIFN0YXRpY0RPTURhdGFTdG9yZQorLy8KKy8vIFN0YXRpY0RPTURhdGFTdG9yZSBpcyBhIERP
TURhdGFTdG9yZSB0aGF0IG1hbmFnZXMgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdG9yZQorLy8gc3Rh
dGljYWxseS4gIFRoaXMgZW5jYXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3Ig
dGhlIG1haW4KKy8vIHRocmVhZC4gIEFsbCB0aGUgbWFwcyBpbiBpdCBhcmUgc3RhdGljLiAgVGhp
cyBpcyBiZWNhdXNlIHdlIGFyZSB1bmFibGUgdG8KKy8vIHJlbHkgb24gV1RGOjpUaHJlYWRTcGVj
aWZpY1RocmVhZEV4aXQgdG8gZG8gdGhlIGNsZWFudXAgc2luY2UgdGhlIHBsYWNlIHRoYXQKKy8v
IHRlYXJzIGRvd24gdGhlIG1haW4gdGhyZWFkIGNhbiBub3QgY2FsbCBhbnkgV1RGIGZ1bmN0aW9u
cy4KK2NsYXNzIFN0YXRpY0RPTURhdGFTdG9yZSA6IHB1YmxpYyBET01EYXRhU3RvcmUgewogcHVi
bGljOgotICAgIE1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQotICAgICAgICA6IG1fc3RhdGlj
RG9tTm9kZU1hcCh3ZWFrTm9kZUNhbGxiYWNrKQotICAgICAgICAsIG1fc3RhdGljRG9tT2JqZWN0
TWFwKHdlYWtET01PYmplY3RDYWxsYmFjaykKLSAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9i
amVjdE1hcCh3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCisgICAgU3RhdGljRE9NRGF0YVN0
b3JlKERPTURhdGEqIGRvbURhdGEpCisgICAgICAgIDogRE9NRGF0YVN0b3JlKGRvbURhdGEpCisg
ICAgICAgICwgbV9zdGF0aWNEb21Ob2RlTWFwKGRvbURhdGEsIHdlYWtOb2RlQ2FsbGJhY2spCisg
ICAgICAgICwgbV9zdGF0aWNEb21PYmplY3RNYXAoZG9tRGF0YSwgd2Vha0RPTU9iamVjdENhbGxi
YWNrKQorICAgICAgICAsIG1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwKGRvbURhdGEsIHdlYWtB
Y3RpdmVET01PYmplY3RDYWxsYmFjaykKICNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAsIG1fc3Rh
dGljRG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFj
aykKLSAgICAgICAgLCBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKHdlYWtTVkdP
YmplY3RXaXRoQ29udGV4dENhbGxiYWNrKQorICAgICAgICAsIG1fc3RhdGljRG9tU3ZnRWxlbWVu
dEluc3RhbmNlTWFwKGRvbURhdGEsIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjaykKKyAg
ICAgICAgLCBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKGRvbURhdGEsIHdlYWtT
VkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKQogI2VuZGlmCiAgICAgewogICAgICAgICBtX2Rv
bU5vZGVNYXAgPSAmbV9zdGF0aWNEb21Ob2RlTWFwOwpAQCAtMjgxLDk4ICsyNzcsMTY3IEBADQog
ICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhD
b250ZXh0TWFwOwogfTsKIAotREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6OlRocmVhZFNwZWNpZmlj
PE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGE+LCB0aHJlYWRTcGVjaWZpY0RPTURhdGEsICgp
KTsKK3R5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YVN0b3JlTGlzdDsK
IAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJbk93
bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5
cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBvYmplY3RUeXBlLCBUKik7CisvLyBET01E
YXRhCisvLworLy8gRE9NRGF0YSByZXByZXNlbnRzIHRoZSBhbGwgdGhlIERPTSB3cmFwcGVycyBm
b3IgYSBnaXZlbiB0aHJlYWQuICBJbgorLy8gcGFydGljdWxhciwgRE9NRGF0YSBob2xkcyB3cmFw
cGVycyBmb3IgYWxsIHRoZSBpc29sYXRlZCB3b3JsZHMgaW4gdGhlCisvLyB0aHJlYWQuICBUaGUg
RE9NRGF0YSBmb3IgdGhlIG1haW4gdGhyZWFkIGFuZCB0aGUgRE9NRGF0YSBmb3IgY2hpbGQgdGhy
ZWFkcworLy8gdXNlIGRpZmZlcmVudCBzdWJjbGFzc2VzLgorLy8KK2NsYXNzIERPTURhdGE6IE5v
bmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBET01EYXRhKCkKKyAgICAgICAgOiBtX2RlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkKGZhbHNlKQorICAgICAgICAsIG1faXNNYWluVGhyZWFkKFdURjo6
aXNNYWluVGhyZWFkKCkpCisgICAgICAgICwgbV9vd25pbmdUaHJlYWQoV1RGOjpjdXJyZW50VGhy
ZWFkKCkpCisgICAgeworICAgIH0KIAotVGhyZWFkU3BlY2lmaWNET01EYXRhJiBnZXRUaHJlYWRT
cGVjaWZpY0RPTURhdGEoKQorICAgIHN0YXRpYyBET01EYXRhKiBnZXRDdXJyZW50KCk7CisgICAg
dmlydHVhbCBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkgPSAwOworCisgICAgdGVtcGxhdGU8dHlw
ZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6
RE9NV3JhcHBlck1hcFR5cGUgbWFwVHlwZSwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OE9iamVj
dCwgVCogZG9tT2JqZWN0KTsKKworICAgIHZvaWQgZm9yZ2V0RGVsYXllZE9iamVjdCh2b2lkKiBv
YmplY3QpIHsgbV9kZWxheWVkT2JqZWN0TWFwLnRha2Uob2JqZWN0KTsgfQorCisgICAgLy8gVGhp
cyBpcyB0byBlbnN1cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmplY3RzIGZyb20gdGhlIG93
bmluZyB0aHJlYWQsCisgICAgLy8gbm90IHRoZSBHQyB0aHJlYWQuICBUaGUgaGVscGVyIGZ1bmN0
aW9uIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZSBHQworICAgIC8vIHRocmVhZCB0byBnZXQgY2Fs
bGVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgZGVyZWZEZWxheWVk
T2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKik7CisgICAgdm9pZCBkZXJlZkRlbGF5ZWRPYmpl
Y3RzKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIHJlbW92
ZU9iamVjdHNGcm9tV3JhcHBlck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApOworCisgICAg
VGhyZWFkSWRlbnRpZmllciBvd25pbmdUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtX293bmluZ1Ro
cmVhZDsgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7CisKKyAgICB2b2lkIGVu
c3VyZURlcmVmKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmpl
Y3QpOworICAgIHN0YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpOworCisgICAgLy8gU3RvcmVzIGFsbCB0aGUgRE9N
IG9iamVjdHMgdGhhdCBhcmUgZGVsYXllZCB0byBiZSBwcm9jZXNzZWQgd2hlbiB0aGUgb3duaW5n
IHRocmVhZCBnYWlucyBjb250cm9sLgorICAgIERlbGF5ZWRPYmplY3RNYXAgbV9kZWxheWVkT2Jq
ZWN0TWFwOworCisgICAgLy8gVGhlIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHRhc2sgdG8gZG8g
dGhlIGRlbGF5ZWQgcHJvY2VzcyBoYXMgYWxyZWFkeSBiZWVuIHBvc3RlZC4KKyAgICBib29sIG1f
ZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQ7CisKKyAgICBib29sIG1faXNNYWluVGhyZWFkOwor
ICAgIFRocmVhZElkZW50aWZpZXIgbV9vd25pbmdUaHJlYWQ7Cit9OworCitjbGFzcyBNYWluVGhy
ZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKK3B1YmxpYzoKKyAgICBNYWluVGhyZWFkRE9N
RGF0YSgpIDogbV9kZWZhdWx0U3RvcmUodGhpcykgeyB9CisKKyAgICBET01EYXRhU3RvcmUmIGdl
dFN0b3JlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICAgICAgVjhJc29sYXRlZFdvcmxkKiB3b3JsZCA9IFY4SXNvbGF0ZWRXb3JsZDo6Z2V0RW50ZXJl
ZCgpOworICAgICAgICBpZiAod29ybGQpCisgICAgICAgICAgICByZXR1cm4gKndvcmxkLT5nZXRE
T01EYXRhU3RvcmUoKTsKKyAgICAgICAgcmV0dXJuIG1fZGVmYXVsdFN0b3JlOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBTdGF0aWNET01EYXRhU3RvcmUgbV9kZWZhdWx0U3RvcmU7CisgICAgLy8g
Tm90ZTogVGhlIERPTURhdGFTdG9yZXMgZm9yIGlzb2xhdGVkIHdvcmxkIGFyZSBvd25lZCBieSB0
aGUgd29ybGQgb2JqZWN0LgorfTsKKworY2xhc3MgQ2hpbGRUaHJlYWRET01EYXRhIDogcHVibGlj
IERPTURhdGEgeworcHVibGljOgorICAgIENoaWxkVGhyZWFkRE9NRGF0YSgpIDogbV9kZWZhdWx0
U3RvcmUodGhpcykgeyB9CisKKyAgICBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkgeworICAgICAg
ICBBU1NFUlQoIVdURjo6aXNNYWluVGhyZWFkKCkpOworICAgICAgICAvLyBDdXJyZW50bHksIGNo
aWxkIHRocmVhZHMgaGF2ZSBvbmx5IG9uZSB3b3JsZC4KKyAgICAgICAgcmV0dXJuIG1fZGVmYXVs
dFN0b3JlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTY29wZWRET01EYXRhU3RvcmUgbV9kZWZh
dWx0U3RvcmU7Cit9OworCitET01EYXRhU3RvcmU6OkRPTURhdGFTdG9yZShET01EYXRhKiBkb21E
YXRhKQorICAgIDogbV9kb21Ob2RlTWFwKDApCisgICAgLCBtX2RvbU9iamVjdE1hcCgwKQorICAg
ICwgbV9hY3RpdmVEb21PYmplY3RNYXAoMCkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICwgbV9kb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAoMCkKKyAgICAsIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRN
YXAoMCkKKyNlbmRpZgorICAgICwgbV9kb21EYXRhKGRvbURhdGEpCiB7Ci0gICAgaWYgKFdURjo6
aXNNYWluVGhyZWFkKCkpIHsKLSAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChNYWluVGhyZWFk
U3BlY2lmaWNET01EYXRhLCBtYWluVGhyZWFkU3BlY2lmaWNET01EYXRhLCAoKSk7Ci0gICAgICAg
IHJldHVybiBtYWluVGhyZWFkU3BlY2lmaWNET01EYXRhOwotICAgIH0KLSAgICByZXR1cm4gKnRo
cmVhZFNwZWNpZmljRE9NRGF0YTsKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRh
U3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCku
YXBwZW5kKHRoaXMpOwogfQogCitET01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUoKQoreworICAg
IFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7
CisgICAgRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKS5yZW1vdmUoRE9NRGF0YVN0b3JlOjphbGxT
dG9yZXMoKS5maW5kKHRoaXMpKTsKK30KKworRE9NRGF0YVN0b3JlSGFuZGxlOjpET01EYXRhU3Rv
cmVIYW5kbGUoKQorICAgIDogbV9zdG9yZShuZXcgU2NvcGVkRE9NRGF0YVN0b3JlKERPTURhdGE6
OmdldEN1cnJlbnQoKSkpCit7Cit9CisKK0RPTURhdGFTdG9yZUhhbmRsZTo6fkRPTURhdGFTdG9y
ZUhhbmRsZSgpCit7Cit9CisKIHRlbXBsYXRlIDxjbGFzcyBLZXlUeXBlPgotdm9pZCBUaHJlYWRT
cGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KEtl
eVR5cGUqIG9iamVjdCkKK3ZvaWQgRE9NRGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8
S2V5VHlwZT46OmZvcmdldChLZXlUeXBlKiBvYmplY3QpCiB7CiAgICAgRE9NV3JhcHBlck1hcDxL
ZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRl
bGF5ZWRPYmplY3RNYXAmIGRlbGF5ZWRPYmplY3RNYXAgPSBnZXRUaHJlYWRTcGVjaWZpY0RPTURh
dGEoKS5kZWxheWVkT2JqZWN0TWFwKCk7Ci0gICAgZGVsYXllZE9iamVjdE1hcC50YWtlKG9iamVj
dCk7CisgICAgbV9kb21EYXRhLT5mb3JnZXREZWxheWVkT2JqZWN0KG9iamVjdCk7CiB9CiAKIERP
TVdyYXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAoKQogewotICAgIHJldHVybiBnZXRUaHJl
YWRTcGVjaWZpY0RPTURhdGEoKS5kb21Ob2RlTWFwKCk7CisgICAgcmV0dXJuIERPTURhdGE6Omdl
dEN1cnJlbnQoKS0+Z2V0U3RvcmUoKS5kb21Ob2RlTWFwKCk7CiB9CiAKIERPTVdyYXBwZXJNYXA8
dm9pZD4mIGdldERPTU9iamVjdE1hcCgpCiB7Ci0gICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmlj
RE9NRGF0YSgpLmRvbU9iamVjdE1hcCgpOworICAgIHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50
KCktPmdldFN0b3JlKCkuZG9tT2JqZWN0TWFwKCk7CiB9CiAKIERPTVdyYXBwZXJNYXA8dm9pZD4m
IGdldEFjdGl2ZURPTU9iamVjdE1hcCgpCiB7Ci0gICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmlj
RE9NRGF0YSgpLmFjdGl2ZURvbU9iamVjdE1hcCgpOworICAgIHJldHVybiBET01EYXRhOjpnZXRD
dXJyZW50KCktPmdldFN0b3JlKCkuYWN0aXZlRG9tT2JqZWN0TWFwKCk7CiB9CiAKICNpZiBFTkFC
TEUoU1ZHKQorCiBET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGdldERPTVNWR0Vs
ZW1lbnRJbnN0YW5jZU1hcCgpCiB7Ci0gICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9NRGF0
YSgpLmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpOworICAgIHJldHVybiBET01EYXRhOjpnZXRD
dXJyZW50KCktPmdldFN0b3JlKCkuZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKCk7CiB9CiAKLXN0
YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCi17Ci0gICAgU1ZHRWxlbWVudElu
c3RhbmNlKiBpbnN0YW5jZSA9IHN0YXRpY19jYXN0PFNWR0VsZW1lbnRJbnN0YW5jZSo+KGRvbU9i
amVjdCk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1h
cDxTVkdFbGVtZW50SW5zdGFuY2U+JiBtYXAgPSBzdGF0aWNfY2FzdDxUaHJlYWRTcGVjaWZpY0RP
TURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+Jj4oZ2V0RE9N
U1ZHRWxlbWVudEluc3RhbmNlTWFwKCkpOwotICAgIGlmIChtYXAuY29udGFpbnMoaW5zdGFuY2Up
KSB7Ci0gICAgICAgIGluc3RhbmNlLT5kZXJlZigpOwotICAgICAgICBtYXAuZm9yZ2V0T25seShp
bnN0YW5jZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1Ro
cmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCwgVjhD
bGFzc0luZGV4OjpTVkdFTEVNRU5USU5TVEFOQ0UsIGluc3RhbmNlKTsKLX0KLQogLy8gTWFwIG9m
IFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjggb2JqZWN0cwogRE9NV3JhcHBlck1hcDx2
b2lkPiYgZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAoKQogewotICAgIHJldHVybiBnZXRU
aHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgpOworICAg
IHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdldFN0b3JlKCkuZG9tU3ZnT2JqZWN0V2l0
aENvbnRleHRNYXAoKTsKIH0KIAotc3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0
Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2Jq
ZWN0KQorI2VuZGlmIC8vIEVOQUJMRShTVkcpCisKKy8vIHN0YXRpYworRE9NRGF0YSogRE9NRGF0
YTo6Z2V0Q3VycmVudCgpCiB7Ci0gICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAgIEFTU0VS
VCh2OE9iamVjdC0+SXNPYmplY3QoKSk7Ci0KLSAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgdHlwZSA9IFY4UHJveHk6OkdldERPTVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6Ok9iamVj
dD46OkNhc3QodjhPYmplY3QpKTsKLQotICAgIFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJu
YWxET01XcmFwcGVyTWFwPHZvaWQ+JiBtYXAgPSBzdGF0aWNfY2FzdDxUaHJlYWRTcGVjaWZpY0RP
TURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiY+KGdldERPTVNWR09iamVjdFdpdGhD
b250ZXh0TWFwKCkpOwotICAgIGlmIChtYXAuY29udGFpbnMoZG9tT2JqZWN0KSkgewotICAgICAg
ICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMgb2JqZWN0IGZyb20gdGhlIG1hcCBhbmQg
ZGlzcG9zZXMgdGhlIHdyYXBwZXIuCi0gICAgICAgIG1hcC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7
Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUp
ICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogc3RhdGljX2Nhc3Q8
bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFrOwotICAgICAgICBTVkdfT0JKRUNUX1RZ
UEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNlCi0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5h
bWUpICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogICAgXAotICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8bmFtZT4qPihkb21P
YmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICAgICAgU1ZHX1BPRF9OQVRJVkVfVFlQRVMoTWFr
ZUNhc2UpCi0jdW5kZWYgTWFrZUNhc2UKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9
IGVsc2UKLSAgICAgICAgaGFuZGxlV2Vha09iamVjdEluT3duaW5nVGhyZWFkKFRocmVhZFNwZWNp
ZmljRE9NRGF0YTo6RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAsIHR5cGUsIGRvbU9iamVjdCk7
CisgICAgaWYgKFdURjo6aXNNYWluVGhyZWFkKCkpIHsKKyAgICAgICAgREVGSU5FX1NUQVRJQ19M
T0NBTChNYWluVGhyZWFkRE9NRGF0YSwgbWFpblRocmVhZERPTURhdGEsICgpKTsKKyAgICAgICAg
cmV0dXJuICZtYWluVGhyZWFkRE9NRGF0YTsKKyAgICB9CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChXVEY6OlRocmVhZFNwZWNpZmljPENoaWxkVGhyZWFkRE9NRGF0YT4sIGNoaWxkVGhyZWFkRE9N
RGF0YSwgKCkpOworICAgIHJldHVybiBjaGlsZFRocmVhZERPTURhdGE7CiB9Ci0jZW5kaWYgLy8g
RU5BQkxFKFNWRykKIAogLy8gQ2FsbGVkIHdoZW4gdGhlIGRlYWQgb2JqZWN0IGlzIG5vdCBpbiBH
QyB0aHJlYWQncyBtYXAuIEdvIHRocm91Z2ggYWxsIHRocmVhZCBtYXBzIHRvIGZpbmQgdGhlIG9u
ZSBjb250YWluaW5nIGl0LgogLy8gVGhlbiBjbGVhciB0aGUgSlMgcmVmZXJlbmNlIGFuZCBwdXNo
IHRoZSBET00gb2JqZWN0IGludG8gdGhlIGRlbGF5ZWQgcXVldWUgZm9yIGl0IHRvIGJlIGRlcmVm
LWVkIGF0IGxhdGVyIHRpbWUgZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KQEAgLTM4MCwzMSArNDQ1
LDQzIEBADQogLy8gKiBUaGlzIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZCB0aGF0IGhhcyBH
QyBydW5uaW5nLgogLy8gKiBPbmx5IG9uZSBWOCBpbnN0YW5jZSBpcyBydW5uaW5nIGF0IGEgdGlt
ZSBkdWUgdG8gVjg6OkxvY2tlci4gU28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBjb25j
dXJyZW5jeS4KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCBoYW5kbGVXZWFrT2Jq
ZWN0SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01XcmFwcGVyTWFwVHlw
ZSBtYXBUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgb2JqZWN0VHlwZSwgVCogb2Jq
ZWN0KQorLy8gc3RhdGljCit2b2lkIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0
b3JlOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHY4
T2JqZWN0LCBUKiBkb21PYmplY3QpCiB7Ci0gICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoZG9t
RGF0YUxpc3RNdXRleCgpKTsKLSAgICBET01EYXRhTGlzdCYgbGlzdCA9IGRvbURhdGFMaXN0KCk7
CisKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011
dGV4KCkpOworICAgIERPTURhdGFMaXN0JiBsaXN0ID0gRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMo
KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgVGhyZWFkU3BlY2lmaWNET01EYXRhKiB0aHJlYWREYXRhID0gbGlzdFtpXTsKKyAgICAgICAg
RE9NRGF0YVN0b3JlKiBzdG9yZSA9IGxpc3RbaV07CiAKLSAgICAgICAgVGhyZWFkU3BlY2lmaWNE
T01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qIGRvbU1hcCA9IHN0YXRpY19jYXN0PFRo
cmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPFQ+Kj4odGhyZWFkRGF0
YS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBlKSk7Ci0gICAgICAgIGlmIChkb21NYXAtPmNvbnRh
aW5zKG9iamVjdCkpIHsKKyAgICAgICAgRE9NRGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJN
YXA8VD4qIGRvbU1hcCA9IHN0YXRpY19jYXN0PERPTURhdGFTdG9yZTo6SW50ZXJuYWxET01XcmFw
cGVyTWFwPFQ+Kj4oc3RvcmUtPmdldERPTVdyYXBwZXJNYXAobWFwVHlwZSkpOworCisgICAgICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGRvbU1hcC0+Z2V0KGRvbU9iamVjdCk7
CisgICAgICAgIGlmICgqd3JhcHBlciA9PSAqdjhPYmplY3QpIHsKICAgICAgICAgICAgIC8vIENs
ZWFyIHRoZSBKUyByZWZlcmVuY2UuCi0gICAgICAgICAgICBkb21NYXAtPmZvcmdldE9ubHkob2Jq
ZWN0KTsKKyAgICAgICAgICAgIGRvbU1hcC0+Zm9yZ2V0T25seShkb21PYmplY3QpOworICAgICAg
ICAgICAgc3RvcmUtPmRvbURhdGEoKS0+ZW5zdXJlRGVyZWYoVjhQcm94eTo6R2V0RE9NV3JhcHBl
clR5cGUodjhPYmplY3QpLCBkb21PYmplY3QpOworICAgICAgICB9CisgICAgfQorfQogCi0gICAg
ICAgICAgICAvLyBQdXNoIGludG8gdGhlIGRlbGF5ZWQgcXVldWUuCi0gICAgICAgICAgICB0aHJl
YWREYXRhLT5kZWxheWVkT2JqZWN0TWFwKCkuc2V0KG9iamVjdCwgb2JqZWN0VHlwZSk7Cit2b2lk
IERPTURhdGE6OmVuc3VyZURlcmVmKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2
b2lkKiBkb21PYmplY3QpCit7CisgICAgaWYgKG1fb3duaW5nVGhyZWFkID09IFdURjo6Y3VycmVu
dFRocmVhZCgpKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gZGVsYXkgdGhlIHdvcmsuICBXZSBj
YW4gZGVyZWYgcmlnaHQgbm93LgorICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3Qp
OworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0
byB0aGUgb3duaW5nIHRocmVhZCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBkZWxheWVkIHF1ZXVl
LgotICAgICAgICAgICAgLy8gRklYTUU6IEZvciBub3csIHdlIGNhbiBvbmx5IHBvc3QgdG8gbWFp
biB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3RpbmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBmaXgg
dGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdvcmtlci4KLSAgICAgICAgICAgIGlmICghdGhy
ZWFkRGF0YS0+ZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoKSkgewotICAgICAgICAgICAgICAg
IHRocmVhZERhdGEtPnNldERlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKHRydWUpOwotICAgICAg
ICAgICAgICAgIGlmICh0aHJlYWREYXRhLT5pc01haW5UaHJlYWQoKSkKLSAgICAgICAgICAgICAg
ICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFkKCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50
VGhyZWFkLCAwKTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBkZXJl
ZiBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCisgICAgbV9kZWxheWVkT2JqZWN0TWFwLnNldChkb21P
YmplY3QsIHR5cGUpOwogCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIC8vIFBv
c3QgYSB0YXNrIHRvIHRoZSBvd25pbmcgdGhyZWFkIGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIGRl
bGF5ZWQgcXVldWUuCisgICAgLy8gRklYTUU6IEZvciBub3csIHdlIGNhbiBvbmx5IHBvc3QgdG8g
bWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3RpbmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBm
aXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdvcmtlci4KKyAgICBpZiAoIW1fZGVsYXll
ZFByb2Nlc3NpbmdTY2hlZHVsZWQpIHsKKyAgICAgICAgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVk
dWxlZCA9IHRydWU7CisgICAgICAgIGlmIChpc01haW5UaHJlYWQoKSkKKyAgICAgICAgICAgIFdU
Rjo6Y2FsbE9uTWFpblRocmVhZCgmZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCwg
MCk7CiAgICAgfQogfQogCkBAIC00MTQsNjUgKzQ5MSw0MyBAQA0KIHsKICAgICB2ODo6SGFuZGxl
U2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKLQotICAgIFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5
cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwotCi0gICAgVGhyZWFk
U3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1hcCA9IHN0YXRp
Y19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+
Jj4oZ2V0RE9NT2JqZWN0TWFwKCkpOwotICAgIGlmIChtYXAuY29udGFpbnMoZG9tT2JqZWN0KSkg
ewotICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMgb2JqZWN0IGZyb20gdGhl
IG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCi0gICAgICAgIG1hcC5mb3JnZXRPbmx5KGRv
bU9iamVjdCk7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0jZGVmaW5lIE1ha2VDYXNlKHR5
cGUsIG5hbWUpICAgXAotICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0YXRp
Y19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICAgICAgRE9NX09C
SkVDVF9UWVBFUyhNYWtlQ2FzZSkKLSN1bmRlZiBNYWtlQ2FzZQotICAgICAgICBkZWZhdWx0Ogot
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJl
YWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01PYmplY3RNYXAsIHR5cGUsIGRvbU9iamVjdCk7
CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTU9iamVjdE1h
cCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIGRvbU9iamVjdCk7CiB9
CiAKIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpW
YWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUg
c2NvcGU7CiAgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBET01EYXRhOjpo
YW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6QWN0aXZlRE9NT2JqZWN0TWFwLCB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKK30KIAotICAgIFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5
cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworc3RhdGljIHZvaWQg
d2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lk
KiBkb21PYmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2
OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdDxOb2Rl
PihET01EYXRhU3RvcmU6OkRPTU5vZGVNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3Qo
djhPYmplY3QpLCBzdGF0aWNfY2FzdDxOb2RlKj4oZG9tT2JqZWN0KSk7Cit9CiAKLSAgICBUaHJl
YWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3Rh
dGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9p
ZD4mPihnZXRBY3RpdmVET01PYmplY3RNYXAoKSk7Ci0gICAgaWYgKG1hcC5jb250YWlucyhkb21P
YmplY3QpKSB7Ci0gICAgICAgIC8vIFRoZSBmb3JnZXQgZnVuY3Rpb24gcmVtb3ZlcyBvYmplY3Qg
ZnJvbSB0aGUgbWFwIGFuZCBkaXNwb3NlcyB0aGUgd3JhcHBlci4KLSAgICAgICAgbWFwLmZvcmdl
dE9ubHkoZG9tT2JqZWN0KTsKKyNpZiBFTkFCTEUoU1ZHKQogCi0gICAgICAgIHN3aXRjaCAodHlw
ZSkgewotI2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgIFwKLSAgICAgICAgICAgIGNhc2Ug
VjhDbGFzc0luZGV4Ojp0eXBlOiBzdGF0aWNfY2FzdDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYo
KTsgYnJlYWs7Ci0gICAgICAgIEFDVElWRV9ET01fT0JKRUNUX1RZUEVTKE1ha2VDYXNlKQotI3Vu
ZGVmIE1ha2VDYXNlCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6
OkFjdGl2ZURPTU9iamVjdE1hcCwgdHlwZSwgZG9tT2JqZWN0KTsKK3N0YXRpYyB2b2lkIHdlYWtT
VkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2Jq
ZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAg
IEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09i
amVjdChET01EYXRhU3RvcmU6OkRPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCwgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIHN0YXRpY19jYXN0PFNWR0VsZW1lbnRJbnN0YW5j
ZSo+KGRvbU9iamVjdCkpOwogfQogCi1zdGF0aWMgdm9pZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3N0YXRpYyB2
b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpW
YWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKIHsKLSAgICBOb2RlKiBub2RlID0gc3Rh
dGljX2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6
OkludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3Bl
Y2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4mPihnZXRET01Ob2RlTWFw
KCkpOwotICAgIGlmIChtYXAuY29udGFpbnMobm9kZSkpIHsKLSAgICAgICAgbWFwLmZvcmdldE9u
bHkobm9kZSk7Ci0gICAgICAgIG5vZGUtPmRlcmVmKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhh
bmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZDxOb2RlPihUaHJlYWRTcGVjaWZpY0RPTURhdGE6
OkRPTU5vZGVNYXAsIFY4Q2xhc3NJbmRleDo6Tk9ERSwgbm9kZSk7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0
YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVNWR09iamVjdFdpdGhDb250ZXh0
TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsK
IH0KIAotc3RhdGljIHZvaWQgZGVyZWZPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKKyNlbmRpZiAgLy8gRU5BQkxFKFNWRykKKworLy8gc3Rh
dGljCit2b2lkIERPTURhdGE6OmRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCiB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6Ok5PREU6CkBAIC01MDMsMjYgKzU1OCwyNyBAQA0KICAgICB9CiB9CiAK
LXN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHMoKQordm9pZCBET01EYXRhOjpkZXJlZkRl
bGF5ZWRPYmplY3RzKCkKIHsKLSAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihkb21EYXRhTGlz
dE11dGV4KCkpOworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxs
U3RvcmVzTXV0ZXgoKSk7CiAKLSAgICBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5zZXREZWxh
eWVkUHJvY2Vzc2luZ1NjaGVkdWxlZChmYWxzZSk7CisgICAgbV9kZWxheWVkUHJvY2Vzc2luZ1Nj
aGVkdWxlZCA9IGZhbHNlOwogCi0gICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpEZWxheWVkT2Jq
ZWN0TWFwJiBkZWxheWVkT2JqZWN0TWFwID0gZ2V0VGhyZWFkU3BlY2lmaWNET01EYXRhKCkuZGVs
YXllZE9iamVjdE1hcCgpOwotICAgIGZvciAoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpEZWxheWVk
T2JqZWN0TWFwOjppdGVyYXRvciBpdGVyKGRlbGF5ZWRPYmplY3RNYXAuYmVnaW4oKSk7IGl0ZXIg
IT0gZGVsYXllZE9iamVjdE1hcC5lbmQoKTsgKytpdGVyKSB7CisgICAgZm9yIChEZWxheWVkT2Jq
ZWN0TWFwOjppdGVyYXRvciBpdGVyKG1fZGVsYXllZE9iamVjdE1hcC5iZWdpbigpKTsgaXRlciAh
PSBtX2RlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsraXRlcikKICAgICAgICAgZGVyZWZPYmplY3Qo
aXRlci0+c2Vjb25kLCBpdGVyLT5maXJzdCk7Ci0gICAgfQotICAgIGRlbGF5ZWRPYmplY3RNYXAu
Y2xlYXIoKTsKKworICAgIG1fZGVsYXllZE9iamVjdE1hcC5jbGVhcigpOwogfQogCi1zdGF0aWMg
dm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkKHZvaWQqKQorLy8gc3RhdGlj
Cit2b2lkIERPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCop
CiB7Ci0gICAgZGVyZWZEZWxheWVkT2JqZWN0cygpOworICAgIGdldEN1cnJlbnQoKS0+ZGVyZWZE
ZWxheWVkT2JqZWN0cygpOwogfQogCisvLyBzdGF0aWMKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1z
dGF0aWMgdm9pZCByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYg
ZG9tTWFwKQordm9pZCBET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXAoRE9NV3Jh
cHBlck1hcDxUPiYgZG9tTWFwKQogewogICAgIGZvciAodHlwZW5hbWUgV1RGOjpIYXNoTWFwPFQq
LCB2ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ZXIoZG9tTWFwLmltcGwoKS5iZWdpbigpKTsgaXRl
ciAhPSBkb21NYXAuaW1wbCgpLmVuZCgpOyArK2l0ZXIpIHsKICAgICAgICAgVCogZG9tT2JqZWN0
ID0gc3RhdGljX2Nhc3Q8VCo+KGl0ZXItPmZpcnN0KTsKQEAgLTU0NCwyMyArNjAwLDIzIEBADQog
ICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKIAogICAgIC8vIERlcmVmIGFsbCBvYmplY3RzIGlu
IHRoZSBkZWxheWVkIHF1ZXVlLgotICAgIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKKyAgICBET01E
YXRhOjpnZXRDdXJyZW50KCktPmRlcmVmRGVsYXllZE9iamVjdHMoKTsKIAogICAgIC8vIFJlbW92
ZSBhbGwgRE9NIG5vZGVzLgotICAgIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDxOb2RlPihn
ZXRET01Ob2RlTWFwKCkpOworICAgIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1h
cDxOb2RlPihnZXRET01Ob2RlTWFwKCkpOwogCiAgICAgLy8gUmVtb3ZlIGFsbCBET00gb2JqZWN0
cyBpbiB0aGUgd3JhcHBlciBtYXAuCi0gICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZv
aWQ+KGdldERPTU9iamVjdE1hcCgpKTsKKyAgICBET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdy
YXBwZXJNYXA8dm9pZD4oZ2V0RE9NT2JqZWN0TWFwKCkpOwogCiAgICAgLy8gUmVtb3ZlIGFsbCBh
Y3RpdmUgRE9NIG9iamVjdHMgaW4gdGhlIHdyYXBwZXIgbWFwLgotICAgIHJlbW92ZU9iamVjdHNG
cm9tV3JhcHBlck1hcDx2b2lkPihnZXRBY3RpdmVET01PYmplY3RNYXAoKSk7CisgICAgRE9NRGF0
YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldEFjdGl2ZURPTU9iamVjdE1h
cCgpKTsKIAogI2lmIEVOQUJMRShTVkcpCiAgICAgLy8gUmVtb3ZlIGFsbCBTVkcgZWxlbWVudCBp
bnN0YW5jZXMgaW4gdGhlIHdyYXBwZXIgbWFwLgotICAgIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBl
ck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+KGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCgpKTsK
KyAgICBET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3Rh
bmNlPihnZXRET01TVkdFbGVtZW50SW5zdGFuY2VNYXAoKSk7CiAKICAgICAvLyBSZW1vdmUgYWxs
IFNWRyBvYmplY3RzIHdpdGggY29udGV4dCBpbiB0aGUgd3JhcHBlciBtYXAuCi0gICAgcmVtb3Zl
T2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFw
KCkpOworICAgIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDx2b2lkPihnZXRE
T01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKICNlbmRpZgogfQogCkBAIC01NzQsNCArNjMw
LDk0IEBADQogICAgICAgICByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkSGVscGVy
KCk7CiB9CiAKKwordm9pZCB2aXNpdERPTU5vZGVzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJN
YXA8Tm9kZT46OlZpc2l0b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3Bl
OworCisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNN
dXRleCgpKTsKKyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVz
KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAg
ICAgIERPTURhdGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5k
b21EYXRhKCktPm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+JiBt
YXAgPSBzdG9yZS0+ZG9tTm9kZU1hcCgpLmltcGwoKTsKKyAgICAgICAgZm9yIChIYXNoTWFwPE5v
ZGUqLCB2ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5l
bmQoKTsgKytpdCkKKyAgICAgICAgICAgIHZpc2l0b3ItPnZpc2l0RE9NV3JhcHBlcihpdC0+Zmly
c3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisK
K3ZvaWQgdmlzaXRET01PYmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8dm9pZD46
OlZpc2l0b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAg
V1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsK
KyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERPTURh
dGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21EYXRhKCkt
Pm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+ICYgbWFwID0gc3Rv
cmUtPmRvbU9iamVjdE1hcCgpLmltcGwoKTsKKyAgICAgICAgZm9yIChIYXNoTWFwPHZvaWQqLCB2
ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsg
KytpdCkKKyAgICAgICAgICAgIHZpc2l0b3ItPnZpc2l0RE9NV3JhcHBlcihpdC0+Zmlyc3QsIHY4
OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKK3ZvaWQg
dmlzaXRBY3RpdmVET01PYmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8dm9pZD46
OlZpc2l0b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAg
V1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsK
KyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERPTURh
dGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21EYXRhKCkt
Pm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+JiBtYXAgPSBzdG9y
ZS0+YWN0aXZlRG9tT2JqZWN0TWFwKCkuaW1wbCgpOworICAgICAgICBmb3IgKEhhc2hNYXA8dm9p
ZCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVu
ZCgpOyArK2l0KQorICAgICAgICAgICAgdmlzaXRvci0+dmlzaXRET01XcmFwcGVyKGl0LT5maXJz
dCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCkpOworICAgIH0KK30KKwor
I2lmIEVOQUJMRShTVkcpCisKK3ZvaWQgdmlzaXRET01TVkdFbGVtZW50SW5zdGFuY2VzSW5DdXJy
ZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPjo6VmlzaXRvciogdmlz
aXRvcikKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisKKyAgICBXVEY6Ok11dGV4TG9j
a2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFM
aXN0JiBsaXN0ID0gRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBzdG9y
ZSA9IGxpc3RbaV07CisgICAgICAgIGlmICghc3RvcmUtPmRvbURhdGEoKS0+b3duaW5nVGhyZWFk
KCkgPT0gV1RGOjpjdXJyZW50VGhyZWFkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICBIYXNoTWFwPFNWR0VsZW1lbnRJbnN0YW5jZSosIHY4OjpPYmplY3QqPiAmIG1hcCA9IHN0
b3JlLT5kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoKS5pbXBsKCk7CisgICAgICAgIGZvciAoSGFz
aE1hcDxTVkdFbGVtZW50SW5zdGFuY2UqLCB2ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0gbWFw
LmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgIHZpc2l0b3ItPnZp
c2l0RE9NV3JhcHBlcihpdC0+Zmlyc3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5z
ZWNvbmQpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmlzaXRTVkdPYmplY3RzSW5DdXJyZW50VGhyZWFk
KERPTVdyYXBwZXJNYXA8dm9pZD46OlZpc2l0b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRs
ZVNjb3BlIHNjb3BlOworCisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3Jl
OjphbGxTdG9yZXNNdXRleCgpKTsKKyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9y
ZTo6YWxsU3RvcmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsg
KytpKSB7CisgICAgICAgIERPTURhdGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBp
ZiAoIXN0b3JlLT5kb21EYXRhKCktPm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVh
ZCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgSGFzaE1hcDx2b2lkKiwgdjg6
Ok9iamVjdCo+JiBtYXAgPSBzdG9yZS0+ZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKS5pbXBs
KCk7CisgICAgICAgIGZvciAoSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBp
dCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpCisgICAgICAgICAgICB2aXNp
dG9yLT52aXNpdERPTVdyYXBwZXIoaXQtPmZpcnN0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0
PihpdC0+c2Vjb25kKSk7CisgICAgfQorfQorCisjZW5kaWYKKwogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31640</attachid>
            <date>2009-06-22 01:49:32 -0700</date>
            <delta_ts>2009-06-22 10:06:24 -0700</delta_ts>
            <desc>updated patch</desc>
            <filename>iso4.patch</filename>
            <type>text/plain</type>
            <size>48121</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDkzMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjUgQEAKKzIwMDktMDYtMjIgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZWZh
Y3RvciBWOERPTU1hcCB0byBzdXBwb3J0IGlzb2xhdGVkIHdvcmxkcy4KKworICAgICAgICAqIGJp
bmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2NyaXB0
Q29udHJvbGxlcjo6ZXZhbHVhdGVJbk5ld1dvcmxkKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9T
Y3JpcHRDb250cm9sbGVyLmg6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhET01NYXAuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA6Oklu
dGVybmFsRE9NV3JhcHBlck1hcCk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OmFs
bFN0b3Jlcyk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6ZG9tRGF0YSk6CisgICAgICAgIChX
ZWJDb3JlOjpTY29wZWRET01EYXRhU3RvcmU6OlNjb3BlZERPTURhdGFTdG9yZSk6CisgICAgICAg
IChXZWJDb3JlOjpTY29wZWRET01EYXRhU3RvcmU6On5TY29wZWRET01EYXRhU3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6U3RhdGljRE9NRGF0YVN0b3JlOjpTdGF0aWNET01EYXRhU3RvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6Ok1haW5UaHJlYWRET01EYXRh
OjpNYWluVGhyZWFkRE9NRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpNYWluVGhyZWFkRE9NRGF0
YTo6Z2V0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpDaGls
ZFRocmVhZERPTURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpn
ZXRTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OkRPTURhdGFTdG9yZSk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlSGFuZGxlOjpET01EYXRhU3RvcmVIYW5kbGUpOgorICAg
ICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlSGFuZGxlOjp+RE9NRGF0YVN0b3JlSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6Ojo6Zm9yZ2V0KToKKyAgICAgICAgKFdlYkNvcmU6OmdldERPTU5v
ZGVNYXApOgorICAgICAgICAoV2ViQ29yZTo6Z2V0RE9NT2JqZWN0TWFwKToKKyAgICAgICAgKFdl
YkNvcmU6OmdldEFjdGl2ZURPTU9iamVjdE1hcCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRET01T
VkdFbGVtZW50SW5zdGFuY2VNYXApOgorICAgICAgICAoV2ViQ29yZTo6Z2V0RE9NU1ZHT2JqZWN0
V2l0aENvbnRleHRNYXApOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6Z2V0Q3VycmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRPTURhdGE6OmVuc3VyZURlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OndlYWtE
T01PYmplY3RDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjp3ZWFrQWN0aXZlRE9NT2JqZWN0
Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6d2Vha05vZGVDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjp3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6d2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29y
ZTo6RE9NRGF0YTo6ZGVyZWZPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6ZGVy
ZWZEZWxheWVkT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhOjpkZXJlZkRlbGF5
ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OnJl
bW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcCk6CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVBbGxE
T01PYmplY3RzSW5DdXJyZW50VGhyZWFkSGVscGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnZpc2l0
RE9NTm9kZXNJbkN1cnJlbnRUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6dmlzaXRET01PYmpl
Y3RzSW5DdXJyZW50VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OnZpc2l0QWN0aXZlRE9NT2Jq
ZWN0c0luQ3VycmVudFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjp2aXNpdERPTVNWR0VsZW1l
bnRJbnN0YW5jZXNJbkN1cnJlbnRUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6dmlzaXRTVkdP
YmplY3RzSW5DdXJyZW50VGhyZWFkKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOERPTU1hcC5o
OgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlSGFuZGxlOjpnZXRTdG9yZSk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvVjhJc29sYXRlZFdvcmxkLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpnZXRJc29sYXRlZFdvcmxkS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnRleHRX
ZWFrUmVmZXJlbmNlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhJc29sYXRlZFdvcmxk
OjpldmFsdWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOElzb2xhdGVkV29ybGQ6OlY4SXNvbGF0
ZWRXb3JsZCk6CisgICAgICAgIChXZWJDb3JlOjpWOElzb2xhdGVkV29ybGQ6On5WOElzb2xhdGVk
V29ybGQpOgorICAgICAgICAoV2ViQ29yZTo6VjhJc29sYXRlZFdvcmxkOjpnZXRFbnRlcmVkKToK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9WOElzb2xhdGVkV29ybGQuaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpWOElzb2xhdGVkV29ybGQ6OmdldERPTURhdGFTdG9yZSk6CisKIDIwMDktMDYt
MjEgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1NjcmlwdENvbnRyb2xsZXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvU2NyaXB0Q29udHJvbGxlci5j
cHAJKHJldmlzaW9uIDQ0ODk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY3JpcHRDb250cm9s
bGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTgwLDYgKzE4MCwxMSBAQCBib29sIFNjcmlwdENv
bnRyb2xsZXI6OnByb2Nlc3NpbmdVc2VyR2VzCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lk
IFNjcmlwdENvbnRyb2xsZXI6OmV2YWx1YXRlSW5OZXdXb3JsZChjb25zdCBWZWN0b3I8U2NyaXB0
U291cmNlQ29kZT4mIHNvdXJjZXMpCit7CisgICAgbV9wcm94eS0+ZXZhbHVhdGVJbk5ld1dvcmxk
KHNvdXJjZXMpOworfQorCiB2b2lkIFNjcmlwdENvbnRyb2xsZXI6OmV2YWx1YXRlSW5OZXdDb250
ZXh0KGNvbnN0IFZlY3RvcjxTY3JpcHRTb3VyY2VDb2RlPiYgc291cmNlcykKIHsKICAgICBtX3By
b3h5LT5ldmFsdWF0ZUluTmV3Q29udGV4dChzb3VyY2VzKTsKSW5kZXg6IFdlYkNvcmUvYmluZGlu
Z3MvdjgvU2NyaXB0Q29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvU2NyaXB0Q29udHJvbGxlci5oCShyZXZpc2lvbiA0NDg5NSkKKysrIFdlYkNvcmUvYmluZGlu
Z3MvdjgvU2NyaXB0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02NSw2ICs2NSwxMiBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIGFzIGEgc3RyaW5nLgogICAgICAgICBT
Y3JpcHRWYWx1ZSBldmFsdWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJik7CiAKKyAgICAgICAg
Ly8gRXhlY3V0ZXMgSmF2YVNjcmlwdCBpbiBhIG5ldyB3b3JsZCBhc3NvY2lhdGVkIHdpdGggdGhl
IHdlYiBmcmFtZS4gVGhlCisgICAgICAgIC8vIHNjcmlwdCBnZXRzIGl0cyBvd24gZ2xvYmFsIHNj
b3BlLCBpdHMgb3duIHByb3RvdHlwZXMgZm9yIGludHJpbnNpYworICAgICAgICAvLyBKYXZhU2Ny
aXB0IG9iamVjdHMgKFN0cmluZywgQXJyYXksIGFuZCBzby1vbiksIGFuZCBpdHMgb3duIHdyYXBw
ZXJzIGZvcgorICAgICAgICAvLyBhbGwgRE9NIG5vZGVzIGFuZCBET00gY29uc3RydWN0b3JzLgor
ICAgICAgICB2b2lkIGV2YWx1YXRlSW5OZXdXb3JsZChjb25zdCBWZWN0b3I8U2NyaXB0U291cmNl
Q29kZT4mKTsKKwogICAgICAgICAvLyBFeGVjdXRlcyBKYXZhU2NyaXB0IGluIGEgbmV3IGNvbnRl
eHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWIgZnJhbWUuIFRoZQogICAgICAgICAvLyBzY3JpcHQg
Z2V0cyBpdHMgb3duIGdsb2JhbCBzY29wZSBhbmQgaXRzIG93biBwcm90b3R5cGVzIGZvciBpbnRy
aW5zaWMKICAgICAgICAgLy8gSmF2YVNjcmlwdCBvYmplY3RzIChTdHJpbmcsIEFycmF5LCBhbmQg
c28tb24pLiBJdCBzaGFyZXMgdGhlIHdyYXBwZXJzIGZvcgpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTU1hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOERP
TU1hcC5jcHAJKHJldmlzaW9uIDQ0ODk1KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1h
cC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJET01PYmpl
Y3RzSW5jbHVkZS5oIgogCiAjaW5jbHVkZSA8djguaD4KKwogI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+CiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFi
bGUuaD4KQEAgLTQyLDYgKzQzLDggQEAKICNpbmNsdWRlIDx3dGYvVGhyZWFkU3BlY2lmaWMuaD4K
ICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJWOElzb2xhdGVkV29ybGQuaCIK
KwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiAvLyBET00gYmluZGluZyBhbGdvcml0aG06CkBAIC05
MCwzOCArOTMsMjkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogLy8gICAgYWxsIG9iamVjdHMgaW4g
dGhlIGRlbGF5ZWQgcXVldWUgYW5kIHRoZSB0aHJlYWQgbWFwIGFuZCBkZXJlZiBhbGwgb2YKIC8v
ICAgIHRoZW0uCiAKLXN0YXRpYyB2b2lkIHdlYWtET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lz
dGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwogc3RhdGljIHZvaWQg
d2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lk
KiBkb21PYmplY3QpOwotCitzdGF0aWMgdm9pZCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBl
cnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKK3ZvaWQgd2Vh
a0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmpl
Y3QsIHZvaWQqIGRvbU9iamVjdCk7CiAjaWYgRU5BQkxFKFNWRykKIHN0YXRpYyB2b2lkIHdlYWtT
VkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2Jq
ZWN0LCB2b2lkKiBkb21PYmplY3QpOwotCiAvLyBTVkcgbm9uLW5vZGUgZWxlbWVudHMgbWF5IGhh
dmUgYSByZWZlcmVuY2UgdG8gYSBjb250ZXh0IG5vZGUgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVk
IHdoZW4gdGhlIGVsZW1lbnQgaXMgY2hhbmdlLgogc3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdp
dGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9p
ZCogZG9tT2JqZWN0KTsKICNlbmRpZgogCi0vLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIHdp
bGwgZGVyZWYgRE9NIG9iamVjdHMgZnJvbSB0aGUgb3duaW5nIHRocmVhZCwgbm90IHRoZSBHQyB0
aHJlYWQuCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZSBH
QyB0aHJlYWQgdG8gZ2V0IGNhbGxlZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgotc3RhdGljIHZv
aWQgZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKik7CitjbGFzcyBET01E
YXRhOworY2xhc3MgRE9NRGF0YVN0b3JlOwordHlwZWRlZiBXVEY6OlZlY3RvcjxET01EYXRhU3Rv
cmUqPiBET01EYXRhTGlzdDsKIAotLy8gQSBsaXN0IG9mIGFsbCBUaHJlYWRTcGVjaWZpYyBET00g
RGF0YSBvYmplY3RzLiBUcmF2ZXJzZWQgZHVyaW5nIEdDIHRvIGZpbmQgYSB0aHJlYWQtc3BlY2lm
aWMgbWFwIHRoYXQKLS8vIGNvbnRhaW5zIHRoZSBvYmplY3QgLSBzbyB3ZSBjYW4gc2NoZWR1bGUg
dGhlIG9iamVjdCB0byBiZSBkZWxldGVkIG9uIHRoZSB0aHJlYWQgd2hpY2ggY3JlYXRlZCBpdC4K
LWNsYXNzIFRocmVhZFNwZWNpZmljRE9NRGF0YTsKLXR5cGVkZWYgV1RGOjpWZWN0b3I8VGhyZWFk
U3BlY2lmaWNET01EYXRhKj4gRE9NRGF0YUxpc3Q7Ci1zdGF0aWMgRE9NRGF0YUxpc3QmIGRvbURh
dGFMaXN0KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERPTURhdGFMaXN0LCBzdGF0aWNE
T01EYXRhTGlzdCwgKCkpOwotICAgIHJldHVybiBzdGF0aWNET01EYXRhTGlzdDsKLX0KLQotLy8g
TXV0ZXggdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIG9mIERPTURhdGFMaXN0
Lgotc3RhdGljIFdURjo6TXV0ZXgmIGRvbURhdGFMaXN0TXV0ZXgoKQotewotICAgIERFRklORV9T
VEFUSUNfTE9DQUwoV1RGOjpNdXRleCwgc3RhdGljRE9NRGF0YUxpc3RNdXRleCwgKCkpOwotICAg
IHJldHVybiBzdGF0aWNET01EYXRhTGlzdE11dGV4OwotfQotCi1jbGFzcyBUaHJlYWRTcGVjaWZp
Y0RPTURhdGEgOiBOb25jb3B5YWJsZSB7CisvLyBET01EYXRhU3RvcmUKKy8vCisvLyBET01EYXRh
U3RvcmUgaXMgdGhlIGJhY2tpbmcgc3RvcmUgdGhhdCBob2xkcyB0aGUgbWFwcyBiZXR3ZWVuIERP
TSBvYmplY3RzCisvLyBhbmQgSmF2YVNjcmlwdCBvYmplY3RzLiAgSW4gZ2VuZXJhbCwgZWFjaCB0
aHJlYWQgY2FuIGhhdmUgbXVsdGlwbGUgYmFja2luZworLy8gc3RvcmVzLCBvbmUgcGVyIGlzb2xh
dGVkIHdvcmxkLgorLy8KKy8vIFRoaXMgY2xhc3MgZG9lc24ndCBtYW5hZ2UgdGhlIGxpZmV0aW1l
IG9mIHRoZSBzdG9yZS4gIFRoZSBkYXRhIHN0b3JlCisvLyBsaWZldGltZSBpcyBtYW5hZ2VkIGJ5
IHN1YmNsYXNzZXMuCisvLworY2xhc3MgRE9NRGF0YVN0b3JlIDogTm9uY29weWFibGUgewogcHVi
bGljOgogICAgIGVudW0gRE9NV3JhcHBlck1hcFR5cGUgewogICAgICAgICBET01Ob2RlTWFwLApA
QCAtMTMzLDEzICsxMjcsMTIgQEAgcHVibGljOgogI2VuZGlmCiAgICAgfTsKIAotICAgIHR5cGVk
ZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5
ZWRPYmplY3RNYXA7Ci0KICAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KICAgICBjbGFzcyBJ
bnRlcm5hbERPTVdyYXBwZXJNYXAgOiBwdWJsaWMgRE9NV3JhcHBlck1hcDxLZXlUeXBlPiB7CiAg
ICAgcHVibGljOgotICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXAodjg6OldlYWtSZWZlcmVu
Y2VDYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICAgICAgIDogRE9NV3JhcHBlck1hcDxLZXlUeXBl
PihjYWxsYmFjaykgeyB9CisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcChET01EYXRhKiBk
b21EYXRhLCB2ODo6V2Vha1JlZmVyZW5jZUNhbGxiYWNrIGNhbGxiYWNrKQorICAgICAgICAgICAg
OiBET01XcmFwcGVyTWFwPEtleVR5cGU+KGNhbGxiYWNrKQorICAgICAgICAgICAgLCBtX2RvbURh
dGEoZG9tRGF0YSkgeyB9CiAKICAgICAgICAgdmlydHVhbCB2b2lkIGZvcmdldChLZXlUeXBlKik7
CiAKQEAgLTE0NywyOSArMTQwLDMxIEBAIHB1YmxpYzoKICAgICAgICAgewogICAgICAgICAgICAg
RE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7CiAgICAgICAgIH0KKworICAg
IHByaXZhdGU6CisgICAgICAgIERPTURhdGEqIG1fZG9tRGF0YTsKICAgICB9OwogCi0gICAgVGhy
ZWFkU3BlY2lmaWNET01EYXRhKCkKLSAgICAgICAgOiBtX2RvbU5vZGVNYXAoMCkKLSAgICAgICAg
LCBtX2RvbU9iamVjdE1hcCgwKQotICAgICAgICAsIG1fYWN0aXZlRG9tT2JqZWN0TWFwKDApCi0j
aWYgRU5BQkxFKFNWRykKLSAgICAgICAgLCBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgwKQot
ICAgICAgICAsIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoMCkKLSNlbmRpZgotICAgICAg
ICAsIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFsc2UpCi0gICAgICAgICwgbV9pc01h
aW5UaHJlYWQoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAvLyBBIGxpc3Qgb2YgYWxsIERPTURh
dGFTdG9yZSBvYmplY3RzLiAgVHJhdmVyc2VkIGR1cmluZyBHQyB0byBmaW5kIGEgdGhyZWFkLXNw
ZWNpZmljIG1hcCB0aGF0CisgICAgLy8gY29udGFpbnMgdGhlIG9iamVjdCAtIHNvIHdlIGNhbiBz
Y2hlZHVsZSB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQgb24gdGhlIHRocmVhZCB3aGljaCBjcmVh
dGVkIGl0LgorICAgIHN0YXRpYyBET01EYXRhTGlzdCYgYWxsU3RvcmVzKCkKICAgICB7Ci0gICAg
ICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKGRvbURhdGFMaXN0TXV0ZXgoKSk7Ci0gICAgICAg
IGRvbURhdGFMaXN0KCkuYXBwZW5kKHRoaXMpOworICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KERPTURhdGFMaXN0LCBzdGF0aWNET01EYXRhTGlzdCwgKCkpOworICAgICAgICByZXR1cm4gc3Rh
dGljRE9NRGF0YUxpc3Q7CiAgICAgfQogCi0gICAgdmlydHVhbCB+VGhyZWFkU3BlY2lmaWNET01E
YXRhKCkKKyAgICAvLyBNdXRleCB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3Mg
b2YgRE9NRGF0YUxpc3QuCisgICAgc3RhdGljIFdURjo6TXV0ZXgmIGFsbFN0b3Jlc011dGV4KCkK
ICAgICB7Ci0gICAgICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKGRvbURhdGFMaXN0TXV0ZXgo
KSk7Ci0gICAgICAgIGRvbURhdGFMaXN0KCkucmVtb3ZlKGRvbURhdGFMaXN0KCkuZmluZCh0aGlz
KSk7CisgICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwoV1RGOjpNdXRleCwgc3RhdGljRE9NRGF0
YUxpc3RNdXRleCwgKCkpOworICAgICAgICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3RNdXRleDsK
ICAgICB9CiAKKyAgICBET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSk7CisgICAgdmlydHVh
bCB+RE9NRGF0YVN0b3JlKCk7CisKKyAgICBET01EYXRhKiBkb21EYXRhKCkgY29uc3QgeyByZXR1
cm4gbV9kb21EYXRhOyB9CisKICAgICB2b2lkKiBnZXRET01XcmFwcGVyTWFwKERPTVdyYXBwZXJN
YXBUeXBlIHR5cGUpCiAgICAgewogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKQEAgLTE5OSwxMSAr
MTk0LDYgQEAgcHVibGljOgogICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgZG9tU3Zn
T2JqZWN0V2l0aENvbnRleHRNYXAoKSB7IHJldHVybiAqbV9kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcDsgfQogI2VuZGlmCiAKLSAgICBEZWxheWVkT2JqZWN0TWFwJiBkZWxheWVkT2JqZWN0TWFw
KCkgeyByZXR1cm4gbV9kZWxheWVkT2JqZWN0TWFwOyB9Ci0gICAgYm9vbCBkZWxheWVkUHJvY2Vz
c2luZ1NjaGVkdWxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVs
ZWQ7IH0KLSAgICB2b2lkIHNldERlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKGJvb2wgdmFsdWUp
IHsgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCA9IHZhbHVlOyB9Ci0gICAgYm9vbCBpc01h
aW5UaHJlYWQoKSBjb25zdCB7IHJldHVybiBtX2lzTWFpblRocmVhZDsgfQotCiBwcm90ZWN0ZWQ6
CiAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+KiBtX2RvbU5vZGVNYXA7CiAgICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBtX2RvbU9iamVjdE1hcDsKQEAgLTIxMywzMiArMjAz
LDM0IEBAIHByb3RlY3RlZDoKICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fZG9t
U3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CiAjZW5kaWYKIAotICAgIC8vIFN0b3JlcyBhbGwgdGhl
IERPTSBvYmplY3RzIHRoYXQgYXJlIGRlbGF5ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlIG93
bmluZyB0aHJlYWQgZ2FpbnMgY29udHJvbC4KLSAgICBEZWxheWVkT2JqZWN0TWFwIG1fZGVsYXll
ZE9iamVjdE1hcDsKLQotICAgIC8vIFRoZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB0YXNrIHRv
IGRvIHRoZSBkZWxheWVkIHByb2Nlc3MgaGFzIGFscmVhZHkgYmVlbiBwb3N0ZWQuCi0gICAgYm9v
bCBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkOwotCi0gICAgYm9vbCBtX2lzTWFpblRocmVh
ZDsKK3ByaXZhdGU6CisgICAgLy8gQSBiYWNrLXBvaW50ZXIgdG8gdGhlIERPTURhdGEgdG8gd2hp
Y2ggd2UgYmVsb25nLgorICAgIERPTURhdGEqIG1fZG9tRGF0YTsKIH07CiAKLS8vIFRoaXMgZW5j
YXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3Igbm9uLW1haW4gdGhyZWFkLiBB
bGwgdGhlIG1hcHMgaW4gaXQgYXJlIGNyZWF0ZWQgZHluYW1pY2FsbHkuCi1jbGFzcyBOb25NYWlu
VGhyZWFkU3BlY2lmaWNET01EYXRhIDogcHVibGljIFRocmVhZFNwZWNpZmljRE9NRGF0YSB7Cisv
LyBTY29wZWRET01EYXRhU3RvcmUKKy8vCisvLyBTY29wZWRET01EYXRhU3RvcmUgaXMgYSBET01E
YXRhU3RvcmUgdGhhdCBjb250cm9scyBsaW1pdHMgdGhlIGxpZmV0aW1lIG9mCisvLyB0aGUgc3Rv
cmUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMs
IHdoZW4gdGhlCisvLyBTY29wZWRET01EYXRhU3RvcmUgb2JqZWN0IGlzIGRlYWxsb2NhdGVkLCB0
aGUgbWFwcyB0aGF0IGJlbG9uZyB0byB0aGUgc3RvcmUKKy8vIGFyZSBkZWFsbG9jYXRlZCBhcyB3
ZWxsLgorLy8KK2NsYXNzIFNjb3BlZERPTURhdGFTdG9yZSA6IHB1YmxpYyBET01EYXRhU3RvcmUg
ewogcHVibGljOgotICAgIE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgIFNjb3Bl
ZERPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKSA6IERPTURhdGFTdG9yZShkb21EYXRhKQog
ICAgIHsKLSAgICAgICAgbV9kb21Ob2RlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxO
b2RlPigmd2Vha05vZGVDYWxsYmFjayk7Ci0gICAgICAgIG1fZG9tT2JqZWN0TWFwID0gbmV3IElu
dGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPih3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOwotICAgICAg
ICBtX2FjdGl2ZURvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4o
d2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKTsKKyAgICAgICAgbV9kb21Ob2RlTWFwID0gbmV3
IEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPihkb21EYXRhLCB3ZWFrTm9kZUNhbGxiYWNrKTsK
KyAgICAgICAgbV9kb21PYmplY3RNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+
KGRvbURhdGEsIHdlYWtET01PYmplY3RDYWxsYmFjayk7CisgICAgICAgIG1fYWN0aXZlRG9tT2Jq
ZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCB3ZWFrQWN0
aXZlRE9NT2JqZWN0Q2FsbGJhY2spOwogI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIG1fZG9tU3Zn
RWxlbWVudEluc3RhbmNlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50
SW5zdGFuY2U+KHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk7Ci0gICAgICAgIG1fZG9t
U3ZnT2JqZWN0V2l0aENvbnRleHRNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+
KHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKTsKKyAgICAgICAgbV9kb21TdmdFbGVt
ZW50SW5zdGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0
YW5jZT4oZG9tRGF0YSwgd2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKTsKKyAgICAgICAg
bV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
dm9pZD4oZG9tRGF0YSwgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spOwogI2VuZGlm
CiAgICAgfQogCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBXVEYgdGhyZWFkIGlzIHRlYXJp
bmcgZG93bi4KKyAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgd2hlbiBXVEYgdGhyZWFkIGlzIHRl
YXJpbmcgZG93bi4KICAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2hpbGQgdGhyZWFkcyBydW5u
aW5nIFY4IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBXVEYuCi0gICAgdmlydHVhbCB+Tm9uTWFp
blRocmVhZFNwZWNpZmljRE9NRGF0YSgpCisgICAgdmlydHVhbCB+U2NvcGVkRE9NRGF0YVN0b3Jl
KCkKICAgICB7CiAgICAgICAgIGRlbGV0ZSBtX2RvbU5vZGVNYXA7CiAgICAgICAgIGRlbGV0ZSBt
X2RvbU9iamVjdE1hcDsKQEAgLTI1MCwxOCArMjQyLDIzIEBAIHB1YmxpYzoKICAgICB9CiB9Owog
Ci0vLyBUaGlzIGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIHRoZSBt
YWluIHRocmVhZC4gQWxsIHRoZSBtYXBzIGluIGl0IGFyZSBzdGF0aWMuCi0vLyBUaGlzIGlzIGJl
Y2F1c2Ugd2UgYXJlIHVuYWJsZSB0byByZWx5IG9uIFdURjo6VGhyZWFkU3BlY2lmaWNUaHJlYWRF
eGl0IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlCi0vLyB0aGUgcGxhY2UgdGhhdCB0ZWFycyBkb3du
IHRoZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlvbnMuCi1jbGFzcyBN
YWluVGhyZWFkU3BlY2lmaWNET01EYXRhIDogcHVibGljIFRocmVhZFNwZWNpZmljRE9NRGF0YSB7
CisvLyBTdGF0aWNET01EYXRhU3RvcmUKKy8vCisvLyBTdGF0aWNET01EYXRhU3RvcmUgaXMgYSBE
T01EYXRhU3RvcmUgdGhhdCBtYW5hZ2VzIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUKKy8vIHN0
YXRpY2FsbHkuICBUaGlzIGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9y
IHRoZSBtYWluCisvLyB0aHJlYWQuICBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4gIFRo
aXMgaXMgYmVjYXVzZSB3ZSBhcmUgdW5hYmxlIHRvCisvLyByZWx5IG9uIFdURjo6VGhyZWFkU3Bl
Y2lmaWNUaHJlYWRFeGl0IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlIHRoZSBwbGFjZSB0aGF0Cisv
LyB0ZWFycyBkb3duIHRoZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlv
bnMuCitjbGFzcyBTdGF0aWNET01EYXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0b3JlIHsKIHB1
YmxpYzoKLSAgICBNYWluVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKLSAgICAgICAgOiBtX3N0YXRp
Y0RvbU5vZGVNYXAod2Vha05vZGVDYWxsYmFjaykKLSAgICAgICAgLCBtX3N0YXRpY0RvbU9iamVj
dE1hcCh3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spCi0gICAgICAgICwgbV9zdGF0aWNBY3RpdmVEb21P
YmplY3RNYXAod2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKQorICAgIFN0YXRpY0RPTURhdGFT
dG9yZShET01EYXRhKiBkb21EYXRhKQorICAgICAgICA6IERPTURhdGFTdG9yZShkb21EYXRhKQor
ICAgICAgICAsIG1fc3RhdGljRG9tTm9kZU1hcChkb21EYXRhLCB3ZWFrTm9kZUNhbGxiYWNrKQor
ICAgICAgICAsIG1fc3RhdGljRG9tT2JqZWN0TWFwKGRvbURhdGEsIHdlYWtET01PYmplY3RDYWxs
YmFjaykKKyAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9iamVjdE1hcChkb21EYXRhLCB3ZWFr
QWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCiAjaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLCBtX3N0
YXRpY0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCh3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJh
Y2spCi0gICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCh3ZWFrU1ZH
T2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKKyAgICAgICAgLCBtX3N0YXRpY0RvbVN2Z0VsZW1l
bnRJbnN0YW5jZU1hcChkb21EYXRhLCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spCisg
ICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcChkb21EYXRhLCB3ZWFr
U1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKICNlbmRpZgogICAgIHsKICAgICAgICAgbV9k
b21Ob2RlTWFwID0gJm1fc3RhdGljRG9tTm9kZU1hcDsKQEAgLTI4MSw5OCArMjc4LDE2NyBAQCBw
cml2YXRlOgogICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbVN2Z09i
amVjdFdpdGhDb250ZXh0TWFwOwogfTsKIAotREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6OlRocmVh
ZFNwZWNpZmljPE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGE+LCB0aHJlYWRTcGVjaWZpY0RP
TURhdGEsICgpKTsKK3R5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YVN0
b3JlTGlzdDsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyB2b2lkIGhhbmRsZVdlYWtP
YmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVdyYXBwZXJNYXBU
eXBlIG1hcFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBvYmplY3RUeXBlLCBUKik7
CisvLyBET01EYXRhCisvLworLy8gRE9NRGF0YSByZXByZXNlbnRzIHRoZSBhbGwgdGhlIERPTSB3
cmFwcGVycyBmb3IgYSBnaXZlbiB0aHJlYWQuICBJbgorLy8gcGFydGljdWxhciwgRE9NRGF0YSBo
b2xkcyB3cmFwcGVycyBmb3IgYWxsIHRoZSBpc29sYXRlZCB3b3JsZHMgaW4gdGhlCisvLyB0aHJl
YWQuICBUaGUgRE9NRGF0YSBmb3IgdGhlIG1haW4gdGhyZWFkIGFuZCB0aGUgRE9NRGF0YSBmb3Ig
Y2hpbGQgdGhyZWFkcworLy8gdXNlIGRpZmZlcmVudCBzdWJjbGFzc2VzLgorLy8KK2NsYXNzIERP
TURhdGE6IE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBET01EYXRhKCkKKyAgICAgICAgOiBt
X2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKGZhbHNlKQorICAgICAgICAsIG1faXNNYWluVGhy
ZWFkKFdURjo6aXNNYWluVGhyZWFkKCkpCisgICAgICAgICwgbV9vd25pbmdUaHJlYWQoV1RGOjpj
dXJyZW50VGhyZWFkKCkpCisgICAgeworICAgIH0KIAotVGhyZWFkU3BlY2lmaWNET01EYXRhJiBn
ZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKQotewotICAgIGlmIChXVEY6OmlzTWFpblRocmVhZCgp
KSB7Ci0gICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwoTWFpblRocmVhZFNwZWNpZmljRE9NRGF0
YSwgbWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSwgKCkpOwotICAgICAgICByZXR1cm4gbWFpblRo
cmVhZFNwZWNpZmljRE9NRGF0YTsKKyAgICBzdGF0aWMgRE9NRGF0YSogZ2V0Q3VycmVudCgpOwor
ICAgIHZpcnR1YWwgRE9NRGF0YVN0b3JlJiBnZXRTdG9yZSgpID0gMDsKKworICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaGFuZGxlV2Vha09iamVjdChET01EYXRhU3Rv
cmU6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhP
YmplY3QsIFQqIGRvbU9iamVjdCk7CisKKyAgICB2b2lkIGZvcmdldERlbGF5ZWRPYmplY3Qodm9p
ZCogb2JqZWN0KSB7IG1fZGVsYXllZE9iamVjdE1hcC50YWtlKG9iamVjdCk7IH0KKworICAgIC8v
IFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgd2Ugd2lsbCBkZXJlZiBET00gb2JqZWN0cyBmcm9tIHRo
ZSBvd25pbmcgdGhyZWFkLAorICAgIC8vIG5vdCB0aGUgR0MgdGhyZWFkLiAgVGhlIGhlbHBlciBm
dW5jdGlvbiB3aWxsIGJlIHNjaGVkdWxlZCBieSB0aGUgR0MKKyAgICAvLyB0aHJlYWQgdG8gZ2V0
IGNhbGxlZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorICAgIHN0YXRpYyB2b2lkIGRlcmVmRGVs
YXllZE9iamVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCopOworICAgIHZvaWQgZGVyZWZEZWxheWVk
T2JqZWN0cygpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBy
ZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFwKTsKKwor
ICAgIFRocmVhZElkZW50aWZpZXIgb3duaW5nVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbV9vd25p
bmdUaHJlYWQ7IH0KKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIFdURjo6SGFzaE1hcDx2b2lkKiwg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlPiBEZWxheWVkT2JqZWN0TWFwOworCisgICAgdm9p
ZCBlbnN1cmVEZXJlZihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9pZCogZG9t
T2JqZWN0KTsKKyAgICBzdGF0aWMgdm9pZCBkZXJlZk9iamVjdChWOENsYXNzSW5kZXg6OlY4V3Jh
cHBlclR5cGUgdHlwZSwgdm9pZCogZG9tT2JqZWN0KTsKKworICAgIC8vIFN0b3JlcyBhbGwgdGhl
IERPTSBvYmplY3RzIHRoYXQgYXJlIGRlbGF5ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlIG93
bmluZyB0aHJlYWQgZ2FpbnMgY29udHJvbC4KKyAgICBEZWxheWVkT2JqZWN0TWFwIG1fZGVsYXll
ZE9iamVjdE1hcDsKKworICAgIC8vIFRoZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB0YXNrIHRv
IGRvIHRoZSBkZWxheWVkIHByb2Nlc3MgaGFzIGFscmVhZHkgYmVlbiBwb3N0ZWQuCisgICAgYm9v
bCBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkOworCisgICAgYm9vbCBtX2lzTWFpblRocmVh
ZDsKKyAgICBUaHJlYWRJZGVudGlmaWVyIG1fb3duaW5nVGhyZWFkOworfTsKKworY2xhc3MgTWFp
blRocmVhZERPTURhdGEgOiBwdWJsaWMgRE9NRGF0YSB7CitwdWJsaWM6CisgICAgTWFpblRocmVh
ZERPTURhdGEoKSA6IG1fZGVmYXVsdFN0b3JlKHRoaXMpIHsgfQorCisgICAgRE9NRGF0YVN0b3Jl
JiBnZXRTdG9yZSgpCisgICAgeworICAgICAgICBBU1NFUlQoV1RGOjppc01haW5UaHJlYWQoKSk7
CisgICAgICAgIFY4SXNvbGF0ZWRXb3JsZCogd29ybGQgPSBWOElzb2xhdGVkV29ybGQ6OmdldEVu
dGVyZWQoKTsKKyAgICAgICAgaWYgKHdvcmxkKQorICAgICAgICAgICAgcmV0dXJuICp3b3JsZC0+
Z2V0RE9NRGF0YVN0b3JlKCk7CisgICAgICAgIHJldHVybiBtX2RlZmF1bHRTdG9yZTsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgU3RhdGljRE9NRGF0YVN0b3JlIG1fZGVmYXVsdFN0b3JlOworICAg
IC8vIE5vdGU6IFRoZSBET01EYXRhU3RvcmVzIGZvciBpc29sYXRlZCB3b3JsZCBhcmUgb3duZWQg
YnkgdGhlIHdvcmxkIG9iamVjdC4KK307CisKK2NsYXNzIENoaWxkVGhyZWFkRE9NRGF0YSA6IHB1
YmxpYyBET01EYXRhIHsKK3B1YmxpYzoKKyAgICBDaGlsZFRocmVhZERPTURhdGEoKSA6IG1fZGVm
YXVsdFN0b3JlKHRoaXMpIHsgfQorCisgICAgRE9NRGF0YVN0b3JlJiBnZXRTdG9yZSgpIHsKKyAg
ICAgICAgQVNTRVJUKCFXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgLy8gQ3VycmVudGx5
LCBjaGlsZCB0aHJlYWRzIGhhdmUgb25seSBvbmUgd29ybGQuCisgICAgICAgIHJldHVybiBtX2Rl
ZmF1bHRTdG9yZTsKICAgICB9Ci0gICAgcmV0dXJuICp0aHJlYWRTcGVjaWZpY0RPTURhdGE7CisK
K3ByaXZhdGU6CisgICAgU2NvcGVkRE9NRGF0YVN0b3JlIG1fZGVmYXVsdFN0b3JlOworfTsKKwor
RE9NRGF0YVN0b3JlOjpET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkKKyAgICA6IG1fZG9t
Tm9kZU1hcCgwKQorICAgICwgbV9kb21PYmplY3RNYXAoMCkKKyAgICAsIG1fYWN0aXZlRG9tT2Jq
ZWN0TWFwKDApCisjaWYgRU5BQkxFKFNWRykKKyAgICAsIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwKDApCisgICAgLCBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKDApCisjZW5kaWYKKyAg
ICAsIG1fZG9tRGF0YShkb21EYXRhKQoreworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERP
TURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CisgICAgRE9NRGF0YVN0b3JlOjphbGxTdG9y
ZXMoKS5hcHBlbmQodGhpcyk7Cit9CisKK0RPTURhdGFTdG9yZTo6fkRPTURhdGFTdG9yZSgpCit7
CisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRl
eCgpKTsKKyAgICBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpLnJlbW92ZShET01EYXRhU3RvcmU6
OmFsbFN0b3JlcygpLmZpbmQodGhpcykpOworfQorCitET01EYXRhU3RvcmVIYW5kbGU6OkRPTURh
dGFTdG9yZUhhbmRsZSgpCisgICAgOiBtX3N0b3JlKG5ldyBTY29wZWRET01EYXRhU3RvcmUoRE9N
RGF0YTo6Z2V0Q3VycmVudCgpKSkKK3sKK30KKworRE9NRGF0YVN0b3JlSGFuZGxlOjp+RE9NRGF0
YVN0b3JlSGFuZGxlKCkKK3sKIH0KIAogdGVtcGxhdGUgPGNsYXNzIEtleVR5cGU+Ci12b2lkIFRo
cmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3Jn
ZXQoS2V5VHlwZSogb2JqZWN0KQordm9pZCBET01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBl
ck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KEtleVR5cGUqIG9iamVjdCkKIHsKICAgICBET01XcmFwcGVy
TWFwPEtleVR5cGU+Ojpmb3JnZXQob2JqZWN0KTsKLQotICAgIFRocmVhZFNwZWNpZmljRE9NRGF0
YTo6RGVsYXllZE9iamVjdE1hcCYgZGVsYXllZE9iamVjdE1hcCA9IGdldFRocmVhZFNwZWNpZmlj
RE9NRGF0YSgpLmRlbGF5ZWRPYmplY3RNYXAoKTsKLSAgICBkZWxheWVkT2JqZWN0TWFwLnRha2Uo
b2JqZWN0KTsKKyAgICBtX2RvbURhdGEtPmZvcmdldERlbGF5ZWRPYmplY3Qob2JqZWN0KTsKIH0K
IAogRE9NV3JhcHBlck1hcDxOb2RlPiYgZ2V0RE9NTm9kZU1hcCgpCiB7Ci0gICAgcmV0dXJuIGdl
dFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmRvbU5vZGVNYXAoKTsKKyAgICByZXR1cm4gRE9NRGF0
YTo6Z2V0Q3VycmVudCgpLT5nZXRTdG9yZSgpLmRvbU5vZGVNYXAoKTsKIH0KIAogRE9NV3JhcHBl
ck1hcDx2b2lkPiYgZ2V0RE9NT2JqZWN0TWFwKCkKIHsKLSAgICByZXR1cm4gZ2V0VGhyZWFkU3Bl
Y2lmaWNET01EYXRhKCkuZG9tT2JqZWN0TWFwKCk7CisgICAgcmV0dXJuIERPTURhdGE6OmdldEN1
cnJlbnQoKS0+Z2V0U3RvcmUoKS5kb21PYmplY3RNYXAoKTsKIH0KIAogRE9NV3JhcHBlck1hcDx2
b2lkPiYgZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkKIHsKLSAgICByZXR1cm4gZ2V0VGhyZWFkU3Bl
Y2lmaWNET01EYXRhKCkuYWN0aXZlRG9tT2JqZWN0TWFwKCk7CisgICAgcmV0dXJuIERPTURhdGE6
OmdldEN1cnJlbnQoKS0+Z2V0U3RvcmUoKS5hY3RpdmVEb21PYmplY3RNYXAoKTsKIH0KIAogI2lm
IEVOQUJMRShTVkcpCi1ET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGdldERPTVNW
R0VsZW1lbnRJbnN0YW5jZU1hcCgpCi17Ci0gICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9N
RGF0YSgpLmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpOwotfQogCi1zdGF0aWMgdm9pZCB3ZWFr
U1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9i
amVjdCwgdm9pZCogZG9tT2JqZWN0KQorRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+
JiBnZXRET01TVkdFbGVtZW50SW5zdGFuY2VNYXAoKQogewotICAgIFNWR0VsZW1lbnRJbnN0YW5j
ZSogaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5zdGFuY2UqPihkb21PYmplY3Qp
OwotCi0gICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZH
RWxlbWVudEluc3RhbmNlPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRh
OjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPiY+KGdldERPTVNWR0Vs
ZW1lbnRJbnN0YW5jZU1hcCgpKTsKLSAgICBpZiAobWFwLmNvbnRhaW5zKGluc3RhbmNlKSkgewot
ICAgICAgICBpbnN0YW5jZS0+ZGVyZWYoKTsKLSAgICAgICAgbWFwLmZvcmdldE9ubHkoaW5zdGFu
Y2UpOwotICAgIH0gZWxzZQotICAgICAgICBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJlYWQo
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIFY4Q2xhc3NJ
bmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7CisgICAgcmV0dXJuIERPTURhdGE6
OmdldEN1cnJlbnQoKS0+Z2V0U3RvcmUoKS5kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoKTsKIH0K
IAogLy8gTWFwIG9mIFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjggb2JqZWN0cwogRE9N
V3JhcHBlck1hcDx2b2lkPiYgZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAoKQogewotICAg
IHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcCgpOworICAgIHJldHVybiBET01EYXRhOjpnZXRDdXJyZW50KCktPmdldFN0b3JlKCkuZG9t
U3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKTsKIH0KIAotc3RhdGljIHZvaWQgd2Vha1NWR09iamVj
dFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwg
dm9pZCogZG9tT2JqZWN0KQotewotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKLSAgICBBU1NF
UlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwotCi0gICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+OjpDYXN0KHY4T2JqZWN0KSk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVy
bmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNE
T01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRET01TVkdPYmplY3RXaXRo
Q29udGV4dE1hcCgpKTsKLSAgICBpZiAobWFwLmNvbnRhaW5zKGRvbU9iamVjdCkpIHsKLSAgICAg
ICAgLy8gVGhlIGZvcmdldCBmdW5jdGlvbiByZW1vdmVzIG9iamVjdCBmcm9tIHRoZSBtYXAgYW5k
IGRpc3Bvc2VzIHRoZSB3cmFwcGVyLgotICAgICAgICBtYXAuZm9yZ2V0T25seShkb21PYmplY3Qp
OworI2VuZGlmIC8vIEVOQUJMRShTVkcpCiAKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0jZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xhc3NJ
bmRleDo6dHlwZTogc3RhdGljX2Nhc3Q8bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFr
OwotICAgICAgICBTVkdfT0JKRUNUX1RZUEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNlCi0j
ZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCi0gICAgICAgICAgICBjYXNlIFY4Q2xh
c3NJbmRleDo6dHlwZTogICAgXAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9E
VHlwZVdyYXBwZXI8bmFtZT4qPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICAgICAg
U1ZHX1BPRF9OQVRJVkVfVFlQRVMoTWFrZUNhc2UpCi0jdW5kZWYgTWFrZUNhc2UKLSAgICAgICAg
ZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgaGFuZGxlV2Vha09iamVjdElu
T3duaW5nVGhyZWFkKFRocmVhZFNwZWNpZmljRE9NRGF0YTo6RE9NU1ZHT2JqZWN0V2l0aENvbnRl
eHRNYXAsIHR5cGUsIGRvbU9iamVjdCk7CisvLyBzdGF0aWMKK0RPTURhdGEqIERPTURhdGE6Omdl
dEN1cnJlbnQoKQoreworICAgIGlmIChXVEY6OmlzTWFpblRocmVhZCgpKSB7CisgICAgICAgIERF
RklORV9TVEFUSUNfTE9DQUwoTWFpblRocmVhZERPTURhdGEsIG1haW5UaHJlYWRET01EYXRhLCAo
KSk7CisgICAgICAgIHJldHVybiAmbWFpblRocmVhZERPTURhdGE7CisgICAgfQorICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoV1RGOjpUaHJlYWRTcGVjaWZpYzxDaGlsZFRocmVhZERPTURhdGE+LCBj
aGlsZFRocmVhZERPTURhdGEsICgpKTsKKyAgICByZXR1cm4gY2hpbGRUaHJlYWRET01EYXRhOwog
fQotI2VuZGlmIC8vIEVOQUJMRShTVkcpCiAKIC8vIENhbGxlZCB3aGVuIHRoZSBkZWFkIG9iamVj
dCBpcyBub3QgaW4gR0MgdGhyZWFkJ3MgbWFwLiBHbyB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0
byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyBpdC4KIC8vIFRoZW4gY2xlYXIgdGhlIEpTIHJlZmVy
ZW5jZSBhbmQgcHVzaCB0aGUgRE9NIG9iamVjdCBpbnRvIHRoZSBkZWxheWVkIHF1ZXVlIGZvciBp
dCB0byBiZSBkZXJlZi1lZCBhdCBsYXRlciB0aW1lIGZyb20gdGhlIG93bmluZyB0aHJlYWQuCkBA
IC0zODAsMzEgKzQ0Niw0MyBAQCBzdGF0aWMgdm9pZCB3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRD
YWxsCiAvLyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkIHRoYXQgaGFzIEdDIHJ1
bm5pbmcuCiAvLyAqIE9ubHkgb25lIFY4IGluc3RhbmNlIGlzIHJ1bm5pbmcgYXQgYSB0aW1lIGR1
ZSB0byBWODo6TG9ja2VyLiBTbyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbmN1cnJl
bmN5LgogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJ
bk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1h
cFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBvYmplY3RUeXBlLCBUKiBvYmplY3Qp
CisvLyBzdGF0aWMKK3ZvaWQgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6
OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhPYmpl
Y3QsIFQqIGRvbU9iamVjdCkKIHsKLSAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihkb21EYXRh
TGlzdE11dGV4KCkpOwotICAgIERPTURhdGFMaXN0JiBsaXN0ID0gZG9tRGF0YUxpc3QoKTsKKwor
ICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgo
KSk7CisgICAgRE9NRGF0YUxpc3QmIGxpc3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpOwog
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgewotICAgICAgICBU
aHJlYWRTcGVjaWZpY0RPTURhdGEqIHRocmVhZERhdGEgPSBsaXN0W2ldOworICAgICAgICBET01E
YXRhU3RvcmUqIHN0b3JlID0gbGlzdFtpXTsKKworICAgICAgICBET01EYXRhU3RvcmU6OkludGVy
bmFsRE9NV3JhcHBlck1hcDxUPiogZG9tTWFwID0gc3RhdGljX2Nhc3Q8RE9NRGF0YVN0b3JlOjpJ
bnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qPihzdG9yZS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBl
KSk7CiAKLSAgICAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJN
YXA8VD4qIGRvbU1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJu
YWxET01XcmFwcGVyTWFwPFQ+Kj4odGhyZWFkRGF0YS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBl
KSk7Ci0gICAgICAgIGlmIChkb21NYXAtPmNvbnRhaW5zKG9iamVjdCkpIHsKKyAgICAgICAgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9tTWFwLT5nZXQoZG9tT2JqZWN0KTsKKyAg
ICAgICAgaWYgKCp3cmFwcGVyID09ICp2OE9iamVjdCkgewogICAgICAgICAgICAgLy8gQ2xlYXIg
dGhlIEpTIHJlZmVyZW5jZS4KLSAgICAgICAgICAgIGRvbU1hcC0+Zm9yZ2V0T25seShvYmplY3Qp
OworICAgICAgICAgICAgZG9tTWFwLT5mb3JnZXRPbmx5KGRvbU9iamVjdCk7CisgICAgICAgICAg
ICBzdG9yZS0+ZG9tRGF0YSgpLT5lbnN1cmVEZXJlZihWOFByb3h5OjpHZXRET01XcmFwcGVyVHlw
ZSh2OE9iamVjdCksIGRvbU9iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKLSAgICAgICAg
ICAgIC8vIFB1c2ggaW50byB0aGUgZGVsYXllZCBxdWV1ZS4KLSAgICAgICAgICAgIHRocmVhZERh
dGEtPmRlbGF5ZWRPYmplY3RNYXAoKS5zZXQob2JqZWN0LCBvYmplY3RUeXBlKTsKK3ZvaWQgRE9N
RGF0YTo6ZW5zdXJlRGVyZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQq
IGRvbU9iamVjdCkKK3sKKyAgICBpZiAobV9vd25pbmdUaHJlYWQgPT0gV1RGOjpjdXJyZW50VGhy
ZWFkKCkpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byBkZWxheSB0aGUgd29yay4gIFdlIGNhbiBk
ZXJlZiByaWdodCBub3cuCisgICAgICAgIGRlcmVmT2JqZWN0KHR5cGUsIGRvbU9iamVjdCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgICAgIC8vIFBvc3QgYSB0YXNrIHRvIHRo
ZSBvd25pbmcgdGhyZWFkIGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIGRlbGF5ZWQgcXVldWUuCi0g
ICAgICAgICAgICAvLyBGSVhNRTogRm9yIG5vdywgd2UgY2FuIG9ubHkgcG9zdCB0byBtYWluIHRo
cmVhZCBkdWUgdG8gV1RGIHRhc2sgcG9zdGluZyBsaW1pdGF0aW9uLiBXZSB3aWxsIGZpeCB0aGlz
IHdoZW4gd2Ugd29yayBvbiBuZXN0ZWQgd29ya2VyLgotICAgICAgICAgICAgaWYgKCF0aHJlYWRE
YXRhLT5kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhy
ZWFkRGF0YS0+c2V0RGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQodHJ1ZSk7Ci0gICAgICAgICAg
ICAgICAgaWYgKHRocmVhZERhdGEtPmlzTWFpblRocmVhZCgpKQotICAgICAgICAgICAgICAgICAg
ICBXVEY6OmNhbGxPbk1haW5UaHJlYWQoJmRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJlbnRUaHJl
YWQsIDApOwotICAgICAgICAgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhlIGRlcmVmIG9u
IHRoZSBjb3JyZWN0IHRocmVhZC4KKyAgICBtX2RlbGF5ZWRPYmplY3RNYXAuc2V0KGRvbU9iamVj
dCwgdHlwZSk7CiAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgLy8gUG9zdCBh
IHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQgaW4gb3JkZXIgdG8gcHJvY2VzcyB0aGUgZGVsYXll
ZCBxdWV1ZS4KKyAgICAvLyBGSVhNRTogRm9yIG5vdywgd2UgY2FuIG9ubHkgcG9zdCB0byBtYWlu
IHRocmVhZCBkdWUgdG8gV1RGIHRhc2sgcG9zdGluZyBsaW1pdGF0aW9uLiBXZSB3aWxsIGZpeCB0
aGlzIHdoZW4gd2Ugd29yayBvbiBuZXN0ZWQgd29ya2VyLgorICAgIGlmICghbV9kZWxheWVkUHJv
Y2Vzc2luZ1NjaGVkdWxlZCkgeworICAgICAgICBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVk
ID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlzTWFpblRocmVhZCgpKQorICAgICAgICAgICAgV1RGOjpj
YWxsT25NYWluVGhyZWFkKCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkLCAwKTsK
ICAgICB9CiB9CiAKQEAgLTQxNCw2NSArNDkyLDQzIEBAIHN0YXRpYyB2b2lkIHdlYWtET01PYmpl
Y3RDYWxsYmFjayh2ODo6UGUKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNT
RVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKLQotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwotCi0gICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRl
cm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmlj
RE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+Jj4oZ2V0RE9NT2JqZWN0TWFwKCkp
OwotICAgIGlmIChtYXAuY29udGFpbnMoZG9tT2JqZWN0KSkgewotICAgICAgICAvLyBUaGUgZm9y
Z2V0IGZ1bmN0aW9uIHJlbW92ZXMgb2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhl
IHdyYXBwZXIuCi0gICAgICAgIG1hcC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7Ci0KLSAgICAgICAg
c3dpdGNoICh0eXBlKSB7Ci0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAotICAgICAg
ICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmpl
Y3QpLT5kZXJlZigpOyBicmVhazsKLSAgICAgICAgRE9NX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkK
LSN1bmRlZiBNYWtlQ2FzZQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZQot
ICAgICAgICBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01E
YXRhOjpET01PYmplY3RNYXAsIHR5cGUsIGRvbU9iamVjdCk7CisgICAgRE9NRGF0YTo6aGFuZGxl
V2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCksIGRvbU9iamVjdCk7CiB9CiAKIHZvaWQgd2Vha0FjdGl2ZURP
TU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQq
IGRvbU9iamVjdCkKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CiAgICAgQVNTRVJUKHY4
T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURh
dGFTdG9yZTo6QWN0aXZlRE9NT2JqZWN0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0
KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKK30KIAotICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworc3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6
UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7
CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdDxOb2RlPihET01EYXRhU3RvcmU6OkRPTU5v
ZGVNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0aWNfY2Fz
dDxOb2RlKj4oZG9tT2JqZWN0KSk7Cit9CiAKLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6Oklu
dGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lm
aWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mPihnZXRBY3RpdmVET01PYmpl
Y3RNYXAoKSk7Ci0gICAgaWYgKG1hcC5jb250YWlucyhkb21PYmplY3QpKSB7Ci0gICAgICAgIC8v
IFRoZSBmb3JnZXQgZnVuY3Rpb24gcmVtb3ZlcyBvYmplY3QgZnJvbSB0aGUgbWFwIGFuZCBkaXNw
b3NlcyB0aGUgd3JhcHBlci4KLSAgICAgICAgbWFwLmZvcmdldE9ubHkoZG9tT2JqZWN0KTsKKyNp
ZiBFTkFCTEUoU1ZHKQogCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotI2RlZmluZSBNYWtlQ2Fz
ZSh0eXBlLCBuYW1lKSAgIFwKLSAgICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBz
dGF0aWNfY2FzdDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7Ci0gICAgICAgIEFD
VElWRV9ET01fT0JKRUNUX1RZUEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNlCi0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhbmRsZVdlYWtPYmplY3RJ
bk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkFjdGl2ZURPTU9iamVjdE1hcCwg
dHlwZSwgZG9tT2JqZWN0KTsKK3N0YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3Qp
Cit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNP
YmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRP
TVNWR0VsZW1lbnRJbnN0YW5jZU1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9i
amVjdCksIHN0YXRpY19jYXN0PFNWR0VsZW1lbnRJbnN0YW5jZSo+KGRvbU9iamVjdCkpOwogfQog
Ci1zdGF0aWMgdm9pZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4g
djhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3N0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRo
Q29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQq
IGRvbU9iamVjdCkKIHsKLSAgICBOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KGRvbU9i
amVjdCk7Ci0KLSAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1h
cDxOb2RlPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5h
bERPTVdyYXBwZXJNYXA8Tm9kZT4mPihnZXRET01Ob2RlTWFwKCkpOwotICAgIGlmIChtYXAuY29u
dGFpbnMobm9kZSkpIHsKLSAgICAgICAgbWFwLmZvcmdldE9ubHkobm9kZSk7Ci0gICAgICAgIG5v
ZGUtPmRlcmVmKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmlu
Z1RocmVhZDxOb2RlPihUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTU5vZGVNYXAsIFY4Q2xhc3NJ
bmRleDo6Tk9ERSwgbm9kZSk7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VS
VCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChE
T01EYXRhU3RvcmU6OkRPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwLCB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVy
ZWZPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVj
dCkKKyNlbmRpZiAgLy8gRU5BQkxFKFNWRykKKworLy8gc3RhdGljCit2b2lkIERPTURhdGE6OmRl
cmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmpl
Y3QpCiB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREU6
CkBAIC01MDMsMjYgKzU1OSwyNyBAQCBzdGF0aWMgdm9pZCBkZXJlZk9iamVjdChWOENsYXNzSW5k
ZXg6OlY4CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzKCkKK3Zv
aWQgRE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0cygpCiB7Ci0gICAgV1RGOjpNdXRleExvY2tl
ciBsb2NrZXIoZG9tRGF0YUxpc3RNdXRleCgpKTsKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tl
cihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOwogCi0gICAgZ2V0VGhyZWFkU3BlY2lm
aWNET01EYXRhKCkuc2V0RGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFsc2UpOworICAgIG1f
ZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQgPSBmYWxzZTsKIAotICAgIFRocmVhZFNwZWNpZmlj
RE9NRGF0YTo6RGVsYXllZE9iamVjdE1hcCYgZGVsYXllZE9iamVjdE1hcCA9IGdldFRocmVhZFNw
ZWNpZmljRE9NRGF0YSgpLmRlbGF5ZWRPYmplY3RNYXAoKTsKLSAgICBmb3IgKFRocmVhZFNwZWNp
ZmljRE9NRGF0YTo6RGVsYXllZE9iamVjdE1hcDo6aXRlcmF0b3IgaXRlcihkZWxheWVkT2JqZWN0
TWFwLmJlZ2luKCkpOyBpdGVyICE9IGRlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsraXRlcikgewor
ICAgIGZvciAoRGVsYXllZE9iamVjdE1hcDo6aXRlcmF0b3IgaXRlcihtX2RlbGF5ZWRPYmplY3RN
YXAuYmVnaW4oKSk7IGl0ZXIgIT0gbV9kZWxheWVkT2JqZWN0TWFwLmVuZCgpOyArK2l0ZXIpCiAg
ICAgICAgIGRlcmVmT2JqZWN0KGl0ZXItPnNlY29uZCwgaXRlci0+Zmlyc3QpOwotICAgIH0KLSAg
ICBkZWxheWVkT2JqZWN0TWFwLmNsZWFyKCk7CisKKyAgICBtX2RlbGF5ZWRPYmplY3RNYXAuY2xl
YXIoKTsKIH0KIAotc3RhdGljIHZvaWQgZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVh
ZCh2b2lkKikKKy8vIHN0YXRpYwordm9pZCBET01EYXRhOjpkZXJlZkRlbGF5ZWRPYmplY3RzSW5D
dXJyZW50VGhyZWFkKHZvaWQqKQogewotICAgIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKKyAgICBn
ZXRDdXJyZW50KCktPmRlcmVmRGVsYXllZE9iamVjdHMoKTsKIH0KIAorLy8gc3RhdGljCiB0ZW1w
bGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIHZvaWQgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFw
KERPTVdyYXBwZXJNYXA8VD4mIGRvbU1hcCkKK3ZvaWQgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zy
b21XcmFwcGVyTWFwKERPTVdyYXBwZXJNYXA8VD4mIGRvbU1hcCkKIHsKICAgICBmb3IgKHR5cGVu
YW1lIFdURjo6SGFzaE1hcDxUKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBpdGVyKGRvbU1hcC5p
bXBsKCkuYmVnaW4oKSk7IGl0ZXIgIT0gZG9tTWFwLmltcGwoKS5lbmQoKTsgKytpdGVyKSB7CiAg
ICAgICAgIFQqIGRvbU9iamVjdCA9IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CkBAIC01
NDQsMjMgKzYwMSwyMyBAQCBzdGF0aWMgdm9pZCByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50
CiAgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwogCiAgICAgLy8gRGVyZWYgYWxsIG9iamVjdHMg
aW4gdGhlIGRlbGF5ZWQgcXVldWUuCi0gICAgZGVyZWZEZWxheWVkT2JqZWN0cygpOworICAgIERP
TURhdGE6OmdldEN1cnJlbnQoKS0+ZGVyZWZEZWxheWVkT2JqZWN0cygpOwogCiAgICAgLy8gUmVt
b3ZlIGFsbCBET00gbm9kZXMuCi0gICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPE5vZGU+
KGdldERPTU5vZGVNYXAoKSk7CisgICAgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVy
TWFwPE5vZGU+KGdldERPTU5vZGVNYXAoKSk7CiAKICAgICAvLyBSZW1vdmUgYWxsIERPTSBvYmpl
Y3RzIGluIHRoZSB3cmFwcGVyIG1hcC4KLSAgICByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8
dm9pZD4oZ2V0RE9NT2JqZWN0TWFwKCkpOworICAgIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9t
V3JhcHBlck1hcDx2b2lkPihnZXRET01PYmplY3RNYXAoKSk7CiAKICAgICAvLyBSZW1vdmUgYWxs
IGFjdGl2ZSBET00gb2JqZWN0cyBpbiB0aGUgd3JhcHBlciBtYXAuCi0gICAgcmVtb3ZlT2JqZWN0
c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldEFjdGl2ZURPTU9iamVjdE1hcCgpKTsKKyAgICBET01E
YXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8dm9pZD4oZ2V0QWN0aXZlRE9NT2JqZWN0
TWFwKCkpOwogCiAjaWYgRU5BQkxFKFNWRykKICAgICAvLyBSZW1vdmUgYWxsIFNWRyBlbGVtZW50
IGluc3RhbmNlcyBpbiB0aGUgd3JhcHBlciBtYXAuCi0gICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFw
cGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4oZ2V0RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKCkp
OworICAgIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1hcDxTVkdFbGVtZW50SW5z
dGFuY2U+KGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCgpKTsKIAogICAgIC8vIFJlbW92ZSBh
bGwgU1ZHIG9iamVjdHMgd2l0aCBjb250ZXh0IGluIHRoZSB3cmFwcGVyIG1hcC4KLSAgICByZW1v
dmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8dm9pZD4oZ2V0RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRN
YXAoKSk7CisgICAgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdl
dERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkpOwogI2VuZGlmCiB9CiAKQEAgLTU3NCw0ICs2
MzEsOTQgQEAgdm9pZCByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkKAogICAgICAg
ICByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkSGVscGVyKCk7CiB9CiAKKwordm9p
ZCB2aXNpdERPTU5vZGVzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8Tm9kZT46OlZpc2l0
b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgV1RGOjpN
dXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKKyAgICBE
T01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERPTURhdGFTdG9y
ZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21EYXRhKCktPm93bmlu
Z1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgSGFzaE1hcDxOb2RlKiwgdjg6Ok9iamVjdCo+JiBtYXAgPSBzdG9yZS0+ZG9t
Tm9kZU1hcCgpLmltcGwoKTsKKyAgICAgICAgZm9yIChIYXNoTWFwPE5vZGUqLCB2ODo6T2JqZWN0
Kj46Oml0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkKKyAg
ICAgICAgICAgIHZpc2l0b3ItPnZpc2l0RE9NV3JhcHBlcihpdC0+Zmlyc3QsIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmlzaXRET01P
YmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8dm9pZD46OlZpc2l0b3IqIHZpc2l0
b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgV1RGOjpNdXRleExvY2tl
ciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKKyAgICBET01EYXRhTGlz
dCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERPTURhdGFTdG9yZSogc3RvcmUg
PSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21EYXRhKCktPm93bmluZ1RocmVhZCgp
ID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+ICYgbWFwID0gc3RvcmUtPmRvbU9iamVjdE1h
cCgpLmltcGwoKTsKKyAgICAgICAgZm9yIChIYXNoTWFwPHZvaWQqLCB2ODo6T2JqZWN0Kj46Oml0
ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkKKyAgICAgICAg
ICAgIHZpc2l0b3ItPnZpc2l0RE9NV3JhcHBlcihpdC0+Zmlyc3QsIHY4OjpQZXJzaXN0ZW50PHY4
OjpPYmplY3Q+KGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmlzaXRBY3RpdmVET01P
YmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8dm9pZD46OlZpc2l0b3IqIHZpc2l0
b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgV1RGOjpNdXRleExvY2tl
ciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKKyAgICBET01EYXRhTGlz
dCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERPTURhdGFTdG9yZSogc3RvcmUg
PSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21EYXRhKCktPm93bmluZ1RocmVhZCgp
ID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+JiBtYXAgPSBzdG9yZS0+YWN0aXZlRG9tT2Jq
ZWN0TWFwKCkuaW1wbCgpOworICAgICAgICBmb3IgKEhhc2hNYXA8dm9pZCosIHY4OjpPYmplY3Qq
Pjo6aXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0KQorICAg
ICAgICAgICAgdmlzaXRvci0+dmlzaXRET01XcmFwcGVyKGl0LT5maXJzdCwgdjg6OlBlcnNpc3Rl
bnQ8djg6Ok9iamVjdD4oaXQtPnNlY29uZCkpOworICAgIH0KK30KKworI2lmIEVOQUJMRShTVkcp
CisKK3ZvaWQgdmlzaXRET01TVkdFbGVtZW50SW5zdGFuY2VzSW5DdXJyZW50VGhyZWFkKERPTVdy
YXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPjo6VmlzaXRvciogdmlzaXRvcikKK3sKKyAgICB2
ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01E
YXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFMaXN0JiBsaXN0ID0gRE9N
RGF0YVN0b3JlOjphbGxTdG9yZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Qu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRE9NRGF0YVN0b3JlKiBzdG9yZSA9IGxpc3RbaV07Cisg
ICAgICAgIGlmICghc3RvcmUtPmRvbURhdGEoKS0+b3duaW5nVGhyZWFkKCkgPT0gV1RGOjpjdXJy
ZW50VGhyZWFkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBIYXNoTWFwPFNW
R0VsZW1lbnRJbnN0YW5jZSosIHY4OjpPYmplY3QqPiAmIG1hcCA9IHN0b3JlLT5kb21TdmdFbGVt
ZW50SW5zdGFuY2VNYXAoKS5pbXBsKCk7CisgICAgICAgIGZvciAoSGFzaE1hcDxTVkdFbGVtZW50
SW5zdGFuY2UqLCB2ODo6T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9
IG1hcC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgIHZpc2l0b3ItPnZpc2l0RE9NV3JhcHBlcihp
dC0+Zmlyc3QsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+KGl0LT5zZWNvbmQpKTsKKyAgICB9
Cit9CisKK3ZvaWQgdmlzaXRTVkdPYmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8
dm9pZD46OlZpc2l0b3IqIHZpc2l0b3IpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwor
CisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRl
eCgpKTsKKyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAg
IERPTURhdGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworICAgICAgICBpZiAoIXN0b3JlLT5kb21E
YXRhKCktPm93bmluZ1RocmVhZCgpID09IFdURjo6Y3VycmVudFRocmVhZCgpKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+JiBtYXAg
PSBzdG9yZS0+ZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKS5pbXBsKCk7CisgICAgICAgIGZv
ciAoSGFzaE1hcDx2b2lkKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBpdCA9IG1hcC5iZWdpbigp
OyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpCisgICAgICAgICAgICB2aXNpdG9yLT52aXNpdERPTVdy
YXBwZXIoaXQtPmZpcnN0LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PihpdC0+c2Vjb25kKSk7
CisgICAgfQorfQorCisjZW5kaWYKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2Vi
Q29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGlu
Z3MvdjgvVjhET01NYXAuaAkocmV2aXNpb24gNDQ4OTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4
L1Y4RE9NTWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgVjhE
T01NYXBfaAogCiAjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CiAjaW5jbHVkZSA8djguaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtODksMTAgKzkw
LDI5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdjg6OldlYWtSZWZlcmVuY2VDYWxs
YmFjayBtX3dlYWtSZWZlcmVuY2VDYWxsYmFjazsKICAgICB9OwogCi0KICAgICB0ZW1wbGF0ZSA8
Y2xhc3MgS2V5VHlwZT4gY2xhc3MgRE9NV3JhcHBlck1hcCA6IHB1YmxpYyBXZWFrUmVmZXJlbmNl
TWFwPEtleVR5cGUsIHY4OjpPYmplY3Q+IHsKICAgICBwdWJsaWM6CiAgICAgICAgIERPTVdyYXBw
ZXJNYXAodjg6OldlYWtSZWZlcmVuY2VDYWxsYmFjayBjYWxsYmFjaykgOiBXZWFrUmVmZXJlbmNl
TWFwPEtleVR5cGUsIHY4OjpPYmplY3Q+KGNhbGxiYWNrKSB7IH0KKworICAgICAgICBjbGFzcyBW
aXNpdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgIHZpcnR1YWwgdm9pZCB2aXNpdERP
TVdyYXBwZXIoS2V5VHlwZSoga2V5LCB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBvYmplY3Qp
ID0gMDsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgLy8gQW4gb3BhcXVlIGNsYXNzIHRoYXQg
cmVwcmVzZW50cyBhIHNldCBvZiBET00gd3JhcHBlcnMuCisgICAgY2xhc3MgRE9NRGF0YVN0b3Jl
OworCisgICAgLy8gQSB1dGlsaXR5IGNsYXNzIHRvIG1hbmFnZSB0aGUgbGlmZXRpbWUgb2Ygc2V0
IG9mIERPTSB3cmFwcGVycy4KKyAgICBjbGFzcyBET01EYXRhU3RvcmVIYW5kbGUgeworICAgIHB1
YmxpYzoKKyAgICAgICAgRE9NRGF0YVN0b3JlSGFuZGxlKCk7CisgICAgICAgIH5ET01EYXRhU3Rv
cmVIYW5kbGUoKTsKKworICAgICAgICBET01EYXRhU3RvcmUqIGdldFN0b3JlKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdG9yZS5nZXQoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgT3duUHRyPERP
TURhdGFTdG9yZT4gbV9zdG9yZTsKICAgICB9OwogCiAgICAgLy8gQ2FsbGJhY2sgd2hlbiBKUyB3
cmFwcGVyIG9mIGFjdGl2ZSBET00gb2JqZWN0IGlzIGRlYWQuCkBAIC0xMDAsMTIgKzEyMCwxNSBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAvLyBBIG1hcCBmcm9tIERPTSBub2RlIHRvIGl0
cyBKUyB3cmFwcGVyLgogICAgIERPTVdyYXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAoKTsK
KyAgICB2b2lkIHZpc2l0RE9NTm9kZXNJbkN1cnJlbnRUaHJlYWQoRE9NV3JhcHBlck1hcDxOb2Rl
Pjo6VmlzaXRvciopOwogCiAgICAgLy8gQSBtYXAgZnJvbSBhIERPTSBvYmplY3QgKG5vbi1ub2Rl
KSB0byBpdHMgSlMgd3JhcHBlci4gVGhpcyBtYXAgZG9lcyBub3QgY29udGFpbiB0aGUgRE9NIG9i
amVjdHMgd2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eSAoYWN0aXZlIGRvbSBvYmplY3Rz
KS4KICAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01PYmplY3RNYXAoKTsKKyAgICB2b2lk
IHZpc2l0RE9NT2JqZWN0c0luQ3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpWaXNp
dG9yKik7CiAKICAgICAvLyBBIG1hcCBmcm9tIGEgRE9NIG9iamVjdCB0byBpdHMgSlMgd3JhcHBl
ciBmb3IgRE9NIG9iamVjdHMgd2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eS4KICAgICBE
T01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRBY3RpdmVET01PYmplY3RNYXAoKTsKKyAgICB2b2lkIHZp
c2l0QWN0aXZlRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZChET01XcmFwcGVyTWFwPHZvaWQ+OjpW
aXNpdG9yKik7CiAKICAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgdG8gcmVtb3ZlIGFsbCBE
T00gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkIHdoZW4gaXQgaXMg
dGVhcmluZyBkb3duLgogICAgIHZvaWQgcmVtb3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVh
ZCgpOwpAQCAtMTEzLDkgKzEzNiwxMSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYgRU5BQkxF
KFNWRykKICAgICAvLyBBIG1hcCBmb3IgU1ZHRWxlbWVudEluc3RhbmNlcyB0byBpdHMgSlMgd3Jh
cHBlci4KICAgICBET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGdldERPTVNWR0Vs
ZW1lbnRJbnN0YW5jZU1hcCgpOworICAgIHZvaWQgdmlzaXRTVkdFbGVtZW50SW5zdGFuY2VzSW5D
dXJyZW50VGhyZWFkKERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPjo6VmlzaXRvciop
OwogCiAgICAgLy8gTWFwIG9mIFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjggb2JqZWN0
cy4KICAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1h
cCgpOworICAgIHZvaWQgdmlzaXRET01TVkdPYmplY3RzSW5DdXJyZW50VGhyZWFkKERPTVdyYXBw
ZXJNYXA8dm9pZD46OlZpc2l0b3IqKTsKICNlbmRpZgogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SXNvbGF0ZWRXb3JsZC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOElzb2xhdGVkV29ybGQuY3BwCShyZXZpc2lvbiAw
KQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9WOElzb2xhdGVkV29ybGQuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlY4SXNv
bGF0ZWRXb3JsZC5oIgorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUgIlY4RE9NV2luZG93
LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJIYXNoTWFwLmgiCisjaW5jbHVkZSAi
U2NyaXB0Q29udHJvbGxlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFdlIGNhY2hl
IGEgcG9pbnRlciB0byB0aGUgVjhJc29sYXRlZFdvcmxkIGFzIGEgaGlkZGVuIHByb3BlcnR5IG9u
IHRoZQorLy8gY29udGV4dCdzIGdsb2JhbCBvYmplY3QuICBUaGlzIGNvbnN0YW50IGlzIHRoZSBu
YW1lIG9mIG91ciBoaWRkZW4gcHJvcGVydHkuCisvLworLy8gRklYTUU6IFdlIHNob3VsZCBjZW50
cmFsaXplIG91ciBsaXN0IG9mIFY4IGhpZGRlbiBwcm9wcmV0eSBuYW1lcyB0byBlbnN1cmUKKy8v
IHdlIGRvbid0IGhhdmUgbmFtZSBjb2xsaXNpb25zLgorLy8KK3N0YXRpYyBjaGFyIGtJc29sYXRl
ZFdvcmxkS2V5W10gPSAiSXNvbGF0ZWRXb3JsZCI7CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpT
dHJpbmc+IGdldElzb2xhdGVkV29ybGRLZXkoKQoreworICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVu
dDx2ODo6U3RyaW5nPioga2V5OworICAgIGlmICgha2V5KQorICAgICAgICBrZXkgPSBuZXcgdjg6
OlBlcnNpc3RlbnQ8djg6OlN0cmluZz4odjg6OlBlcnNpc3RlbnQ8djg6OlN0cmluZz46Ok5ldyh2
ODo6U3RyaW5nOjpOZXdTeW1ib2woa0lzb2xhdGVkV29ybGRLZXkpKSk7CisgICAgcmV0dXJuICpr
ZXk7Cit9CisKK3N0YXRpYyBpbnQgZ19pc29sYXRlZFdvcmxkQ291bnQgPSAwOworCitzdGF0aWMg
dm9pZCBjb250ZXh0V2Vha1JlZmVyZW5jZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1
ZT4gb2JqZWN0LCB2b2lkKiBpc29sYXRlZF93b3JsZCkKK3sKKyAgICAvLyBPdXIgY29udGV4dCBp
cyBnb2luZyBhd2F5LiAgVGltZSB0byBjbGVhbiB1cCB0aGUgd29ybGQuCisgICAgVjhJc29sYXRl
ZFdvcmxkKiB3b3JsZCA9IHN0YXRpY19jYXN0PFY4SXNvbGF0ZWRXb3JsZCo+KGlzb2xhdGVkX3dv
cmxkKTsKKyAgICBkZWxldGUgd29ybGQ7Cit9CisKK3ZvaWQgVjhJc29sYXRlZFdvcmxkOjpldmFs
dWF0ZShjb25zdCBWZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mIHNvdXJjZXMsIFY4UHJveHkqIHBy
b3h5KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICB2ODo6UGVyc2lzdGVudDx2
ODo6Q29udGV4dD4gY29udGV4dCA9IHByb3h5LT5jcmVhdGVOZXdDb250ZXh0KHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4oKSk7CisKKyAgICAvLyBSdW4gY29kZSBpbiB0aGUgbmV3IGNvbnRleHQuCisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisKKyAgICAvLyBU
aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QgaXMgY29udHJvbGxlZCBieSB0aGUgVjggR0MuCisg
ICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgdGhlIHdvcmxkIGJlZm9yZSB0b3VjaGluZyBET00gd3Jh
cHBlcnMuCisgICAgVjhJc29sYXRlZFdvcmxkKiB3b3JsZCA9IG5ldyBWOElzb2xhdGVkV29ybGQo
Y29udGV4dCk7CisKKyAgICBwcm94eS0+aW5zdGFsbERPTVdpbmRvdyhjb250ZXh0LCBwcm94eS0+
ZnJhbWUoKS0+ZG9tV2luZG93KCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNl
cy5zaXplKCk7ICsraSkKKyAgICAgICAgcHJveHktPmV2YWx1YXRlKHNvdXJjZXNbaV0sIDApOwor
CisgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgc2VjdXJpdHkgdG9rZW4gbWVhbnMgdGhhdCB0aGUg
Y2FuQWNjZXNzIGlzIGFsd2F5cworICAgIC8vIGNhbGxlZCwgd2hpY2ggaXMgc2xvdy4KKyAgICAv
LyBUT0RPKGFhKTogVXNlIHRva2VucyB3aGVyZSBwb3NzaWJsZS4gVGhpcyB3aWxsIG1lYW4ga2Vl
cGluZyB0cmFjayBvZiBhbGwKKyAgICAvLyBjcmVhdGVkIGNvbnRleHRzIHNvIHRoYXQgdGhleSBj
YW4gYWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgZG9jdW1lbnQgZG9tYWluCisgICAgLy8gY2hhbmdl
cy4KKyAgICAvLyBUT0RPKGFiYXJ0aCk6IE1vdmUgdGhpcyBzdGF0ZW1lbnQgYWJvdmUgcHJveHkt
PmV2YWx1YXRlPyAgSXQgc2VlbXMgbGlrZQorICAgIC8vICAgICAgICAgICAgICAgd2Ugc2hvdWxk
IHNldCB1cCB0aGUgdG9rZW4gYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdC4KKyAgICBjb250ZXh0
LT5Vc2VEZWZhdWx0U2VjdXJpdHlUb2tlbigpOworCisgICAgY29udGV4dC5EaXNwb3NlKCk7Cisg
ICAgLy8gV0FSTklORyEgIFRoaXMgbWlnaHQgd2VsbCBkZWxldGUgfHdvcmxkfC4KK30KKworVjhJ
c29sYXRlZFdvcmxkOjpWOElzb2xhdGVkV29ybGQodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCkKKyAgICA6IG1fY29udGV4dChjb250ZXh0KQoreworICAgICsrZ19pc29sYXRlZFdvcmxk
Q291bnQ7CisgICAgbV9jb250ZXh0Lk1ha2VXZWFrKHRoaXMsICZjb250ZXh0V2Vha1JlZmVyZW5j
ZUNhbGxiYWNrKTsKKyAgICBtX2NvbnRleHQtPkdsb2JhbCgpLT5TZXRIaWRkZW5WYWx1ZShnZXRJ
c29sYXRlZFdvcmxkS2V5KCksIHY4OjpFeHRlcm5hbDo6V3JhcCh0aGlzKSk7Cit9CisKK1Y4SXNv
bGF0ZWRXb3JsZDo6flY4SXNvbGF0ZWRXb3JsZCgpCit7CisgICAgLS1nX2lzb2xhdGVkV29ybGRD
b3VudDsKK30KKworVjhJc29sYXRlZFdvcmxkKiBWOElzb2xhdGVkV29ybGQ6OmdldEVudGVyZWQo
KQoreworICAgIGlmIChnX2lzb2xhdGVkV29ybGRDb3VudCA9PSAwKSB7CisgICAgICAgIC8vIFRo
aXMgaXMgYSB0ZW1wb3JhcnkgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgIEVzc2VudGlhbGx5
LAorICAgICAgICAvLyBHZXRIaWRkZW5WYWx1ZSBpcyB0b28gc2xvdyBmb3IgdGhpcyBjb2RlIHBh
dGguICBXZSBuZWVkIHRvIGdldCB0aGUKKyAgICAgICAgLy8gVjggdGVhbSB0byBhZGQgYSByZWFs
IHByb3BlcnR5IHRvIHY4OjpDb250ZXh0IGZvciBpc29sYXRlZCB3b3JsZHMuCisgICAgICAgIC8v
IFVudGlsIHRoZW4sIHdlIG9wdGltaXplIHRoZSBjb21tb24gY2FzZSBvZiBub3QgaGF2aW5nIGFu
eSBpc29sYXRlZAorICAgICAgICAvLyB3b3JsZHMgYXQgYWxsLgorICAgICAgICByZXR1cm4gTlVM
TDsKKyAgICB9CisKKyAgICBpZiAoIXY4OjpDb250ZXh0OjpJbkNvbnRleHQoKSkKKyAgICAgICAg
cmV0dXJuIE5VTEw7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gd29ybGQgPSB2ODo6Q29udGV4dDo6R2V0RW50ZXJlZCgpLT5HbG9iYWwoKS0+
R2V0SGlkZGVuVmFsdWUoZ2V0SXNvbGF0ZWRXb3JsZEtleSgpKTsKKyAgICBpZiAod29ybGQuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxW
OElzb2xhdGVkV29ybGQqPih2ODo6RXh0ZXJuYWw6OlVud3JhcCh3b3JsZCkpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SXNvbGF0ZWRX
b3JsZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhJc29sYXRlZFdvcmxk
LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4SXNvbGF0ZWRXb3JsZC5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWOElzb2xhdGVkV29ybGRfaAor
I2RlZmluZSBWOElzb2xhdGVkV29ybGRfaAorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUg
InY4X2luZGV4LmgiCisjaW5jbHVkZSAidjhfdXRpbGl0eS5oIgorI2luY2x1ZGUgIlY4RE9NTWFw
LmgiCisjaW5jbHVkZSAiU2NyaXB0U291cmNlQ29kZS5oIiAgLy8gZm9yIFdlYkNvcmU6OlNjcmlw
dFNvdXJjZUNvZGUKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgVjhQcm94eTsK
KworICAgIC8vIFY4SXNvbGF0ZWRXb3JsZAorICAgIC8vCisgICAgLy8gVjhJc29sYXRlZFdvcmxk
IHJlcHJlc2VudHMgYSBpc29sYXRlZCBleGVjdXRpb24gZW52aXJvbm1lbnQgZm9yCisgICAgLy8g
SmF2YVNjcmlwdC4gIEVhY2ggaXNvbGF0ZWQgd29ybGQgZXhlY3V0ZXMgaW4gcGFyYWxsZWwgd2l0
aCB0aGUgbWFpbgorICAgIC8vIEphdmFTY3JpcHQgd29ybGQuICBBbiBpc29sYXRlZCB3b3JsZCBo
YXMgYWNjZXNzIHRvIHRoZSBzYW1lIERPTSBkYXRhCisgICAgLy8gc3RydWN0dXJlcyBhcyB0aGUg
bWFpbiB3b3JsZCBidXQgbm9uZSBvZiB0aGUgSmF2YVNjcmlwdCBwb2ludGVycy4KKyAgICAvLwor
ICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGV2ZXIgc2hhcmUgYSBKYXZhU2NyaXB0IHBvaW50ZXIg
YmV0d2VlbiB0d28gaXNvbGF0ZWQKKyAgICAvLyB3b3JsZHMgb3IgYmV0d2VlbiBhbiBpc29sYXRl
ZCB3b3JsZCBhbmQgdGhlIG1haW4gd29ybGQuICBCZWNhdXNlCisgICAgLy8gaXNvbGF0ZWQgd29y
bGRzIGhhdmUgYWNjZXNzIHRvIHRoZSBET00sIHRoZXkgbmVlZCB0aGVpciBvd24gRE9NIHdyYXBw
ZXJzCisgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHBvaW50ZXJzIHRvIHRoZSBtYWluIHdvcmxkJ3Mg
RE9NIHdyYXBwZXJzICh3aGljaCBhcmUKKyAgICAvLyBKYXZhU2NyaXB0IG9iamVjdHMpLgorICAg
IC8vCisgICAgY2xhc3MgVjhJc29sYXRlZFdvcmxkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5W
OElzb2xhdGVkV29ybGQoKTsKKworICAgICAgICAvLyBFdmFsdWF0ZSBKYXZhU2NyaXB0IGluIGEg
bmV3IGlzb2xhdGVkIHdvcmxkLiAgVGhlIHNjcmlwdCBoYXMgYWNjZXNzCisgICAgICAgIC8vIHRv
IHRoZSBET00gb2YgdGhlIGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB8cHJveHl8LgorICAgICAg
ICBzdGF0aWMgdm9pZCBldmFsdWF0ZShjb25zdCBWZWN0b3I8U2NyaXB0U291cmNlQ29kZT4mIHNv
dXJjZXMsIFY4UHJveHkqIHByb3h5KTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBpc29sYXRl
ZCB3b3JsZCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgLy8gdjg6OkNvbnRleHQ6OkdldEVudGVy
ZWQoKS4gIEJlY2F1c2Ugd29ybGRzIGFyZSBpc29sYXRlZCwgdGhlIGVudGlyZQorICAgICAgICAv
LyBKYXZhU2NyaXB0IGNhbGwgc3RhY2sgc2hvdWxkIGJlIGZyb20gdGhlIHNhbWUgaXNvbGF0ZWQg
d29ybGQuCisgICAgICAgIC8vIFJldHVybnMgTlVMTCBpZiB0aGUgZW50ZXJlZCBjb250ZXh0IGlz
IGZyb20gdGhlIG1haW4gd29ybGQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBDb25z
aWRlciBlZGdlIGNhc2VzIHdpdGggRE9NIG11dGF0aW9uIGV2ZW50cyB0aGF0IG1pZ2h0CisgICAg
ICAgIC8vIHZpb2xhdGUgdGhpcyBpbnZhcmlhbnQuCisgICAgICAgIC8vCisgICAgICAgIHN0YXRp
YyBWOElzb2xhdGVkV29ybGQqIGdldEVudGVyZWQoKTsKKworICAgICAgICBET01EYXRhU3RvcmUq
IGdldERPTURhdGFTdG9yZSgpIGNvbnN0IHsgcmV0dXJuIG1fZG9tRGF0YVN0b3JlLmdldFN0b3Jl
KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRoZSBsaWZldGltZSBvZiBhbiBpc29s
YXRlZCB3b3JsZCBpcyBtYW5hZ2VkIGJ5IHRoZSBWOCBnYXJiYWdlCisgICAgICAgIC8vIGNvbGxl
Y3Rvci4gIEluIHBhcnRpY3VsYXIsIHRoZSBvYmplY3QgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVj
dG9yIGlzCisgICAgICAgIC8vIGZyZWVkIHdoZW4gfGNvbnRleHR8IGlzIGdhcmJhZ2UgY29sbGVj
dGVkLgorICAgICAgICBleHBsaWNpdCBWOElzb2xhdGVkV29ybGQodjg6OkhhbmRsZTx2ODo6Q29u
dGV4dD4gY29udGV4dCk7CisKKyAgICAgICAgLy8gVGhlIHY4OjpDb250ZXh0IGZvciB0aGUgaXNv
bGF0ZWQgd29ybGQuICBUaGlzIG9iamVjdCBpcyBrZWVwIG9uIHRoZQorICAgICAgICAvLyBoZWFw
IGFzIGxvbmcgYXMgfG1fY29udGV4dHwgaGFzIG5vdCBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgor
ICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OworCisgICAgICAg
IC8vIFRoZSBiYWNraW5nIHN0b3JlIGZvciB0aGUgaXNvbGF0ZWQgd29ybGQncyBET00gd3JhcHBl
cnMuICBUaGlzIGNsYXNzCisgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB2aXNpYmlsaXR5IGludG8g
dGhlIHdyYXBwZXJzLiAgVGhpcyBoYW5kbGUgc2ltcGx5IGhlbHBzCisgICAgICAgIC8vIG1hbmFn
ZSB0aGVpciBsaWZldGltZS4KKyAgICAgICAgRE9NRGF0YVN0b3JlSGFuZGxlIG1fZG9tRGF0YVN0
b3JlOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFY4SXNv
bGF0ZWRXb3JsZF9oCg==
</data>
<flag name="review"
          id="16254"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>