<?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>32246</bug_id>
          
          <creation_ts>2009-12-07 14:37:08 -0800</creation_ts>
          <short_desc>Multiple connection attempts to a WebSocket server should not be allowed</short_desc>
          <delta_ts>2016-03-31 11:15:56 -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 Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>beidson</cc>
    
    <cc>bfulgham</cc>
    
    <cc>buildbot</cc>
    
    <cc>joenotcharles</cc>
    
    <cc>lamarque</cc>
    
    <cc>ocheung</cc>
    
    <cc>rniwa</cc>
    
    <cc>ukai</cc>
    
    <cc>wilander</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>169472</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-12-07 14:37:08 -0800</bug_when>
    <thetext>We don&apos;t have the following implemented yet:

-------------------------------
   1.   If the user agent already has a Web Socket connection to the
        remote host (IP address) identified by /host/, even if known by
        another name, wait until that connection has been established or
        for that connection to have failed.

        NOTE: This makes it harder for a script to perform a denial of
        service attack by just opening a large number of Web Socket
        connections to a remote host.

        NOTE: There is no limit to the number of established Web Socket
        connections a user agent can have with a single remote host.
        Servers can refuse to connect users with an excessive number of
        connections, or disconnect resource-hogging users when suffering
        high load.
-------------------------------</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169602</commentid>
    <comment_count>1</comment_count>
    <who name="Fumitoshi Ukai">ukai</who>
    <bug_when>2009-12-07 21:52:32 -0800</bug_when>
    <thetext>Chromium implement this in SocketStreamHandle, but it&apos;s not clean, but it needs to sniff data to detect handshake message.

Maybe, we need to add some methods in SocketStreamHandle and SocketStreamHandleClient.

 - new SocketStreamHandle




(In reply to comment #0)
&gt; We don&apos;t have the following implemented yet:
&gt; 
&gt; -------------------------------
&gt;    1.   If the user agent already has a Web Socket connection to the
&gt;         remote host (IP address) identified by /host/, even if known by
&gt;         another name, wait until that connection has been established or
&gt;         for that connection to have failed.
&gt; 
&gt;         NOTE: This makes it harder for a script to perform a denial of
&gt;         service attack by just opening a large number of Web Socket
&gt;         connections to a remote host.
&gt; 
&gt;         NOTE: There is no limit to the number of established Web Socket
&gt;         connections a user agent can have with a single remote host.
&gt;         Servers can refuse to connect users with an excessive number of
&gt;         connections, or disconnect resource-hogging users when suffering
&gt;         high load.
&gt; -------------------------------</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169603</commentid>
    <comment_count>2</comment_count>
    <who name="Fumitoshi Ukai">ukai</who>
    <bug_when>2009-12-07 21:58:49 -0800</bug_when>
    <thetext>Chromium implement this in SocketStreamHandle, but it&apos;s not clean.
It needs to sniff data to detect handshake message.

To implement it in WebCore/websocket,  we need to add some methods in SocketStreamHandle and SocketStreamHandleClient.

 - new SocketStreamHandle
        resolve ip address from host.
        calls back client-&gt;willOpen(handle, addresslist);
 - in WebSocketChannel, maintain table of address that is running handshake.
   if handle&apos;s address is open, call handle-&gt;connect().
   otherwise, wait other handle&apos;s handshake finishes, or close.

  - in WebSocketChannel, once handshake is finished or closed, clear its addresses from table.
     pick next handle which address becomes free from the table, and call handle-&gt;connect().



(In reply to comment #0)
&gt; We don&apos;t have the following implemented yet:
&gt; 
&gt; -------------------------------
&gt;    1.   If the user agent already has a Web Socket connection to the
&gt;         remote host (IP address) identified by /host/, even if known by
&gt;         another name, wait until that connection has been established or
&gt;         for that connection to have failed.
&gt; 
&gt;         NOTE: This makes it harder for a script to perform a denial of
&gt;         service attack by just opening a large number of Web Socket
&gt;         connections to a remote host.
&gt; 
&gt;         NOTE: There is no limit to the number of established Web Socket
&gt;         connections a user agent can have with a single remote host.
&gt;         Servers can refuse to connect users with an excessive number of
&gt;         connections, or disconnect resource-hogging users when suffering
&gt;         high load.
&gt; -------------------------------</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169765</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-12-08 13:09:20 -0800</bug_when>
    <thetext>This sounds like a good plan.

Alternatively, we could try to shoot down this provision in the spec. I&apos;m not sure if it really adds any protection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169786</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-12-08 14:02:57 -0800</bug_when>
    <thetext>Actually, I need to reverse both statements!

Yes, WebSocket is the first way to open an unlimited number of connections to a single server, so it indeed likely needs additional protection to prevent DOS attacks.

But we don&apos;t really have a way to implement this correctly. Since each DNS request can result in a new result (this is a form of load balancing), resolving the name first and re-resolving it for actual connect() won&apos;t work. We don&apos;t have a way to pass both host name and its pre-resolved IP address down to the network stack.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169844</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-12-08 17:12:18 -0800</bug_when>
    <thetext>&lt;rdar://problem/7455142&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>357709</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-02-24 22:45:33 -0800</bug_when>
    <thetext>*** Bug 55178 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>360925</commentid>
    <comment_count>7</comment_count>
    <who name="Joe Mason">joenotcharles</who>
    <bug_when>2011-03-02 11:09:57 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Actually, I need to reverse both statements!
&gt; 
&gt; Yes, WebSocket is the first way to open an unlimited number of connections to a single server, so it indeed likely needs additional protection to prevent DOS attacks.
&gt; 
&gt; But we don&apos;t really have a way to implement this correctly. Since each DNS request can result in a new result (this is a form of load balancing), resolving the name first and re-resolving it for actual connect() won&apos;t work. We don&apos;t have a way to pass both host name and its pre-resolved IP address down to the network stack.

We could add didResolveIP(handle, ip) to SocketStreamHandleClient, and only add a host/ip pair to the &quot;existing connections&quot; map if this is called.  That way each platform&apos;s network backend can call this function if they can get the IP, and if they don&apos;t implement it they just don&apos;t get connection limiting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>874768</commentid>
    <comment_count>8</comment_count>
      <attachid>197853</attachid>
    <who name="Lamarque V. Souza">lamarque</who>
    <bug_when>2013-04-12 08:51:30 -0700</bug_when>
    <thetext>Created attachment 197853
Patch

Proposed patch. The patch is not ready so I am not asking for +cq just yet. I want to read comments about it before I finish it, specially regarding the RefPtr/ListHashSet usage and the two FIXME I added to it. Just as a note, I am using 50 as pending request limit because LayoutTests/http/tests/websocket/tests/hybi/multiple-connections.html starts 50 connection attempts. Using 50 as limit allows me to avoid editing multiple-connections.html to lower that value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>874786</commentid>
    <comment_count>9</comment_count>
      <attachid>197853</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-04-12 09:15:35 -0700</bug_when>
    <thetext>Comment on attachment 197853
Patch

Attachment 197853 did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/131073</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>874800</commentid>
    <comment_count>10</comment_count>
      <attachid>197853</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-04-12 09:40:02 -0700</bug_when>
    <thetext>Comment on attachment 197853
Patch

Attachment 197853 did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/35303</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>874851</commentid>
    <comment_count>11</comment_count>
      <attachid>197853</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-04-12 10:56:59 -0700</bug_when>
    <thetext>Comment on attachment 197853
Patch

I don&apos;t think that WebSocket class is the correct level for such checks. In a multi-process environment, the checks should be in networking process to account for the possibility of a client using multiple windows and/or frames.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>874957</commentid>
    <comment_count>12</comment_count>
    <who name="Lamarque V. Souza">lamarque</who>
    <bug_when>2013-04-12 14:32:05 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 197853 [details])
&gt; I don&apos;t think that WebSocket class is the correct level for such checks. In a multi-process environment, the checks should be in networking process to account for the possibility of a client using multiple windows and/or frames.

Would moving the checks to WebSocketChannel as suggested in comment #2 work in multi-process environment?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>875889</commentid>
    <comment_count>13</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-04-15 10:26:40 -0700</bug_when>
    <thetext>Unsure. I really see this as part of underlying networking code, just like HTTP connection limit enforcement.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>875936</commentid>
    <comment_count>14</comment_count>
    <who name="Lamarque V. Souza">lamarque</who>
    <bug_when>2013-04-15 12:15:15 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Unsure. I really see this as part of underlying networking code, just like HTTP connection limit enforcement.

In which file is the HTTP connection limit enforcement implemented? I have found initializeMaximumHTTPConnectionCountPerHost in Source/WebCore/platform/network/ResourceRequestBase.h but it seems not to be used anywhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>875977</commentid>
    <comment_count>15</comment_count>
    <who name="Joe Mason">joenotcharles</who>
    <bug_when>2013-04-15 12:28:49 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #13)
&gt; &gt; Unsure. I really see this as part of underlying networking code, just like HTTP connection limit enforcement.
&gt; 
&gt; In which file is the HTTP connection limit enforcement implemented? I have found initializeMaximumHTTPConnectionCountPerHost in Source/WebCore/platform/network/ResourceRequestBase.h but it seems not to be used anywhere.

It&apos;s not in WebKit - it&apos;s part of the underlying platform network stack (the Windows network stack, or the Mac network stack, or libsoup for the GTK+ port, or the Qt network classes for the Qt port, etc.)

I&apos;m not sure websockets are in the same boat as HTTP connection limits. It&apos;s assumed that the underlying stack is a complete implementation of the HTTP protocol, but for WebSockets most of the protocol is implemented in WebKit and the &quot;underlying stack&quot; is simply TCP. So any additional limitations that don&apos;t apply to TCP connections in general would be more properly be part of the WebSocket protocol code in WebKit than in the network stack.

(To be a completely clean parallel to HTTP, much of the WebSocket code should be removed from webkit and provided through an external library... but that&apos;s uselessly pedantic.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>876053</commentid>
    <comment_count>16</comment_count>
    <who name="Lamarque V. Souza">lamarque</who>
    <bug_when>2013-04-15 14:05:21 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; In which file is the HTTP connection limit enforcement implemented? I have found initializeMaximumHTTPConnectionCountPerHost in Source/WebCore/platform/network/ResourceRequestBase.h but it seems not to be used anywhere.
&gt; 
&gt; It&apos;s not in WebKit - it&apos;s part of the underlying platform network stack (the Windows network stack, or the Mac network stack, or libsoup for the GTK+ port, or the Qt network classes for the Qt port, etc.)
&gt; 
&gt; I&apos;m not sure websockets are in the same boat as HTTP connection limits. It&apos;s assumed that the underlying stack is a complete implementation of the HTTP protocol, but for WebSockets most of the protocol is implemented in WebKit and the &quot;underlying stack&quot; is simply TCP. So any additional limitations that don&apos;t apply to TCP connections in general would be more properly be part of the WebSocket protocol code in WebKit than in the network stack.
&gt; 
&gt; (To be a completely clean parallel to HTTP, much of the WebSocket code should be removed from webkit and provided through an external library... but that&apos;s uselessly pedantic.)

Actually, initializeMaximumHTTPConnectionCountPerHost is used in Source/WebCore/loader/ResourceLoadScheduler.cpp. It seems to be the right place. I am still investigating how ResourceLoadScheduler works.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>876063</commentid>
    <comment_count>17</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-04-15 14:20:28 -0700</bug_when>
    <thetext>WebCore counts HTTP connections in addition to lower level code doing this. IIRC that&apos;s a workaround for some CFNetwork issues, where trying to exceed allowed number of connections would trigger bugs. I don&apos;t remember all details though.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>197853</attachid>
            <date>2013-04-12 08:51:30 -0700</date>
            <delta_ts>2013-04-12 10:56:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-32246-20130412125107.patch</filename>
            <type>text/plain</type>
            <size>31458</size>
            <attacher name="Lamarque V. Souza">lamarque</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQ4MTE1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOTkyMzc3N2Q1ZThlNjYy
ZTRkOGRhYzBlM2UwNGVjYTU5NzYyMzFhOS4uNGJmODg3MTc5YWQzY2YzMjhlODQwNWRhNTUxYjQy
MDAxMjY2ZGFiOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc5IEBACisyMDEzLTA0LTExICBMYW1h
cnF1ZSBWLiBTb3V6YSAgPExhbWFycXVlLlNvdXphQGJhc3lza29tLmNvbT4KKworICAgICAgICBb
V2ViU29ja2V0XSBNdWx0aXBsZSBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIGEgV2ViU29ja2V0IHNl
cnZlciBzaG91bGQgbm90IGJlIGFsbG93ZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTMyMjQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIHBhcnRzIG9mIHNlY3Rpb24g
NC4xIG9mIHRoZSBXZWJTb2NrZXQKKyAgICAgICAgc3BlY2lmaWNhdGlvbi4gV2UgY3JlYXRlIG9u
ZSBxdWV1ZSBmb3IgZWFjaCBpcDpwb3J0IChvciBob3N0OnBvcnQpCisgICAgICAgIGNvbWJpbmF0
aW9uLCBhIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBxdWV1ZWQgaWYgdGhlcmUgaXMgYW4gb25nb2lu
ZworICAgICAgICBjb25uZWN0aW9uIGF0dGVtcHQgb24gdGhlIHNhbWUgaXA6cG9ydC4gQWZ0ZXIg
dGhlIGZpcnN0IGNvbm5lY3Rpb24gaXMKKyAgICAgICAgZXN0YWJsaXNoZWQgb3IgaGFzIGZhaWxl
ZCBvbmUgY29ubmVjdGlvbiByZXF1ZXN0IGlzIGRlcXVldWVkIGFuZCBzdGFydGVkLgorICAgICAg
ICBBbHNvIGFkZCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQ6OmRpZFJlc29sdmVJUCgpIHRvIHBh
c3MgdGhlCisgICAgICAgIHJlc29sdmVkIGlwIGFkZHJlc3MgdG8gV2ViU29ja2V0IG9iamVjdCBz
aW5jZSBXZWJTb2NrZXQgc3BlY2lmaWNhdGlvbgorICAgICAgICBzYXlzIHdlIG11c3QgdXNlIHRo
ZSBpcCBhZGRyZXNzIGFuZCBub3QgdGhlIGhvc3RuYW1lIHdoZW4gaW1wbGVtZW50aW5nCisgICAg
ICAgIHRoaXMuIFRoaXMgcGF0Y2ggaW1wbGVtZW50cyBkaWRSZXNvbHZlSVAoKSBvbmx5IGZvciB0
aGUgUXQgcG9ydC4KKworICAgICAgICBUZXN0OiBodHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9o
eWJpL2ZhaWxlZC1ieS1tYXhpbXVtLXBlbmRpbmctY29ubmVjdGlvbnMuaHRtbAorCisgICAgICAg
ICogTW9kdWxlcy93ZWJzb2NrZXRzL1dlYlNvY2tldC5jcHA6CisgICAgICAgIChXZWJDb3JlKTog
QWRkZWQgbWF4UGVuZGluZ1JlcXVlc3RzIGludCB2YXJpYWJsZSB0byBXZWJDb3JlIG5hbWVzcGFj
ZS4KKyAgICAgICAgKENvbm5lY3Rpb25SZXF1ZXN0KTogQWRkZWQgY2xhc3MgdG8gc3RvcmUgaW5k
aXZpZHVhbCBjb25uZWN0aW9uIHJlcXVlc3QncyBkYXRhLgorICAgICAgICAoQ29ubmVjdGlvblF1
ZXVlKTogQWRkZWQgY2xhc3MgdG8gc3RvcmUgcGVuZGluZyByZXF1ZXN0IGxpc3RzLiBUaGVyZSBp
cworICAgICAgICBvbmUgbGlzdCBmb3IgZWFjaCBpcDpwb3J0IChvciBob3N0OnBvcnQpIGNvbWJp
bmF0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29ubmVjdGlvblJlcXVlc3Q6OmNyZWF0ZSk6IENy
ZWF0ZSBvbmUgQ29ubmVjdGlvblF1ZXVlIG9iamVjdCBmb3IKKyAgICAgICAgZWFjaCBob3N0OnBv
cnQgY29tYmluYXRpb24uIFF1ZXVlIGNvbm5lY3Rpb24gYXR0ZW1wdCBpZiB0aGVyZSBpcyBhCisg
ICAgICAgIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3Mgb24gdGhlIHNhbWUgaG9zdDpwb3J0LiBEZWxh
eSBhbGxvY2F0aW9uIG9mCisgICAgICAgIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsIG9iamVj
dCBmb3IgdGhlIHF1ZXVlZCBjb25uZWN0aW9uIGF0dGVtcHQKKyAgICAgICAgdW50aWwgdGhlIGNv
bm5lY3Rpb24gaXMgcmVhbGx5IHN0YXJ0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDb25uZWN0aW9u
UmVxdWVzdDo6d2ViU29ja2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbm5lY3Rpb25SZXF1ZXN0
Ojpwcm90b2NvbFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpDb25uZWN0aW9uUmVxdWVzdDo6
Q29ubmVjdGlvblJlcXVlc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29ubmVjdGlvblF1ZXVlOjpj
cmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q29ubmVjdGlvblF1ZXVlOjpuYW1lKTogUmV0dXJu
cyB0aGUgaXA6cG9ydCBuYW1lIG9mIHRoaXMgcXVldWUuCisgICAgICAgIChXZWJDb3JlOjpDb25u
ZWN0aW9uUXVldWU6OkNvbm5lY3Rpb25RdWV1ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJTb2Nr
ZXQ6On5XZWJTb2NrZXQpOiBSZW1vdmUgdGhpcyBXZWJTb2NrZXQgb2JqZWN0IGZyb20gdGhlCisg
ICAgICAgIGNvbm5lY3Rpb24gcXVldWUgaW4gY2FzZSBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJl
YWR5LgorICAgICAgICAoV2ViQ29yZTo6V2ViU29ja2V0Ojpjb25uZWN0KTogQWRkZWQgbWV0aG9k
IHRvIGFsbG9jYXRlIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsCisgICAgICAgIGFuZCBzdGFy
dCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OldlYlNvY2tldDo6c3RhcnROZXh0
UGVuZGluZ1JlcXVlc3QpOiBEZXF1ZXVlIG5leHQgcGVuZGluZworICAgICAgICByZXF1ZXN0LCBp
ZiBhbnksIGFuZCBzdGFydHMgaXQuIElmIHRoZXJlIGlzIG5vIHJlcXVlc3QgcGVuZGluZyB0aGUK
KyAgICAgICAgcXVldWUgZm9yIHRoYXQgaXA6cG9ydCBpcyByZW1vdmVkLgorICAgICAgICAoV2Vi
Q29yZTo6V2ViU29ja2V0OjpyZW1vdmVGcm9tUGVuZGluZ1F1ZXVlKTogUmVtb3ZlIHJlcXVlc3Qg
YXNzb2NpYXRlZAorICAgICAgICB3aXRoIHRoaXMgV2ViU29ja2V0IG9iamVjdCBmcm9tIHBlbmRp
bmcgcXVldWUuIFRoaXMgaXMgbmVjZXNzYXJ5IGluCisgICAgICAgIGNhc2UgV2ViU29ja2V0Ojpj
bG9zZSgpIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBpcworICAgICAg
ICBkZXF1ZXVlZCBieSBzdGFydE5leHRQZW5kaW5nUmVxdWVzdC4KKyAgICAgICAgKFdlYkNvcmU6
OldlYlNvY2tldDo6aXNQZW5kaW5nKTogVGVzdCBpZiB0aGlzIFdlYlNvY2tldCBvYmplY3QgaXMg
aW4KKyAgICAgICAgYW55IHBlbmRpbmcgcXVldWUuCisgICAgICAgIChXZWJDb3JlOjpXZWJTb2Nr
ZXQ6OmRpZFJlc29sdmVJUCk6IFVwZGF0ZXMgcGVuZGluZyBxdWV1ZXMgdG8gdXNlCisgICAgICAg
IGlwOnBvcnQgaW5zdGVhZCBvZiBob3N0OnBvcnQgYXMga2V5LgorICAgICAgICAoV2ViQ29yZTo6
V2ViU29ja2V0OjpjbG9zZSk6IENhbGwgcmVtb3ZlRnJvbVBlbmRpbmdRdWV1ZSgpIGFuZAorICAg
ICAgICBzdGFydE5leHRQZW5kaW5nUmVxdWVzdCgpLgorICAgICAgICAoV2ViQ29yZTo6V2ViU29j
a2V0OjpzdG9wKTogQ2FsbCByZW1vdmVGcm9tUGVuZGluZ1F1ZXVlKCkgYW5kCisgICAgICAgIHN0
YXJ0TmV4dFBlbmRpbmdSZXF1ZXN0KCkuCisgICAgICAgIChXZWJDb3JlOjpXZWJTb2NrZXQ6OmRp
ZENvbm5lY3QpOiBDYWxsIHN0YXJ0TmV4dFBlbmRpbmdSZXF1ZXN0KCkuCisgICAgICAgIChXZWJD
b3JlOjpXZWJTb2NrZXQ6OmRpZENsb3NlKTogQ2FsbCBzdGFydE5leHRQZW5kaW5nUmVxdWVzdCgp
LgorICAgICAgICAqIE1vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXQuaDoKKyAgICAgICAgKFdl
YkNvcmUpOgorICAgICAgICAoV2ViU29ja2V0KToKKyAgICAgICAgKiBNb2R1bGVzL3dlYnNvY2tl
dHMvV2ViU29ja2V0Q2hhbm5lbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJTb2NrZXRDaGFu
bmVsOjpmYWlsKTogQXZvaWQgY3Jhc2ggYnkgdGVzdGluZyBpZgorICAgICAgICBoYW5kc2hha2Ug
b2JqZWN0IHdhcyBhbGxvY2F0ZWQgYmVmb3JlIHVzaW5nIGl0LgorICAgICAgICAoV2ViQ29yZTo6
V2ViU29ja2V0Q2hhbm5lbDo6ZGlkUmVzb2x2ZUlQKTogQWRkZWQgbWV0aG9kIHRvIGNhbGwKKyAg
ICAgICAgZGlkUmVzb2x2ZUlQIG9uIHRoaXMgV2ViU29ja2V0Q2hhbm5lbCdzIGNsaWVudCBvYmpl
Y3QuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKiBNb2R1bGVzL3dlYnNvY2tldHMvV2Vi
U29ja2V0Q2hhbm5lbC5oOgorICAgICAgICAoV2ViU29ja2V0Q2hhbm5lbCk6CisgICAgICAgICog
TW9kdWxlcy93ZWJzb2NrZXRzL1dlYlNvY2tldENoYW5uZWxDbGllbnQuaDoKKyAgICAgICAgKFdl
YkNvcmU6OldlYlNvY2tldENoYW5uZWxDbGllbnQ6OmRpZFJlc29sdmVJUCk6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9Tb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaDoKKyAgICAgICAgKFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1I
YW5kbGVDbGllbnQ6OmRpZFJlc29sdmVJUCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9x
dC9Tb2NrZXRTdHJlYW1IYW5kbGVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGVQcml2YXRlOjpzb2NrZXRDb25uZWN0ZWQpOiBJbXBsZW1lbnQKKyAgICAgICAgZGlk
UmVzb2x2ZUlQKCkgZm9yIFF0IHBvcnQuCisKIDIwMTMtMDQtMTAgIE5vYW0gUm9zZW50aGFsICA8
bm9hbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFtUZXhtYXBdIEluIGNlcnRhaW4gc2l0dWF0aW9u
cyBuZXN0ZWQgYmxlbmRpbmcgd2l0aCBvdmVyZmxvdzpoaWRkZW4gZGlzcGxheXMgY2xpcHBlZCBy
ZXN1bHRzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYnNvY2tldHMvV2Vi
U29ja2V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXQu
Y3BwCmluZGV4IGQ4MmQ4MGQ1MmRlYzk0NmVkZTYzZDU4NjdkOGNkNDM2Mzc3OTM4NmQuLjVmOGVk
ZmM0YjU2ZTdmYjIwMmZjZDhhOTc5NTExMzEzMjE2MWJkYWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXQuY3BwCisrKyBiL1NvdXJjZS9XZWJD
b3JlL01vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXQuY3BwCkBAIC02OCw2ICs2OCw3IEBAIHVz
aW5nIG5hbWVzcGFjZSBzdGQ7CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNvbnN0IHNpemVfdCBt
YXhSZWFzb25TaXplSW5CeXRlcyA9IDEyMzsKK2NvbnN0IGludCBtYXhQZW5kaW5nUmVxdWVzdHMg
PSA1MDsKIAogc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQcm90b2NvbENoYXJhY3RlcihVQ2hh
ciBjaGFyYWN0ZXIpCiB7CkBAIC0xNDIsNiArMTQzLDkwIEBAIGNvbnN0IGNoYXIqIFdlYlNvY2tl
dDo6c3ViUHJvdG9jb2xTZXBlcmF0b3IoKQogICAgIHJldHVybiAiLCAiOwogfQogCitjbGFzcyBD
b25uZWN0aW9uUmVxdWVzdCA6IHB1YmxpYyBSZWZDb3VudGVkPENvbm5lY3Rpb25SZXF1ZXN0PiB7
CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8Q29ubmVjdGlvblJlcXVlc3Q+IGNyZWF0
ZShXZWJTb2NrZXQqIHdlYlNvY2tldCwgY29uc3QgQXRvbWljU3RyaW5nJiBwcm90b2NvbFN0cmlu
ZykgeyByZXR1cm4gYWRvcHRSZWYobmV3IENvbm5lY3Rpb25SZXF1ZXN0KHdlYlNvY2tldCwgcHJv
dG9jb2xTdHJpbmcpKTsgfQorCisgICAgdmlydHVhbCB+Q29ubmVjdGlvblJlcXVlc3QoKSB7IH0K
KworICAgIHVzaW5nIFJlZkNvdW50ZWQ8Q29ubmVjdGlvblJlcXVlc3Q+OjpyZWY7CisgICAgdXNp
bmcgUmVmQ291bnRlZDxDb25uZWN0aW9uUmVxdWVzdD46OmRlcmVmOworCisgICAgV2ViU29ja2V0
KiB3ZWJTb2NrZXQoKSB7IHJldHVybiBtX3dlYlNvY2tldDsgfQorICAgIEF0b21pY1N0cmluZyYg
cHJvdG9jb2xTdHJpbmcoKSB7IHJldHVybiBtX3Byb3RvY29sU3RyaW5nOyB9CisKK3ByaXZhdGU6
CisgICAgQ29ubmVjdGlvblJlcXVlc3QoV2ViU29ja2V0KiB3ZWJTb2NrZXQsIGNvbnN0IEF0b21p
Y1N0cmluZyYgcHJvdG9jb2xTdHJpbmcpCisgICAgeworICAgICAgICBtX3dlYlNvY2tldCA9IHdl
YlNvY2tldDsKKyAgICAgICAgbV9wcm90b2NvbFN0cmluZyA9IHByb3RvY29sU3RyaW5nOworICAg
IH0KKworICAgIFdlYlNvY2tldCogbV93ZWJTb2NrZXQ7CisgICAgQXRvbWljU3RyaW5nIG1fcHJv
dG9jb2xTdHJpbmc7Cit9OworCisvLyBXZWJTb2NrZXQ6OmNyZWF0ZSgpIGNyZWF0ZXMgb25lIG9m
IHRoaXMgZm9yIGVhY2ggaXA6cG9ydCAob3IgaG9zdDpwb3J0KSBjb21iaW5hdGlvbi4KK2NsYXNz
IENvbm5lY3Rpb25RdWV1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPENvbm5lY3Rpb25RdWV1ZT4gewor
cHVibGljOgorICAgIHN0cnVjdCBDb25uZWN0aW9uUmVxdWVzdEhhc2hGdW5jdGlvbnM7CisgICAg
c3RydWN0IENvbm5lY3Rpb25SZXF1ZXN0SGFzaFRyYW5zbGF0b3I7CisKKyAgICB0eXBlZGVmIExp
c3RIYXNoU2V0PFJlZlB0cjxDb25uZWN0aW9uUmVxdWVzdD4sIDEsIENvbm5lY3Rpb25SZXF1ZXN0
SGFzaEZ1bmN0aW9ucz4gUmVxdWVzdFNldDsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxDb25uZWN0
aW9uUXVldWU+IGNyZWF0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpIHsgcmV0dXJuIGFkb3B0
UmVmKG5ldyBDb25uZWN0aW9uUXVldWUobmFtZSkpOyB9CisKKyAgICB2aXJ0dWFsIH5Db25uZWN0
aW9uUXVldWUoKSB7IH0KKworICAgIHVzaW5nIFJlZkNvdW50ZWQ8Q29ubmVjdGlvblF1ZXVlPjo6
cmVmOworICAgIHVzaW5nIFJlZkNvdW50ZWQ8Q29ubmVjdGlvblF1ZXVlPjo6ZGVyZWY7CisKKyAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKwor
ICAgIFJlcXVlc3RTZXQgcGVuZGluZ1JlcXVlc3RzOworCitwcml2YXRlOgorICAgIENvbm5lY3Rp
b25RdWV1ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisg
ICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKK307CisKKy8vIFRoZSBIYXNoRnVuY3Rpb25zIG9iamVj
dCB1c2VkIGJ5IHRoZSBIYXNoU2V0IHRvIGNvbXBhcmUgYmV0d2VlbiBDb25uZWN0aW9uUXVldWVz
LgorLy8gSXQgaXMgc2FmZSB0byBzZXQgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgYmVj
YXVzZSB0aGUgSGFzaFNldCB3aWxsIG5ldmVyIGNvbnRhaW4gbnVsbCBwb2ludGVycyBvciBkZWxl
dGVkIHZhbHVlcy4KK3N0cnVjdCBXZWJTb2NrZXQ6OkNvbm5lY3Rpb25RdWV1ZUhhc2hGdW5jdGlv
bnMgeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKFBhc3NSZWZQdHI8Q29ubmVjdGlvblF1ZXVl
PiBrZXkpIHsgcmV0dXJuIERlZmF1bHRIYXNoPFN0cmluZz46Okhhc2g6Omhhc2goa2V5LT5uYW1l
KCkpOyB9CisgICAgc3RhdGljIGJvb2wgZXF1YWwoUGFzc1JlZlB0cjxDb25uZWN0aW9uUXVldWU+
IGEsIFBhc3NSZWZQdHI8Q29ubmVjdGlvblF1ZXVlPiBiKSB7IHJldHVybiBhLT5uYW1lKCkgPT0g
Yi0+bmFtZSgpOyB9CisgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlP
ckRlbGV0ZWQgPSB0cnVlOworfTsKKworLy8gVGhlIEhhc2hUcmFuc2xhdG9yIGlzIHVzZWQgdG8g
bG9va3VwIGEgUmVmUHRyPENvbm5lY3Rpb25RdWV1ZT4gaW4gdGhlIHNldCB1c2luZyBhIG5hbWUu
CitzdHJ1Y3QgV2ViU29ja2V0OjpDb25uZWN0aW9uUXVldWVIYXNoVHJhbnNsYXRvciB7CisgICAg
c3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgU3RyaW5nJiBrZXkpIHsgcmV0dXJuIERlZmF1bHRI
YXNoPFN0cmluZz46Okhhc2g6Omhhc2goa2V5KTsgfQorICAgIHN0YXRpYyBib29sIGVxdWFsKFBh
c3NSZWZQdHI8Q29ubmVjdGlvblF1ZXVlPiBhLCBjb25zdCBTdHJpbmcmIGIpIHsgcmV0dXJuIGEt
Pm5hbWUoKSA9PSBiOyB9Cit9OworCisvLyBUaGUgSGFzaEZ1bmN0aW9ucyBvYmplY3QgdXNlZCBi
eSB0aGUgSGFzaFNldCB0byBjb21wYXJlIGJldHdlZW4gQ29ubmVjdGlvblJlcXVlc3RzLgorLy8g
SXQgaXMgc2FmZSB0byBzZXQgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgYmVjYXVzZSB0
aGUgSGFzaFNldCB3aWxsIG5ldmVyIGNvbnRhaW4gbnVsbCBwb2ludGVycyBvciBkZWxldGVkIHZh
bHVlcy4KK3N0cnVjdCBDb25uZWN0aW9uUXVldWU6OkNvbm5lY3Rpb25SZXF1ZXN0SGFzaEZ1bmN0
aW9ucyA6IFB0ckhhc2g8V2ViU29ja2V0Kj4geworICAgIHVzaW5nIFB0ckhhc2g8V2ViU29ja2V0
Kj46Omhhc2g7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goUGFzc1JlZlB0cjxDb25uZWN0aW9u
UmVxdWVzdD4ga2V5KSB7IHJldHVybiBoYXNoKGtleS0+d2ViU29ja2V0KCkpOyB9CisgICAgc3Rh
dGljIGJvb2wgZXF1YWwoUGFzc1JlZlB0cjxDb25uZWN0aW9uUmVxdWVzdD4gYSwgUGFzc1JlZlB0
cjxDb25uZWN0aW9uUmVxdWVzdD4gYikgeyByZXR1cm4gYS0+d2ViU29ja2V0KCkgPT0gYi0+d2Vi
U29ja2V0KCk7IH0KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9y
RGVsZXRlZCA9IHRydWU7Cit9OworCisvLyBUaGUgSGFzaFRyYW5zbGF0b3IgaXMgdXNlZCB0byBs
b29rdXAgYSBSZWZQdHI8Q29ubmVjdGlvblJlcXVlc3Q+IGluIHRoZSBzZXQgdXNpbmcgYSBXZWJT
b2NrZXQqLgorc3RydWN0IENvbm5lY3Rpb25RdWV1ZTo6Q29ubmVjdGlvblJlcXVlc3RIYXNoVHJh
bnNsYXRvciA6IFB0ckhhc2g8V2ViU29ja2V0Kj4geworICAgIHVzaW5nIFB0ckhhc2g8V2ViU29j
a2V0Kj46Omhhc2g7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgV2ViU29ja2V0KiBr
ZXkpIHsgcmV0dXJuIGhhc2goa2V5KTsgfQorICAgIHN0YXRpYyBib29sIGVxdWFsKFBhc3NSZWZQ
dHI8Q29ubmVjdGlvblJlcXVlc3Q+IGEsIGNvbnN0IFdlYlNvY2tldCogYikgeyByZXR1cm4gYS0+
d2ViU29ja2V0KCkgPT0gYjsgfQorfTsKKworLyoKKyAqIFRoZXJlIGlzIG9uZSBjb25uZWN0aW9u
IHF1ZXVlIGZvciBlYWNoIGhvc3Q6cG9ydCBvciBpcDpwb3J0IGNvbWJpbmF0aW9ucy4KKyAqIE9u
Y2UgaG9zdCBpcyByZXNvbHZlZCB0byBhbiBpcCBhZGRyZXNzIHRoZW4gYWxsIHJlcXVlc3RzIGZy
b20gdGhhdCBxdWV1ZSBhcmUKKyAqIG1vdmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGlwOnBvcnQg
cXVldWUgKGNyZWF0aW5nIG9uZSBpZiBuZWNlc3NhcnkpLgorICovCitXZWJTb2NrZXQ6OkNvbm5l
Y3Rpb25RdWV1ZVNldCBXZWJTb2NrZXQ6Om1fY29ubmVjdGlvblF1ZXVlczsKKwogV2ViU29ja2V0
OjpXZWJTb2NrZXQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKICAgICA6IEFjdGl2
ZURPTU9iamVjdChjb250ZXh0KQogICAgICwgbV9zdGF0ZShDT05ORUNUSU5HKQpAQCAtMTU3LDYg
KzI0Miw4IEBAIFdlYlNvY2tldDo6fldlYlNvY2tldCgpCiB7CiAgICAgaWYgKG1fY2hhbm5lbCkK
ICAgICAgICAgbV9jaGFubmVsLT5kaXNjb25uZWN0KCk7CisgICAgLy8gRklYTUU6IFRoaXMgaXMg
Y2F1c2luZyBjcmFzaC4KKyAgICAvKiByZW1vdmVGcm9tUGVuZGluZ1F1ZXVlKCk7ICovCiB9CiAK
IFBhc3NSZWZQdHI8V2ViU29ja2V0PiBXZWJTb2NrZXQ6OmNyZWF0ZShTY3JpcHRFeGVjdXRpb25D
b250ZXh0KiBjb250ZXh0KQpAQCAtMjU0LDggKzM0MSw2IEBAIHZvaWQgV2ViU29ja2V0Ojpjb25u
ZWN0KGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgcHJvdG9jb2xzLCBF
eGNlCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtX2NoYW5uZWwgPSBUaHJlYWRhYmxl
V2ViU29ja2V0Q2hhbm5lbDo6Y3JlYXRlKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSwgdGhpcyk7
Ci0KICAgICAvLyBGSVhNRTogVGhlcmUgaXMgYSBkaXNhZ3JlZW1lbnQgYWJvdXQgcmVzdHJpY3Rp
b24gb2Ygc3VicHJvdG9jb2xzIGJldHdlZW4gV2ViU29ja2V0IEFQSSBhbmQgaHliaS0xMCBwcm90
b2NvbAogICAgIC8vIGRyYWZ0LiBUaGUgZm9ybWVyIHNpbXBseSBzYXlzICJvbmx5IGNoYXJhY3Rl
cnMgaW4gdGhlIHJhbmdlIFUrMDAyMSB0byBVKzAwN0UgYXJlIGFsbG93ZWQsIiB3aGlsZSB0aGUg
bGF0dGVyCiAgICAgLy8gaW1wb3NlcyBhIHN0cmljdGVyIHJ1bGU6ICJ0aGUgZWxlbWVudHMgTVVT
VCBiZSBub24tZW1wdHkgc3RyaW5ncyB3aXRoIGNoYXJhY3RlcnMgYXMgZGVmaW5lZCBpbiBbUkZD
MjYxNl0sCkBAIC0yODYsMTAgKzM3MSwxMjYgQEAgdm9pZCBXZWJTb2NrZXQ6OmNvbm5lY3QoY29u
c3QgU3RyaW5nJiB1cmwsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBwcm90b2NvbHMsIEV4Y2UKICAg
ICBpZiAoIXByb3RvY29scy5pc0VtcHR5KCkpCiAgICAgICAgIHByb3RvY29sU3RyaW5nID0gam9p
blN0cmluZ3MocHJvdG9jb2xzLCBzdWJQcm90b2NvbFNlcGVyYXRvcigpKTsKIAorICAgIC8vIFVz
ZSBob3N0OnBvcnQgYXMga2V5IGZvciBub3csIGl0IHdpbGwgYmUgZml4ZWQgaW4gZGlkUmVzb2x2
ZUlQKCkuCisgICAgbV9jb25uZWN0aW9uUXVldWVLZXkgPSBtX3VybC5ob3N0KCkgKyBTdHJpbmc6
OmZvcm1hdCgiOiVkIiwgbV91cmwucG9ydCgpKTsKKworICAgIENvbm5lY3Rpb25RdWV1ZVNldDo6
Y29uc3RfaXRlcmF0b3IgaXRRdWV1ZSA9IG1fY29ubmVjdGlvblF1ZXVlcy5maW5kPFN0cmluZywg
Q29ubmVjdGlvblF1ZXVlSGFzaFRyYW5zbGF0b3I+KG1fY29ubmVjdGlvblF1ZXVlS2V5KTsKKyAg
ICBpZiAoaXRRdWV1ZSA9PSBtX2Nvbm5lY3Rpb25RdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgUmVm
UHRyPENvbm5lY3Rpb25RdWV1ZT4gY29ubmVjdGlvblF1ZXVlID0gQ29ubmVjdGlvblF1ZXVlOjpj
cmVhdGUobV9jb25uZWN0aW9uUXVldWVLZXkpOworICAgICAgICBtX2Nvbm5lY3Rpb25RdWV1ZXMu
YWRkKGNvbm5lY3Rpb25RdWV1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVmUHRyPENvbm5l
Y3Rpb25RdWV1ZT4gY29ubmVjdGlvblF1ZXVlID0gKml0UXVldWU7CisgICAgICAgIGlmIChjb25u
ZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5zaXplKCkgPj0gbWF4UGVuZGluZ1JlcXVlc3Rz
KSB7CisgICAgICAgICAgICBzY3JpcHRFeGVjdXRpb25Db250ZXh0KCktPmFkZENvbnNvbGVNZXNz
YWdlKEpTTWVzc2FnZVNvdXJjZSwgRXJyb3JNZXNzYWdlTGV2ZWwsICJNYXhpbXVtIHBlbmRpbmcg
cmVxdWVzdHMgcmVhY2hlZCBmb3IgIiArIG1fY29ubmVjdGlvblF1ZXVlS2V5KTsKKyAgICAgICAg
ICAgIG1fc3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICBlYyA9IE5FVFdPUktfRVJSOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUmVmUHRyPENvbm5lY3Rpb25S
ZXF1ZXN0PiBDb25uZWN0aW9uUmVxdWVzdCA9IENvbm5lY3Rpb25SZXF1ZXN0OjpjcmVhdGUodGhp
cywgcHJvdG9jb2xTdHJpbmcpOworICAgICAgICBjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1
ZXN0cy5hZGQoQ29ubmVjdGlvblJlcXVlc3QuZ2V0KCkpOworICAgICAgICBBY3RpdmVET01PYmpl
Y3Q6OnNldFBlbmRpbmdBY3Rpdml0eSh0aGlzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGNvbm5lY3QocHJvdG9jb2xTdHJpbmcpOworfQorCit2b2lkIFdlYlNvY2tldDo6Y29ubmVj
dChjb25zdCBTdHJpbmcmIHByb3RvY29sU3RyaW5nKQoreworICAgIG1fY2hhbm5lbCA9IFRocmVh
ZGFibGVXZWJTb2NrZXRDaGFubmVsOjpjcmVhdGUoc2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLCB0
aGlzKTsKICAgICBtX2NoYW5uZWwtPmNvbm5lY3QobV91cmwsIHByb3RvY29sU3RyaW5nKTsKICAg
ICBBY3RpdmVET01PYmplY3Q6OnNldFBlbmRpbmdBY3Rpdml0eSh0aGlzKTsKIH0KIAordm9pZCBX
ZWJTb2NrZXQ6OnN0YXJ0TmV4dFBlbmRpbmdSZXF1ZXN0KCkKK3sKKyAgICBDb25uZWN0aW9uUXVl
dWVTZXQ6Oml0ZXJhdG9yIGl0UXVldWUgPSBtX2Nvbm5lY3Rpb25RdWV1ZXMuZmluZDxTdHJpbmcs
IENvbm5lY3Rpb25RdWV1ZUhhc2hUcmFuc2xhdG9yPihtX2Nvbm5lY3Rpb25RdWV1ZUtleSk7Cisg
ICAgaWYgKGl0UXVldWUgPT0gbV9jb25uZWN0aW9uUXVldWVzLmVuZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBSZWZQdHI8Q29ubmVjdGlvblF1ZXVlPiBjb25uZWN0aW9uUXVldWUgPSAqaXRR
dWV1ZTsKKyAgICBBU1NFUlQoIWlzUGVuZGluZygpKTsKKworICAgIENvbm5lY3Rpb25RdWV1ZTo6
UmVxdWVzdFNldDo6aXRlcmF0b3IgaXRSZXF1ZXN0ID0gY29ubmVjdGlvblF1ZXVlLT5wZW5kaW5n
UmVxdWVzdHMuYmVnaW4oKTsKKyAgICBpZiAoaXRSZXF1ZXN0ID09IGNvbm5lY3Rpb25RdWV1ZS0+
cGVuZGluZ1JlcXVlc3RzLmVuZCgpKSB7CisgICAgICAgIG1fY29ubmVjdGlvblF1ZXVlcy5yZW1v
dmUoaXRRdWV1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8Q29ubmVj
dGlvblJlcXVlc3Q+IENvbm5lY3Rpb25SZXF1ZXN0ID0gKml0UmVxdWVzdDsKKyAgICBXZWJTb2Nr
ZXQqIHdlYlNvY2tldCA9IENvbm5lY3Rpb25SZXF1ZXN0LT53ZWJTb2NrZXQoKTsKKyAgICBTdHJp
bmcgcHJvdG9jb2xTdHJpbmcgPSBDb25uZWN0aW9uUmVxdWVzdC0+cHJvdG9jb2xTdHJpbmcoKTsK
KyAgICBjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5yZW1vdmUoaXRSZXF1ZXN0KTsK
KyAgICB3ZWJTb2NrZXQtPmNvbm5lY3QocHJvdG9jb2xTdHJpbmcpOworfQorCit2b2lkIFdlYlNv
Y2tldDo6cmVtb3ZlRnJvbVBlbmRpbmdRdWV1ZSgpCit7CisgICAgQ29ubmVjdGlvblF1ZXVlU2V0
OjppdGVyYXRvciBpdFF1ZXVlID0gbV9jb25uZWN0aW9uUXVldWVzLmZpbmQ8U3RyaW5nLCBDb25u
ZWN0aW9uUXVldWVIYXNoVHJhbnNsYXRvcj4obV9jb25uZWN0aW9uUXVldWVLZXkpOworICAgIGlm
IChpdFF1ZXVlID09IG1fY29ubmVjdGlvblF1ZXVlcy5lbmQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgUmVmUHRyPENvbm5lY3Rpb25RdWV1ZT4gY29ubmVjdGlvblF1ZXVlID0gKml0UXVldWU7
CisgICAgQ29ubmVjdGlvblF1ZXVlOjpSZXF1ZXN0U2V0OjppdGVyYXRvciBpdFJlcXVlc3QgPSBj
b25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5maW5kPFdlYlNvY2tldCosIENvbm5lY3Rp
b25RdWV1ZTo6Q29ubmVjdGlvblJlcXVlc3RIYXNoVHJhbnNsYXRvcj4odGhpcyk7CisgICAgaWYg
KGl0UmVxdWVzdCA9PSBjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5lbmQoKSkgewor
ICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIHdoZW4gdGhpcyBXZWJTb2NrZXQgb2JqZWN0IGlzIGlu
IENPTk5FQ1RJTkcgc3RhdGUgYW5kIFdlYlNvY2tldDo6Y2xvc2UoKSBpcyBjYWxsZWQuCisgICAg
ICAgIGlmIChjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5pc0VtcHR5KCkpCisgICAg
ICAgICAgICBtX2Nvbm5lY3Rpb25RdWV1ZXMucmVtb3ZlKGl0UXVldWUpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgY29ubmVjdGlvblF1ZXVlLT5wZW5kaW5nUmVxdWVzdHMucmVtb3Zl
KGl0UmVxdWVzdCk7CisgICAgaWYgKGNvbm5lY3Rpb25RdWV1ZS0+cGVuZGluZ1JlcXVlc3RzLmlz
RW1wdHkoKSkKKyAgICAgICAgbV9jb25uZWN0aW9uUXVldWVzLnJlbW92ZShpdFF1ZXVlKTsKK30K
KworYm9vbCBXZWJTb2NrZXQ6OmlzUGVuZGluZygpCit7CisgICAgQ29ubmVjdGlvblF1ZXVlU2V0
Ojpjb25zdF9pdGVyYXRvciBpdFF1ZXVlID0gbV9jb25uZWN0aW9uUXVldWVzLmZpbmQ8U3RyaW5n
LCBDb25uZWN0aW9uUXVldWVIYXNoVHJhbnNsYXRvcj4obV9jb25uZWN0aW9uUXVldWVLZXkpOwor
ICAgIGlmIChpdFF1ZXVlID09IG1fY29ubmVjdGlvblF1ZXVlcy5lbmQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgUmVmUHRyPENvbm5lY3Rpb25RdWV1ZT4gY29ubmVjdGlvblF1ZXVl
ID0gKml0UXVldWU7CisgICAgQ29ubmVjdGlvblF1ZXVlOjpSZXF1ZXN0U2V0Ojpjb25zdF9pdGVy
YXRvciBpdFJlcXVlc3QgPSBjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdSZXF1ZXN0cy5maW5kPFdl
YlNvY2tldCosIENvbm5lY3Rpb25RdWV1ZTo6Q29ubmVjdGlvblJlcXVlc3RIYXNoVHJhbnNsYXRv
cj4odGhpcyk7CisgICAgaWYgKGl0UmVxdWVzdCA9PSBjb25uZWN0aW9uUXVldWUtPnBlbmRpbmdS
ZXF1ZXN0cy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgV2ViU29ja2V0OjpkaWRSZXNvbHZlSVAoY29uc3QgU3RyaW5nJiBpcEFkZHJl
c3MpCit7CisgICAgU3RyaW5nIGRlc3RDb25uZWN0aW9uUXVldWVLZXkgPSBpcEFkZHJlc3MgKyBT
dHJpbmc6OmZvcm1hdCgiOiVkIiwgbV91cmwucG9ydCgpKTsKKyAgICBpZiAoZGVzdENvbm5lY3Rp
b25RdWV1ZUtleSA9PSBtX2Nvbm5lY3Rpb25RdWV1ZUtleSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgQ29ubmVjdGlvblF1ZXVlU2V0OjppdGVyYXRvciBpdFNvdXJjZVF1ZXVlID0gbV9jb25uZWN0
aW9uUXVldWVzLmZpbmQ8U3RyaW5nLCBDb25uZWN0aW9uUXVldWVIYXNoVHJhbnNsYXRvcj4obV9j
b25uZWN0aW9uUXVldWVLZXkpOworICAgIGlmIChpdFNvdXJjZVF1ZXVlID09IG1fY29ubmVjdGlv
blF1ZXVlcy5lbmQoKSkgeworICAgICAgICBtX2Nvbm5lY3Rpb25RdWV1ZUtleSA9IGRlc3RDb25u
ZWN0aW9uUXVldWVLZXk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUmVmUHRyPENvbm5l
Y3Rpb25RdWV1ZT4gY29ubmVjdGlvblF1ZXVlU291cmNlID0gKml0U291cmNlUXVldWU7CisKKyAg
ICBSZWZQdHI8Q29ubmVjdGlvblF1ZXVlPiBjb25uZWN0aW9uUXVldWVEZXN0OworICAgIENvbm5l
Y3Rpb25RdWV1ZVNldDo6Y29uc3RfaXRlcmF0b3IgaXREZXN0UXVldWUgPSBtX2Nvbm5lY3Rpb25R
dWV1ZXMuZmluZDxTdHJpbmcsIENvbm5lY3Rpb25RdWV1ZUhhc2hUcmFuc2xhdG9yPihkZXN0Q29u
bmVjdGlvblF1ZXVlS2V5KTsKKworICAgIC8vIENvcHkgZW50cmllcyBmcm9tIHF1ZXVlIHVzaW5n
IGhvc3Q6cG9ydCBhcyBrZXkgdG8gcXVldWUgdXNpbmcgaXA6cG9ydCBhcyBrZXksIGNyZWF0aW5n
IG5ldyBxdWV1ZSBpZiBuZWNlc3NhcnkuCisgICAgLy8gRklYTUU6IE1vdmUgYWxsIHBlbmRpbmcg
cmVxdWVzdHMgb3IganVzdCB0aGUgb25lIHRoaXMgV2ViU29ja2V0IG9iamVjdCBpcyBhc3NvY2lh
dGVkIHdpdGg/CisgICAgaWYgKGl0RGVzdFF1ZXVlID09IG1fY29ubmVjdGlvblF1ZXVlcy5lbmQo
KSkgeworICAgICAgICBjb25uZWN0aW9uUXVldWVEZXN0ID0gQ29ubmVjdGlvblF1ZXVlOjpjcmVh
dGUoZGVzdENvbm5lY3Rpb25RdWV1ZUtleSk7CisgICAgICAgIGNvbm5lY3Rpb25RdWV1ZURlc3Qt
PnBlbmRpbmdSZXF1ZXN0cyA9IGNvbm5lY3Rpb25RdWV1ZVNvdXJjZS0+cGVuZGluZ1JlcXVlc3Rz
OworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb25RdWV1ZURlc3QgPSAqaXREZXN0UXVl
dWU7CisgICAgICAgIGZvciAoQ29ubmVjdGlvblF1ZXVlOjpSZXF1ZXN0U2V0OjppdGVyYXRvciBp
dFJlcXVlc3QgPSBjb25uZWN0aW9uUXVldWVTb3VyY2UtPnBlbmRpbmdSZXF1ZXN0cy5iZWdpbigp
OyBpdFJlcXVlc3QgIT0gY29ubmVjdGlvblF1ZXVlU291cmNlLT5wZW5kaW5nUmVxdWVzdHMuZW5k
KCk7ICsraXRSZXF1ZXN0KQorICAgICAgICAgICAgY29ubmVjdGlvblF1ZXVlRGVzdC0+cGVuZGlu
Z1JlcXVlc3RzLmFkZCgqaXRSZXF1ZXN0KTsKKyAgICB9CisKKyAgICBtX2Nvbm5lY3Rpb25RdWV1
ZXMucmVtb3ZlKGl0U291cmNlUXVldWUpOworICAgIG1fY29ubmVjdGlvblF1ZXVlcy5hZGQoY29u
bmVjdGlvblF1ZXVlRGVzdCk7CisgICAgbV9jb25uZWN0aW9uUXVldWVLZXkgPSBkZXN0Q29ubmVj
dGlvblF1ZXVlS2V5OworfQorCiBib29sIFdlYlNvY2tldDo6c2VuZChjb25zdCBTdHJpbmcmIG1l
c3NhZ2UsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewogICAgIExPRyhOZXR3b3JrLCAiV2ViU29ja2V0
ICVwIHNlbmQoKSBTZW5kaW5nIFN0cmluZyAnJXMnIiwgdGhpcywgbWVzc2FnZS51dGY4KCkuZGF0
YSgpKTsKQEAgLTM4NywxNiArNTg4LDI0IEBAIHZvaWQgV2ViU29ja2V0OjpjbG9zZShpbnQgY29k
ZSwgY29uc3QgU3RyaW5nJiByZWFzb24sIEV4Y2VwdGlvbkNvZGUmIGVjKQogICAgICAgICB9CiAg
ICAgfQogCi0gICAgaWYgKG1fc3RhdGUgPT0gQ0xPU0lORyB8fCBtX3N0YXRlID09IENMT1NFRCkK
KyAgICBpZiAobV9zdGF0ZSA9PSBDTE9TSU5HIHx8IG1fc3RhdGUgPT0gQ0xPU0VEKSB7CisgICAg
ICAgIEFTU0VSVCghaXNQZW5kaW5nKCkpOwogICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
cmVtb3ZlRnJvbVBlbmRpbmdRdWV1ZSgpOworCiAgICAgaWYgKG1fc3RhdGUgPT0gQ09OTkVDVElO
RykgewogICAgICAgICBtX3N0YXRlID0gQ0xPU0lORzsKLSAgICAgICAgbV9jaGFubmVsLT5mYWls
KCJXZWJTb2NrZXQgaXMgY2xvc2VkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hl
ZC4iKTsKKyAgICAgICAgaWYgKG1fY2hhbm5lbCkKKyAgICAgICAgICAgIG1fY2hhbm5lbC0+ZmFp
bCgiV2ViU29ja2V0IGlzIGNsb3NlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNo
ZWQuIik7CisgICAgICAgIHN0YXJ0TmV4dFBlbmRpbmdSZXF1ZXN0KCk7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAgICAgbV9zdGF0ZSA9IENMT1NJTkc7CiAgICAgaWYgKG1fY2hhbm5lbCkKICAg
ICAgICAgbV9jaGFubmVsLT5jbG9zZShjb2RlLCByZWFzb24pOworICAgIHN0YXJ0TmV4dFBlbmRp
bmdSZXF1ZXN0KCk7CiB9CiAKIGNvbnN0IEtVUkwmIFdlYlNvY2tldDo6dXJsKCkgY29uc3QKQEAg
LTQ4Niw2ICs2OTUsNyBAQCB2b2lkIFdlYlNvY2tldDo6cmVzdW1lKCkKIAogdm9pZCBXZWJTb2Nr
ZXQ6OnN0b3AoKQogeworICAgIHJlbW92ZUZyb21QZW5kaW5nUXVldWUoKTsKICAgICBib29sIHBl
bmRpbmcgPSBoYXNQZW5kaW5nQWN0aXZpdHkoKTsKICAgICBpZiAobV9jaGFubmVsKQogICAgICAg
ICBtX2NoYW5uZWwtPmRpc2Nvbm5lY3QoKTsKQEAgLTQ5NCw2ICs3MDQsNyBAQCB2b2lkIFdlYlNv
Y2tldDo6c3RvcCgpCiAgICAgQWN0aXZlRE9NT2JqZWN0OjpzdG9wKCk7CiAgICAgaWYgKHBlbmRp
bmcpCiAgICAgICAgIEFjdGl2ZURPTU9iamVjdDo6dW5zZXRQZW5kaW5nQWN0aXZpdHkodGhpcyk7
CisgICAgc3RhcnROZXh0UGVuZGluZ1JlcXVlc3QoKTsKIH0KIAogdm9pZCBXZWJTb2NrZXQ6OmRp
ZENvbm5lY3QoKQpAQCAtNTA4LDYgKzcxOSw3IEBAIHZvaWQgV2ViU29ja2V0OjpkaWRDb25uZWN0
KCkKICAgICBtX3N1YnByb3RvY29sID0gbV9jaGFubmVsLT5zdWJwcm90b2NvbCgpOwogICAgIG1f
ZXh0ZW5zaW9ucyA9IG1fY2hhbm5lbC0+ZXh0ZW5zaW9ucygpOwogICAgIGRpc3BhdGNoRXZlbnQo
RXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkub3BlbkV2ZW50LCBmYWxzZSwgZmFsc2UpKTsKKyAg
ICBzdGFydE5leHRQZW5kaW5nUmVxdWVzdCgpOwogfQogCiB2b2lkIFdlYlNvY2tldDo6ZGlkUmVj
ZWl2ZU1lc3NhZ2UoY29uc3QgU3RyaW5nJiBtc2cpCkBAIC01NjQsOCArNzc2LDEwIEBAIHZvaWQg
V2ViU29ja2V0OjpkaWRTdGFydENsb3NpbmdIYW5kc2hha2UoKQogdm9pZCBXZWJTb2NrZXQ6OmRp
ZENsb3NlKHVuc2lnbmVkIGxvbmcgdW5oYW5kbGVkQnVmZmVyZWRBbW91bnQsIENsb3NpbmdIYW5k
c2hha2VDb21wbGV0aW9uU3RhdHVzIGNsb3NpbmdIYW5kc2hha2VDb21wbGV0aW9uLCB1bnNpZ25l
ZCBzaG9ydCBjb2RlLCBjb25zdCBTdHJpbmcmIHJlYXNvbikKIHsKICAgICBMT0coTmV0d29yaywg
IldlYlNvY2tldCAlcCBkaWRDbG9zZSgpIiwgdGhpcyk7Ci0gICAgaWYgKCFtX2NoYW5uZWwpCisg
ICAgaWYgKCFtX2NoYW5uZWwpIHsKKyAgICAgICAgc3RhcnROZXh0UGVuZGluZ1JlcXVlc3QoKTsK
ICAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBib29sIHdhc0NsZWFuID0gbV9zdGF0ZSA9PSBD
TE9TSU5HICYmICF1bmhhbmRsZWRCdWZmZXJlZEFtb3VudCAmJiBjbG9zaW5nSGFuZHNoYWtlQ29t
cGxldGlvbiA9PSBDbG9zaW5nSGFuZHNoYWtlQ29tcGxldGUgJiYgY29kZSAhPSBXZWJTb2NrZXRD
aGFubmVsOjpDbG9zZUV2ZW50Q29kZUFibm9ybWFsQ2xvc3VyZTsKICAgICBtX3N0YXRlID0gQ0xP
U0VEOwogICAgIG1fYnVmZmVyZWRBbW91bnQgPSB1bmhhbmRsZWRCdWZmZXJlZEFtb3VudDsKQEAg
LTU3OCw2ICs3OTIsNyBAQCB2b2lkIFdlYlNvY2tldDo6ZGlkQ2xvc2UodW5zaWduZWQgbG9uZyB1
bmhhbmRsZWRCdWZmZXJlZEFtb3VudCwgQ2xvc2luZ0hhbmRzaGFrZQogICAgIH0KICAgICBpZiAo
aGFzUGVuZGluZ0FjdGl2aXR5KCkpCiAgICAgICAgIEFjdGl2ZURPTU9iamVjdDo6dW5zZXRQZW5k
aW5nQWN0aXZpdHkodGhpcyk7CisgICAgc3RhcnROZXh0UGVuZGluZ1JlcXVlc3QoKTsKIH0KIAog
RXZlbnRUYXJnZXREYXRhKiBXZWJTb2NrZXQ6OmV2ZW50VGFyZ2V0RGF0YSgpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYnNvY2tldHMvV2ViU29ja2V0LmggYi9Tb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYnNvY2tldHMvV2ViU29ja2V0LmgKaW5kZXggMmJhZTUzOWIxYjUx
MjUzYTRiMzNjZWJiNWI4NDY5NjhlZWE0OGM0MS4uOTlkZWM4OWVjY2I1MjkwNDk3ZTlkOTU1OWJm
YzU1MjZhNmExMDE4OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJzb2Nr
ZXRzL1dlYlNvY2tldC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vic29ja2V0cy9X
ZWJTb2NrZXQuaApAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIldlYlNvY2tldENoYW5uZWwu
aCIKICNpbmNsdWRlICJXZWJTb2NrZXRDaGFubmVsQ2xpZW50LmgiCiAjaW5jbHVkZSA8d3RmL0Zv
cndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvT3du
UHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9B
dG9taWNTdHJpbmdIYXNoLmg+CkBAIC00OCw2ICs0OSw3IEBACiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKIGNsYXNzIEJsb2I7CitjbGFzcyBDb25uZWN0aW9uUXVldWU7CiBjbGFzcyBUaHJlYWRhYmxl
V2ViU29ja2V0Q2hhbm5lbDsKIAogY2xhc3MgV2ViU29ja2V0IDogcHVibGljIFJlZkNvdW50ZWQ8
V2ViU29ja2V0PiwgcHVibGljIEV2ZW50VGFyZ2V0LCBwdWJsaWMgQWN0aXZlRE9NT2JqZWN0LCBw
dWJsaWMgV2ViU29ja2V0Q2hhbm5lbENsaWVudCB7CkBAIC0xMTgsNiArMTIwLDcgQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgdm9pZCBkaWRVcGRhdGVCdWZmZXJlZEFtb3VudCh1bnNpZ25lZCBsb25n
IGJ1ZmZlcmVkQW1vdW50KSBPVkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnRDbG9z
aW5nSGFuZHNoYWtlKCkgT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIGRpZENsb3NlKHVuc2ln
bmVkIGxvbmcgdW5oYW5kbGVkQnVmZmVyZWRBbW91bnQsIENsb3NpbmdIYW5kc2hha2VDb21wbGV0
aW9uU3RhdHVzLCB1bnNpZ25lZCBzaG9ydCBjb2RlLCBjb25zdCBTdHJpbmcmIHJlYXNvbikgT1ZF
UlJJREU7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc29sdmVJUChjb25zdCBTdHJpbmcmIGlwQWRk
cmVzcykgT1ZFUlJJREU7CiAKIHByaXZhdGU6CiAgICAgZXhwbGljaXQgV2ViU29ja2V0KFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqKTsKQEAgLTE0NCw2ICsxNDcsMTggQEAgcHJpdmF0ZToKICAgICBC
aW5hcnlUeXBlIG1fYmluYXJ5VHlwZTsKICAgICBTdHJpbmcgbV9zdWJwcm90b2NvbDsKICAgICBT
dHJpbmcgbV9leHRlbnNpb25zOworCisgICAgU3RyaW5nIG1fY29ubmVjdGlvblF1ZXVlS2V5Owor
ICAgIHZvaWQgY29ubmVjdChjb25zdCBTdHJpbmcmIHByb3RvY29sU3RyaW5nKTsKKyAgICB2b2lk
IHN0YXJ0TmV4dFBlbmRpbmdSZXF1ZXN0KCk7CisgICAgdm9pZCByZW1vdmVGcm9tUGVuZGluZ1F1
ZXVlKCk7CisgICAgYm9vbCBpc1BlbmRpbmcoKTsKKworICAgIHN0cnVjdCBDb25uZWN0aW9uUXVl
dWVIYXNoRnVuY3Rpb25zOworICAgIHN0cnVjdCBDb25uZWN0aW9uUXVldWVIYXNoVHJhbnNsYXRv
cjsKKworICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8UmVmUHRyPENvbm5lY3Rpb25RdWV1ZT4sIDEs
IENvbm5lY3Rpb25RdWV1ZUhhc2hGdW5jdGlvbnM+IENvbm5lY3Rpb25RdWV1ZVNldDsKKyAgICBz
dGF0aWMgQ29ubmVjdGlvblF1ZXVlU2V0IG1fY29ubmVjdGlvblF1ZXVlczsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
c29ja2V0cy9XZWJTb2NrZXRDaGFubmVsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
c29ja2V0cy9XZWJTb2NrZXRDaGFubmVsLmNwcAppbmRleCBjOTg0ODUzMGVhOTRiNTQ1ZDE3ZTE4
OWE5NzU0MWU4ZGMxMzhhMzY1Li41NjFjOTViZmM2NDVkOGNkMTAyYjY5M2UzZGYxNjViZjcwYTVh
MTA1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYnNvY2tldHMvV2ViU29j
a2V0Q2hhbm5lbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJzb2NrZXRzL1dl
YlNvY2tldENoYW5uZWwuY3BwCkBAIC0xOTksNyArMTk5LDEwIEBAIHZvaWQgV2ViU29ja2V0Q2hh
bm5lbDo6ZmFpbChjb25zdCBTdHJpbmcmIHJlYXNvbikKICAgICBBU1NFUlQoIW1fc3VzcGVuZGVk
KTsKICAgICBpZiAobV9kb2N1bWVudCkgewogICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OmRpZFJlY2VpdmVXZWJTb2NrZXRGcmFtZUVycm9yKG1fZG9jdW1lbnQsIG1faWRlbnRpZmll
ciwgcmVhc29uKTsKLSAgICAgICAgbV9kb2N1bWVudC0+YWRkQ29uc29sZU1lc3NhZ2UoTmV0d29y
a01lc3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCAiV2ViU29ja2V0IGNvbm5lY3Rpb24g
dG8gJyIgKyBtX2hhbmRzaGFrZS0+dXJsKCkuZWxpZGVkU3RyaW5nKCkgKyAiJyBmYWlsZWQ6ICIg
KyByZWFzb24pOworICAgICAgICBpZiAobV9oYW5kc2hha2UpCisgICAgICAgICAgICBtX2RvY3Vt
ZW50LT5hZGRDb25zb2xlTWVzc2FnZShOZXR3b3JrTWVzc2FnZVNvdXJjZSwgRXJyb3JNZXNzYWdl
TGV2ZWwsICJXZWJTb2NrZXQgY29ubmVjdGlvbiB0byAnIiArIG1faGFuZHNoYWtlLT51cmwoKS5l
bGlkZWRTdHJpbmcoKSArICInIGZhaWxlZDogIiArIHJlYXNvbik7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG1fZG9jdW1lbnQtPmFkZENvbnNvbGVNZXNzYWdlKE5ldHdvcmtNZXNzYWdlU291
cmNlLCBFcnJvck1lc3NhZ2VMZXZlbCwgIldlYlNvY2tldCBjb25uZWN0aW9uIHRvICciICsgbV9k
b2N1bWVudC0+dXJsKCkuZWxpZGVkU3RyaW5nKCkgKyAiJyBmYWlsZWQ6ICIgKyByZWFzb24pOwog
ICAgIH0KIAogICAgIC8vIEh5YmktMTAgc3BlY2lmaWNhdGlvbiBleHBsaWNpdGx5IHN0YXRlcyB3
ZSBtdXN0IG5vdCBjb250aW51ZSB0byBoYW5kbGUgaW5jb21pbmcgZGF0YQpAQCAtODA5LDYgKzgx
MiwxNCBAQCBib29sIFdlYlNvY2tldENoYW5uZWw6OnNlbmRGcmFtZShXZWJTb2NrZXRGcmFtZTo6
T3BDb2RlIG9wQ29kZSwgY29uc3QgY2hhciogZGF0YQogICAgIHJldHVybiBtX2hhbmRsZS0+c2Vu
ZChmcmFtZURhdGEuZGF0YSgpLCBmcmFtZURhdGEuc2l6ZSgpKTsKIH0KIAordm9pZCBXZWJTb2Nr
ZXRDaGFubmVsOjpkaWRSZXNvbHZlSVAoU29ja2V0U3RyZWFtSGFuZGxlKiBoYW5kbGUsIGNvbnN0
IFN0cmluZyYgaXBBZGRyZXNzKQoreworICAgIExPRyhOZXR3b3JrLCAiV2ViU29ja2V0Q2hhbm5l
bCAlcCBkaWRSZXNvbHZlSVAoKSIsIHRoaXMpOworICAgIEFTU0VSVChoYW5kbGUgPT0gbV9oYW5k
bGUpOworICAgIEFTU0VSVChtX2NsaWVudCk7CisgICAgbV9jbGllbnQtPmRpZFJlc29sdmVJUChp
cEFkZHJlc3MpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgIC8vIEVO
QUJMRShXRUJfU09DS0VUUykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
c29ja2V0cy9XZWJTb2NrZXRDaGFubmVsLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYnNv
Y2tldHMvV2ViU29ja2V0Q2hhbm5lbC5oCmluZGV4IDE3MGFiMTgzYWQ0ODNlOTk0MzQ5MTlmZTI5
ZGVhMTAzYTY2MDg1OTIuLjVjZDFhOWJmZTg5M2RhMDIxZDllMmM2MThmMmRjMDExY2EyOTlkNTkg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXRD
aGFubmVsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJzb2NrZXRzL1dlYlNvY2tl
dENoYW5uZWwuaApAQCAtOTEsNiArOTEsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGRp
ZEZhaWxTb2NrZXRTdHJlYW0oU29ja2V0U3RyZWFtSGFuZGxlKiwgY29uc3QgU29ja2V0U3RyZWFt
RXJyb3ImKSBPVkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0
aW9uQ2hhbGxlbmdlKFNvY2tldFN0cmVhbUhhbmRsZSosIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJikgT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIGRpZENhbmNlbEF1dGhlbnRpY2F0
aW9uQ2hhbGxlbmdlKFNvY2tldFN0cmVhbUhhbmRsZSosIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc29sdmVJUChTb2NrZXRT
dHJlYW1IYW5kbGUqLCBjb25zdCBTdHJpbmcmKSBPVkVSUklERTsKIAogICAgIGVudW0gQ2xvc2VF
dmVudENvZGUgewogICAgICAgICBDbG9zZUV2ZW50Q29kZU5vdFNwZWNpZmllZCA9IC0xLApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJzb2NrZXRzL1dlYlNvY2tldENoYW5u
ZWxDbGllbnQuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vic29ja2V0cy9XZWJTb2NrZXRD
aGFubmVsQ2xpZW50LmgKaW5kZXggMzFkMTg5MjE3Zjc0NjZhYTQ3NDM5OTdkZDk1YWY2NDg0NGJj
NTdkOC4uMjEwNjk1MTExNDk4MzQ1NWUwNzE5YjcyNzQ5MmE1OTA1MTVmNzk2NCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJzb2NrZXRzL1dlYlNvY2tldENoYW5uZWxDbGll
bnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYnNvY2tldHMvV2ViU29ja2V0Q2hh
bm5lbENsaWVudC5oCkBAIC00OCw2ICs0OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAg
ICAgdmlydHVhbCB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlRXJyb3IoKSB7IH0KICAgICAgICAgdmly
dHVhbCB2b2lkIGRpZFVwZGF0ZUJ1ZmZlcmVkQW1vdW50KHVuc2lnbmVkIGxvbmcgLyogYnVmZmVy
ZWRBbW91bnQgKi8pIHsgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnRDbG9zaW5nSGFu
ZHNoYWtlKCkgeyB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRSZXNvbHZlSVAoY29uc3QgU3Ry
aW5nJikgeyB9CiAgICAgICAgIGVudW0gQ2xvc2luZ0hhbmRzaGFrZUNvbXBsZXRpb25TdGF0dXMg
ewogICAgICAgICAgICAgQ2xvc2luZ0hhbmRzaGFrZUluY29tcGxldGUsCiAgICAgICAgICAgICBD
bG9zaW5nSGFuZHNoYWtlQ29tcGxldGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL1NvY2tldFN0cmVhbUhhbmRsZUNsaWVudC5oCmluZGV4IGJmZjY2NzZi
OTZhYmRjYWQyZGE0OWM0ZmRiNGY5NjRjZDFhNTgxMDAuLjg2NzQ1MGYwNDFhMjg4OWM5YjUwOTE0
NzBlZDI0ZTgzOTc5YzA1ZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9Tb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaApAQCAtMzIsNiArMzIsOCBA
QAogI2lmbmRlZiBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnRfaAogI2RlZmluZSBTb2NrZXRTdHJl
YW1IYW5kbGVDbGllbnRfaAogCisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogICAgIGNsYXNzIEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlOwpA
QCAtNTQsNiArNTYsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIC8vIE5vIGF1dGhl
bnRpY2F0aW9uIGZvciBzdHJlYW1zIHBlciBzZSwgYnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRl
bnRpYWxzLgogICAgICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlKFNvY2tldFN0cmVhbUhhbmRsZSosIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
JikgeyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRDYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYp
IHsgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRSZXNvbHZlSVAoU29ja2V0U3RyZWFtSGFu
ZGxlKiwgY29uc3QgU3RyaW5nJikgeyB9CiAgICAgfTsKIAogfSAgLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvcXQvU29ja2V0
U3RyZWFtSGFuZGxlUXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9xdC9T
b2NrZXRTdHJlYW1IYW5kbGVRdC5jcHAKaW5kZXggMTAzZGMxZmNjMWQyNmQ0YTVkMTA4Mzk3YmY3
NWIzYmM2M2JjMDdhMy4uZDdlNzQyZTVkZTlhMjZjYTBkMjYyZWFiOTMzNWNkNDM1ODU5YWYxNCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9xdC9Tb2NrZXRTdHJl
YW1IYW5kbGVRdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9xdC9T
b2NrZXRTdHJlYW1IYW5kbGVRdC5jcHAKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlICJTb2Nr
ZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVQcml2
YXRlLmgiCiAKKyNpbmNsdWRlIDxRSG9zdEFkZHJlc3M+CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAogU29ja2V0U3RyZWFtSGFuZGxlUHJpdmF0ZTo6U29ja2V0U3RyZWFtSGFuZGxlUHJpdmF0ZShT
b2NrZXRTdHJlYW1IYW5kbGUqIHN0cmVhbUhhbmRsZSwgY29uc3QgS1VSTCYgdXJsKQpAQCAtMTA0
LDYgKzEwNiw3IEBAIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlUHJpdmF0ZTo6c29ja2V0Q29ubmVj
dGVkKCkKIHsKICAgICBpZiAobV9zdHJlYW1IYW5kbGUgJiYgbV9zdHJlYW1IYW5kbGUtPmNsaWVu
dCgpKSB7CiAgICAgICAgIG1fc3RyZWFtSGFuZGxlLT5tX3N0YXRlID0gU29ja2V0U3RyZWFtSGFu
ZGxlQmFzZTo6T3BlbjsKKyAgICAgICAgbV9zdHJlYW1IYW5kbGUtPmNsaWVudCgpLT5kaWRSZXNv
bHZlSVAobV9zdHJlYW1IYW5kbGUsIG1fc29ja2V0LT5wZWVyQWRkcmVzcygpLnRvU3RyaW5nKCkp
OwogICAgICAgICBtX3N0cmVhbUhhbmRsZS0+Y2xpZW50KCktPmRpZE9wZW5Tb2NrZXRTdHJlYW0o
bV9zdHJlYW1IYW5kbGUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCA3ZjVjMGFiMmIzMGRmNDA5YzAxNTM4
ZDkxYTM2Yzc1ZTkwMDFiYTNiLi4zYzRmOGIyZTE4ZDc2MWVjNmI2NmJhZjQ1YjQxOTk3Njk2YmI2
OTRiIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTMtMDQtMTEgIExhbWFycXVlIFYuIFNvdXph
ICA8TGFtYXJxdWUuU291emFAYmFzeXNrb20uY29tPgorCisgICAgICAgIFtXZWJTb2NrZXRdIE11
bHRpcGxlIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gYSBXZWJTb2NrZXQgc2VydmVyIHNob3VsZCBu
b3QgYmUgYWxsb3dlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MzIyNDYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBUZXN0IGlmIFdlYlNvY2tldCBzdGFjayByZXR1cm5zIGV4Y2VwdGlvbiB3aGVuIG1heGlt
dW0gcGVuZGluZyByZXF1ZXN0IGxpbWl0IGlzIHJlYWNoZWQuCisKKyAgICAgICAgKiBodHRwL3Rl
c3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL2ZhaWxlZC1ieS1tYXhpbXVtLXBlbmRpbmctY29ubmVj
dGlvbnMtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBodHRwL3Rlc3RzL3dlYnNvY2tl
dC90ZXN0cy9oeWJpL2ZhaWxlZC1ieS1tYXhpbXVtLXBlbmRpbmctY29ubmVjdGlvbnMuaHRtbDog
QWRkZWQuCisgICAgICAgICogaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS9mYWlsZWQt
YnktbWF4aW11bS1wZW5kaW5nLWNvbm5lY3Rpb25zX3dzaC5weTogQWRkZWQuCisKIDIwMTMtMDQt
MTAgIE5vYW0gUm9zZW50aGFsICA8bm9hbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFtUZXhtYXBd
IEluIGNlcnRhaW4gc2l0dWF0aW9ucyBuZXN0ZWQgYmxlbmRpbmcgd2l0aCBvdmVyZmxvdzpoaWRk
ZW4gZGlzcGxheXMgY2xpcHBlZCByZXN1bHRzCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9odHRw
L3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL2ZhaWxlZC1ieS1tYXhpbXVtLXBlbmRpbmctY29u
bmVjdGlvbnMtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy93ZWJzb2NrZXQv
dGVzdHMvaHliaS9mYWlsZWQtYnktbWF4aW11bS1wZW5kaW5nLWNvbm5lY3Rpb25zLWV4cGVjdGVk
LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5lZGVjYTc5ZjM2NTRlNDYzOWU0MTI5OGM0YzM2YmQ2MDM4MGQ4YTI0
Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVz
dHMvaHliaS9mYWlsZWQtYnktbWF4aW11bS1wZW5kaW5nLWNvbm5lY3Rpb25zLWV4cGVjdGVkLnR4
dApAQCAtMCwwICsxLDEyIEBACitDT05TT0xFIE1FU1NBR0U6IE1heGltdW0gcGVuZGluZyByZXF1
ZXN0cyByZWFjaGVkIGZvciBsb2NhbGhvc3Q6ODg4MAorUHJpbnQgdGhlIG1heGltdW0gcGVuZGlu
ZyByZXF1ZXN0cyBsaW1pdCBkZWZpbmVkIGluIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKwor
T24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9s
bG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCis1MAorCitQQVNTIE1heGltdW0gcGVuZGluZyBy
ZXF1ZXN0cyByZWFjaGVkOiA1MAorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitU
RVNUIENPTVBMRVRFCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvd2Vic29j
a2V0L3Rlc3RzL2h5YmkvZmFpbGVkLWJ5LW1heGltdW0tcGVuZGluZy1jb25uZWN0aW9ucy5odG1s
IGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS9mYWlsZWQtYnkt
bWF4aW11bS1wZW5kaW5nLWNvbm5lY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDk3NzQ1N2QwYmNh
Njc5YThhMmI0YmI1YzVkM2FhZjEwODFkZDMzNAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRl
c3RzL2h0dHAvdGVzdHMvd2Vic29ja2V0L3Rlc3RzL2h5YmkvZmFpbGVkLWJ5LW1heGltdW0tcGVu
ZGluZy1jb25uZWN0aW9ucy5odG1sCkBAIC0wLDAgKzEsNTMgQEAKKzwhRE9DVFlQRSBIVE1MPgor
PGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1w
cmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+
PC9kaXY+Cis8cCBpZD0icmVzdWx0Ij5SdW5uaW5nLi4uPC9wPgorPGRpdiBpZD0iY29uc29sZSI+
PC9kaXY+Cis8c2NyaXB0PgorZGVzY3JpcHRpb24oJ1ByaW50IHRoZSBtYXhpbXVtIHBlbmRpbmcg
cmVxdWVzdHMgbGltaXQgZGVmaW5lZCBpbiBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb24uJyk7CisK
K3dpbmRvdy5qc1Rlc3RJc0FzeW5jID0gdHJ1ZTsKKworaWYgKHdpbmRvdy50ZXN0UnVubmVyKQor
ICAgIHRlc3RSdW5uZXIuZHVtcEFzVGV4dCgpOworCit2YXIgc29ja2V0Q291bnQgPSAxMDAKK3Zh
ciBtYXhQZW5kaW5nUmVxdWVzdHMgPSAtMQordmFyIHJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCdyZXN1bHQnKTsKK3ZhciBzb2NrZXRzID0gW107CisKK2ZvciAoaSA9IDA7IGkgPCBz
b2NrZXRDb3VudDsgKytpKSB7CisgICAgdmFyIHdzOworICAgIHRyeSB7CisgICAgICAgIHdzID0g
bmV3IFdlYlNvY2tldCgnd3M6Ly9sb2NhbGhvc3Q6ODg4MC93ZWJzb2NrZXQvdGVzdHMvaHliaS9m
YWlsZWQtYnktbWF4aW11bS1wZW5kaW5nLWNvbm5lY3Rpb25zJyk7CisgICAgfSBjYXRjaCAoZXgp
IHsKKyAgICAgICAgaWYgKGV4Lm5hbWUgPT09ICdOZXR3b3JrRXJyb3InKSB7CisgICAgICAgICAg
ICBtYXhQZW5kaW5nUmVxdWVzdHMgPSBpIC0gMTsKKyAgICAgICAgICAgIHRlc3RQYXNzZWQoJ01h
eGltdW0gcGVuZGluZyByZXF1ZXN0cyByZWFjaGVkOiAnICsgbWF4UGVuZGluZ1JlcXVlc3RzKQor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRlc3RGYWlsZWQoJ1VuZXhwZWN0ZWQgZXJyb3Ig
JyArIGV4Lm1lc3NhZ2UpOworICAgICAgICBzb2NrZXRDb3VudCA9IGk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICBzb2NrZXRzW2ldID0gd3M7CisgICAgd3Mub25vcGVuID0gZnVuY3Rpb24o
KSB7CisgICAgICAgIHZhciBudW0gPSBwYXJzZUludChyZXN1bHQuaW5uZXJIVE1MKTsKKyAgICAg
ICAgaWYgKCFudW0pCisgICAgICAgICAgICBudW0gPSAwOworICAgICAgICBpZiAobnVtICE9IHNv
Y2tldENvdW50IC0gMSkKKyAgICAgICAgICAgIHJlc3VsdC5pbm5lckhUTUwgPSBudW0gKyAxOwor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzb2NrZXRDb3VudDsg
KytqKQorICAgICAgICAgICAgICAgIHNvY2tldHNbal0uY2xvc2UoKTsKKyAgICAgICAgICAgIGZp
bmlzaEpTVGVzdCgpCisgICAgICAgIH0KKyAgICB9Cit9Cis8L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4K
KzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0dHAvdGVzdHMvd2Vic29ja2V0L3Rl
c3RzL2h5YmkvZmFpbGVkLWJ5LW1heGltdW0tcGVuZGluZy1jb25uZWN0aW9uc193c2gucHkgYi9M
YXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL2ZhaWxlZC1ieS1tYXhp
bXVtLXBlbmRpbmctY29ubmVjdGlvbnNfd3NoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBhZmJjYzYyOWQzMTU3
NjNlMTU3NTlmNjg3OTdiNzE2MjgyMmVhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0
cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL2ZhaWxlZC1ieS1tYXhpbXVtLXBlbmRp
bmctY29ubmVjdGlvbnNfd3NoLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IDIwMTMs
IGJhc3lzS29tIEdtYkguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisj
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBD
T1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
CitpbXBvcnQgdGltZQorCitkZWYgd2ViX3NvY2tldF9kb19leHRyYV9oYW5kc2hha2UocmVxdWVz
dCk6CisgICAgIyBBZGQgZGVsYXkgdG8ga2VlcCB3ZWJzb2NrZXQgaW4gY29ubmVjdGluZyBzdGF0
ZSB1bnRpbCBtYXhpbXVtIHBlbmRpbmcKKyAgICAjIGNvbm5lY3Rpb25zIGxpbWl0IGlzIHJlYWNo
ZWQuCisgICAgdGltZS5zbGVlcCgwLjIpCisKK2RlZiB3ZWJfc29ja2V0X3RyYW5zZmVyX2RhdGEo
cmVxdWVzdCk6CisgICAgcmVxdWVzdC53c19zdHJlYW0ucmVjZWl2ZV9tZXNzYWdlKCkK
</data>
<flag name="review"
          id="219682"
          type_id="1"
          status="-"
          setter="ap"
    />
    <flag name="commit-queue"
          id="219688"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
      

    </bug>

</bugzilla>