<?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>163327</bug_id>
          
          <creation_ts>2016-10-12 03:58:26 -0700</creation_ts>
          <short_desc>WebRTC: [GTK] Add MediaEndpointOwr - an OpenWebRTC WebRTC backend</short_desc>
          <delta_ts>2016-10-21 03:23:13 -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>WebKitGTK</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>
          <dependson>163330</dependson>
          <blocked>143211</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Bergkvist">adam.bergkvist</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>alex</cc>
    
    <cc>bugs-noreply</cc>
    
    <cc>commit-queue</cc>
    
    <cc>pnormand</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1239233</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-12 03:58:26 -0700</bug_when>
    <thetext>MediaEndpointOwr is an implementation of the MediaEndpoint interface that uses the GStreamer-based OpenWebRTC framework. The plan is to add a manual test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1241894</commentid>
    <comment_count>1</comment_count>
      <attachid>292061</attachid>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-19 05:45:35 -0700</bug_when>
    <thetext>Created attachment 292061
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1241907</commentid>
    <comment_count>2</comment_count>
      <attachid>292061</attachid>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-19 06:59:13 -0700</bug_when>
    <thetext>Comment on attachment 292061
Proposed patch

View in context: https://bugs.webkit.org/attachment.cgi?id=292061&amp;action=review

&gt; ManualTests/webrtc-one-tab-p2p.html:310
&gt; +&lt;p&gt;Click start to request user media. The same stream is sent in both directions so a successful bidirectional media setup shows the same output in all four video elements. Open console to view signaling details. Some browsers only allow access to user media via a secure origin (e.g. localhost).&lt;/p&gt;

Will wrap this line in a follow-up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242286</commentid>
    <comment_count>3</comment_count>
      <attachid>292061</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2016-10-20 00:44:43 -0700</bug_when>
    <thetext>Comment on attachment 292061
Proposed patch

View in context: https://bugs.webkit.org/attachment.cgi?id=292061&amp;action=review

Nice patch! Looking forward having it in trunk :) Was this tested with a debug build too? Please also check the comments inline!

&gt; Source/WebCore/ChangeLog:10
&gt; +        is till done with MockMediaEndpoint.

typo: till

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:88
&gt; +    g_free(m_dtlsPrivateKey);
&gt; +    g_free(m_dtlsCertificate);
&gt; +
&gt; +    g_regex_unref(m_helperServerRegEx);

Could we use smart pointers for those?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:113
&gt; +    payload-&gt;setEncodingName(&quot;OPUS&quot;);

What if we don&apos;t have the Opus gst plugin? I suspect we should build the vector depending on the codecs and (de)payloaders available. Maybe open a new bug about this and link it here.

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:141
&gt; +    payload-&gt;setEncodingName(&quot;H264&quot;);

Ditto :)

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:260
&gt; +            printf(&quot;updateSendConfiguration: BAD missing configuration element for %d\n&quot;, i);

Replace with an ASSERT ?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:288
&gt; +            printf(&quot;updateSendConfiguration: no payloads\n&quot;);

Remove this one or ASSERT ?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:356
&gt; +    // FIXME: An OWR bug prevents this from succeeding

details? Is there a github OWR issue for this?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:478
&gt; +    bool useRtpMux = !isInitiator &amp;&amp; mediaDescription-&gt;rtcpMux();

useRtcpMux

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:557
&gt; +                parseHelperServerUrl(m_helperServerRegEx, webkitUrl, url);

I suppose the regex could be managed here locally instead of having it as class member?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:559
&gt; +                unsigned short port = url.port ? url.port : 3478;

Use a define for the default port

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:658
&gt; +    iceCandidate-&gt;setPort(port ? port : 9);

ditto?

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:669
&gt; +        iceCandidate-&gt;setRelatedPort(relatedPort ? relatedPort : 9);

:)

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:680
&gt; +    g_free(foundation);
&gt; +    g_free(address);
&gt; +    g_free(relatedAddress);

Smart pointers could be used for these, I think.

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h:37
&gt; +#include &lt;owr/owr_media_session.h&gt;
&gt; +#include &lt;owr/owr_transport_agent.h&gt;

Maybe use forward declarations of the structs needed and move includes to the .cpp file, if possible :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242509</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-20 11:55:44 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 292061 [details]
&gt; Proposed patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=292061&amp;action=review
&gt; 
&gt; Nice patch! Looking forward having it in trunk :) Was this tested with a
&gt; debug build too? Please also check the comments inline!

Thanks for reviewing. (Now) it&apos;s successfully tested with a debug build. :)

&gt; &gt; Source/WebCore/ChangeLog:10
&gt; &gt; +        is till done with MockMediaEndpoint.
&gt; 
&gt; typo: till

Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:88
&gt; &gt; +    g_free(m_dtlsPrivateKey);
&gt; &gt; +    g_free(m_dtlsCertificate);
&gt; &gt; +
&gt; &gt; +    g_regex_unref(m_helperServerRegEx);
&gt; 
&gt; Could we use smart pointers for those?

Fixed first two (using WTFString).

The third can&apos;t directly be put into a unique_ptr and I&apos;m not sure it&apos;s worth going the length to fix it since it&apos;s a temporary solution until WebKit&apos;s URL class can handle the ICE helper server urls properly.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:113
&gt; &gt; +    payload-&gt;setEncodingName(&quot;OPUS&quot;);
&gt; 
&gt; What if we don&apos;t have the Opus gst plugin? I suspect we should build the
&gt; vector depending on the codecs and (de)payloaders available. Maybe open a
&gt; new bug about this and link it here.

True. Added FIXME and bug.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:141
&gt; &gt; +    payload-&gt;setEncodingName(&quot;H264&quot;);
&gt; 
&gt; Ditto :)

See above.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:260
&gt; &gt; +            printf(&quot;updateSendConfiguration: BAD missing configuration element for %d\n&quot;, i);
&gt; 
&gt; Replace with an ASSERT ?

Removed (was debug logging)

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:288
&gt; &gt; +            printf(&quot;updateSendConfiguration: no payloads\n&quot;);
&gt; 
&gt; Remove this one or ASSERT ?

Removed (was debug logging)

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:356
&gt; &gt; +    // FIXME: An OWR bug prevents this from succeeding
&gt; 
&gt; details? Is there a github OWR issue for this?

Yes. Added a link.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:478
&gt; &gt; +    bool useRtpMux = !isInitiator &amp;&amp; mediaDescription-&gt;rtcpMux();
&gt; 
&gt; useRtcpMux

Fixed.
 
&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:557
&gt; &gt; +                parseHelperServerUrl(m_helperServerRegEx, webkitUrl, url);
&gt; 
&gt; I suppose the regex could be managed here locally instead of having it as
&gt; class member?

Having it as class member has the benefit that we only need to compile the regex once instead of every time the parseHelperServerUrl is called. I don&apos;t have a strong preference though. Left as is for now.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:559
&gt; &gt; +                unsigned short port = url.port ? url.port : 3478;
&gt; 
&gt; Use a define for the default port

Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:658
&gt; &gt; +    iceCandidate-&gt;setPort(port ? port : 9);
&gt; 
&gt; ditto?

Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:669
&gt; &gt; +        iceCandidate-&gt;setRelatedPort(relatedPort ? relatedPort : 9);
&gt; 
&gt; :)

Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:680
&gt; &gt; +    g_free(foundation);
&gt; &gt; +    g_free(address);
&gt; &gt; +    g_free(relatedAddress);
&gt; 
&gt; Smart pointers could be used for these, I think.

We could put these in WTFString objects, but that would imply copying the data and still freeing the gchar* strings, since it doesn&apos;t seem possible to String::adopt() a plain char*. This would also require alternative names for the WTFString versions. I think it would be worth the extra work if the function had multiple exit points (to avoid forgetting a free), but it probably never will since it&apos;s just a bunch of set-operations. 

&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h:37
&gt; &gt; +#include &lt;owr/owr_media_session.h&gt;
&gt; &gt; +#include &lt;owr/owr_transport_agent.h&gt;
&gt; 
&gt; Maybe use forward declarations of the structs needed and move includes to
&gt; the .cpp file, if possible :)

It made a try, but it gets a bit messy since all the OWR types are typedefs (of structs).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242514</commentid>
    <comment_count>5</comment_count>
      <attachid>292236</attachid>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-20 12:11:45 -0700</bug_when>
    <thetext>Created attachment 292236
Updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242792</commentid>
    <comment_count>6</comment_count>
      <attachid>292236</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2016-10-21 00:52:43 -0700</bug_when>
    <thetext>Comment on attachment 292236
Updated patch

View in context: https://bugs.webkit.org/attachment.cgi?id=292236&amp;action=review

&gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:352
&gt; +    owr_media_session_set_send_source(OWR_MEDIA_SESSION(transceiver-&gt;session()), owrSource.mediaSource());

So this won&apos;t work then? Maybe replace with notImplemented() ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242795</commentid>
    <comment_count>7</comment_count>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2016-10-21 00:54:46 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h:37
&gt; &gt; &gt; +#include &lt;owr/owr_media_session.h&gt;
&gt; &gt; &gt; +#include &lt;owr/owr_transport_agent.h&gt;
&gt; &gt; 
&gt; &gt; Maybe use forward declarations of the structs needed and move includes to
&gt; &gt; the .cpp file, if possible :)
&gt; 
&gt; It made a try, but it gets a bit messy since all the OWR types are typedefs
&gt; (of structs).

typedef struct _Foo Foo;

We do this in some of the player headers for Gst structs.
The issue usually is with C enums that can&apos;t be forward-declared.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242823</commentid>
    <comment_count>8</comment_count>
      <attachid>292334</attachid>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-21 02:00:55 -0700</bug_when>
    <thetext>Created attachment 292334
Updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242825</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-21 02:02:36 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Comment on attachment 292236 [details]
&gt; Updated patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=292236&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:352
&gt; &gt; +    owr_media_session_set_send_source(OWR_MEDIA_SESSION(transceiver-&gt;session()), owrSource.mediaSource());
&gt; 
&gt; So this won&apos;t work then? Maybe replace with notImplemented() ?

Fixed.

(In reply to comment #7)
&gt; (In reply to comment #4)
&gt; &gt; &gt; &gt; Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h:37
&gt; &gt; &gt; &gt; +#include &lt;owr/owr_media_session.h&gt;
&gt; &gt; &gt; &gt; +#include &lt;owr/owr_transport_agent.h&gt;
&gt; &gt; &gt; 
&gt; &gt; &gt; Maybe use forward declarations of the structs needed and move includes to
&gt; &gt; &gt; the .cpp file, if possible :)
&gt; &gt; 
&gt; &gt; It made a try, but it gets a bit messy since all the OWR types are typedefs
&gt; &gt; (of structs).
&gt; 
&gt; typedef struct _Foo Foo;
&gt; 
&gt; We do this in some of the player headers for Gst structs.
&gt; The issue usually is with C enums that can&apos;t be forward-declared.

Fixed. We need owr_session.h in the header for the OwrIceState enum.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242829</commentid>
    <comment_count>10</comment_count>
      <attachid>292334</attachid>
    <who name="Adam Bergkvist">adam.bergkvist</who>
    <bug_when>2016-10-21 02:59:10 -0700</bug_when>
    <thetext>Comment on attachment 292334
Updated patch

Thanks for reviewing Philippe :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242833</commentid>
    <comment_count>11</comment_count>
      <attachid>292334</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-10-21 03:23:09 -0700</bug_when>
    <thetext>Comment on attachment 292334
Updated patch

Clearing flags on attachment: 292334

Committed r207665: &lt;http://trac.webkit.org/changeset/207665&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1242834</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-10-21 03:23:13 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>292061</attachid>
            <date>2016-10-19 05:45:35 -0700</date>
            <delta_ts>2016-10-20 12:11:45 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>add-media-endpoint-owr_0.patch</filename>
            <type>text/plain</type>
            <size>52077</size>
            <attacher name="Adam Bergkvist">adam.bergkvist</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4MDEwZWNjLi4xNmUwMWM3
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTYtMTAtMTkgIEFkYW0gQmVyZ2t2aXN0ICA8YWRhbS5iZXJna3Zpc3RAZXJpY3Nzb24uY29t
PgorCisgICAgICAgIFdlYlJUQzogW0dUS10gQWRkIE1lZGlhRW5kcG9pbnRPd3IgLSBhbiBPcGVu
V2ViUlRDIFdlYlJUQyBiYWNrZW5kCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNjMzMjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBBZGQgbWFudWFsIFdlYlJUQyB0ZXN0LiBUZXN0IGZlYXR1cmVzOgorICAg
ICAgICAtIFR3byBSVENQZWVyQ29ubmVjdGlvbiBpbnN0YW5jZXMgY29tbXVuaWNhdGUgaW4gYSBz
aW5nbGUgYnJvd3NlciB0YWIuCisgICAgICAgIC0gU3VwcG9ydHMgc2V0dGluZyB1cCBiaWRpcmVj
dGlvbmFsIG1lZGlhIHdpdGggYSBzaW5nbGUgU0RQIGRpYWxvZywgYXMKKyAgICAgICAgICB3ZWxs
IGFzIG9uZSBkaXJlY3Rpb24gYXQgYSB0aW1lLgorICAgICAgICAtIFN0cmlwcyB2ZW5kb3IgcHJl
Zml4ZXMgKHJ1bnMgaW4gQ2hyb21lIGFuZCBGaXJlZm94IGFzIHdlbGwpCisgICAgICAgIC0gU3Vw
cG9ydHMgbW9kZXJuIGFzIHdlbGwgYXMgbGVnYWN5IEFQSXMgKG1haW5seSB0byBtYWtlIHRoZSB0
ZXN0IHJ1bgorICAgICAgICAgIGluIENocm9tZSkKKworICAgICAgICAqIE1hbnVhbFRlc3RzL3dl
YnJ0Yy1vbmUtdGFiLXAycC5odG1sOiBBZGRlZC4KKwogMjAxNi0xMC0xMCAgWmFuIERvYmVyc2Vr
ICA8emRvYmVyc2VrQGlnYWxpYS5jb20+CiAKICAgICAgICAgQWRkIEVOQUJMRV9FTkNSWVBURURf
TUVESUEgY29uZmlndXJhdGlvbiBvcHRpb24KZGlmZiAtLWdpdCBhL01hbnVhbFRlc3RzL3dlYnJ0
Yy1vbmUtdGFiLXAycC5odG1sIGIvTWFudWFsVGVzdHMvd2VicnRjLW9uZS10YWItcDJwLmh0bWwK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMWI1OQotLS0gL2Rldi9udWxs
CisrKyBiL01hbnVhbFRlc3RzL3dlYnJ0Yy1vbmUtdGFiLXAycC5odG1sCkBAIC0wLDAgKzEsMzQx
IEBACis8IWRvY3R5cGUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+T25lIHRhYiBwMnA8
L3RpdGxlPgorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIHZpZGVvIHsgd2lkdGg6IDI0
MHB4OyBoZWlnaHQ6IDE2MHB4OyBib3JkZXI6IGJsYWNrIDFweCBkYXNoZWQ7IH0KKyAgICBpbnB1
dCB7IG1hcmdpbjogMnB4IH0KKzwvc3R5bGU+CisKKzxzY3JpcHQ+CisvLyBNYWtlIHVzZSBvZiBw
cmVmaXhlZCBBUElzIHRvIHJ1biB0aGlzIHRlc3QgaW4gQ2hyb21lIGFuZCBGaXJlZm94CitzZWxm
LlJUQ1BlZXJDb25uZWN0aW9uID0gc2VsZi5SVENQZWVyQ29ubmVjdGlvbiB8fCBzZWxmLndlYmtp
dFJUQ1BlZXJDb25uZWN0aW9uIHx8IHNlbGYubW96UlRDUGVlckNvbm5lY3Rpb247CituYXZpZ2F0
b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLmdldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3Iud2Vi
a2l0R2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWE7CisKK2xldCBsZWdh
Y3lDaGVja0JveDsKK2xldCBjbG9zZUJ1dHRvbjsKK2xldCBwY0E7CitsZXQgcGNCOworbGV0IGxv
Y2FsU3RyZWFtOworCitjb25zdCBwY05hbWVzID0geworICAgIGZpcnN0OiAiQSIsCisgICAgc2Vj
b25kOiAiQiIKK307CisKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgYW4gZW1w
dHkgY29uZmlndXJhdGlvbiAoYnVnOiBodHRwOi8vd2Via2l0Lm9yZy9iLzE1ODkzNikKK2NvbnN0
IGNvbmZpZ3VyYXRpb24gPSB7ICJpY2VTZXJ2ZXJzIjogW3sgInVybHMiOiAic3R1bjptbXQtc3R1
bi52ZXJrc3RhZC5uZXQiIH1dIH07CisKK2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNv
bnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgbGVnYWN5Q2hlY2tCb3ggPSBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjbGVnYWN5X2NoZWNrIik7CisgICAgY29uc3QgYXVkaW9DaGVja0Jv
eCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhdWRpb19jaGVjayIpOworICAgIGNvbnN0IHZp
ZGVvQ2hlY2tCb3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdmlkZW9fY2hlY2siKTsKKwor
ICAgIGNvbnN0IHN0YXJ0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3N0YXJ0X2J1
dCIpOworICAgIGNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Nsb3NlX2J1
dCIpOworCisgICAgY29uc3QgdGVzdEJ1dHRvbnMgPSB7CisgICAgICAgICJzaW5nbGUiOiBkb2N1
bWVudC5xdWVyeVNlbGVjdG9yKCIjc2luZ2xlX2J1dCIpLAorICAgICAgICAibWVkaWFBdG9CIjog
ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI21lZGlhX0FfdG9fQl9idXQiKSwKKyAgICAgICAgIm1l
ZGlhQnRvQSI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtZWRpYV9CX3RvX0FfYnV0IikKKyAg
ICB9OworCisgICAgZnVuY3Rpb24gc2V0VGVzdEJ1dHRvbnNEaXNhYmxlZChpc0Rpc2FibGVkKSB7
CisgICAgICAgIGZvciAobGV0IHAgaW4gdGVzdEJ1dHRvbnMpCisgICAgICAgICAgICB0ZXN0QnV0
dG9uc1twXS5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CisgICAgfQorCisgICAgc3RhcnRCdXR0b24u
b25jbGljayA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSh7
CisgICAgICAgICAgICAiYXVkaW8iOiBhdWRpb0NoZWNrQm94LmNoZWNrZWQsCisgICAgICAgICAg
ICAidmlkZW8iOiB2aWRlb0NoZWNrQm94LmNoZWNrZWQKKyAgICAgICAgfSwgZnVuY3Rpb24gKHN0
cmVhbSkgeworICAgICAgICAgICAgYXVkaW9DaGVja0JveC5kaXNhYmxlZCA9IHZpZGVvQ2hlY2tC
b3guZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgbG9jYWxTdHJlYW0gPSBzdHJlYW07Cisg
ICAgICAgICAgICBzdGFydEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzZXRU
ZXN0QnV0dG9uc0Rpc2FibGVkKGZhbHNlKTsKKyAgICAgICAgfSwgbG9nRXJyb3IpOworICAgIH07
CisKKyAgICBjbG9zZUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBl
dnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgY29uc29sZS5sb2coIkNsb3Npbmci
KTsKKyAgICAgICAgcGNBLmNsb3NlKCk7CisgICAgICAgIHBjQi5jbG9zZSgpOworICAgICAgICBw
Y0EgPSBudWxsOworICAgICAgICBwY0IgPSBudWxsOworCisgICAgICAgIHNldFRlc3RCdXR0b25z
RGlzYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHRlc3RCdXR0b25zLnNpbmdsZS5vbmNsaWNr
ID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUp
OworICAgICAgICBnZXRUZXN0RnVuY3Rpb24oInNpbmdsZURpYWxvZyIpKCk7CisgICAgfQorCisg
ICAgdGVzdEJ1dHRvbnMubWVkaWFBdG9CLm9uY2xpY2sgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAg
ICAgIHNldFRlc3RCdXR0b25zRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIGlmICghcGNBKQorICAg
ICAgICAgICAgY29tbW9uU2V0dXAoKTsKKyAgICAgICAgZ2V0VGVzdEZ1bmN0aW9uKCJhZGRPbmVX
YXlNZWRpYSIpKHBjQSwgcGNCLCB0ZXN0QnV0dG9ucy5tZWRpYUJ0b0EpOworICAgIH0KKworICAg
IHRlc3RCdXR0b25zLm1lZGlhQnRvQS5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAg
ICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUpOworICAgICAgICBpZiAoIXBjQSkKKyAgICAg
ICAgICAgIGNvbW1vblNldHVwKCk7CisgICAgICAgIGdldFRlc3RGdW5jdGlvbigiYWRkT25lV2F5
TWVkaWEiKShwY0IsIHBjQSwgdGVzdEJ1dHRvbnMubWVkaWFBdG9CKTsKKyAgICB9Cit9KTsKKwor
ZnVuY3Rpb24gZ2V0VGVzdEZ1bmN0aW9uKG5hbWUpIHsKKyAgICBjb25zdCBmdW5jdGlvbk5hbWUg
PSBsZWdhY3lDaGVja0JveC5jaGVja2VkID8gbmFtZSA6IGAke25hbWV9UHJvbWlzZWA7CisgICAg
cmV0dXJuIHNlbGZbZnVuY3Rpb25OYW1lXTsKK30KKworZnVuY3Rpb24gc2luZ2xlRGlhbG9nKCkg
eworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0obG9jYWxTdHJlYW0sIGRv
Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAgIHBjQS5hZGRTdHJlYW0o
bG9jYWxTdHJlYW0pOworCisgICAgcGNBLmNyZWF0ZU9mZmVyKGZ1bmN0aW9uIChvZmZlcikgewor
ICAgICAgICBwY0Euc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgb2ZmZXJUb0IocGNBLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dF
cnJvcik7CisgICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Iob2ZmZXIp
IHsKKyAgICAgICAgbG9nU2lnbmFsbGluZyhvZmZlciwgcGNBLCBwY0IpOworICAgICAgICBwY0Iu
c2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGFk
ZFN0b3JlZENhbmRpZGF0ZXMocGNCKTsKKyAgICAgICAgICAgIHJlbmRlclN0cmVhbShsb2NhbFN0
cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlbGZfdmlld0IiKSk7CisgICAgICAgICAg
ICBwY0IuYWRkU3RyZWFtKGxvY2FsU3RyZWFtKTsKKworICAgICAgICAgICAgcGNCLmNyZWF0ZUFu
c3dlcihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAgICAgICAgICAgcGNCLnNldExvY2FsRGVz
Y3JpcHRpb24oYW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dl
clRvQShwY0IubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9BKGFuc3dlcikgeworICAgICAgICBsb2dTaWduYWxs
aW5nKGFuc3dlciwgcGNCLCBwY0EpOworICAgICAgICBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
YW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiSW5pdGlhdG9y
IGdvdCBhbnN3ZXIsIE8vQSBkaWFsb2cgY29tcGxldGVkIik7CisgICAgICAgICAgICBhZGRTdG9y
ZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgICAgICBjbG9zZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAgfQorfQorCitmdW5jdGlvbiBzaW5nbGVE
aWFsb2dQcm9taXNlKCkgeworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0o
bG9jYWxTdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAg
IGxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4geworICAgICAgICBwY0Eu
YWRkVHJhY2sodHJhY2ssIGxvY2FsU3RyZWFtKTsKKyAgICB9KTsKKworICAgIHBjQS5jcmVhdGVP
ZmZlcigpLnRoZW4oZnVuY3Rpb24gKG9mZmVyKSB7CisgICAgICAgIHJldHVybiBwY0Euc2V0TG9j
YWxEZXNjcmlwdGlvbihvZmZlcik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIGxvZ1NpZ25hbGxpbmcocGNBLmxvY2FsRGVzY3JpcHRpb24sIHBjQSwgcGNCKTsKKyAg
ICAgICAgcmV0dXJuIHBjQi5zZXRSZW1vdGVEZXNjcmlwdGlvbihwY0EubG9jYWxEZXNjcmlwdGlv
bik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGFkZFN0b3JlZENh
bmRpZGF0ZXMocGNCKTsKKyAgICAgICAgcmVuZGVyU3RyZWFtKGxvY2FsU3RyZWFtLCBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjc2VsZl92aWV3QiIpKTsKKyAgICAgICAgbG9jYWxTdHJlYW0uZ2V0
VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB7CisgICAgICAgICAgICBwY0IuYWRkVHJhY2sodHJh
Y2ssIGxvY2FsU3RyZWFtKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwY0IuY3JlYXRl
QW5zd2VyKCk7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAg
IHJldHVybiBwY0Iuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpOworICAgIH0pCisgICAgLnRo
ZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWduYWxsaW5nKHBjQi5sb2NhbERlc2NyaXB0
aW9uLCBwY0IsIHBjQSk7CisgICAgICAgIHJldHVybiBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
cGNCLmxvY2FsRGVzY3JpcHRpb24pOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgewor
ICAgICAgICBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgIGNvbnNvbGUubG9nKCJJ
bml0aWF0b3IgZ290IGFuc3dlciwgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgY2xv
c2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAgIC5jYXRjaChsb2dFcnJvcik7
Cit9CisKK2Z1bmN0aW9uIGFkZE9uZVdheU1lZGlhKG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBj
b250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQu
cXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2ZmZXJpbmdQYy5uYW1lfWApKTsKKyAgICBvZmZl
cmluZ1BjLmFkZFN0cmVhbShsb2NhbFN0cmVhbSk7CisKKyAgICBvZmZlcmluZ1BjLmNyZWF0ZU9m
ZmVyKGZ1bmN0aW9uIChvZmZlcikgeworICAgICAgICBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIG9mZmVyVG9BbnN3ZXJpbmdQ
YyhvZmZlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dFcnJvcik7Cisg
ICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Fuc3dlcmluZ1BjKG9mZmVy
KSB7CisgICAgICAgIGxvZ1NpZ25hbGxpbmcob2ZmZXIsIG9mZmVyaW5nUGMsIGFuc3dlcmluZ1Bj
KTsKKyAgICAgICAgYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0ZXMoYW5zd2VyaW5nUGMpOwor
ICAgICAgICAgICAgYW5zd2VyaW5nUGMuY3JlYXRlQW5zd2VyKGZ1bmN0aW9uIChhbnN3ZXIpIHsK
KyAgICAgICAgICAgICAgICBhbnN3ZXJpbmdQYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlciwg
ZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICBhbnN3ZXJUb09mZmVyaW5nUGMoYW5z
d2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9PZmZlcmluZ1BjKGFuc3dlcikgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlciwgYW5zd2VyaW5nUGMsIG9mZmVyaW5nUGMpOworICAgICAgICBv
ZmZlcmluZ1BjLnNldFJlbW90ZURlc2NyaXB0aW9uKGFuc3dlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIsIHNpbmdsZSB3
YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0
ZXMob2ZmZXJpbmdQYyk7CisgICAgICAgICAgICBjb250aW51ZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICAgICAg
fSwgbG9nRXJyb3IpOworICAgIH0KK30KKworZnVuY3Rpb24gYWRkT25lV2F5TWVkaWFQcm9taXNl
KG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBjb250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0
cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2Zm
ZXJpbmdQYy5uYW1lfWApKTsKKyAgICBsb2NhbFN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKHRy
YWNrID0+IHsKKyAgICAgICAgb2ZmZXJpbmdQYy5hZGRUcmFjayh0cmFjaywgbG9jYWxTdHJlYW0p
OworICAgIH0pOworCisgICAgb2ZmZXJpbmdQYy5jcmVhdGVPZmZlcigpLnRoZW4oZnVuY3Rpb24g
KG9mZmVyKSB7CisgICAgICAgIHJldHVybiBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3JpcHRpb24o
b2ZmZXIpOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWdu
YWxsaW5nKG9mZmVyaW5nUGMubG9jYWxEZXNjcmlwdGlvbiwgb2ZmZXJpbmdQYywgYW5zd2VyaW5n
UGMpOworICAgICAgICByZXR1cm4gYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2Zm
ZXJpbmdQYy5sb2NhbERlc2NyaXB0aW9uKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0aW9uICgp
IHsKKyAgICAgICAgYWRkU3RvcmVkQ2FuZGlkYXRlcyhhbnN3ZXJpbmdQYyk7CisgICAgICAgIHJl
dHVybiBhbnN3ZXJpbmdQYy5jcmVhdGVBbnN3ZXIoKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uIChhbnN3ZXIpIHsKKyAgICAgICAgcmV0dXJuIGFuc3dlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24oYW5zd2VyKQorICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24sIGFuc3dlcmluZ1BjLCBv
ZmZlcmluZ1BjKTsKKyAgICAgICAgcmV0dXJuIG9mZmVyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRp
b24oYW5zd2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbikKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIs
IHNpbmdsZSB3YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgYWRkU3RvcmVkQ2Fu
ZGlkYXRlcyhvZmZlcmluZ1BjKTsKKyAgICAgICAgY29udGludWVCdXR0b24uZGlzYWJsZWQgPSBm
YWxzZTsKKyAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAg
IC5jYXRjaChsb2dFcnJvcik7Cit9CisKK2Z1bmN0aW9uIGNvbW1vblNldHVwKCkgeworICAgIHBj
QSA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBwY0IgPSBuZXcg
UlRDUGVlckNvbm5lY3Rpb24oY29uZmlndXJhdGlvbik7CisKKyAgICBwY0EubmFtZSA9IHBjTmFt
ZXMuZmlyc3Q7CisgICAgcGNCLm5hbWUgPSBwY05hbWVzLnNlY29uZDsKKworICAgIHN5bWV0cmlj
U2V0dXAocGNBLCBwY0IpOworICAgIHN5bWV0cmljU2V0dXAocGNCLCBwY0EpOworfQorCitmdW5j
dGlvbiBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjKSB7CisgICAgaWYgKCFwYy5zdG9yZWRDYW5kaWRh
dGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzLmZvckVhY2go
Y2FuZGlkYXRlID0+IHsKKyAgICAgICAgcGMuYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkuY2F0
Y2gobG9nRXJyb3IpOworICAgIH0pOworCisgICAgY29uc29sZS5sb2coYEFkZGVkICR7cGMuc3Rv
cmVkQ2FuZGlkYXRlcy5sZW5ndGh9IHN0b3JlZCBjYW5kaWRhdGVzIChhcnJpdmVkIGJlZm9yZSBy
ZW1vdGUgZGVzY3JpcHRpb24gd2FzIHNldClgKTsKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzID0g
bnVsbDsKK30KKworZnVuY3Rpb24gc3ltZXRyaWNTZXR1cChwYywgb3RoZXJQYykgeworICAgIHBj
Lm9uaWNlY2FuZGlkYXRlID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBpZiAoZXZ0LmNhbmRp
ZGF0ZSkgeworICAgICAgICAgICAgbG9nU2lnbmFsbGluZyhldnQuY2FuZGlkYXRlLCBwYywgb3Ro
ZXJQYyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3RlIGRlc2NyaXB0aW9uIGlzbid0IHNl
dCB5ZXQsIHN0b3JlIHRoZSBjYW5kaWRhdGUKKyAgICAgICAgICAgIGlmICghb3RoZXJQYy5yZW1v
dGVEZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghb3RoZXJQYy5zdG9yZWRDYW5k
aWRhdGVzKQorICAgICAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMgPSBb
XTsKKyAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMucHVzaChldnQuY2Fu
ZGlkYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG90aGVyUGMuYWRk
SWNlQ2FuZGlkYXRlKGV2dC5jYW5kaWRhdGUpLmNhdGNoKGxvZ0Vycm9yKTsKKyAgICAgICAgfQor
ICAgIH07CisKKyAgICBwYy5vbmFkZHN0cmVhbSA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAg
cmVuZGVyU3RyZWFtKGV2dC5zdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNyZW1vdGVf
dmlldyR7cGMubmFtZX1gKSk7CisgICAgfTsKK30KKworZnVuY3Rpb24gcmVuZGVyU3RyZWFtKHN0
cmVhbSwgdmlkZW8pIHsKKyAgICBpZiAodHlwZW9mIHZpZGVvLnNyY09iamVjdCAhPT0gInVuZGVm
aW5lZCIpCisgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTsKKyAgICBlbHNlCisgICAg
ICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTsKK30KKworZnVuY3Rp
b24gbG9nU2lnbmFsbGluZyhtc2csIGZyb21QYywgdG9QYykgeworICAgIGNvbnN0IHR5cGUgPSBt
c2cuY2FuZGlkYXRlID8gIkNhbmRpZGF0ZSIgOiBtc2cudHlwZS5yZXBsYWNlKC9eW2Etel0vLCBz
ID0+IHMudG9VcHBlckNhc2UoKSk7CisgICAgbGV0IGhlYWRlciA9IGAke3R5cGV9IGA7CisgICAg
aGVhZGVyICs9IGZyb21QYy5uYW1lID09IHBjTmFtZXMuZmlyc3QgPyBgJHtmcm9tUGMubmFtZX0g
LT4gJHt0b1BjLm5hbWV9YCA6IGAke3RvUGMubmFtZX0gPC0gJHtmcm9tUGMubmFtZX1gOworICAg
IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoaGVhZGVyKTsKKyAgICBjb25zb2xlLmxvZyhtc2cuY2Fu
ZGlkYXRlIHx8IG1zZy5zZHApOworICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKK30KKworZnVuY3Rp
b24gbG9nRXJyb3IoZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgaWYgKGVycm9y
Lm5hbWUgfHwgZXJyb3IubWVzc2FnZSkKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGxvZ0Vy
cm9yOiAke2Vycm9yLm5hbWUgfHwgIi0ifTogJHtlcnJvci5tZXNzYWdlIHx8ICItIn1gKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgY29uc29sZS5lcnJvcihgbG9nRXJyb3I6ICR7ZXJyb3J9
YCk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnNvbGUuZXJyb3IoImxvZ0Vycm9yOiAobm8gZXJy
b3IgbWVzc2FnZSkiKTsKK30KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKzxoMz5PbmUg
VGFiIFAyUCAtIFRlc3QgRGlmZmVyZW50IFNpZ25hbGluZyBTY2hlbWFzPC9oMz4KKzxwPkNsaWNr
IHN0YXJ0IHRvIHJlcXVlc3QgdXNlciBtZWRpYS4gVGhlIHNhbWUgc3RyZWFtIGlzIHNlbnQgaW4g
Ym90aCBkaXJlY3Rpb25zIHNvIGEgc3VjY2Vzc2Z1bCBiaWRpcmVjdGlvbmFsIG1lZGlhIHNldHVw
IHNob3dzIHRoZSBzYW1lIG91dHB1dCBpbiBhbGwgZm91ciB2aWRlbyBlbGVtZW50cy4gT3BlbiBj
b25zb2xlIHRvIHZpZXcgc2lnbmFsaW5nIGRldGFpbHMuIFNvbWUgYnJvd3NlcnMgb25seSBhbGxv
dyBhY2Nlc3MgdG8gdXNlciBtZWRpYSB2aWEgYSBzZWN1cmUgb3JpZ2luIChlLmcuIGxvY2FsaG9z
dCkuPC9wPgorPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ibGVnYWN5X2NoZWNrIj5Vc2UgTGVn
YWN5IEFQSXMgKENocm9tZSBjb21wYXRpYmxlKTxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2JveCIg
aWQ9ImF1ZGlvX2NoZWNrIj5BdWRpbzxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InZp
ZGVvX2NoZWNrIiBjaGVja2VkPlZpZGVvPGJyPgorCis8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0i
c3RhcnRfYnV0IiB2YWx1ZT0iU3RhcnQiPgorPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNsb3Nl
X2J1dCIgdmFsdWU9IkNsb3NlIENvbm5lY3Rpb25zIiBkaXNhYmxlZD4KKzxicj4KK1NldHVwIGJp
ZGlyZWN0aW9uYWwgbWVkaWE6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzaW5nbGVfYnV0IiB2
YWx1ZT0iU2luZ2xlIFNEUCBkaWFsb2ciIGRpc2FibGVkPgorPGJyPgorU2V0dXAgbWVkaWEgaW4g
b25lIGRpcmVjdGlvbiBhdCBhIHRpbWU6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJtZWRpYV9B
X3RvX0JfYnV0IiB2YWx1ZT0iTWVkaWEgQSB0byBCIiBkaXNhYmxlZD4KKzxpbnB1dCB0eXBlPSJi
dXR0b24iIGlkPSJtZWRpYV9CX3RvX0FfYnV0IiB2YWx1ZT0iTWVkaWEgQiB0byBBIiBkaXNhYmxl
ZD4KKzxicj4KKworPHRhYmxlPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkxvY2FsIChBKTwvdGQ+
PHRkPlJlbW90ZSAoQSk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHZp
ZGVvIGlkPSJzZWxmX3ZpZXdBIiBhdXRvcGxheSBtdXRlZD48L3ZpZGVvPjwvdGQ+CisgICAgICAg
IDx0ZD48dmlkZW8gaWQ9InJlbW90ZV92aWV3QSIgYXV0b3BsYXk+PC92aWRlbz48L3RkPgorICAg
IDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+TG9jYWwgKEIpPC90ZD48dGQ+UmVtb3RlIChC
KTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dmlkZW8gaWQ9InNlbGZf
dmlld0IiIGF1dG9wbGF5IG11dGVkPjwvdmlkZW8+PC90ZD4KKyAgICAgICAgPHRkPjx2aWRlbyBp
ZD0icmVtb3RlX3ZpZXdCIiBhdXRvcGxheT48L3ZpZGVvPjwvdGQ+CisgICAgPC90cj4KKzwvdGFi
bGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxp
c3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDk4ODIxOWYuLjEz
YTU4ZWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0yMzA2LDcgKzIzMDYsNiBAQCBzZXQoV2Vi
Q29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2xhdGVU
cmFuc2Zvcm1PcGVyYXRpb24uY3BwCiAKICAgICBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRpYUNv
bnN0cmFpbnRzLmNwcAotICAgIHBsYXRmb3JtL21lZGlhc3RyZWFtL01lZGlhRW5kcG9pbnQuY3Bw
CiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFFbmRwb2ludENvbmZpZ3VyYXRpb24uY3Bw
CiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1Qcml2YXRlLmNwcAogICAgIHBs
YXRmb3JtL21lZGlhc3RyZWFtL01lZGlhU3RyZWFtVHJhY2tQcml2YXRlLmNwcApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmlu
ZGV4IDQ4ZDBlMzAuLjY1OWRlNjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxv
ZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw3MiBAQAorMjAxNi0x
MC0xOSAgQWRhbSBCZXJna3Zpc3QgIDxhZGFtLmJlcmdrdmlzdEBlcmljc3Nvbi5jb20+CisKKyAg
ICAgICAgV2ViUlRDOiBbR1RLXSBBZGQgTWVkaWFFbmRwb2ludE93ciAtIGFuIE9wZW5XZWJSVEMg
V2ViUlRDIGJhY2tlbmQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE2MzMyNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZCBNZWRpYUVuZHBvaW50T3dyIHdoaWNoIGlzIGEgTWVkaWFFbmRwb2ludCBpbXBs
ZW1lbnRhdGlvbiAoV2ViUlRDIGJhY2tlbmQpIGJhc2VkIG9uCisgICAgICAgIE9wZW5XZWJSVEMg
WzFdLiBUaGUgV2ViUlRDIGJhY2tlbmQgY2FuIGJlIHRlc3RlZCB3aXRoIGEgbWFudWFsIHRlc3Qu
IEF1dG9tYXRpYyB0ZXN0aW5nCisgICAgICAgIGlzIHRpbGwgZG9uZSB3aXRoIE1vY2tNZWRpYUVu
ZHBvaW50LgorCisgICAgICAgIFsxXSBodHRwOi8vd3d3Lm9wZW53ZWJydGMub3JnLworCisgICAg
ICAgIFRlc3Rpbmc6IEFkZGVkIG1hbnVhbCB0ZXN0ICh3ZWJydGMtb25lLXRhYi1wMnAuaHRtbCkK
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIHBsYXRmb3JtL0dTdHJlYW1l
ci5jbWFrZToKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlh
RW5kcG9pbnRPd3IuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZU1lZGlhRW5k
cG9pbnRPd3IpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6TWVkaWFFbmRw
b2ludE93cik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjp+TWVkaWFFbmRw
b2ludE93cik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpzZXRDb25maWd1
cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OmNyeXB0b0RhdGFDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpnZW5lcmF0ZUR0bHNJbmZvKToKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmdldERlZmF1bHRBdWRpb1BheWxvYWRzKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmdldERlZmF1bHRWaWRlb1BheWxvYWRz
KToKKyAgICAgICAgKFdlYkNvcmU6OnBheWxvYWRzQ29udGFpblR5cGUpOgorICAgICAgICAoV2Vi
Q29yZTo6TWVkaWFFbmRwb2ludE93cjo6ZmlsdGVyUGF5bG9hZHMpOgorICAgICAgICAoV2ViQ29y
ZTo6TWVkaWFFbmRwb2ludE93cjo6dXBkYXRlUmVjZWl2ZUNvbmZpZ3VyYXRpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6ZmluZFJ0eFBheWxvYWQpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRw
b2ludE93cjo6dXBkYXRlU2VuZENvbmZpZ3VyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFFbmRwb2ludE93cjo6YWRkUmVtb3RlQ2FuZGlkYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1l
ZGlhRW5kcG9pbnRPd3I6OnJlcGxhY2VNdXRlZFJlbW90ZVNvdXJjZU1pZCk6CisgICAgICAgIChX
ZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpjcmVhdGVNdXRlZFJlbW90ZVNvdXJjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpyZXBsYWNlU2VuZFNvdXJjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpzdG9wKToKKyAgICAgICAgKFdlYkNvcmU6
Ok1lZGlhRW5kcG9pbnRPd3I6OnRyYW5zY2VpdmVySW5kZXhGb3JTZXNzaW9uKToKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OnNlc3Npb25NaWQpOgorICAgICAgICAoV2ViQ29y
ZTo6TWVkaWFFbmRwb2ludE93cjo6bWF0Y2hUcmFuc2NlaXZlckJ5TWlkKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoTmV3SWNlQ2FuZGlkYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoR2F0aGVyaW5nRG9uZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpwcm9jZXNzSWNlVHJhbnNwb3J0U3Rh
dGVDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6ZGlzcGF0Y2hE
dGxzRmluZ2VycHJpbnQpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6dW5t
dXRlUmVtb3RlU291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OnBy
ZXBhcmVTZXNzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OnByZXBh
cmVNZWRpYVNlc3Npb24pOgorICAgICAgICAoV2ViQ29yZTo6cGFyc2VIZWxwZXJTZXJ2ZXJVcmwp
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6ZW5zdXJlVHJhbnNwb3J0QWdl
bnRBbmRUcmFuc2NlaXZlcnMpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6
aW50ZXJuYWxBZGRSZW1vdGVDYW5kaWRhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Z290Q2FuZGlk
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNhbmRpZGF0ZUdhdGhlcmluZ0RvbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6
OmdvdEluY29taW5nU291cmNlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVu
d2VicnRjL01lZGlhRW5kcG9pbnRPd3IuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpPd3JU
cmFuc2NlaXZlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok93clRyYW5zY2VpdmVyOjp+
T3dyVHJhbnNjZWl2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6Om1pZCk6
CisgICAgICAgIChXZWJDb3JlOjpPd3JUcmFuc2NlaXZlcjo6c2Vzc2lvbik6CisgICAgICAgIChX
ZWJDb3JlOjpPd3JUcmFuc2NlaXZlcjo6b3dySWNlU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
T3dyVHJhbnNjZWl2ZXI6OnNldE93ckljZVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok93clRy
YW5zY2VpdmVyOjpnb3RFbmRPZlJlbW90ZUNhbmRpZGF0ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
T3dyVHJhbnNjZWl2ZXI6Om1hcmtHb3RFbmRPZlJlbW90ZUNhbmRpZGF0ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6Ok93clRyYW5zY2VpdmVyKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VPd3IuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lTWVkaWFTb3VyY2VPd3I6OlJlYWx0aW1lTWVkaWFTb3Vy
Y2VPd3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVhbHRpbWVNZWRpYVNvdXJjZU93cjo6c3dhcE91
dFNoYWxsb3dTb3VyY2UpOgorICAgICAgICBBZGQgc3VwcG9ydCBmb3IgYW4gaW5pdGlhbGx5IG11
dGVkIHNvdXJjZS4gVGhpcyBpcyB1c2VkIGZvciBlYXJseQorICAgICAgICBjcmVhdGlvbiBvZiBy
ZW1vdGUgc291cmNlcy4KKwogMjAxNi0xMC0xMCAgWmFuIERvYmVyc2VrICA8emRvYmVyc2VrQGln
YWxpYS5jb20+CiAKICAgICAgICAgQWRkIEVOQUJMRV9FTkNSWVBURURfTUVESUEgY29uZmlndXJh
dGlvbiBvcHRpb24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1l
ci5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1lci5jbWFrZQppbmRleCAw
MzFjOWYxLi4zN2ZlZDZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3Ry
ZWFtZXIuY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vR1N0cmVhbWVyLmNtYWtl
CkBAIC0xNCw2ICsxNCw3IEBAIGlmIChFTkFCTEVfTUVESUFfU1RSRUFNKQogICAgIGxpc3QoQVBQ
RU5EIFdlYkNvcmVfU09VUkNFUwogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIv
TWVkaWFQbGF5ZXJQcml2YXRlR1N0cmVhbWVyT3dyLmNwcAogCisgICAgICAgIHBsYXRmb3JtL21l
ZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5jcHAKICAgICAgICAgcGxhdGZv
cm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9PcGVuV2ViUlRDVXRpbGl0aWVzLmNwcAogICAgICAg
ICBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VDZW50
ZXJPd3IuY3BwCiAgICAgKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVk
aWFzdHJlYW0vb3BlbndlYnJ0Yy9NZWRpYUVuZHBvaW50T3dyLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzYTlkMAotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFF
bmRwb2ludE93ci5jcHAKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUsIDIwMTYgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgRXJpY3Nzb24gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9SVEMpCisjaW5jbHVkZSAiTWVkaWFFbmRwb2ludE93
ci5oIgorCisjaW5jbHVkZSAiTWVkaWFFbmRwb2ludFNlc3Npb25Db25maWd1cmF0aW9uLmgiCisj
aW5jbHVkZSAiTWVkaWFQYXlsb2FkLmgiCisjaW5jbHVkZSAiT3BlbldlYlJUQ1V0aWxpdGllcy5o
IgorI2luY2x1ZGUgIlJlYWx0aW1lTWVkaWFTb3VyY2VPd3IuaCIKKyNpbmNsdWRlIDxvd3Ivb3dy
Lmg+CisjaW5jbHVkZSA8b3dyL293cl9hdWRpb19wYXlsb2FkLmg+CisjaW5jbHVkZSA8b3dyL293
cl9jcnlwdG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxvd3Ivb3dyX3ZpZGVvX3BheWxvYWQuaD4KKyNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3Rh
dGljIHZvaWQgZ290Q2FuZGlkYXRlKE93clNlc3Npb24qLCBPd3JDYW5kaWRhdGUqLCBNZWRpYUVu
ZHBvaW50T3dyKik7CitzdGF0aWMgdm9pZCBjYW5kaWRhdGVHYXRoZXJpbmdEb25lKE93clNlc3Np
b24qLCBNZWRpYUVuZHBvaW50T3dyKik7CitzdGF0aWMgdm9pZCBpY2VDb25uZWN0aW9uU3RhdGVD
aGFuZ2UoT3dyU2Vzc2lvbiosIEdQYXJhbVNwZWMqLCBNZWRpYUVuZHBvaW50T3dyKik7CitzdGF0
aWMgdm9pZCBnb3RJbmNvbWluZ1NvdXJjZShPd3JNZWRpYVNlc3Npb24qLCBPd3JNZWRpYVNvdXJj
ZSosIE1lZGlhRW5kcG9pbnRPd3IqKTsKKworc3RhdGljIGNvbnN0IFZlY3RvcjxTdHJpbmc+IGNh
bmRpZGF0ZVR5cGVzID0geyAiaG9zdCIsICJzcmZseCIsICJwcmZseCIsICJyZWxheSIgfTsKK3N0
YXRpYyBjb25zdCBWZWN0b3I8U3RyaW5nPiBjYW5kaWRhdGVUY3BUeXBlcyA9IHsgIiIsICJhY3Rp
dmUiLCAicGFzc2l2ZSIsICJzbyIgfTsKK3N0YXRpYyBjb25zdCBWZWN0b3I8U3RyaW5nPiBjb2Rl
Y1R5cGVzID0geyAiTk9ORSIsICJQQ01VIiwgIlBDTUEiLCAiT1BVUyIsICJIMjY0IiwgIlZQOCIg
fTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGhlbHBlclNlcnZlclJlZ0V4ID0gIih0dXJufHN0dW4p
OihbXFx3XFwuXFwtXSt8XFxbW1xcd1xcOl0rXFxdKSg6XFxkKyk/KFxcPy4rKT8iOworCitzdGF0
aWMgc3RkOjp1bmlxdWVfcHRyPE1lZGlhRW5kcG9pbnQ+IGNyZWF0ZU1lZGlhRW5kcG9pbnRPd3Io
TWVkaWFFbmRwb2ludENsaWVudCYgY2xpZW50KQoreworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9w
dHI8TWVkaWFFbmRwb2ludD4obmV3IE1lZGlhRW5kcG9pbnRPd3IoY2xpZW50KSk7Cit9CisKK0Ny
ZWF0ZU1lZGlhRW5kcG9pbnQgTWVkaWFFbmRwb2ludDo6Y3JlYXRlID0gY3JlYXRlTWVkaWFFbmRw
b2ludE93cjsKKworTWVkaWFFbmRwb2ludE93cjo6TWVkaWFFbmRwb2ludE93cihNZWRpYUVuZHBv
aW50Q2xpZW50JiBjbGllbnQpCisgICAgOiBtX3RyYW5zcG9ydEFnZW50KG51bGxwdHIpCisgICAg
LCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX251bWJlck9mUmVjZWl2ZVByZXBhcmVkU2Vzc2lv
bnMoMCkKKyAgICAsIG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRTZXNzaW9ucygwKQorICAgICwgbV9k
dGxzUHJpdmF0ZUtleShudWxscHRyKQorICAgICwgbV9kdGxzQ2VydGlmaWNhdGUobnVsbHB0cikK
K3sKKyAgICBpbml0aWFsaXplT3BlbldlYlJUQygpOworCisgICAgR1JlZ2V4Q29tcGlsZUZsYWdz
IGNvbXBpbGVGbGFncyA9IEdfUkVHRVhfSkFWQVNDUklQVF9DT01QQVQ7CisgICAgR1JlZ2V4TWF0
Y2hGbGFncyBtYXRjaEZsYWdzID0gc3RhdGljX2Nhc3Q8R1JlZ2V4TWF0Y2hGbGFncz4oMCk7Cisg
ICAgbV9oZWxwZXJTZXJ2ZXJSZWdFeCA9IGdfcmVnZXhfbmV3KGhlbHBlclNlcnZlclJlZ0V4LCBj
b21waWxlRmxhZ3MsIG1hdGNoRmxhZ3MsIG51bGxwdHIpOworfQorCitNZWRpYUVuZHBvaW50T3dy
Ojp+TWVkaWFFbmRwb2ludE93cigpCit7CisgICAgc3RvcCgpOworCisgICAgZ19mcmVlKG1fZHRs
c1ByaXZhdGVLZXkpOworICAgIGdfZnJlZShtX2R0bHNDZXJ0aWZpY2F0ZSk7CisKKyAgICBnX3Jl
Z2V4X3VucmVmKG1faGVscGVyU2VydmVyUmVnRXgpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRP
d3I6OnNldENvbmZpZ3VyYXRpb24oUmVmUHRyPE1lZGlhRW5kcG9pbnRDb25maWd1cmF0aW9uPiYm
IGNvbmZpZ3VyYXRpb24pCit7CisgICAgbV9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsK
K30KKworc3RhdGljIHZvaWQgY3J5cHRvRGF0YUNhbGxiYWNrKGdjaGFyKiBwcml2YXRlS2V5LCBn
Y2hhciogY2VydGlmaWNhdGUsIGdjaGFyKiBmaW5nZXJwcmludCwgZ2NoYXIqIGZpbmdlcnByaW50
RnVuY3Rpb24sIGdwb2ludGVyIGRhdGEpCit7CisgICAgTWVkaWFFbmRwb2ludE93ciogbWVkaWFF
bmRwb2ludCA9IChNZWRpYUVuZHBvaW50T3dyKikgZGF0YTsKKyAgICBtZWRpYUVuZHBvaW50LT5k
aXNwYXRjaER0bHNGaW5nZXJwcmludChnX3N0cmR1cChwcml2YXRlS2V5KSwgZ19zdHJkdXAoY2Vy
dGlmaWNhdGUpLCBTdHJpbmcoZmluZ2VycHJpbnQpLCBTdHJpbmcoZmluZ2VycHJpbnRGdW5jdGlv
bikpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OmdlbmVyYXRlRHRsc0luZm8oKQorewor
ICAgIG93cl9jcnlwdG9fY3JlYXRlX2NyeXB0b19kYXRhKGNyeXB0b0RhdGFDYWxsYmFjaywgdGhp
cyk7Cit9CisKK01lZGlhUGF5bG9hZFZlY3RvciBNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0
QXVkaW9QYXlsb2FkcygpCit7CisgICAgTWVkaWFQYXlsb2FkVmVjdG9yIHBheWxvYWRzOworCisg
ICAgUmVmUHRyPE1lZGlhUGF5bG9hZD4gcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7
CisgICAgcGF5bG9hZC0+c2V0VHlwZSgxMTEpOworICAgIHBheWxvYWQtPnNldEVuY29kaW5nTmFt
ZSgiT1BVUyIpOworICAgIHBheWxvYWQtPnNldENsb2NrUmF0ZSg0ODAwMCk7CisgICAgcGF5bG9h
ZC0+c2V0Q2hhbm5lbHMoMik7CisgICAgcGF5bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAg
cGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7CisgICAgcGF5bG9hZC0+c2V0VHlwZSg4
KTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGluZ05hbWUoIlBDTUEiKTsKKyAgICBwYXlsb2FkLT5z
ZXRDbG9ja1JhdGUoODAwMCk7CisgICAgcGF5bG9hZC0+c2V0Q2hhbm5lbHMoMSk7CisgICAgcGF5
bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAgcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3Jl
YXRlKCk7CisgICAgcGF5bG9hZC0+c2V0VHlwZSgwKTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGlu
Z05hbWUoIlBDTVUiKTsKKyAgICBwYXlsb2FkLT5zZXRDbG9ja1JhdGUoODAwMCk7CisgICAgcGF5
bG9hZC0+c2V0Q2hhbm5lbHMoMSk7CisgICAgcGF5bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisg
ICAgcmV0dXJuIHBheWxvYWRzOworfQorCitNZWRpYVBheWxvYWRWZWN0b3IgTWVkaWFFbmRwb2lu
dE93cjo6Z2V0RGVmYXVsdFZpZGVvUGF5bG9hZHMoKQoreworICAgIE1lZGlhUGF5bG9hZFZlY3Rv
ciBwYXlsb2FkczsKKworICAgIFJlZlB0cjxNZWRpYVBheWxvYWQ+IHBheWxvYWQgPSBNZWRpYVBh
eWxvYWQ6OmNyZWF0ZSgpOworICAgIHBheWxvYWQtPnNldFR5cGUoMTAzKTsKKyAgICBwYXlsb2Fk
LT5zZXRFbmNvZGluZ05hbWUoIkgyNjQiKTsKKyAgICBwYXlsb2FkLT5zZXRDbG9ja1JhdGUoOTAw
MDApOworICAgIHBheWxvYWQtPnNldENjbWZpcih0cnVlKTsKKyAgICBwYXlsb2FkLT5zZXROYWNr
cGxpKHRydWUpOworICAgIHBheWxvYWQtPmFkZFBhcmFtZXRlcigicGFja2V0aXphdGlvbk1vZGUi
LCAxKTsKKyAgICBwYXlsb2Fkcy5hcHBlbmQocGF5bG9hZCk7CisKKyAgICBwYXlsb2FkID0gTWVk
aWFQYXlsb2FkOjpjcmVhdGUoKTsKKyAgICBwYXlsb2FkLT5zZXRUeXBlKDEwMCk7CisgICAgcGF5
bG9hZC0+c2V0RW5jb2RpbmdOYW1lKCJWUDgiKTsKKyAgICBwYXlsb2FkLT5zZXRDbG9ja1JhdGUo
OTAwMDApOworICAgIHBheWxvYWQtPnNldENjbWZpcih0cnVlKTsKKyAgICBwYXlsb2FkLT5zZXRO
YWNrcGxpKHRydWUpOworICAgIHBheWxvYWQtPnNldE5hY2sodHJ1ZSk7CisgICAgcGF5bG9hZHMu
YXBwZW5kKHBheWxvYWQpOworCisgICAgcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7
CisgICAgcGF5bG9hZC0+c2V0VHlwZSgxMjApOworICAgIHBheWxvYWQtPnNldEVuY29kaW5nTmFt
ZSgiUlRYIik7CisgICAgcGF5bG9hZC0+c2V0Q2xvY2tSYXRlKDkwMDAwKTsKKyAgICBwYXlsb2Fk
LT5hZGRQYXJhbWV0ZXIoImFwdCIsIDEwMCk7CisgICAgcGF5bG9hZC0+YWRkUGFyYW1ldGVyKCJy
dHhUaW1lIiwgMjAwKTsKKyAgICBwYXlsb2Fkcy5hcHBlbmQocGF5bG9hZCk7CisKKyAgICByZXR1
cm4gcGF5bG9hZHM7Cit9CisKK3N0YXRpYyBib29sIHBheWxvYWRzQ29udGFpblR5cGUoTWVkaWFQ
YXlsb2FkVmVjdG9yIHBheWxvYWRzLCB1bnNpZ25lZCBwYXlsb2FkVHlwZSkKK3sKKyAgICBmb3Ig
KGF1dG8mIHBheWxvYWQgOiBwYXlsb2FkcykgeworICAgICAgICBpZiAocGF5bG9hZC0+dHlwZSgp
ID09IHBheWxvYWRUeXBlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKworTWVkaWFQYXlsb2FkVmVjdG9yIE1lZGlhRW5kcG9pbnRPd3I6OmZp
bHRlclBheWxvYWRzKGNvbnN0IE1lZGlhUGF5bG9hZFZlY3RvciYgcmVtb3RlUGF5bG9hZHMsIGNv
bnN0IE1lZGlhUGF5bG9hZFZlY3RvciYgZGVmYXVsdFBheWxvYWRzKQoreworICAgIE1lZGlhUGF5
bG9hZFZlY3RvciBmaWx0ZXJlZFBheWxvYWRzOworCisgICAgZm9yIChhdXRvJiByZW1vdGVQYXls
b2FkIDogcmVtb3RlUGF5bG9hZHMpIHsKKyAgICAgICAgTWVkaWFQYXlsb2FkKiBkZWZhdWx0UGF5
bG9hZCA9IG51bGxwdHI7CisgICAgICAgIGZvciAoYXV0byYgcCA6IGRlZmF1bHRQYXlsb2Fkcykg
eworICAgICAgICAgICAgaWYgKHAtPmVuY29kaW5nTmFtZSgpID09IHJlbW90ZVBheWxvYWQtPmVu
Y29kaW5nTmFtZSgpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkpIHsKKyAgICAgICAgICAgICAg
ICBkZWZhdWx0UGF5bG9hZCA9IHAuZ2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkZWZhdWx0UGF5bG9hZCkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkZWZhdWx0UGF5bG9hZC0+cGFyYW1ldGVy
cygpLmNvbnRhaW5zKCJwYWNrZXRpemF0aW9uTW9kZSIpICYmIHJlbW90ZVBheWxvYWQtPnBhcmFt
ZXRlcnMoKS5jb250YWlucygicGFja2V0aXphdGlvbk1vZGUiKQorICAgICAgICAgICAgJiYgKGRl
ZmF1bHRQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuZ2V0KCJwYWNrZXRpemF0aW9uTW9kZSIpICE9IGRl
ZmF1bHRQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuZ2V0KCJwYWNrZXRpemF0aW9uTW9kZSIpKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZpbHRlcmVkUGF5bG9hZHMuYXBwZW5kKHJl
bW90ZVBheWxvYWQpOworICAgIH0KKworICAgIE1lZGlhUGF5bG9hZFZlY3RvciBmaWx0ZXJlZEFw
dFBheWxvYWRzOworCisgICAgZm9yIChhdXRvJiBmaWx0ZXJlZFBheWxvYWQgOiBmaWx0ZXJlZFBh
eWxvYWRzKSB7CisgICAgICAgIGlmIChmaWx0ZXJlZFBheWxvYWQtPnBhcmFtZXRlcnMoKS5jb250
YWlucygiYXB0IikgJiYgKCFwYXlsb2Fkc0NvbnRhaW5UeXBlKGZpbHRlcmVkUGF5bG9hZHMsIGZp
bHRlcmVkUGF5bG9hZC0+cGFyYW1ldGVycygpLmdldCgiYXB0IikpKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBmaWx0ZXJlZEFwdFBheWxvYWRzLmFwcGVuZChmaWx0ZXJlZFBheWxv
YWQpOworICAgIH0KKworICAgIHJldHVybiBmaWx0ZXJlZEFwdFBheWxvYWRzOworfQorCitNZWRp
YUVuZHBvaW50OjpVcGRhdGVSZXN1bHQgTWVkaWFFbmRwb2ludE93cjo6dXBkYXRlUmVjZWl2ZUNv
bmZpZ3VyYXRpb24oTWVkaWFFbmRwb2ludFNlc3Npb25Db25maWd1cmF0aW9uKiBjb25maWd1cmF0
aW9uLCBib29sIGlzSW5pdGlhdG9yKQoreworICAgIFZlY3RvcjxUcmFuc2NlaXZlckNvbmZpZz4g
dHJhbnNjZWl2ZXJDb25maWdzOworICAgIGZvciAodW5zaWduZWQgaSA9IG1fdHJhbnNjZWl2ZXJz
LnNpemUoKTsgaSA8IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3JpcHRpb25zKCkuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgVHJhbnNjZWl2ZXJDb25maWcgY29uZmlnOworICAgICAgICBjb25maWcu
dHlwZSA9IFNlc3Npb25UeXBlTWVkaWE7CisgICAgICAgIGNvbmZpZy5pc0R0bHNDbGllbnQgPSBj
b25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0aW9ucygpW2ldLT5kdGxzU2V0dXAoKSA9PSAiYWN0
aXZlIjsKKyAgICAgICAgY29uZmlnLm1pZCA9IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3JpcHRp
b25zKClbaV0tPm1pZCgpOworICAgICAgICB0cmFuc2NlaXZlckNvbmZpZ3MuYXBwZW5kKFdURk1v
dmUoY29uZmlnKSk7CisgICAgfQorCisgICAgZW5zdXJlVHJhbnNwb3J0QWdlbnRBbmRUcmFuc2Nl
aXZlcnMoaXNJbml0aWF0b3IsIHRyYW5zY2VpdmVyQ29uZmlncyk7CisKKyAgICAvLyBQcmVwYXJl
IHRoZSBuZXcgc2Vzc2lvbnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gbV9udW1iZXJPZlJlY2Vp
dmVQcmVwYXJlZFNlc3Npb25zOyBpIDwgbV90cmFuc2NlaXZlcnMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgT3dyU2Vzc2lvbiogc2Vzc2lvbiA9IG1fdHJhbnNjZWl2ZXJzW2ldLT5zZXNzaW9uKCk7
CisgICAgICAgIHByZXBhcmVNZWRpYVNlc3Npb24oT1dSX01FRElBX1NFU1NJT04oc2Vzc2lvbiks
IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3JpcHRpb25zKClbaV0uZ2V0KCksIGlzSW5pdGlhdG9y
KTsKKyAgICAgICAgb3dyX3RyYW5zcG9ydF9hZ2VudF9hZGRfc2Vzc2lvbihtX3RyYW5zcG9ydEFn
ZW50LCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICBtX251bWJlck9mUmVjZWl2ZVByZXBhcmVkU2Vz
c2lvbnMgPSBtX3RyYW5zY2VpdmVycy5zaXplKCk7CisKKyAgICByZXR1cm4gVXBkYXRlUmVzdWx0
OjpTdWNjZXNzOworfQorCitzdGF0aWMgUmVmUHRyPE1lZGlhUGF5bG9hZD4gZmluZFJ0eFBheWxv
YWQoTWVkaWFQYXlsb2FkVmVjdG9yIHBheWxvYWRzLCB1bnNpZ25lZCBhcHQpCit7CisgICAgZm9y
IChhdXRvJiBwYXlsb2FkIDogcGF5bG9hZHMpIHsKKyAgICAgICAgaWYgKHBheWxvYWQtPmVuY29k
aW5nTmFtZSgpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkgPT0gIlJUWCIgJiYgcGF5bG9hZC0+
cGFyYW1ldGVycygpLmNvbnRhaW5zKCJhcHQiKQorICAgICAgICAgICAgJiYgKHBheWxvYWQtPnBh
cmFtZXRlcnMoKS5nZXQoImFwdCIpID09IGFwdCkpCisgICAgICAgICAgICByZXR1cm4gcGF5bG9h
ZDsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK01lZGlhRW5kcG9pbnQ6OlVwZGF0
ZVJlc3VsdCBNZWRpYUVuZHBvaW50T3dyOjp1cGRhdGVTZW5kQ29uZmlndXJhdGlvbihNZWRpYUVu
ZHBvaW50U2Vzc2lvbkNvbmZpZ3VyYXRpb24qIGNvbmZpZ3VyYXRpb24sIGNvbnN0IFJlYWx0aW1l
TWVkaWFTb3VyY2VNYXAmIHNlbmRTb3VyY2VNYXAsIGJvb2wgaXNJbml0aWF0b3IpCit7CisgICAg
VmVjdG9yPFRyYW5zY2VpdmVyQ29uZmlnPiB0cmFuc2NlaXZlckNvbmZpZ3M7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gbV90cmFuc2NlaXZlcnMuc2l6ZSgpOyBpIDwgY29uZmlndXJhdGlvbi0+bWVk
aWFEZXNjcmlwdGlvbnMoKS5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFuc2NlaXZlckNvbmZp
ZyBjb25maWc7CisgICAgICAgIGNvbmZpZy50eXBlID0gU2Vzc2lvblR5cGVNZWRpYTsKKyAgICAg
ICAgY29uZmlnLmlzRHRsc0NsaWVudCA9IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3JpcHRpb25z
KClbaV0tPmR0bHNTZXR1cCgpICE9ICJhY3RpdmUiOworICAgICAgICBjb25maWcubWlkID0gY29u
ZmlndXJhdGlvbi0+bWVkaWFEZXNjcmlwdGlvbnMoKVtpXS0+bWlkKCk7CisgICAgICAgIHRyYW5z
Y2VpdmVyQ29uZmlncy5hcHBlbmQoV1RGTW92ZShjb25maWcpKTsKKyAgICB9CisKKyAgICBlbnN1
cmVUcmFuc3BvcnRBZ2VudEFuZFRyYW5zY2VpdmVycyhpc0luaXRpYXRvciwgdHJhbnNjZWl2ZXJD
b25maWdzKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3RyYW5zY2VpdmVycy5z
aXplKCk7ICsraSkgeworICAgICAgICBpZiAoaSA+PSBjb25maWd1cmF0aW9uLT5tZWRpYURlc2Ny
aXB0aW9ucygpLnNpemUoKSkKKyAgICAgICAgICAgIHByaW50ZigidXBkYXRlU2VuZENvbmZpZ3Vy
YXRpb246IEJBRCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgJWRcbiIsIGkpOwor
CisgICAgICAgIE93clNlc3Npb24qIHNlc3Npb24gPSBtX3RyYW5zY2VpdmVyc1tpXS0+c2Vzc2lv
bigpOworICAgICAgICBQZWVyTWVkaWFEZXNjcmlwdGlvbiYgbWRlc2MgPSAqY29uZmlndXJhdGlv
bi0+bWVkaWFEZXNjcmlwdGlvbnMoKVtpXTsKKworICAgICAgICBpZiAobWRlc2MudHlwZSgpID09
ICJhdWRpbyIgfHwgbWRlc2MudHlwZSgpID09ICJ2aWRlbyIpCisgICAgICAgICAgICBnX29iamVj
dF9zZXQoc2Vzc2lvbiwgInJ0Y3AtbXV4IiwgbWRlc2MucnRjcE11eCgpLCBudWxscHRyKTsKKwor
ICAgICAgICBpZiAobWRlc2MuaWNlQ2FuZGlkYXRlcygpLnNpemUoKSkgeworICAgICAgICAgICAg
Zm9yIChhdXRvJiBjYW5kaWRhdGUgOiBtZGVzYy5pY2VDYW5kaWRhdGVzKCkpCisgICAgICAgICAg
ICAgICAgaW50ZXJuYWxBZGRSZW1vdGVDYW5kaWRhdGUoc2Vzc2lvbiwgKmNhbmRpZGF0ZSwgbWRl
c2MuaWNlVWZyYWcoKSwgbWRlc2MuaWNlUGFzc3dvcmQoKSk7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoaSA8IG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRTZXNzaW9ucykKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIGlmICghc2VuZFNvdXJjZU1hcC5jb250YWlucyhtZGVzYy5taWQo
KSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBNZWRpYVBheWxvYWQqIHBheWxv
YWQgPSBudWxscHRyOworICAgICAgICBmb3IgKGF1dG8mIHAgOiBtZGVzYy5wYXlsb2FkcygpKSB7
CisgICAgICAgICAgICBpZiAocC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNh
c2UoKSAhPSAiUlRYIikgeworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBwLmdldCgpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
aWYgKCFwYXlsb2FkKSB7CisgICAgICAgICAgICBwcmludGYoInVwZGF0ZVNlbmRDb25maWd1cmF0
aW9uOiBubyBwYXlsb2Fkc1xuIik7CisgICAgICAgICAgICByZXR1cm4gVXBkYXRlUmVzdWx0OjpG
YWlsZWQ7CisgICAgICAgIH0KKworICAgICAgICBSZWZQdHI8TWVkaWFQYXlsb2FkPiBydHhQYXls
b2FkID0gZmluZFJ0eFBheWxvYWQobWRlc2MucGF5bG9hZHMoKSwgcGF5bG9hZC0+dHlwZSgpKTsK
KyAgICAgICAgUmVhbHRpbWVNZWRpYVNvdXJjZU93ciogc291cmNlID0gc3RhdGljX2Nhc3Q8UmVh
bHRpbWVNZWRpYVNvdXJjZU93cio+KHNlbmRTb3VyY2VNYXAuZ2V0KG1kZXNjLm1pZCgpKSk7CisK
KyAgICAgICAgQVNTRVJUKGNvZGVjVHlwZXMuZmluZChwYXlsb2FkLT5lbmNvZGluZ05hbWUoKS5j
b252ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpKSAhPSBub3RGb3VuZCk7CisgICAgICAgIE93ckNvZGVj
VHlwZSBjb2RlY1R5cGUgPSBzdGF0aWNfY2FzdDxPd3JDb2RlY1R5cGU+KGNvZGVjVHlwZXMuZmlu
ZChwYXlsb2FkLT5lbmNvZGluZ05hbWUoKS5jb252ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpKSk7CisK
KyAgICAgICAgT3dyUGF5bG9hZCogc2VuZFBheWxvYWQ7CisgICAgICAgIGlmIChtZGVzYy50eXBl
KCkgPT0gImF1ZGlvIikKKyAgICAgICAgICAgIHNlbmRQYXlsb2FkID0gb3dyX2F1ZGlvX3BheWxv
YWRfbmV3KGNvZGVjVHlwZSwgcGF5bG9hZC0+dHlwZSgpLCBwYXlsb2FkLT5jbG9ja1JhdGUoKSwg
cGF5bG9hZC0+Y2hhbm5lbHMoKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VuZFBh
eWxvYWQgPSBvd3JfdmlkZW9fcGF5bG9hZF9uZXcoY29kZWNUeXBlLCBwYXlsb2FkLT50eXBlKCks
IHBheWxvYWQtPmNsb2NrUmF0ZSgpLCBwYXlsb2FkLT5jY21maXIoKSwgcGF5bG9hZC0+bmFja3Bs
aSgpKTsKKyAgICAgICAgICAgIGdfb2JqZWN0X3NldChzZW5kUGF5bG9hZCwgInJ0eC1wYXlsb2Fk
LXR5cGUiLCBydHhQYXlsb2FkID8gcnR4UGF5bG9hZC0+dHlwZSgpIDogLTEsCisgICAgICAgICAg
ICAgICAgInJ0eC10aW1lIiwgcnR4UGF5bG9hZCAmJiBydHhQYXlsb2FkLT5wYXJhbWV0ZXJzKCku
Y29udGFpbnMoInJ0eFRpbWUiKSA/IHJ0eFBheWxvYWQtPnBhcmFtZXRlcnMoKS5nZXQoInJ0eFRp
bWUiKSA6IDAsIG51bGxwdHIpOworICAgICAgICB9CisKKyAgICAgICAgb3dyX21lZGlhX3Nlc3Np
b25fc2V0X3NlbmRfcGF5bG9hZChPV1JfTUVESUFfU0VTU0lPTihzZXNzaW9uKSwgc2VuZFBheWxv
YWQpOworICAgICAgICBvd3JfbWVkaWFfc2Vzc2lvbl9zZXRfc2VuZF9zb3VyY2UoT1dSX01FRElB
X1NFU1NJT04oc2Vzc2lvbiksIHNvdXJjZS0+bWVkaWFTb3VyY2UoKSk7CisKKyAgICAgICAgbV9u
dW1iZXJPZlNlbmRQcmVwYXJlZFNlc3Npb25zID0gaSArIDE7CisgICAgfQorCisgICAgcmV0dXJu
IFVwZGF0ZVJlc3VsdDo6U3VjY2VzczsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjphZGRS
ZW1vdGVDYW5kaWRhdGUoSWNlQ2FuZGlkYXRlJiBjYW5kaWRhdGUsIGNvbnN0IFN0cmluZyYgbWlk
LCBjb25zdCBTdHJpbmcmIHVmcmFnLCBjb25zdCBTdHJpbmcmIHBhc3N3b3JkKQoreworICAgIGZv
ciAoYXV0byYgdHJhbnNjZWl2ZXIgOiBtX3RyYW5zY2VpdmVycykgeworICAgICAgICBpZiAodHJh
bnNjZWl2ZXItPm1pZCgpID09IG1pZCkgeworICAgICAgICAgICAgaW50ZXJuYWxBZGRSZW1vdGVD
YW5kaWRhdGUodHJhbnNjZWl2ZXItPnNlc3Npb24oKSwgY2FuZGlkYXRlLCB1ZnJhZywgcGFzc3dv
cmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVk
aWFFbmRwb2ludE93cjo6cmVwbGFjZU11dGVkUmVtb3RlU291cmNlTWlkKGNvbnN0IFN0cmluZyYg
b2xkTWlkLCBjb25zdCBTdHJpbmcmIG5ld01pZCkKK3sKKyAgICBSZWZQdHI8UmVhbHRpbWVNZWRp
YVNvdXJjZU93cj4gcmVtb3RlU291cmNlID0gbV9tdXRlZFJlbW90ZVNvdXJjZXMudGFrZShvbGRN
aWQpOworICAgIG1fbXV0ZWRSZW1vdGVTb3VyY2VzLnNldChuZXdNaWQsIHJlbW90ZVNvdXJjZSk7
Cit9CisKK1JlZjxSZWFsdGltZU1lZGlhU291cmNlPiBNZWRpYUVuZHBvaW50T3dyOjpjcmVhdGVN
dXRlZFJlbW90ZVNvdXJjZShjb25zdCBTdHJpbmcmIG1pZCwgUmVhbHRpbWVNZWRpYVNvdXJjZTo6
VHlwZSB0eXBlKQoreworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBpZCgibm90IHVzZWQi
KTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUmVhbHRpbWVNZWRpYVNvdXJjZTo6
QXVkaW86IG5hbWUgPSAicmVtb3RlIGF1ZGlvIjsgYnJlYWs7CisgICAgY2FzZSBSZWFsdGltZU1l
ZGlhU291cmNlOjpWaWRlbzogbmFtZSA9ICJyZW1vdGUgdmlkZW8iOyBicmVhazsKKyAgICBjYXNl
IFJlYWx0aW1lTWVkaWFTb3VyY2U6Ok5vbmU6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKworICAgIFJlZlB0cjxSZWFsdGltZU1lZGlhU291cmNlT3dyPiBzb3VyY2UgPSBh
ZG9wdFJlZihuZXcgUmVhbHRpbWVNZWRpYVNvdXJjZU93cihudWxscHRyLCBpZCwgdHlwZSwgbmFt
ZSkpOworICAgIG1fbXV0ZWRSZW1vdGVTb3VyY2VzLnNldChtaWQsIHNvdXJjZSk7CisKKyAgICBy
ZXR1cm4gKnNvdXJjZTsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjpyZXBsYWNlU2VuZFNv
dXJjZShSZWFsdGltZU1lZGlhU291cmNlJiBuZXdTb3VyY2UsIGNvbnN0IFN0cmluZyYgbWlkKQor
eworICAgIFJlYWx0aW1lTWVkaWFTb3VyY2VPd3ImIG93clNvdXJjZSA9IHN0YXRpY19jYXN0PFJl
YWx0aW1lTWVkaWFTb3VyY2VPd3ImPihuZXdTb3VyY2UpOworICAgIE93clRyYW5zY2VpdmVyKiB0
cmFuc2NlaXZlciA9IG1hdGNoVHJhbnNjZWl2ZXJCeU1pZChtaWQpOworICAgIEFTU0VSVCh0cmFu
c2NlaXZlcik7CisKKyAgICAvLyBGSVhNRTogQW4gT1dSIGJ1ZyBwcmV2ZW50cyB0aGlzIGZyb20g
c3VjY2VlZGluZworICAgIG93cl9tZWRpYV9zZXNzaW9uX3NldF9zZW5kX3NvdXJjZShPV1JfTUVE
SUFfU0VTU0lPTih0cmFuc2NlaXZlci0+c2Vzc2lvbigpKSwgb3dyU291cmNlLm1lZGlhU291cmNl
KCkpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnN0b3AoKQoreworICAgIGlmICghbV90
cmFuc3BvcnRBZ2VudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChhdXRvJiB0cmFuc2Nl
aXZlciA6IG1fdHJhbnNjZWl2ZXJzKQorICAgICAgICBvd3JfbWVkaWFfc2Vzc2lvbl9zZXRfc2Vu
ZF9zb3VyY2UoT1dSX01FRElBX1NFU1NJT04odHJhbnNjZWl2ZXItPnNlc3Npb24oKSksIG51bGxw
dHIpOworCisgICAgZ19vYmplY3RfdW5yZWYobV90cmFuc3BvcnRBZ2VudCk7CisgICAgbV90cmFu
c3BvcnRBZ2VudCA9IG51bGxwdHI7Cit9CisKK3NpemVfdCBNZWRpYUVuZHBvaW50T3dyOjp0cmFu
c2NlaXZlckluZGV4Rm9yU2Vzc2lvbihPd3JTZXNzaW9uKiBzZXNzaW9uKSBjb25zdAoreworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3RyYW5zY2VpdmVycy5zaXplKCk7ICsraSkgewor
ICAgICAgICBpZiAobV90cmFuc2NlaXZlcnNbaV0tPnNlc3Npb24oKSA9PSBzZXNzaW9uKQorICAg
ICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgcmV0dXJuIG5vdEZvdW5kOworfQorCitjb25zdCBTdHJpbmcmIE1lZGlhRW5kcG9pbnRPd3I6
OnNlc3Npb25NaWQoT3dyU2Vzc2lvbiogc2Vzc2lvbikgY29uc3QKK3sKKyAgICBzaXplX3QgaW5k
ZXggPSB0cmFuc2NlaXZlckluZGV4Rm9yU2Vzc2lvbihzZXNzaW9uKTsKKyAgICByZXR1cm4gbV90
cmFuc2NlaXZlcnNbaW5kZXhdLT5taWQoKTsKK30KKworT3dyVHJhbnNjZWl2ZXIqIE1lZGlhRW5k
cG9pbnRPd3I6Om1hdGNoVHJhbnNjZWl2ZXJCeU1pZChjb25zdCBTdHJpbmcmIG1pZCkgY29uc3QK
K3sKKyAgICBmb3IgKGF1dG8mIHRyYW5zY2VpdmVyIDogbV90cmFuc2NlaXZlcnMpIHsKKyAgICAg
ICAgaWYgKHRyYW5zY2VpdmVyLT5taWQoKSA9PSBtaWQpCisgICAgICAgICAgICByZXR1cm4gdHJh
bnNjZWl2ZXIuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIE1l
ZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoTmV3SWNlQ2FuZGlkYXRlKGNvbnN0IFN0cmluZyYgbWlk
LCBSZWZQdHI8SWNlQ2FuZGlkYXRlPiYmIGljZUNhbmRpZGF0ZSkKK3sKKyAgICBtX2NsaWVudC5n
b3RJY2VDYW5kaWRhdGUobWlkLCBXVEZNb3ZlKGljZUNhbmRpZGF0ZSkpOworfQorCit2b2lkIE1l
ZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoR2F0aGVyaW5nRG9uZShjb25zdCBTdHJpbmcmIG1pZCkK
K3sKKyAgICBtX2NsaWVudC5kb25lR2F0aGVyaW5nQ2FuZGlkYXRlcyhtaWQpOworfQorCit2b2lk
IE1lZGlhRW5kcG9pbnRPd3I6OnByb2Nlc3NJY2VUcmFuc3BvcnRTdGF0ZUNoYW5nZShPd3JTZXNz
aW9uKiBzZXNzaW9uKQoreworICAgIE93ckljZVN0YXRlIG93ckljZVN0YXRlOworICAgIGdfb2Jq
ZWN0X2dldChzZXNzaW9uLCAiaWNlLWNvbm5lY3Rpb24tc3RhdGUiLCAmb3dySWNlU3RhdGUsIG51
bGxwdHIpOworCisgICAgT3dyVHJhbnNjZWl2ZXImIHRyYW5zY2VpdmVyID0gKm1fdHJhbnNjZWl2
ZXJzW3RyYW5zY2VpdmVySW5kZXhGb3JTZXNzaW9uKHNlc3Npb24pXTsKKyAgICBpZiAob3dySWNl
U3RhdGUgPCB0cmFuc2NlaXZlci5vd3JJY2VTdGF0ZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICB0cmFuc2NlaXZlci5zZXRPd3JJY2VTdGF0ZShvd3JJY2VTdGF0ZSk7CisKKyAgICAvLyBXZSBj
YW5ub3QgZ28gdG8gQ29tcGxldGVkIGlmIHRoZXJlIG1heSBiZSBtb3JlIHJlbW90ZSBjYW5kaWRh
dGVzLgorICAgIGlmIChvd3JJY2VTdGF0ZSA9PSBPV1JfSUNFX1NUQVRFX1JFQURZICYmICF0cmFu
c2NlaXZlci5nb3RFbmRPZlJlbW90ZUNhbmRpZGF0ZXMoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgTWVkaWFFbmRwb2ludDo6SWNlVHJhbnNwb3J0U3RhdGUgdHJhbnNwb3J0U3RhdGU7CisgICAg
c3dpdGNoIChvd3JJY2VTdGF0ZSkgeworICAgIGNhc2UgT1dSX0lDRV9TVEFURV9DT05ORUNUSU5H
OgorICAgICAgICB0cmFuc3BvcnRTdGF0ZSA9IE1lZGlhRW5kcG9pbnQ6OkljZVRyYW5zcG9ydFN0
YXRlOjpDaGVja2luZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPV1JfSUNFX1NUQVRFX0NP
Tk5FQ1RFRDoKKyAgICAgICAgdHJhbnNwb3J0U3RhdGUgPSBNZWRpYUVuZHBvaW50OjpJY2VUcmFu
c3BvcnRTdGF0ZTo6Q29ubmVjdGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9XUl9JQ0Vf
U1RBVEVfUkVBRFk6CisgICAgICAgIHRyYW5zcG9ydFN0YXRlID0gTWVkaWFFbmRwb2ludDo6SWNl
VHJhbnNwb3J0U3RhdGU6OkNvbXBsZXRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPV1Jf
SUNFX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgdHJhbnNwb3J0U3RhdGUgPSBNZWRpYUVuZHBvaW50
OjpJY2VUcmFuc3BvcnRTdGF0ZTo6RmFpbGVkOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9jbGllbnQuaWNlVHJhbnNwb3J0U3Rh
dGVDaGFuZ2VkKHRyYW5zY2VpdmVyLm1pZCgpLCB0cmFuc3BvcnRTdGF0ZSk7Cit9CisKK3ZvaWQg
TWVkaWFFbmRwb2ludE93cjo6ZGlzcGF0Y2hEdGxzRmluZ2VycHJpbnQoZ2NoYXIqIHByaXZhdGVL
ZXksIGdjaGFyKiBjZXJ0aWZpY2F0ZSwgY29uc3QgU3RyaW5nJiBmaW5nZXJwcmludCwgY29uc3Qg
U3RyaW5nJiBmaW5nZXJwcmludEZ1bmN0aW9uKQoreworICAgIG1fZHRsc1ByaXZhdGVLZXkgPSBw
cml2YXRlS2V5OworICAgIG1fZHRsc0NlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisKKyAgICBt
X2NsaWVudC5nb3REdGxzRmluZ2VycHJpbnQoZmluZ2VycHJpbnQsIGZpbmdlcnByaW50RnVuY3Rp
b24pOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnVubXV0ZVJlbW90ZVNvdXJjZShjb25z
dCBTdHJpbmcmIG1pZCwgT3dyTWVkaWFTb3VyY2UqIHJlYWxTb3VyY2UpCit7CisgICAgUmVmUHRy
PFJlYWx0aW1lTWVkaWFTb3VyY2VPd3I+IHJlbW90ZVNvdXJjZSA9IG1fbXV0ZWRSZW1vdGVTb3Vy
Y2VzLnRha2UobWlkKTsKKyAgICBpZiAoIXJlbW90ZVNvdXJjZSkgeworICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byBmaW5kIG11dGVkIHJlbW90ZSBzb3VyY2UuIik7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoIXJlbW90ZVNvdXJjZS0+c3RvcHBlZCgpKQorICAgICAgICBy
ZW1vdGVTb3VyY2UtPnN3YXBPdXRTaGFsbG93U291cmNlKCpyZWFsU291cmNlKTsKK30KKwordm9p
ZCBNZWRpYUVuZHBvaW50T3dyOjpwcmVwYXJlU2Vzc2lvbihPd3JTZXNzaW9uKiBzZXNzaW9uLCBQ
ZWVyTWVkaWFEZXNjcmlwdGlvbiogbWVkaWFEZXNjcmlwdGlvbikKK3sKKyAgICBnX29iamVjdF9z
ZXRfZGF0YV9mdWxsKEdfT0JKRUNUKHNlc3Npb24pLCAiaWNlLXVmcmFnIiwgZ19zdHJkdXAobWVk
aWFEZXNjcmlwdGlvbi0+aWNlVWZyYWcoKS5hc2NpaSgpLmRhdGEoKSksIGdfZnJlZSk7CisgICAg
Z19vYmplY3Rfc2V0X2RhdGFfZnVsbChHX09CSkVDVChzZXNzaW9uKSwgImljZS1wYXNzd29yZCIs
IGdfc3RyZHVwKG1lZGlhRGVzY3JpcHRpb24tPmljZVBhc3N3b3JkKCkuYXNjaWkoKS5kYXRhKCkp
LCBnX2ZyZWUpOworCisgICAgZ19zaWduYWxfY29ubmVjdChzZXNzaW9uLCAib24tbmV3LWNhbmRp
ZGF0ZSIsIEdfQ0FMTEJBQ0soZ290Q2FuZGlkYXRlKSwgdGhpcyk7CisgICAgZ19zaWduYWxfY29u
bmVjdChzZXNzaW9uLCAib24tY2FuZGlkYXRlLWdhdGhlcmluZy1kb25lIiwgR19DQUxMQkFDSyhj
YW5kaWRhdGVHYXRoZXJpbmdEb25lKSwgdGhpcyk7CisgICAgZ19zaWduYWxfY29ubmVjdChzZXNz
aW9uLCAibm90aWZ5OjppY2UtY29ubmVjdGlvbi1zdGF0ZSIsIEdfQ0FMTEJBQ0soaWNlQ29ubmVj
dGlvblN0YXRlQ2hhbmdlKSwgdGhpcyk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6cHJl
cGFyZU1lZGlhU2Vzc2lvbihPd3JNZWRpYVNlc3Npb24qIG1lZGlhU2Vzc2lvbiwgUGVlck1lZGlh
RGVzY3JpcHRpb24qIG1lZGlhRGVzY3JpcHRpb24sIGJvb2wgaXNJbml0aWF0b3IpCit7CisgICAg
cHJlcGFyZVNlc3Npb24oT1dSX1NFU1NJT04obWVkaWFTZXNzaW9uKSwgbWVkaWFEZXNjcmlwdGlv
bik7CisKKyAgICBib29sIHVzZVJ0cE11eCA9ICFpc0luaXRpYXRvciAmJiBtZWRpYURlc2NyaXB0
aW9uLT5ydGNwTXV4KCk7CisgICAgZ19vYmplY3Rfc2V0KG1lZGlhU2Vzc2lvbiwgInJ0Y3AtbXV4
IiwgdXNlUnRwTXV4LCBudWxscHRyKTsKKworICAgIGlmICghbWVkaWFEZXNjcmlwdGlvbi0+Y25h
bWUoKS5pc0VtcHR5KCkgJiYgbWVkaWFEZXNjcmlwdGlvbi0+c3NyY3MoKS5zaXplKCkpIHsKKyAg
ICAgICAgZ19vYmplY3Rfc2V0KG1lZGlhU2Vzc2lvbiwgImNuYW1lIiwgbWVkaWFEZXNjcmlwdGlv
bi0+Y25hbWUoKS5hc2NpaSgpLmRhdGEoKSwKKyAgICAgICAgICAgICJzZW5kLXNzcmMiLCBtZWRp
YURlc2NyaXB0aW9uLT5zc3JjcygpWzBdLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQor
CisgICAgZ19zaWduYWxfY29ubmVjdChtZWRpYVNlc3Npb24sICJvbi1pbmNvbWluZy1zb3VyY2Ui
LCBHX0NBTExCQUNLKGdvdEluY29taW5nU291cmNlKSwgdGhpcyk7CisKKyAgICBmb3IgKGF1dG8m
IHBheWxvYWQgOiBtZWRpYURlc2NyaXB0aW9uLT5wYXlsb2FkcygpKSB7CisgICAgICAgIGlmIChw
YXlsb2FkLT5lbmNvZGluZ05hbWUoKS5jb252ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpID09ICJSVFgi
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgUmVmUHRyPE1lZGlhUGF5bG9hZD4g
cnR4UGF5bG9hZCA9IGZpbmRSdHhQYXlsb2FkKG1lZGlhRGVzY3JpcHRpb24tPnBheWxvYWRzKCks
IHBheWxvYWQtPnR5cGUoKSk7CisKKyAgICAgICAgQVNTRVJUKGNvZGVjVHlwZXMuZmluZChwYXls
b2FkLT5lbmNvZGluZ05hbWUoKSkgIT0gbm90Rm91bmQpOworICAgICAgICBPd3JDb2RlY1R5cGUg
Y29kZWNUeXBlID0gc3RhdGljX2Nhc3Q8T3dyQ29kZWNUeXBlPihjb2RlY1R5cGVzLmZpbmQocGF5
bG9hZC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNhc2UoKSkpOworCisgICAg
ICAgIE93clBheWxvYWQqIHJlY2VpdmVQYXlsb2FkOworICAgICAgICBpZiAobWVkaWFEZXNjcmlw
dGlvbi0+dHlwZSgpID09ICJhdWRpbyIpCisgICAgICAgICAgICByZWNlaXZlUGF5bG9hZCA9IG93
cl9hdWRpb19wYXlsb2FkX25ldyhjb2RlY1R5cGUsIHBheWxvYWQtPnR5cGUoKSwgcGF5bG9hZC0+
Y2xvY2tSYXRlKCksIHBheWxvYWQtPmNoYW5uZWxzKCkpOworICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIHJlY2VpdmVQYXlsb2FkID0gb3dyX3ZpZGVvX3BheWxvYWRfbmV3KGNvZGVjVHlwZSwg
cGF5bG9hZC0+dHlwZSgpLCBwYXlsb2FkLT5jbG9ja1JhdGUoKSwgcGF5bG9hZC0+Y2NtZmlyKCks
IHBheWxvYWQtPm5hY2twbGkoKSk7CisgICAgICAgICAgICBnX29iamVjdF9zZXQocmVjZWl2ZVBh
eWxvYWQsICJydHgtcGF5bG9hZC10eXBlIiwgcnR4UGF5bG9hZCA/IHJ0eFBheWxvYWQtPnR5cGUo
KSA6IC0xLAorICAgICAgICAgICAgICAgICJydHgtdGltZSIsIHJ0eFBheWxvYWQgJiYgcnR4UGF5
bG9hZC0+cGFyYW1ldGVycygpLmNvbnRhaW5zKCJydHhUaW1lIikgPyBydHhQYXlsb2FkLT5wYXJh
bWV0ZXJzKCkuZ2V0KCJydHhUaW1lIikgOiAwLCBudWxscHRyKTsKKyAgICAgICAgfQorCisgICAg
ICAgIG93cl9tZWRpYV9zZXNzaW9uX2FkZF9yZWNlaXZlX3BheWxvYWQobWVkaWFTZXNzaW9uLCBy
ZWNlaXZlUGF5bG9hZCk7CisgICAgfQorfQorCitzdHJ1Y3QgSGVscGVyU2VydmVyVXJsIHsKKyAg
ICBTdHJpbmcgcHJvdG9jb2w7CisgICAgU3RyaW5nIGhvc3Q7CisgICAgdW5zaWduZWQgc2hvcnQg
cG9ydDsKKyAgICBTdHJpbmcgcXVlcnk7Cit9OworCitzdGF0aWMgdm9pZCBwYXJzZUhlbHBlclNl
cnZlclVybChHUmVnZXgqIHJlZ2V4LCBjb25zdCBVUkwmIHVybCwgSGVscGVyU2VydmVyVXJsJiBv
dXRVcmwpCit7CisgICAgR01hdGNoSW5mbyogbWF0Y2hJbmZvOworCisgICAgaWYgKGdfcmVnZXhf
bWF0Y2gocmVnZXgsIHVybC5zdHJpbmcoKS5hc2NpaSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8R1Jl
Z2V4TWF0Y2hGbGFncz4oMCksICZtYXRjaEluZm8pKSB7CisgICAgICAgIGdjaGFyKiogbWF0Y2hl
cyA9ICBnX21hdGNoX2luZm9fZmV0Y2hfYWxsKG1hdGNoSW5mbyk7CisgICAgICAgIGdpbnQgbWF0
Y2hDb3VudCA9IGdfc3Rydl9sZW5ndGgobWF0Y2hlcyk7CisKKyAgICAgICAgb3V0VXJsLnByb3Rv
Y29sID0gbWF0Y2hlc1sxXTsKKyAgICAgICAgb3V0VXJsLmhvc3QgPSBtYXRjaGVzWzJdWzBdID09
ICdbJyA/IFN0cmluZyhtYXRjaGVzWzJdICsgMSwgc3RybGVuKG1hdGNoZXNbMl0pIC0gMikgLy8g
SVB2NgorICAgICAgICAgICAgOiBtYXRjaGVzWzJdOworCisgICAgICAgIG91dFVybC5wb3J0ID0g
MDsKKyAgICAgICAgaWYgKG1hdGNoQ291bnQgPj0gNCkgeworICAgICAgICAgICAgU3RyaW5nIHBv
cnRTdHJpbmcgPSBTdHJpbmcobWF0Y2hlc1szXSArIDEpOyAvLyBTa2lwIHBvcnQgY29sb24KKyAg
ICAgICAgICAgIG91dFVybC5wb3J0ID0gcG9ydFN0cmluZy50b1VJbnRTdHJpY3QoKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmIChtYXRjaENvdW50ID09IDUpCisgICAgICAgICAgICBvdXRVcmwu
cXVlcnkgPSBTdHJpbmcobWF0Y2hlc1s0XSArIDEpOyAvLyBTa2lwIHF1ZXN0aW9uIG1hcmsKKwor
ICAgICAgICBnX3N0cmZyZWV2KG1hdGNoZXMpOworICAgIH0KKworICAgIGdfbWF0Y2hfaW5mb19m
cmVlKG1hdGNoSW5mbyk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6ZW5zdXJlVHJhbnNw
b3J0QWdlbnRBbmRUcmFuc2NlaXZlcnMoYm9vbCBpc0luaXRpYXRvciwgY29uc3QgVmVjdG9yPFRy
YW5zY2VpdmVyQ29uZmlnPiYgdHJhbnNjZWl2ZXJDb25maWdzKQoreworICAgIEFTU0VSVChtX2R0
bHNQcml2YXRlS2V5KTsKKyAgICBBU1NFUlQobV9kdGxzQ2VydGlmaWNhdGUpOworCisgICAgaWYg
KCFtX3RyYW5zcG9ydEFnZW50KSB7CisgICAgICAgIG1fdHJhbnNwb3J0QWdlbnQgPSBvd3JfdHJh
bnNwb3J0X2FnZW50X25ldyhmYWxzZSk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBt
X2NvbmZpZ3VyYXRpb24tPmljZVNlcnZlcnMoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB3
ZWJraXRVcmwgOiBzZXJ2ZXItPnVybHMoKSkgeworICAgICAgICAgICAgICAgIEhlbHBlclNlcnZl
clVybCB1cmw7CisgICAgICAgICAgICAgICAgLy8gV2ViS2l0J3MgVVJMIGNsYXNzIGNhbid0IGhh
bmRsZSBJQ0UgaGVscGVyIHNlcnZlciB1cmxzIHByb3Blcmx5CisgICAgICAgICAgICAgICAgcGFy
c2VIZWxwZXJTZXJ2ZXJVcmwobV9oZWxwZXJTZXJ2ZXJSZWdFeCwgd2Via2l0VXJsLCB1cmwpOwor
CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IHVybC5wb3J0ID8gdXJsLnBv
cnQgOiAzNDc4OworCisgICAgICAgICAgICAgICAgaWYgKHVybC5wcm90b2NvbCA9PSAic3R1biIp
IHsKKyAgICAgICAgICAgICAgICAgICAgb3dyX3RyYW5zcG9ydF9hZ2VudF9hZGRfaGVscGVyX3Nl
cnZlcihtX3RyYW5zcG9ydEFnZW50LCBPV1JfSEVMUEVSX1NFUlZFUl9UWVBFX1NUVU4sCisgICAg
ICAgICAgICAgICAgICAgICAgICB1cmwuaG9zdC5hc2NpaSgpLmRhdGEoKSwgcG9ydCwgbnVsbHB0
ciwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5wcm90b2NvbCA9
PSAidHVybiIpIHsKKyAgICAgICAgICAgICAgICAgICAgT3dySGVscGVyU2VydmVyVHlwZSBzZXJ2
ZXJUeXBlID0gdXJsLnF1ZXJ5ID09ICJ0cmFuc3BvcnQ9dGNwIiA/IE9XUl9IRUxQRVJfU0VSVkVS
X1RZUEVfVFVSTl9UQ1AKKyAgICAgICAgICAgICAgICAgICAgICAgIDogT1dSX0hFTFBFUl9TRVJW
RVJfVFlQRV9UVVJOX1VEUDsKKworICAgICAgICAgICAgICAgICAgICBvd3JfdHJhbnNwb3J0X2Fn
ZW50X2FkZF9oZWxwZXJfc2VydmVyKG1fdHJhbnNwb3J0QWdlbnQsIHNlcnZlclR5cGUsCisgICAg
ICAgICAgICAgICAgICAgICAgICB1cmwuaG9zdC5hc2NpaSgpLmRhdGEoKSwgcG9ydCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHNlcnZlci0+dXNlcm5hbWUoKS5hc2NpaSgpLmRhdGEoKSwgc2Vy
dmVyLT5jcmVkZW50aWFsKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGdfb2JqZWN0X3NldChtX3RyYW5zcG9ydEFnZW50
LCAiaWNlLWNvbnRyb2xsaW5nLW1vZGUiLCBpc0luaXRpYXRvciwgbnVsbHB0cik7CisKKyAgICBm
b3IgKGF1dG8mIGNvbmZpZyA6IHRyYW5zY2VpdmVyQ29uZmlncykgeworICAgICAgICBPd3JTZXNz
aW9uKiBzZXNzaW9uID0gT1dSX1NFU1NJT04ob3dyX21lZGlhX3Nlc3Npb25fbmV3KGNvbmZpZy5p
c0R0bHNDbGllbnQpKTsKKyAgICAgICAgZ19vYmplY3Rfc2V0KHNlc3Npb24sICJkdGxzLWNlcnRp
ZmljYXRlIiwgbV9kdGxzQ2VydGlmaWNhdGUsCisgICAgICAgICAgICAiZHRscy1rZXkiLCBtX2R0
bHNQcml2YXRlS2V5LAorICAgICAgICAgICAgbnVsbHB0cik7CisKKyAgICAgICAgbV90cmFuc2Nl
aXZlcnMuYXBwZW5kKE93clRyYW5zY2VpdmVyOjpjcmVhdGUoY29uZmlnLm1pZCwgc2Vzc2lvbikp
OworICAgIH0KK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjppbnRlcm5hbEFkZFJlbW90ZUNh
bmRpZGF0ZShPd3JTZXNzaW9uKiBzZXNzaW9uLCBJY2VDYW5kaWRhdGUmIGNhbmRpZGF0ZSwgY29u
c3QgU3RyaW5nJiB1ZnJhZywgY29uc3QgU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBnYm9vbGVh
biBydGNwTXV4OworICAgIGdfb2JqZWN0X2dldChzZXNzaW9uLCAicnRjcC1tdXgiLCAmcnRjcE11
eCwgbnVsbHB0cik7CisKKyAgICBpZiAocnRjcE11eCAmJiBjYW5kaWRhdGUuY29tcG9uZW50SWQo
KSA9PSBPV1JfQ09NUE9ORU5UX1RZUEVfUlRDUCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNT
RVJUKGNhbmRpZGF0ZVR5cGVzLmZpbmQoY2FuZGlkYXRlLnR5cGUoKSkgIT0gbm90Rm91bmQpOwor
CisgICAgT3dyQ2FuZGlkYXRlVHlwZSBjYW5kaWRhdGVUeXBlID0gc3RhdGljX2Nhc3Q8T3dyQ2Fu
ZGlkYXRlVHlwZT4oY2FuZGlkYXRlVHlwZXMuZmluZChjYW5kaWRhdGUudHlwZSgpKSk7CisgICAg
T3dyQ29tcG9uZW50VHlwZSBjb21wb25lbnRJZCA9IHN0YXRpY19jYXN0PE93ckNvbXBvbmVudFR5
cGU+KGNhbmRpZGF0ZS5jb21wb25lbnRJZCgpKTsKKyAgICBPd3JUcmFuc3BvcnRUeXBlIHRyYW5z
cG9ydFR5cGU7CisKKyAgICBpZiAoY2FuZGlkYXRlLnRyYW5zcG9ydCgpLmNvbnZlcnRUb0FTQ0lJ
VXBwZXJjYXNlKCkgPT0gIlVEUCIpCisgICAgICAgIHRyYW5zcG9ydFR5cGUgPSBPV1JfVFJBTlNQ
T1JUX1RZUEVfVURQOworICAgIGVsc2UgeworICAgICAgICBBU1NFUlQoY2FuZGlkYXRlVGNwVHlw
ZXMuZmluZChjYW5kaWRhdGUudGNwVHlwZSgpKSAhPSBub3RGb3VuZCk7CisgICAgICAgIHRyYW5z
cG9ydFR5cGUgPSBzdGF0aWNfY2FzdDxPd3JUcmFuc3BvcnRUeXBlPihjYW5kaWRhdGVUY3BUeXBl
cy5maW5kKGNhbmRpZGF0ZS50Y3BUeXBlKCkpKTsKKyAgICB9CisKKyAgICBPd3JDYW5kaWRhdGUq
IG93ckNhbmRpZGF0ZSA9IG93cl9jYW5kaWRhdGVfbmV3KGNhbmRpZGF0ZVR5cGUsIGNvbXBvbmVu
dElkKTsKKyAgICBnX29iamVjdF9zZXQob3dyQ2FuZGlkYXRlLCAidHJhbnNwb3J0LXR5cGUiLCB0
cmFuc3BvcnRUeXBlLAorICAgICAgICAiYWRkcmVzcyIsIGNhbmRpZGF0ZS5hZGRyZXNzKCkuYXNj
aWkoKS5kYXRhKCksCisgICAgICAgICJwb3J0IiwgY2FuZGlkYXRlLnBvcnQoKSwKKyAgICAgICAg
ImJhc2UtYWRkcmVzcyIsIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcygpLmFzY2lpKCkuZGF0YSgp
LAorICAgICAgICAiYmFzZS1wb3J0IiwgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0KCksCisgICAgICAg
ICJwcmlvcml0eSIsIGNhbmRpZGF0ZS5wcmlvcml0eSgpLAorICAgICAgICAiZm91bmRhdGlvbiIs
IGNhbmRpZGF0ZS5mb3VuZGF0aW9uKCkuYXNjaWkoKS5kYXRhKCksCisgICAgICAgICJ1ZnJhZyIs
IHVmcmFnLmFzY2lpKCkuZGF0YSgpLAorICAgICAgICAicGFzc3dvcmQiLCBwYXNzd29yZC5hc2Np
aSgpLmRhdGEoKSwKKyAgICAgICAgbnVsbHB0cik7CisKKyAgICBvd3Jfc2Vzc2lvbl9hZGRfcmVt
b3RlX2NhbmRpZGF0ZShzZXNzaW9uLCBvd3JDYW5kaWRhdGUpOworfQorCitzdGF0aWMgdm9pZCBn
b3RDYW5kaWRhdGUoT3dyU2Vzc2lvbiogc2Vzc2lvbiwgT3dyQ2FuZGlkYXRlKiBjYW5kaWRhdGUs
IE1lZGlhRW5kcG9pbnRPd3IqIG1lZGlhRW5kcG9pbnQpCit7CisgICAgT3dyQ2FuZGlkYXRlVHlw
ZSBjYW5kaWRhdGVUeXBlOworICAgIGdjaGFyKiBmb3VuZGF0aW9uOworICAgIE93ckNvbXBvbmVu
dFR5cGUgY29tcG9uZW50SWQ7CisgICAgT3dyVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOwor
ICAgIGdpbnQgcHJpb3JpdHk7CisgICAgZ2NoYXIqIGFkZHJlc3M7CisgICAgZ3VpbnQgcG9ydDsK
KyAgICBnY2hhciogcmVsYXRlZEFkZHJlc3M7CisgICAgZ3VpbnQgcmVsYXRlZFBvcnQ7CisKKyAg
ICBnX29iamVjdF9nZXQoY2FuZGlkYXRlLCAidHlwZSIsICZjYW5kaWRhdGVUeXBlLAorICAgICAg
ICAiZm91bmRhdGlvbiIsICZmb3VuZGF0aW9uLAorICAgICAgICAiY29tcG9uZW50LXR5cGUiLCAm
Y29tcG9uZW50SWQsCisgICAgICAgICJ0cmFuc3BvcnQtdHlwZSIsICZ0cmFuc3BvcnRUeXBlLAor
ICAgICAgICAicHJpb3JpdHkiLCAmcHJpb3JpdHksCisgICAgICAgICJhZGRyZXNzIiwgJmFkZHJl
c3MsCisgICAgICAgICJwb3J0IiwgJnBvcnQsCisgICAgICAgICJiYXNlLWFkZHJlc3MiLCAmcmVs
YXRlZEFkZHJlc3MsCisgICAgICAgICJiYXNlLXBvcnQiLCAmcmVsYXRlZFBvcnQsCisgICAgICAg
IG51bGxwdHIpOworCisgICAgQVNTRVJUKGNhbmRpZGF0ZVR5cGUgPj0gMCAmJiBjYW5kaWRhdGVU
eXBlIDwgY2FuZGlkYXRlVHlwZXMuc2l6ZSgpKTsKKyAgICBBU1NFUlQodHJhbnNwb3J0VHlwZSA+
PSAwICYmIHRyYW5zcG9ydFR5cGUgPCBjYW5kaWRhdGVUY3BUeXBlcy5zaXplKCkpOworCisgICAg
UmVmUHRyPEljZUNhbmRpZGF0ZT4gaWNlQ2FuZGlkYXRlID0gSWNlQ2FuZGlkYXRlOjpjcmVhdGUo
KTsKKyAgICBpY2VDYW5kaWRhdGUtPnNldFR5cGUoY2FuZGlkYXRlVHlwZXNbY2FuZGlkYXRlVHlw
ZV0pOworICAgIGljZUNhbmRpZGF0ZS0+c2V0Rm91bmRhdGlvbihmb3VuZGF0aW9uKTsKKyAgICBp
Y2VDYW5kaWRhdGUtPnNldENvbXBvbmVudElkKGNvbXBvbmVudElkKTsKKyAgICBpY2VDYW5kaWRh
dGUtPnNldFByaW9yaXR5KHByaW9yaXR5KTsKKyAgICBpY2VDYW5kaWRhdGUtPnNldEFkZHJlc3Mo
YWRkcmVzcyk7CisgICAgaWNlQ2FuZGlkYXRlLT5zZXRQb3J0KHBvcnQgPyBwb3J0IDogOSk7CisK
KyAgICBpZiAodHJhbnNwb3J0VHlwZSA9PSBPV1JfVFJBTlNQT1JUX1RZUEVfVURQKQorICAgICAg
ICBpY2VDYW5kaWRhdGUtPnNldFRyYW5zcG9ydCgiVURQIik7CisgICAgZWxzZSB7CisgICAgICAg
IGljZUNhbmRpZGF0ZS0+c2V0VHJhbnNwb3J0KCJUQ1AiKTsKKyAgICAgICAgaWNlQ2FuZGlkYXRl
LT5zZXRUY3BUeXBlKGNhbmRpZGF0ZVRjcFR5cGVzW3RyYW5zcG9ydFR5cGVdKTsKKyAgICB9CisK
KyAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPSBPV1JfQ0FORElEQVRFX1RZUEVfSE9TVCkgeworICAg
ICAgICBpY2VDYW5kaWRhdGUtPnNldFJlbGF0ZWRBZGRyZXNzKHJlbGF0ZWRBZGRyZXNzKTsKKyAg
ICAgICAgaWNlQ2FuZGlkYXRlLT5zZXRSZWxhdGVkUG9ydChyZWxhdGVkUG9ydCA/IHJlbGF0ZWRQ
b3J0IDogOSk7CisgICAgfQorCisgICAgZ19vYmplY3Rfc2V0KEdfT0JKRUNUKGNhbmRpZGF0ZSks
ICJ1ZnJhZyIsIGdfb2JqZWN0X2dldF9kYXRhKEdfT0JKRUNUKHNlc3Npb24pLCAiaWNlLXVmcmFn
IiksCisgICAgICAgICJwYXNzd29yZCIsIGdfb2JqZWN0X2dldF9kYXRhKEdfT0JKRUNUKHNlc3Np
b24pLCAiaWNlLXBhc3N3b3JkIiksCisgICAgICAgIG51bGxwdHIpOworCisgICAgbWVkaWFFbmRw
b2ludC0+ZGlzcGF0Y2hOZXdJY2VDYW5kaWRhdGUobWVkaWFFbmRwb2ludC0+c2Vzc2lvbk1pZChz
ZXNzaW9uKSwgV1RGTW92ZShpY2VDYW5kaWRhdGUpKTsKKworICAgIGdfZnJlZShmb3VuZGF0aW9u
KTsKKyAgICBnX2ZyZWUoYWRkcmVzcyk7CisgICAgZ19mcmVlKHJlbGF0ZWRBZGRyZXNzKTsKK30K
Kworc3RhdGljIHZvaWQgY2FuZGlkYXRlR2F0aGVyaW5nRG9uZShPd3JTZXNzaW9uKiBzZXNzaW9u
LCBNZWRpYUVuZHBvaW50T3dyKiBtZWRpYUVuZHBvaW50KQoreworICAgIG1lZGlhRW5kcG9pbnQt
PmRpc3BhdGNoR2F0aGVyaW5nRG9uZShtZWRpYUVuZHBvaW50LT5zZXNzaW9uTWlkKHNlc3Npb24p
KTsKK30KKworc3RhdGljIHZvaWQgaWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKE93clNlc3Npb24q
IHNlc3Npb24sIEdQYXJhbVNwZWMqLCBNZWRpYUVuZHBvaW50T3dyKiBtZWRpYUVuZHBvaW50KQor
eworICAgIG1lZGlhRW5kcG9pbnQtPnByb2Nlc3NJY2VUcmFuc3BvcnRTdGF0ZUNoYW5nZShzZXNz
aW9uKTsKK30KKworc3RhdGljIHZvaWQgZ290SW5jb21pbmdTb3VyY2UoT3dyTWVkaWFTZXNzaW9u
KiBtZWRpYVNlc3Npb24sIE93ck1lZGlhU291cmNlKiBzb3VyY2UsIE1lZGlhRW5kcG9pbnRPd3Iq
IG1lZGlhRW5kcG9pbnQpCit7CisgICAgbWVkaWFFbmRwb2ludC0+dW5tdXRlUmVtb3RlU291cmNl
KG1lZGlhRW5kcG9pbnQtPnNlc3Npb25NaWQoT1dSX1NFU1NJT04obWVkaWFTZXNzaW9uKSksIHNv
dXJjZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShX
RUJfUlRDKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0v
b3BlbndlYnJ0Yy9NZWRpYUVuZHBvaW50T3dyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
ZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi45NjdkMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9NZWRpYUVuZHBvaW50T3dyLmgK
QEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMTYgRXJpY3Nz
b24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5l
aXRoZXIgdGhlIG5hbWUgb2YgRXJpY3Nzb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0
b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tIHRoaXMKKyAqICAgIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
V0VCX1JUQykKKworI2luY2x1ZGUgIk1lZGlhRW5kcG9pbnQuaCIKKyNpbmNsdWRlIDxvd3Ivb3dy
X21lZGlhX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxvd3Ivb3dyX3RyYW5zcG9ydF9hZ2VudC5oPgor
I2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBlZXJNZWRpYURlc2NyaXB0aW9uOworY2xhc3Mg
UmVhbHRpbWVNZWRpYVNvdXJjZU93cjsKK2NsYXNzIFJUQ0NvbmZpZ3VyYXRpb25Qcml2YXRlOwor
CitjbGFzcyBPd3JUcmFuc2NlaXZlciA6IHB1YmxpYyBSZWZDb3VudGVkPE93clRyYW5zY2VpdmVy
PiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxPd3JUcmFuc2NlaXZlcj4gY3JlYXRlKGNvbnN0
IFN0cmluZyYgbWlkLCBPd3JTZXNzaW9uKiBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKCpuZXcgT3dyVHJhbnNjZWl2ZXIobWlkLCBzZXNzaW9uKSk7CisgICAgfQorICAg
IHZpcnR1YWwgfk93clRyYW5zY2VpdmVyKCkgeyB9CisKKyAgICBjb25zdCBTdHJpbmcmIG1pZCgp
IGNvbnN0IHsgcmV0dXJuIG1fbWlkOyB9CisgICAgT3dyU2Vzc2lvbiogc2Vzc2lvbigpIGNvbnN0
IHsgcmV0dXJuIG1fc2Vzc2lvbjsgfQorCisgICAgT3dySWNlU3RhdGUgb3dySWNlU3RhdGUoKSBj
b25zdCB7IHJldHVybiBtX293ckljZVN0YXRlOyB9CisgICAgdm9pZCBzZXRPd3JJY2VTdGF0ZShP
d3JJY2VTdGF0ZSBzdGF0ZSkgeyBtX293ckljZVN0YXRlID0gc3RhdGU7IH0KKworICAgIGJvb2wg
Z290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKCkgY29uc3QgeyByZXR1cm4gbV9nb3RFbmRPZlJlbW90
ZUNhbmRpZGF0ZXM7IH0KKyAgICB2b2lkIG1hcmtHb3RFbmRPZlJlbW90ZUNhbmRpZGF0ZXMoKSB7
IG1fZ290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzID0gdHJ1ZTsgfQorCitwcml2YXRlOgorICAgIE93
clRyYW5zY2VpdmVyKGNvbnN0IFN0cmluZyYgbWlkLCBPd3JTZXNzaW9uKiBzZXNzaW9uKQorICAg
ICAgICA6IG1fbWlkKG1pZCkKKyAgICAgICAgLCBtX3Nlc3Npb24oc2Vzc2lvbikKKyAgICB7IH0K
KworICAgIFN0cmluZyBtX21pZDsKKyAgICBPd3JTZXNzaW9uKiBtX3Nlc3Npb247CisKKyAgICBP
d3JJY2VTdGF0ZSBtX293ckljZVN0YXRlIHsgT1dSX0lDRV9TVEFURV9ESVNDT05ORUNURUQgfTsK
KyAgICBib29sIG1fZ290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzIHsgZmFsc2UgfTsKK307CisKK2Ns
YXNzIE1lZGlhRW5kcG9pbnRPd3IgOiBwdWJsaWMgTWVkaWFFbmRwb2ludCB7CitwdWJsaWM6Cisg
ICAgTWVkaWFFbmRwb2ludE93cihNZWRpYUVuZHBvaW50Q2xpZW50Jik7CisgICAgfk1lZGlhRW5k
cG9pbnRPd3IoKTsKKworICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbihSZWZQdHI8TWVkaWFFbmRw
b2ludENvbmZpZ3VyYXRpb24+JiYpIG92ZXJyaWRlOworCisgICAgdm9pZCBnZW5lcmF0ZUR0bHNJ
bmZvKCkgb3ZlcnJpZGU7CisgICAgTWVkaWFQYXlsb2FkVmVjdG9yIGdldERlZmF1bHRBdWRpb1Bh
eWxvYWRzKCkgb3ZlcnJpZGU7CisgICAgTWVkaWFQYXlsb2FkVmVjdG9yIGdldERlZmF1bHRWaWRl
b1BheWxvYWRzKCkgb3ZlcnJpZGU7CisgICAgTWVkaWFQYXlsb2FkVmVjdG9yIGZpbHRlclBheWxv
YWRzKGNvbnN0IE1lZGlhUGF5bG9hZFZlY3RvciYgcmVtb3RlUGF5bG9hZHMsIGNvbnN0IE1lZGlh
UGF5bG9hZFZlY3RvciYgZGVmYXVsdFBheWxvYWRzKSBvdmVycmlkZTsKKworICAgIFVwZGF0ZVJl
c3VsdCB1cGRhdGVSZWNlaXZlQ29uZmlndXJhdGlvbihNZWRpYUVuZHBvaW50U2Vzc2lvbkNvbmZp
Z3VyYXRpb24qLCBib29sIGlzSW5pdGlhdG9yKSBvdmVycmlkZTsKKyAgICBVcGRhdGVSZXN1bHQg
dXBkYXRlU2VuZENvbmZpZ3VyYXRpb24oTWVkaWFFbmRwb2ludFNlc3Npb25Db25maWd1cmF0aW9u
KiwgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZU1hcCYsIGJvb2wgaXNJbml0aWF0b3IpIG92ZXJy
aWRlOworCisgICAgdm9pZCBhZGRSZW1vdGVDYW5kaWRhdGUoSWNlQ2FuZGlkYXRlJiwgY29uc3Qg
U3RyaW5nJiBtaWQsIGNvbnN0IFN0cmluZyYgdWZyYWcsIGNvbnN0IFN0cmluZyYgcGFzc3dvcmQp
IG92ZXJyaWRlOworCisgICAgUmVmPFJlYWx0aW1lTWVkaWFTb3VyY2U+IGNyZWF0ZU11dGVkUmVt
b3RlU291cmNlKGNvbnN0IFN0cmluZyYgbWlkLCBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlKSBv
dmVycmlkZTsKKyAgICB2b2lkIHJlcGxhY2VNdXRlZFJlbW90ZVNvdXJjZU1pZChjb25zdCBTdHJp
bmcmLCBjb25zdCBTdHJpbmcmKSBmaW5hbDsKKyAgICB2b2lkIHJlcGxhY2VTZW5kU291cmNlKFJl
YWx0aW1lTWVkaWFTb3VyY2UmLCBjb25zdCBTdHJpbmcmIG1pZCkgb3ZlcnJpZGU7CisKKyAgICB2
b2lkIHN0b3AoKSBvdmVycmlkZTsKKworICAgIHNpemVfdCB0cmFuc2NlaXZlckluZGV4Rm9yU2Vz
c2lvbihPd3JTZXNzaW9uKikgY29uc3Q7CisgICAgY29uc3QgU3RyaW5nJiBzZXNzaW9uTWlkKE93
clNlc3Npb24qKSBjb25zdDsKKyAgICBPd3JUcmFuc2NlaXZlciogbWF0Y2hUcmFuc2NlaXZlckJ5
TWlkKGNvbnN0IFN0cmluZyYgbWlkKSBjb25zdDsKKworICAgIHZvaWQgZGlzcGF0Y2hOZXdJY2VD
YW5kaWRhdGUoY29uc3QgU3RyaW5nJiBtaWQsIFJlZlB0cjxJY2VDYW5kaWRhdGU+JiYpOworICAg
IHZvaWQgZGlzcGF0Y2hHYXRoZXJpbmdEb25lKGNvbnN0IFN0cmluZyYgbWlkKTsKKyAgICB2b2lk
IHByb2Nlc3NJY2VUcmFuc3BvcnRTdGF0ZUNoYW5nZShPd3JTZXNzaW9uKik7CisgICAgdm9pZCBk
aXNwYXRjaER0bHNGaW5nZXJwcmludChnY2hhciogcHJpdmF0ZUtleSwgZ2NoYXIqIGNlcnRpZmlj
YXRlLCBjb25zdCBTdHJpbmcmIGZpbmdlcnByaW50LCBjb25zdCBTdHJpbmcmIGZpbmdlcnByaW50
RnVuY3Rpb24pOworICAgIHZvaWQgdW5tdXRlUmVtb3RlU291cmNlKGNvbnN0IFN0cmluZyYgbWlk
LCBPd3JNZWRpYVNvdXJjZSopOworCitwcml2YXRlOgorICAgIGVudW0gU2Vzc2lvblR5cGUgeyBT
ZXNzaW9uVHlwZU1lZGlhIH07CisKKyAgICBzdHJ1Y3QgVHJhbnNjZWl2ZXJDb25maWcgeworICAg
ICAgICBTZXNzaW9uVHlwZSB0eXBlOworICAgICAgICBib29sIGlzRHRsc0NsaWVudDsKKyAgICAg
ICAgU3RyaW5nIG1pZDsKKyAgICB9OworCisgICAgdm9pZCBwcmVwYXJlU2Vzc2lvbihPd3JTZXNz
aW9uKiwgUGVlck1lZGlhRGVzY3JpcHRpb24qKTsKKyAgICB2b2lkIHByZXBhcmVNZWRpYVNlc3Np
b24oT3dyTWVkaWFTZXNzaW9uKiwgUGVlck1lZGlhRGVzY3JpcHRpb24qLCBib29sIGlzSW5pdGlh
dG9yKTsKKworICAgIHZvaWQgZW5zdXJlVHJhbnNwb3J0QWdlbnRBbmRUcmFuc2NlaXZlcnMoYm9v
bCBpc0luaXRpYXRvciwgY29uc3QgVmVjdG9yPFRyYW5zY2VpdmVyQ29uZmlnPiYgdHJhbnNjZWl2
ZXJDb25maWdzKTsKKyAgICB2b2lkIGludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKE93clNlc3Np
b24qLCBJY2VDYW5kaWRhdGUmLCBjb25zdCBTdHJpbmcmIHVmcmFnLCBjb25zdCBTdHJpbmcmIHBh
c3N3b3JkKTsKKworICAgIFJlZlB0cjxNZWRpYUVuZHBvaW50Q29uZmlndXJhdGlvbj4gbV9jb25m
aWd1cmF0aW9uOworICAgIEdSZWdleCogbV9oZWxwZXJTZXJ2ZXJSZWdFeDsKKworICAgIE93clRy
YW5zcG9ydEFnZW50KiBtX3RyYW5zcG9ydEFnZW50OworICAgIFZlY3RvcjxSZWZQdHI8T3dyVHJh
bnNjZWl2ZXI+PiBtX3RyYW5zY2VpdmVyczsKKyAgICBIYXNoTWFwPFN0cmluZywgUmVmUHRyPFJl
YWx0aW1lTWVkaWFTb3VyY2VPd3I+PiBtX211dGVkUmVtb3RlU291cmNlczsKKworICAgIE1lZGlh
RW5kcG9pbnRDbGllbnQmIG1fY2xpZW50OworCisgICAgdW5zaWduZWQgbV9udW1iZXJPZlJlY2Vp
dmVQcmVwYXJlZFNlc3Npb25zOworICAgIHVuc2lnbmVkIG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRT
ZXNzaW9uczsKKworICAgIGdjaGFyKiBtX2R0bHNQcml2YXRlS2V5OworICAgIGdjaGFyKiBtX2R0
bHNDZXJ0aWZpY2F0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShXRUJfUlRDKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVk
aWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VP
d3IuaAppbmRleCBkMjRiMDY1Li44Njk1YzdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VPd3IuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0
aW1lTWVkaWFTb3VyY2VPd3IuaApAQCAtNTQsNiArNTQsOCBAQCBSZWFsdGltZU1lZGlhU291cmNl
T3dyKE93ck1lZGlhU291cmNlKiBtZWRpYVNvdXJjZSwgY29uc3QgU3RyaW5nJiBpZCwgUmVhbHRp
bWVNZQogICAgIDogUmVhbHRpbWVNZWRpYVNvdXJjZShpZCwgdHlwZSwgbmFtZSkKICAgICAsIG1f
bWVkaWFTb3VyY2UobWVkaWFTb3VyY2UpCiAgICAgeworICAgICAgICBpZiAoIW1lZGlhU291cmNl
KQorICAgICAgICAgICAgbV9tdXRlZCA9IHRydWU7CiAgICAgfQogCiBSZWFsdGltZU1lZGlhU291
cmNlT3dyKGNvbnN0IFN0cmluZyYgaWQsIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGUgdHlwZSwg
Y29uc3QgU3RyaW5nJiBuYW1lKQpAQCAtNjQsNiArNjYsMTIgQEAgUmVhbHRpbWVNZWRpYVNvdXJj
ZU93cihjb25zdCBTdHJpbmcmIGlkLCBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlIHR5cGUsIGNv
bnN0IFMKIAogICAgIHZpcnR1YWwgflJlYWx0aW1lTWVkaWFTb3VyY2VPd3IoKSB7IH0KIAorICAg
IHZvaWQgc3dhcE91dFNoYWxsb3dTb3VyY2UoT3dyTWVkaWFTb3VyY2UmIHJlYWxTb3VyY2UpCisg
ICAgeworICAgICAgICBtX21lZGlhU291cmNlID0gJnJlYWxTb3VyY2U7CisgICAgICAgIHNldE11
dGVkKGZhbHNlKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIFJlZlB0cjxSZWFsdGltZU1lZGlhU291
cmNlQ2FwYWJpbGl0aWVzPiBjYXBhYmlsaXRpZXMoKSB7IHJldHVybiBtX2NhcGFiaWxpdGllczsg
fQogICAgIHZpcnR1YWwgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZVNldHRpbmdzJiBzZXR0aW5n
cygpIHsgcmV0dXJuIG1fY3VycmVudFNldHRpbmdzOyB9CiAK
</data>
<flag name="review"
          id="315192"
          type_id="1"
          status="-"
          setter="pnormand"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>292236</attachid>
            <date>2016-10-20 12:11:45 -0700</date>
            <delta_ts>2016-10-21 02:00:55 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>add-media-endpoint-owr_1.patch</filename>
            <type>text/plain</type>
            <size>52273</size>
            <attacher name="Adam Bergkvist">adam.bergkvist</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4MDEwZWNjLi4xNmUwMWM3
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTYtMTAtMTkgIEFkYW0gQmVyZ2t2aXN0ICA8YWRhbS5iZXJna3Zpc3RAZXJpY3Nzb24uY29t
PgorCisgICAgICAgIFdlYlJUQzogW0dUS10gQWRkIE1lZGlhRW5kcG9pbnRPd3IgLSBhbiBPcGVu
V2ViUlRDIFdlYlJUQyBiYWNrZW5kCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNjMzMjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBBZGQgbWFudWFsIFdlYlJUQyB0ZXN0LiBUZXN0IGZlYXR1cmVzOgorICAg
ICAgICAtIFR3byBSVENQZWVyQ29ubmVjdGlvbiBpbnN0YW5jZXMgY29tbXVuaWNhdGUgaW4gYSBz
aW5nbGUgYnJvd3NlciB0YWIuCisgICAgICAgIC0gU3VwcG9ydHMgc2V0dGluZyB1cCBiaWRpcmVj
dGlvbmFsIG1lZGlhIHdpdGggYSBzaW5nbGUgU0RQIGRpYWxvZywgYXMKKyAgICAgICAgICB3ZWxs
IGFzIG9uZSBkaXJlY3Rpb24gYXQgYSB0aW1lLgorICAgICAgICAtIFN0cmlwcyB2ZW5kb3IgcHJl
Zml4ZXMgKHJ1bnMgaW4gQ2hyb21lIGFuZCBGaXJlZm94IGFzIHdlbGwpCisgICAgICAgIC0gU3Vw
cG9ydHMgbW9kZXJuIGFzIHdlbGwgYXMgbGVnYWN5IEFQSXMgKG1haW5seSB0byBtYWtlIHRoZSB0
ZXN0IHJ1bgorICAgICAgICAgIGluIENocm9tZSkKKworICAgICAgICAqIE1hbnVhbFRlc3RzL3dl
YnJ0Yy1vbmUtdGFiLXAycC5odG1sOiBBZGRlZC4KKwogMjAxNi0xMC0xMCAgWmFuIERvYmVyc2Vr
ICA8emRvYmVyc2VrQGlnYWxpYS5jb20+CiAKICAgICAgICAgQWRkIEVOQUJMRV9FTkNSWVBURURf
TUVESUEgY29uZmlndXJhdGlvbiBvcHRpb24KZGlmZiAtLWdpdCBhL01hbnVhbFRlc3RzL3dlYnJ0
Yy1vbmUtdGFiLXAycC5odG1sIGIvTWFudWFsVGVzdHMvd2VicnRjLW9uZS10YWItcDJwLmh0bWwK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmNzlmZAotLS0gL2Rldi9udWxs
CisrKyBiL01hbnVhbFRlc3RzL3dlYnJ0Yy1vbmUtdGFiLXAycC5odG1sCkBAIC0wLDAgKzEsMzQ0
IEBACis8IWRvY3R5cGUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+T25lIHRhYiBwMnA8
L3RpdGxlPgorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIHZpZGVvIHsgd2lkdGg6IDI0
MHB4OyBoZWlnaHQ6IDE2MHB4OyBib3JkZXI6IGJsYWNrIDFweCBkYXNoZWQ7IH0KKyAgICBpbnB1
dCB7IG1hcmdpbjogMnB4IH0KKzwvc3R5bGU+CisKKzxzY3JpcHQ+CisvLyBNYWtlIHVzZSBvZiBw
cmVmaXhlZCBBUElzIHRvIHJ1biB0aGlzIHRlc3QgaW4gQ2hyb21lIGFuZCBGaXJlZm94CitzZWxm
LlJUQ1BlZXJDb25uZWN0aW9uID0gc2VsZi5SVENQZWVyQ29ubmVjdGlvbiB8fCBzZWxmLndlYmtp
dFJUQ1BlZXJDb25uZWN0aW9uIHx8IHNlbGYubW96UlRDUGVlckNvbm5lY3Rpb247CituYXZpZ2F0
b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLmdldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3Iud2Vi
a2l0R2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWE7CisKK2xldCBsZWdh
Y3lDaGVja0JveDsKK2xldCBjbG9zZUJ1dHRvbjsKK2xldCBwY0E7CitsZXQgcGNCOworbGV0IGxv
Y2FsU3RyZWFtOworCitjb25zdCBwY05hbWVzID0geworICAgIGZpcnN0OiAiQSIsCisgICAgc2Vj
b25kOiAiQiIKK307CisKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgYW4gZW1w
dHkgY29uZmlndXJhdGlvbiAoYnVnOiBodHRwOi8vd2Via2l0Lm9yZy9iLzE1ODkzNikKK2NvbnN0
IGNvbmZpZ3VyYXRpb24gPSB7ICJpY2VTZXJ2ZXJzIjogW3sgInVybHMiOiAic3R1bjptbXQtc3R1
bi52ZXJrc3RhZC5uZXQiIH1dIH07CisKK2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNv
bnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgbGVnYWN5Q2hlY2tCb3ggPSBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjbGVnYWN5X2NoZWNrIik7CisgICAgY29uc3QgYXVkaW9DaGVja0Jv
eCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhdWRpb19jaGVjayIpOworICAgIGNvbnN0IHZp
ZGVvQ2hlY2tCb3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdmlkZW9fY2hlY2siKTsKKwor
ICAgIGNvbnN0IHN0YXJ0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3N0YXJ0X2J1
dCIpOworICAgIGNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Nsb3NlX2J1
dCIpOworCisgICAgY29uc3QgdGVzdEJ1dHRvbnMgPSB7CisgICAgICAgICJzaW5nbGUiOiBkb2N1
bWVudC5xdWVyeVNlbGVjdG9yKCIjc2luZ2xlX2J1dCIpLAorICAgICAgICAibWVkaWFBdG9CIjog
ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI21lZGlhX0FfdG9fQl9idXQiKSwKKyAgICAgICAgIm1l
ZGlhQnRvQSI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtZWRpYV9CX3RvX0FfYnV0IikKKyAg
ICB9OworCisgICAgZnVuY3Rpb24gc2V0VGVzdEJ1dHRvbnNEaXNhYmxlZChpc0Rpc2FibGVkKSB7
CisgICAgICAgIGZvciAobGV0IHAgaW4gdGVzdEJ1dHRvbnMpCisgICAgICAgICAgICB0ZXN0QnV0
dG9uc1twXS5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CisgICAgfQorCisgICAgc3RhcnRCdXR0b24u
b25jbGljayA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSh7
CisgICAgICAgICAgICAiYXVkaW8iOiBhdWRpb0NoZWNrQm94LmNoZWNrZWQsCisgICAgICAgICAg
ICAidmlkZW8iOiB2aWRlb0NoZWNrQm94LmNoZWNrZWQKKyAgICAgICAgfSwgZnVuY3Rpb24gKHN0
cmVhbSkgeworICAgICAgICAgICAgYXVkaW9DaGVja0JveC5kaXNhYmxlZCA9IHZpZGVvQ2hlY2tC
b3guZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgbG9jYWxTdHJlYW0gPSBzdHJlYW07Cisg
ICAgICAgICAgICBzdGFydEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzZXRU
ZXN0QnV0dG9uc0Rpc2FibGVkKGZhbHNlKTsKKyAgICAgICAgfSwgbG9nRXJyb3IpOworICAgIH07
CisKKyAgICBjbG9zZUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBl
dnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgY29uc29sZS5sb2coIkNsb3Npbmci
KTsKKyAgICAgICAgcGNBLmNsb3NlKCk7CisgICAgICAgIHBjQi5jbG9zZSgpOworICAgICAgICBw
Y0EgPSBudWxsOworICAgICAgICBwY0IgPSBudWxsOworCisgICAgICAgIHNldFRlc3RCdXR0b25z
RGlzYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHRlc3RCdXR0b25zLnNpbmdsZS5vbmNsaWNr
ID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUp
OworICAgICAgICBnZXRUZXN0RnVuY3Rpb24oInNpbmdsZURpYWxvZyIpKCk7CisgICAgfQorCisg
ICAgdGVzdEJ1dHRvbnMubWVkaWFBdG9CLm9uY2xpY2sgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAg
ICAgIHNldFRlc3RCdXR0b25zRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIGlmICghcGNBKQorICAg
ICAgICAgICAgY29tbW9uU2V0dXAoKTsKKyAgICAgICAgZ2V0VGVzdEZ1bmN0aW9uKCJhZGRPbmVX
YXlNZWRpYSIpKHBjQSwgcGNCLCB0ZXN0QnV0dG9ucy5tZWRpYUJ0b0EpOworICAgIH0KKworICAg
IHRlc3RCdXR0b25zLm1lZGlhQnRvQS5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAg
ICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUpOworICAgICAgICBpZiAoIXBjQSkKKyAgICAg
ICAgICAgIGNvbW1vblNldHVwKCk7CisgICAgICAgIGdldFRlc3RGdW5jdGlvbigiYWRkT25lV2F5
TWVkaWEiKShwY0IsIHBjQSwgdGVzdEJ1dHRvbnMubWVkaWFBdG9CKTsKKyAgICB9Cit9KTsKKwor
ZnVuY3Rpb24gZ2V0VGVzdEZ1bmN0aW9uKG5hbWUpIHsKKyAgICBjb25zdCBmdW5jdGlvbk5hbWUg
PSBsZWdhY3lDaGVja0JveC5jaGVja2VkID8gbmFtZSA6IGAke25hbWV9UHJvbWlzZWA7CisgICAg
cmV0dXJuIHNlbGZbZnVuY3Rpb25OYW1lXTsKK30KKworZnVuY3Rpb24gc2luZ2xlRGlhbG9nKCkg
eworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0obG9jYWxTdHJlYW0sIGRv
Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAgIHBjQS5hZGRTdHJlYW0o
bG9jYWxTdHJlYW0pOworCisgICAgcGNBLmNyZWF0ZU9mZmVyKGZ1bmN0aW9uIChvZmZlcikgewor
ICAgICAgICBwY0Euc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgb2ZmZXJUb0IocGNBLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dF
cnJvcik7CisgICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Iob2ZmZXIp
IHsKKyAgICAgICAgbG9nU2lnbmFsbGluZyhvZmZlciwgcGNBLCBwY0IpOworICAgICAgICBwY0Iu
c2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGFk
ZFN0b3JlZENhbmRpZGF0ZXMocGNCKTsKKyAgICAgICAgICAgIHJlbmRlclN0cmVhbShsb2NhbFN0
cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlbGZfdmlld0IiKSk7CisgICAgICAgICAg
ICBwY0IuYWRkU3RyZWFtKGxvY2FsU3RyZWFtKTsKKworICAgICAgICAgICAgcGNCLmNyZWF0ZUFu
c3dlcihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAgICAgICAgICAgcGNCLnNldExvY2FsRGVz
Y3JpcHRpb24oYW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dl
clRvQShwY0IubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9BKGFuc3dlcikgeworICAgICAgICBsb2dTaWduYWxs
aW5nKGFuc3dlciwgcGNCLCBwY0EpOworICAgICAgICBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
YW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiSW5pdGlhdG9y
IGdvdCBhbnN3ZXIsIE8vQSBkaWFsb2cgY29tcGxldGVkIik7CisgICAgICAgICAgICBhZGRTdG9y
ZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgICAgICBjbG9zZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAgfQorfQorCitmdW5jdGlvbiBzaW5nbGVE
aWFsb2dQcm9taXNlKCkgeworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0o
bG9jYWxTdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAg
IGxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4geworICAgICAgICBwY0Eu
YWRkVHJhY2sodHJhY2ssIGxvY2FsU3RyZWFtKTsKKyAgICB9KTsKKworICAgIHBjQS5jcmVhdGVP
ZmZlcigpLnRoZW4oZnVuY3Rpb24gKG9mZmVyKSB7CisgICAgICAgIHJldHVybiBwY0Euc2V0TG9j
YWxEZXNjcmlwdGlvbihvZmZlcik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIGxvZ1NpZ25hbGxpbmcocGNBLmxvY2FsRGVzY3JpcHRpb24sIHBjQSwgcGNCKTsKKyAg
ICAgICAgcmV0dXJuIHBjQi5zZXRSZW1vdGVEZXNjcmlwdGlvbihwY0EubG9jYWxEZXNjcmlwdGlv
bik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGFkZFN0b3JlZENh
bmRpZGF0ZXMocGNCKTsKKyAgICAgICAgcmVuZGVyU3RyZWFtKGxvY2FsU3RyZWFtLCBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjc2VsZl92aWV3QiIpKTsKKyAgICAgICAgbG9jYWxTdHJlYW0uZ2V0
VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB7CisgICAgICAgICAgICBwY0IuYWRkVHJhY2sodHJh
Y2ssIGxvY2FsU3RyZWFtKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwY0IuY3JlYXRl
QW5zd2VyKCk7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAg
IHJldHVybiBwY0Iuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpOworICAgIH0pCisgICAgLnRo
ZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWduYWxsaW5nKHBjQi5sb2NhbERlc2NyaXB0
aW9uLCBwY0IsIHBjQSk7CisgICAgICAgIHJldHVybiBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
cGNCLmxvY2FsRGVzY3JpcHRpb24pOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgewor
ICAgICAgICBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgIGNvbnNvbGUubG9nKCJJ
bml0aWF0b3IgZ290IGFuc3dlciwgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgY2xv
c2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAgIC5jYXRjaChsb2dFcnJvcik7
Cit9CisKK2Z1bmN0aW9uIGFkZE9uZVdheU1lZGlhKG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBj
b250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQu
cXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2ZmZXJpbmdQYy5uYW1lfWApKTsKKyAgICBvZmZl
cmluZ1BjLmFkZFN0cmVhbShsb2NhbFN0cmVhbSk7CisKKyAgICBvZmZlcmluZ1BjLmNyZWF0ZU9m
ZmVyKGZ1bmN0aW9uIChvZmZlcikgeworICAgICAgICBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIG9mZmVyVG9BbnN3ZXJpbmdQ
YyhvZmZlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dFcnJvcik7Cisg
ICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Fuc3dlcmluZ1BjKG9mZmVy
KSB7CisgICAgICAgIGxvZ1NpZ25hbGxpbmcob2ZmZXIsIG9mZmVyaW5nUGMsIGFuc3dlcmluZ1Bj
KTsKKyAgICAgICAgYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0ZXMoYW5zd2VyaW5nUGMpOwor
ICAgICAgICAgICAgYW5zd2VyaW5nUGMuY3JlYXRlQW5zd2VyKGZ1bmN0aW9uIChhbnN3ZXIpIHsK
KyAgICAgICAgICAgICAgICBhbnN3ZXJpbmdQYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlciwg
ZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICBhbnN3ZXJUb09mZmVyaW5nUGMoYW5z
d2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9PZmZlcmluZ1BjKGFuc3dlcikgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlciwgYW5zd2VyaW5nUGMsIG9mZmVyaW5nUGMpOworICAgICAgICBv
ZmZlcmluZ1BjLnNldFJlbW90ZURlc2NyaXB0aW9uKGFuc3dlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIsIHNpbmdsZSB3
YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0
ZXMob2ZmZXJpbmdQYyk7CisgICAgICAgICAgICBjb250aW51ZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICAgICAg
fSwgbG9nRXJyb3IpOworICAgIH0KK30KKworZnVuY3Rpb24gYWRkT25lV2F5TWVkaWFQcm9taXNl
KG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBjb250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0
cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2Zm
ZXJpbmdQYy5uYW1lfWApKTsKKyAgICBsb2NhbFN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKHRy
YWNrID0+IHsKKyAgICAgICAgb2ZmZXJpbmdQYy5hZGRUcmFjayh0cmFjaywgbG9jYWxTdHJlYW0p
OworICAgIH0pOworCisgICAgb2ZmZXJpbmdQYy5jcmVhdGVPZmZlcigpLnRoZW4oZnVuY3Rpb24g
KG9mZmVyKSB7CisgICAgICAgIHJldHVybiBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3JpcHRpb24o
b2ZmZXIpOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWdu
YWxsaW5nKG9mZmVyaW5nUGMubG9jYWxEZXNjcmlwdGlvbiwgb2ZmZXJpbmdQYywgYW5zd2VyaW5n
UGMpOworICAgICAgICByZXR1cm4gYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2Zm
ZXJpbmdQYy5sb2NhbERlc2NyaXB0aW9uKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0aW9uICgp
IHsKKyAgICAgICAgYWRkU3RvcmVkQ2FuZGlkYXRlcyhhbnN3ZXJpbmdQYyk7CisgICAgICAgIHJl
dHVybiBhbnN3ZXJpbmdQYy5jcmVhdGVBbnN3ZXIoKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uIChhbnN3ZXIpIHsKKyAgICAgICAgcmV0dXJuIGFuc3dlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24oYW5zd2VyKQorICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24sIGFuc3dlcmluZ1BjLCBv
ZmZlcmluZ1BjKTsKKyAgICAgICAgcmV0dXJuIG9mZmVyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRp
b24oYW5zd2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbikKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIs
IHNpbmdsZSB3YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgYWRkU3RvcmVkQ2Fu
ZGlkYXRlcyhvZmZlcmluZ1BjKTsKKyAgICAgICAgY29udGludWVCdXR0b24uZGlzYWJsZWQgPSBm
YWxzZTsKKyAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAg
IC5jYXRjaChsb2dFcnJvcik7Cit9CisKK2Z1bmN0aW9uIGNvbW1vblNldHVwKCkgeworICAgIHBj
QSA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBwY0IgPSBuZXcg
UlRDUGVlckNvbm5lY3Rpb24oY29uZmlndXJhdGlvbik7CisKKyAgICBwY0EubmFtZSA9IHBjTmFt
ZXMuZmlyc3Q7CisgICAgcGNCLm5hbWUgPSBwY05hbWVzLnNlY29uZDsKKworICAgIHN5bWV0cmlj
U2V0dXAocGNBLCBwY0IpOworICAgIHN5bWV0cmljU2V0dXAocGNCLCBwY0EpOworfQorCitmdW5j
dGlvbiBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjKSB7CisgICAgaWYgKCFwYy5zdG9yZWRDYW5kaWRh
dGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzLmZvckVhY2go
Y2FuZGlkYXRlID0+IHsKKyAgICAgICAgcGMuYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkuY2F0
Y2gobG9nRXJyb3IpOworICAgIH0pOworCisgICAgY29uc29sZS5sb2coYEFkZGVkICR7cGMuc3Rv
cmVkQ2FuZGlkYXRlcy5sZW5ndGh9IHN0b3JlZCBjYW5kaWRhdGVzIChhcnJpdmVkIGJlZm9yZSBy
ZW1vdGUgZGVzY3JpcHRpb24gd2FzIHNldClgKTsKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzID0g
bnVsbDsKK30KKworZnVuY3Rpb24gc3ltZXRyaWNTZXR1cChwYywgb3RoZXJQYykgeworICAgIHBj
Lm9uaWNlY2FuZGlkYXRlID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBpZiAoZXZ0LmNhbmRp
ZGF0ZSkgeworICAgICAgICAgICAgbG9nU2lnbmFsbGluZyhldnQuY2FuZGlkYXRlLCBwYywgb3Ro
ZXJQYyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3RlIGRlc2NyaXB0aW9uIGlzbid0IHNl
dCB5ZXQsIHN0b3JlIHRoZSBjYW5kaWRhdGUKKyAgICAgICAgICAgIGlmICghb3RoZXJQYy5yZW1v
dGVEZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghb3RoZXJQYy5zdG9yZWRDYW5k
aWRhdGVzKQorICAgICAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMgPSBb
XTsKKyAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMucHVzaChldnQuY2Fu
ZGlkYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG90aGVyUGMuYWRk
SWNlQ2FuZGlkYXRlKGV2dC5jYW5kaWRhdGUpLmNhdGNoKGxvZ0Vycm9yKTsKKyAgICAgICAgfQor
ICAgIH07CisKKyAgICBwYy5vbmFkZHN0cmVhbSA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAg
cmVuZGVyU3RyZWFtKGV2dC5zdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNyZW1vdGVf
dmlldyR7cGMubmFtZX1gKSk7CisgICAgfTsKK30KKworZnVuY3Rpb24gcmVuZGVyU3RyZWFtKHN0
cmVhbSwgdmlkZW8pIHsKKyAgICBpZiAodHlwZW9mIHZpZGVvLnNyY09iamVjdCAhPT0gInVuZGVm
aW5lZCIpCisgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTsKKyAgICBlbHNlCisgICAg
ICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTsKK30KKworZnVuY3Rp
b24gbG9nU2lnbmFsbGluZyhtc2csIGZyb21QYywgdG9QYykgeworICAgIGNvbnN0IHR5cGUgPSBt
c2cuY2FuZGlkYXRlID8gIkNhbmRpZGF0ZSIgOiBtc2cudHlwZS5yZXBsYWNlKC9eW2Etel0vLCBz
ID0+IHMudG9VcHBlckNhc2UoKSk7CisgICAgbGV0IGhlYWRlciA9IGAke3R5cGV9IGA7CisgICAg
aGVhZGVyICs9IGZyb21QYy5uYW1lID09IHBjTmFtZXMuZmlyc3QgPyBgJHtmcm9tUGMubmFtZX0g
LT4gJHt0b1BjLm5hbWV9YCA6IGAke3RvUGMubmFtZX0gPC0gJHtmcm9tUGMubmFtZX1gOworICAg
IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoaGVhZGVyKTsKKyAgICBjb25zb2xlLmxvZyhtc2cuY2Fu
ZGlkYXRlIHx8IG1zZy5zZHApOworICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKK30KKworZnVuY3Rp
b24gbG9nRXJyb3IoZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgaWYgKGVycm9y
Lm5hbWUgfHwgZXJyb3IubWVzc2FnZSkKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGxvZ0Vy
cm9yOiAke2Vycm9yLm5hbWUgfHwgIi0ifTogJHtlcnJvci5tZXNzYWdlIHx8ICItIn1gKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgY29uc29sZS5lcnJvcihgbG9nRXJyb3I6ICR7ZXJyb3J9
YCk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnNvbGUuZXJyb3IoImxvZ0Vycm9yOiAobm8gZXJy
b3IgbWVzc2FnZSkiKTsKK30KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKzxoMz5PbmUg
VGFiIFAyUCAtIFRlc3QgRGlmZmVyZW50IFNpZ25hbGluZyBTY2hlbWFzPC9oMz4KKzxwPkNsaWNr
IHN0YXJ0IHRvIHJlcXVlc3QgdXNlciBtZWRpYS4gVGhlIHNhbWUgc3RyZWFtIGlzIHNlbnQgaW4g
Ym90aCBkaXJlY3Rpb25zIHNvIGEgc3VjY2Vzc2Z1bAorYmlkaXJlY3Rpb25hbCBtZWRpYSBzZXR1
cCBzaG93cyB0aGUgc2FtZSBvdXRwdXQgaW4gYWxsIGZvdXIgdmlkZW8gZWxlbWVudHMuIE9wZW4g
Y29uc29sZSB0byB2aWV3CitzaWduYWxpbmcgZGV0YWlscy4gU29tZSBicm93c2VycyBvbmx5IGFs
bG93IGFjY2VzcyB0byB1c2VyIG1lZGlhIHZpYSBhIHNlY3VyZSBvcmlnaW4gKGUuZy4KK2xvY2Fs
aG9zdCkuPC9wPgorPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ibGVnYWN5X2NoZWNrIj5Vc2Ug
TGVnYWN5IEFQSXMgKENocm9tZSBjb21wYXRpYmxlKTxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2Jv
eCIgaWQ9ImF1ZGlvX2NoZWNrIj5BdWRpbzxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9
InZpZGVvX2NoZWNrIiBjaGVja2VkPlZpZGVvPGJyPgorCis8aW5wdXQgdHlwZT0iYnV0dG9uIiBp
ZD0ic3RhcnRfYnV0IiB2YWx1ZT0iU3RhcnQiPgorPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNs
b3NlX2J1dCIgdmFsdWU9IkNsb3NlIENvbm5lY3Rpb25zIiBkaXNhYmxlZD4KKzxicj4KK1NldHVw
IGJpZGlyZWN0aW9uYWwgbWVkaWE6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzaW5nbGVfYnV0
IiB2YWx1ZT0iU2luZ2xlIFNEUCBkaWFsb2ciIGRpc2FibGVkPgorPGJyPgorU2V0dXAgbWVkaWEg
aW4gb25lIGRpcmVjdGlvbiBhdCBhIHRpbWU6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJtZWRp
YV9BX3RvX0JfYnV0IiB2YWx1ZT0iTWVkaWEgQSB0byBCIiBkaXNhYmxlZD4KKzxpbnB1dCB0eXBl
PSJidXR0b24iIGlkPSJtZWRpYV9CX3RvX0FfYnV0IiB2YWx1ZT0iTWVkaWEgQiB0byBBIiBkaXNh
YmxlZD4KKzxicj4KKworPHRhYmxlPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkxvY2FsIChBKTwv
dGQ+PHRkPlJlbW90ZSAoQSk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+
PHZpZGVvIGlkPSJzZWxmX3ZpZXdBIiBhdXRvcGxheSBtdXRlZD48L3ZpZGVvPjwvdGQ+CisgICAg
ICAgIDx0ZD48dmlkZW8gaWQ9InJlbW90ZV92aWV3QSIgYXV0b3BsYXk+PC92aWRlbz48L3RkPgor
ICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+TG9jYWwgKEIpPC90ZD48dGQ+UmVtb3Rl
IChCKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dmlkZW8gaWQ9InNl
bGZfdmlld0IiIGF1dG9wbGF5IG11dGVkPjwvdmlkZW8+PC90ZD4KKyAgICAgICAgPHRkPjx2aWRl
byBpZD0icmVtb3RlX3ZpZXdCIiBhdXRvcGxheT48L3ZpZGVvPjwvdGQ+CisgICAgPC90cj4KKzwv
dGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DTWFr
ZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDk4ODIxOWYu
LjEzYTU4ZWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CisrKyBi
L1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0yMzA2LDcgKzIzMDYsNiBAQCBzZXQo
V2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2xh
dGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwCiAKICAgICBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRp
YUNvbnN0cmFpbnRzLmNwcAotICAgIHBsYXRmb3JtL21lZGlhc3RyZWFtL01lZGlhRW5kcG9pbnQu
Y3BwCiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFFbmRwb2ludENvbmZpZ3VyYXRpb24u
Y3BwCiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1Qcml2YXRlLmNwcAogICAg
IHBsYXRmb3JtL21lZGlhc3RyZWFtL01lZGlhU3RyZWFtVHJhY2tQcml2YXRlLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDQ4ZDBlMzAuLmE5NDJjYTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw3MiBAQAorMjAx
Ni0xMC0xOSAgQWRhbSBCZXJna3Zpc3QgIDxhZGFtLmJlcmdrdmlzdEBlcmljc3Nvbi5jb20+CisK
KyAgICAgICAgV2ViUlRDOiBbR1RLXSBBZGQgTWVkaWFFbmRwb2ludE93ciAtIGFuIE9wZW5XZWJS
VEMgV2ViUlRDIGJhY2tlbmQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE2MzMyNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIEFkZCBNZWRpYUVuZHBvaW50T3dyIHdoaWNoIGlzIGEgTWVkaWFFbmRwb2ludCBp
bXBsZW1lbnRhdGlvbiAoV2ViUlRDIGJhY2tlbmQpIGJhc2VkIG9uCisgICAgICAgIE9wZW5XZWJS
VEMgWzFdLiBUaGUgV2ViUlRDIGJhY2tlbmQgY2FuIGJlIHRlc3RlZCB3aXRoIGEgbWFudWFsIHRl
c3QuIEF1dG9tYXRpYyB0ZXN0aW5nCisgICAgICAgIGlzIHN0aWxsIGRvbmUgd2l0aCBNb2NrTWVk
aWFFbmRwb2ludC4KKworICAgICAgICBbMV0gaHR0cDovL3d3dy5vcGVud2VicnRjLm9yZy8KKwor
ICAgICAgICBUZXN0aW5nOiBBZGRlZCBtYW51YWwgdGVzdCAod2VicnRjLW9uZS10YWItcDJwLmh0
bWwpCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBwbGF0Zm9ybS9HU3Ry
ZWFtZXIuY21ha2U6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9N
ZWRpYUVuZHBvaW50T3dyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVNZWRp
YUVuZHBvaW50T3dyKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6Ok1lZGlh
RW5kcG9pbnRPd3IpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6fk1lZGlh
RW5kcG9pbnRPd3IpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6c2V0Q29u
ZmlndXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpjcnlwdG9EYXRhQ2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6Z2VuZXJhdGVEdGxzSW5mbyk6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0QXVkaW9QYXlsb2Fkcyk6
CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0VmlkZW9QYXls
b2Fkcyk6CisgICAgICAgIChXZWJDb3JlOjpwYXlsb2Fkc0NvbnRhaW5UeXBlKToKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmZpbHRlclBheWxvYWRzKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OnVwZGF0ZVJlY2VpdmVDb25maWd1cmF0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OmZpbmRSdHhQYXlsb2FkKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlh
RW5kcG9pbnRPd3I6OnVwZGF0ZVNlbmRDb25maWd1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6
Ok1lZGlhRW5kcG9pbnRPd3I6OmFkZFJlbW90ZUNhbmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpNZWRpYUVuZHBvaW50T3dyOjpyZXBsYWNlTXV0ZWRSZW1vdGVTb3VyY2VNaWQpOgorICAgICAg
ICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6Y3JlYXRlTXV0ZWRSZW1vdGVTb3VyY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6cmVwbGFjZVNlbmRTb3VyY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6c3RvcCk6CisgICAgICAgIChXZWJD
b3JlOjpNZWRpYUVuZHBvaW50T3dyOjp0cmFuc2NlaXZlckluZGV4Rm9yU2Vzc2lvbik6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpzZXNzaW9uTWlkKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6Om1hdGNoVHJhbnNjZWl2ZXJCeU1pZCk6CisgICAgICAg
IChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpkaXNwYXRjaE5ld0ljZUNhbmRpZGF0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpkaXNwYXRjaEdhdGhlcmluZ0RvbmUp
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6cHJvY2Vzc0ljZVRyYW5zcG9y
dFN0YXRlQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmRpc3Bh
dGNoRHRsc0ZpbmdlcnByaW50KToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6
OnVubXV0ZVJlbW90ZVNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dy
OjpwcmVwYXJlU2Vzc2lvbik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpw
cmVwYXJlTWVkaWFTZXNzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlSGVscGVyU2VydmVy
VXJsKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmVuc3VyZVRyYW5zcG9y
dEFnZW50QW5kVHJhbnNjZWl2ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRP
d3I6OmludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmdvdENh
bmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpjYW5kaWRhdGVHYXRoZXJpbmdEb25lKToKKyAg
ICAgICAgKFdlYkNvcmU6OmljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSk6CisgICAgICAgIChXZWJD
b3JlOjpnb3RJbmNvbWluZ1NvdXJjZSk6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0v
b3BlbndlYnJ0Yy9NZWRpYUVuZHBvaW50T3dyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
T3dyVHJhbnNjZWl2ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpPd3JUcmFuc2NlaXZl
cjo6fk93clRyYW5zY2VpdmVyKToKKyAgICAgICAgKFdlYkNvcmU6Ok93clRyYW5zY2VpdmVyOjpt
aWQpOgorICAgICAgICAoV2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6OnNlc3Npb24pOgorICAgICAg
ICAoV2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6Om93ckljZVN0YXRlKToKKyAgICAgICAgKFdlYkNv
cmU6Ok93clRyYW5zY2VpdmVyOjpzZXRPd3JJY2VTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpP
d3JUcmFuc2NlaXZlcjo6Z290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKToKKyAgICAgICAgKFdlYkNv
cmU6Ok93clRyYW5zY2VpdmVyOjptYXJrR290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok93clRyYW5zY2VpdmVyOjpPd3JUcmFuc2NlaXZlcik6CisgICAgICAgICog
cGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmg6
CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZU1lZGlhU291cmNlT3dyOjpSZWFsdGltZU1lZGlh
U291cmNlT3dyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lTWVkaWFTb3VyY2VPd3I6OnN3
YXBPdXRTaGFsbG93U291cmNlKToKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGFuIGluaXRpYWxs
eSBtdXRlZCBzb3VyY2UuIFRoaXMgaXMgdXNlZCBmb3IgZWFybHkKKyAgICAgICAgY3JlYXRpb24g
b2YgcmVtb3RlIHNvdXJjZXMuCisKIDIwMTYtMTAtMTAgIFphbiBEb2JlcnNlayAgPHpkb2JlcnNl
a0BpZ2FsaWEuY29tPgogCiAgICAgICAgIEFkZCBFTkFCTEVfRU5DUllQVEVEX01FRElBIGNvbmZp
Z3VyYXRpb24gb3B0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3Ry
ZWFtZXIuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3RyZWFtZXIuY21ha2UKaW5k
ZXggMDMxYzlmMS4uMzdmZWQ2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
R1N0cmVhbWVyLmNtYWtlCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1lci5j
bWFrZQpAQCAtMTQsNiArMTQsNyBAQCBpZiAoRU5BQkxFX01FRElBX1NUUkVBTSkKICAgICBsaXN0
KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVh
bWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck93ci5jcHAKIAorICAgICAgICBwbGF0Zm9y
bS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuY3BwCiAgICAgICAgIHBs
YXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvT3BlbldlYlJUQ1V0aWxpdGllcy5jcHAKICAg
ICAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNl
Q2VudGVyT3dyLmNwcAogICAgICkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGM5NTQKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01l
ZGlhRW5kcG9pbnRPd3IuY3BwCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1LCAyMDE2IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0
cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEVyaWNzc29uIG5vciB0aGUgbmFt
ZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfUlRDKQorI2luY2x1ZGUgIk1lZGlhRW5kcG9p
bnRPd3IuaCIKKworI2luY2x1ZGUgIk1lZGlhRW5kcG9pbnRTZXNzaW9uQ29uZmlndXJhdGlvbi5o
IgorI2luY2x1ZGUgIk1lZGlhUGF5bG9hZC5oIgorI2luY2x1ZGUgIk9wZW5XZWJSVENVdGlsaXRp
ZXMuaCIKKyNpbmNsdWRlICJSZWFsdGltZU1lZGlhU291cmNlT3dyLmgiCisjaW5jbHVkZSA8b3dy
L293ci5oPgorI2luY2x1ZGUgPG93ci9vd3JfYXVkaW9fcGF5bG9hZC5oPgorI2luY2x1ZGUgPG93
ci9vd3JfY3J5cHRvX3V0aWxzLmg+CisjaW5jbHVkZSA8b3dyL293cl92aWRlb19wYXlsb2FkLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0YXRpYyB2b2lkIGdvdENhbmRpZGF0ZShPd3JTZXNzaW9uKiwgT3dyQ2FuZGlkYXRlKiwgTWVk
aWFFbmRwb2ludE93ciopOworc3RhdGljIHZvaWQgY2FuZGlkYXRlR2F0aGVyaW5nRG9uZShPd3JT
ZXNzaW9uKiwgTWVkaWFFbmRwb2ludE93ciopOworc3RhdGljIHZvaWQgaWNlQ29ubmVjdGlvblN0
YXRlQ2hhbmdlKE93clNlc3Npb24qLCBHUGFyYW1TcGVjKiwgTWVkaWFFbmRwb2ludE93ciopOwor
c3RhdGljIHZvaWQgZ290SW5jb21pbmdTb3VyY2UoT3dyTWVkaWFTZXNzaW9uKiwgT3dyTWVkaWFT
b3VyY2UqLCBNZWRpYUVuZHBvaW50T3dyKik7CisKK3N0YXRpYyBjb25zdCBWZWN0b3I8U3RyaW5n
PiBjYW5kaWRhdGVUeXBlcyA9IHsgImhvc3QiLCAic3JmbHgiLCAicHJmbHgiLCAicmVsYXkiIH07
CitzdGF0aWMgY29uc3QgVmVjdG9yPFN0cmluZz4gY2FuZGlkYXRlVGNwVHlwZXMgPSB7ICIiLCAi
YWN0aXZlIiwgInBhc3NpdmUiLCAic28iIH07CitzdGF0aWMgY29uc3QgVmVjdG9yPFN0cmluZz4g
Y29kZWNUeXBlcyA9IHsgIk5PTkUiLCAiUENNVSIsICJQQ01BIiwgIk9QVVMiLCAiSDI2NCIsICJW
UDgiIH07CisKK3N0YXRpYyBjb25zdCBjaGFyKiBoZWxwZXJTZXJ2ZXJSZWdFeCA9ICIodHVybnxz
dHVuKTooW1xcd1xcLlxcLV0rfFxcW1tcXHdcXDpdK1xcXSkoOlxcZCspPyhcXD8uKyk/IjsKKwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGhlbHBlclNlcnZlckRlZmF1bHRQb3J0ID0gMzQ3
ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjYW5kaWRhdGVEZWZhdWx0UG9ydCA9IDk7
CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFFbmRwb2ludD4gY3JlYXRlTWVkaWFFbmRw
b2ludE93cihNZWRpYUVuZHBvaW50Q2xpZW50JiBjbGllbnQpCit7CisgICAgcmV0dXJuIHN0ZDo6
dW5pcXVlX3B0cjxNZWRpYUVuZHBvaW50PihuZXcgTWVkaWFFbmRwb2ludE93cihjbGllbnQpKTsK
K30KKworQ3JlYXRlTWVkaWFFbmRwb2ludCBNZWRpYUVuZHBvaW50OjpjcmVhdGUgPSBjcmVhdGVN
ZWRpYUVuZHBvaW50T3dyOworCitNZWRpYUVuZHBvaW50T3dyOjpNZWRpYUVuZHBvaW50T3dyKE1l
ZGlhRW5kcG9pbnRDbGllbnQmIGNsaWVudCkKKyAgICA6IG1fdHJhbnNwb3J0QWdlbnQobnVsbHB0
cikKKyAgICAsIG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1fbnVtYmVyT2ZSZWNlaXZlUHJlcGFy
ZWRTZXNzaW9ucygwKQorICAgICwgbV9udW1iZXJPZlNlbmRQcmVwYXJlZFNlc3Npb25zKDApCit7
CisgICAgaW5pdGlhbGl6ZU9wZW5XZWJSVEMoKTsKKworICAgIEdSZWdleENvbXBpbGVGbGFncyBj
b21waWxlRmxhZ3MgPSBHX1JFR0VYX0pBVkFTQ1JJUFRfQ09NUEFUOworICAgIEdSZWdleE1hdGNo
RmxhZ3MgbWF0Y2hGbGFncyA9IHN0YXRpY19jYXN0PEdSZWdleE1hdGNoRmxhZ3M+KDApOworICAg
IG1faGVscGVyU2VydmVyUmVnRXggPSBnX3JlZ2V4X25ldyhoZWxwZXJTZXJ2ZXJSZWdFeCwgY29t
cGlsZUZsYWdzLCBtYXRjaEZsYWdzLCBudWxscHRyKTsKK30KKworTWVkaWFFbmRwb2ludE93cjo6
fk1lZGlhRW5kcG9pbnRPd3IoKQoreworICAgIHN0b3AoKTsKKworICAgIGdfcmVnZXhfdW5yZWYo
bV9oZWxwZXJTZXJ2ZXJSZWdFeCk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6c2V0Q29u
ZmlndXJhdGlvbihSZWZQdHI8TWVkaWFFbmRwb2ludENvbmZpZ3VyYXRpb24+JiYgY29uZmlndXJh
dGlvbikKK3sKKyAgICBtX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOworfQorCitzdGF0
aWMgdm9pZCBjcnlwdG9EYXRhQ2FsbGJhY2soZ2NoYXIqIHByaXZhdGVLZXksIGdjaGFyKiBjZXJ0
aWZpY2F0ZSwgZ2NoYXIqIGZpbmdlcnByaW50LCBnY2hhciogZmluZ2VycHJpbnRGdW5jdGlvbiwg
Z3BvaW50ZXIgZGF0YSkKK3sKKyAgICBNZWRpYUVuZHBvaW50T3dyKiBtZWRpYUVuZHBvaW50ID0g
KE1lZGlhRW5kcG9pbnRPd3IqKSBkYXRhOworICAgIG1lZGlhRW5kcG9pbnQtPmRpc3BhdGNoRHRs
c0ZpbmdlcnByaW50KGdfc3RyZHVwKHByaXZhdGVLZXkpLCBnX3N0cmR1cChjZXJ0aWZpY2F0ZSks
IFN0cmluZyhmaW5nZXJwcmludCksIFN0cmluZyhmaW5nZXJwcmludEZ1bmN0aW9uKSk7Cit9CisK
K3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6Z2VuZXJhdGVEdGxzSW5mbygpCit7CisgICAgb3dyX2Ny
eXB0b19jcmVhdGVfY3J5cHRvX2RhdGEoY3J5cHRvRGF0YUNhbGxiYWNrLCB0aGlzKTsKK30KKwor
TWVkaWFQYXlsb2FkVmVjdG9yIE1lZGlhRW5kcG9pbnRPd3I6OmdldERlZmF1bHRBdWRpb1BheWxv
YWRzKCkKK3sKKyAgICBNZWRpYVBheWxvYWRWZWN0b3IgcGF5bG9hZHM7CisKKyAgICAvLyBGSVhN
RTogVGhpcyBsaXN0IHNob3VsZCBiZSBiYXNlZCBvbiB3aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUg
cGxhdGZvcm0gKGJ1ZzogaHR0cDovL3dlYmtpdC5vcmcvYi8xNjM3MjMpCisgICAgUmVmUHRyPE1l
ZGlhUGF5bG9hZD4gcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7CisgICAgcGF5bG9h
ZC0+c2V0VHlwZSgxMTEpOworICAgIHBheWxvYWQtPnNldEVuY29kaW5nTmFtZSgiT1BVUyIpOwor
ICAgIHBheWxvYWQtPnNldENsb2NrUmF0ZSg0ODAwMCk7CisgICAgcGF5bG9hZC0+c2V0Q2hhbm5l
bHMoMik7CisgICAgcGF5bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAgcGF5bG9hZCA9IE1l
ZGlhUGF5bG9hZDo6Y3JlYXRlKCk7CisgICAgcGF5bG9hZC0+c2V0VHlwZSg4KTsKKyAgICBwYXls
b2FkLT5zZXRFbmNvZGluZ05hbWUoIlBDTUEiKTsKKyAgICBwYXlsb2FkLT5zZXRDbG9ja1JhdGUo
ODAwMCk7CisgICAgcGF5bG9hZC0+c2V0Q2hhbm5lbHMoMSk7CisgICAgcGF5bG9hZHMuYXBwZW5k
KHBheWxvYWQpOworCisgICAgcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7CisgICAg
cGF5bG9hZC0+c2V0VHlwZSgwKTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGluZ05hbWUoIlBDTVUi
KTsKKyAgICBwYXlsb2FkLT5zZXRDbG9ja1JhdGUoODAwMCk7CisgICAgcGF5bG9hZC0+c2V0Q2hh
bm5lbHMoMSk7CisgICAgcGF5bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAgcmV0dXJuIHBh
eWxvYWRzOworfQorCitNZWRpYVBheWxvYWRWZWN0b3IgTWVkaWFFbmRwb2ludE93cjo6Z2V0RGVm
YXVsdFZpZGVvUGF5bG9hZHMoKQoreworICAgIE1lZGlhUGF5bG9hZFZlY3RvciBwYXlsb2FkczsK
KworICAgIC8vIEZJWE1FOiBUaGlzIGxpc3Qgc2hvdWxkIGJlIGJhc2VkIG9uIHdoYXQgaXMgYXZh
aWxhYmxlIGluIHRoZSBwbGF0Zm9ybSAoYnVnOiBodHRwOi8vd2Via2l0Lm9yZy9iLzE2MzcyMykK
KyAgICBSZWZQdHI8TWVkaWFQYXlsb2FkPiBwYXlsb2FkID0gTWVkaWFQYXlsb2FkOjpjcmVhdGUo
KTsKKyAgICBwYXlsb2FkLT5zZXRUeXBlKDEwMyk7CisgICAgcGF5bG9hZC0+c2V0RW5jb2RpbmdO
YW1lKCJIMjY0Iik7CisgICAgcGF5bG9hZC0+c2V0Q2xvY2tSYXRlKDkwMDAwKTsKKyAgICBwYXls
b2FkLT5zZXRDY21maXIodHJ1ZSk7CisgICAgcGF5bG9hZC0+c2V0TmFja3BsaSh0cnVlKTsKKyAg
ICBwYXlsb2FkLT5hZGRQYXJhbWV0ZXIoInBhY2tldGl6YXRpb25Nb2RlIiwgMSk7CisgICAgcGF5
bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAgcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3Jl
YXRlKCk7CisgICAgcGF5bG9hZC0+c2V0VHlwZSgxMDApOworICAgIHBheWxvYWQtPnNldEVuY29k
aW5nTmFtZSgiVlA4Iik7CisgICAgcGF5bG9hZC0+c2V0Q2xvY2tSYXRlKDkwMDAwKTsKKyAgICBw
YXlsb2FkLT5zZXRDY21maXIodHJ1ZSk7CisgICAgcGF5bG9hZC0+c2V0TmFja3BsaSh0cnVlKTsK
KyAgICBwYXlsb2FkLT5zZXROYWNrKHRydWUpOworICAgIHBheWxvYWRzLmFwcGVuZChwYXlsb2Fk
KTsKKworICAgIHBheWxvYWQgPSBNZWRpYVBheWxvYWQ6OmNyZWF0ZSgpOworICAgIHBheWxvYWQt
PnNldFR5cGUoMTIwKTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGluZ05hbWUoIlJUWCIpOworICAg
IHBheWxvYWQtPnNldENsb2NrUmF0ZSg5MDAwMCk7CisgICAgcGF5bG9hZC0+YWRkUGFyYW1ldGVy
KCJhcHQiLCAxMDApOworICAgIHBheWxvYWQtPmFkZFBhcmFtZXRlcigicnR4VGltZSIsIDIwMCk7
CisgICAgcGF5bG9hZHMuYXBwZW5kKHBheWxvYWQpOworCisgICAgcmV0dXJuIHBheWxvYWRzOwor
fQorCitzdGF0aWMgYm9vbCBwYXlsb2Fkc0NvbnRhaW5UeXBlKE1lZGlhUGF5bG9hZFZlY3RvciBw
YXlsb2FkcywgdW5zaWduZWQgcGF5bG9hZFR5cGUpCit7CisgICAgZm9yIChhdXRvJiBwYXlsb2Fk
IDogcGF5bG9hZHMpIHsKKyAgICAgICAgaWYgKHBheWxvYWQtPnR5cGUoKSA9PSBwYXlsb2FkVHlw
ZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK01lZGlhUGF5bG9hZFZlY3RvciBNZWRpYUVuZHBvaW50T3dyOjpmaWx0ZXJQYXlsb2Fkcyhj
b25zdCBNZWRpYVBheWxvYWRWZWN0b3ImIHJlbW90ZVBheWxvYWRzLCBjb25zdCBNZWRpYVBheWxv
YWRWZWN0b3ImIGRlZmF1bHRQYXlsb2FkcykKK3sKKyAgICBNZWRpYVBheWxvYWRWZWN0b3IgZmls
dGVyZWRQYXlsb2FkczsKKworICAgIGZvciAoYXV0byYgcmVtb3RlUGF5bG9hZCA6IHJlbW90ZVBh
eWxvYWRzKSB7CisgICAgICAgIE1lZGlhUGF5bG9hZCogZGVmYXVsdFBheWxvYWQgPSBudWxscHRy
OworICAgICAgICBmb3IgKGF1dG8mIHAgOiBkZWZhdWx0UGF5bG9hZHMpIHsKKyAgICAgICAgICAg
IGlmIChwLT5lbmNvZGluZ05hbWUoKSA9PSByZW1vdGVQYXlsb2FkLT5lbmNvZGluZ05hbWUoKS5j
b252ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFBheWxv
YWQgPSBwLmdldCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIGlmICghZGVmYXVsdFBheWxvYWQpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBpZiAoZGVmYXVsdFBheWxvYWQtPnBhcmFtZXRlcnMoKS5jb250YWlucygi
cGFja2V0aXphdGlvbk1vZGUiKSAmJiByZW1vdGVQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuY29udGFp
bnMoInBhY2tldGl6YXRpb25Nb2RlIikKKyAgICAgICAgICAgICYmIChkZWZhdWx0UGF5bG9hZC0+
cGFyYW1ldGVycygpLmdldCgicGFja2V0aXphdGlvbk1vZGUiKSAhPSBkZWZhdWx0UGF5bG9hZC0+
cGFyYW1ldGVycygpLmdldCgicGFja2V0aXphdGlvbk1vZGUiKSkpCisgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICBmaWx0ZXJlZFBheWxvYWRzLmFwcGVuZChyZW1vdGVQYXlsb2FkKTsK
KyAgICB9CisKKyAgICBNZWRpYVBheWxvYWRWZWN0b3IgZmlsdGVyZWRBcHRQYXlsb2FkczsKKwor
ICAgIGZvciAoYXV0byYgZmlsdGVyZWRQYXlsb2FkIDogZmlsdGVyZWRQYXlsb2FkcykgeworICAg
ICAgICBpZiAoZmlsdGVyZWRQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuY29udGFpbnMoImFwdCIpICYm
ICghcGF5bG9hZHNDb250YWluVHlwZShmaWx0ZXJlZFBheWxvYWRzLCBmaWx0ZXJlZFBheWxvYWQt
PnBhcmFtZXRlcnMoKS5nZXQoImFwdCIpKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgZmlsdGVyZWRBcHRQYXlsb2Fkcy5hcHBlbmQoZmlsdGVyZWRQYXlsb2FkKTsKKyAgICB9CisK
KyAgICByZXR1cm4gZmlsdGVyZWRBcHRQYXlsb2FkczsKK30KKworTWVkaWFFbmRwb2ludDo6VXBk
YXRlUmVzdWx0IE1lZGlhRW5kcG9pbnRPd3I6OnVwZGF0ZVJlY2VpdmVDb25maWd1cmF0aW9uKE1l
ZGlhRW5kcG9pbnRTZXNzaW9uQ29uZmlndXJhdGlvbiogY29uZmlndXJhdGlvbiwgYm9vbCBpc0lu
aXRpYXRvcikKK3sKKyAgICBWZWN0b3I8VHJhbnNjZWl2ZXJDb25maWc+IHRyYW5zY2VpdmVyQ29u
ZmlnczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBtX3RyYW5zY2VpdmVycy5zaXplKCk7IGkgPCBj
b25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0aW9ucygpLnNpemUoKTsgKytpKSB7CisgICAgICAg
IFRyYW5zY2VpdmVyQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgY29uZmlnLnR5cGUgPSBTZXNzaW9u
VHlwZU1lZGlhOworICAgICAgICBjb25maWcuaXNEdGxzQ2xpZW50ID0gY29uZmlndXJhdGlvbi0+
bWVkaWFEZXNjcmlwdGlvbnMoKVtpXS0+ZHRsc1NldHVwKCkgPT0gImFjdGl2ZSI7CisgICAgICAg
IGNvbmZpZy5taWQgPSBjb25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0aW9ucygpW2ldLT5taWQo
KTsKKyAgICAgICAgdHJhbnNjZWl2ZXJDb25maWdzLmFwcGVuZChXVEZNb3ZlKGNvbmZpZykpOwor
ICAgIH0KKworICAgIGVuc3VyZVRyYW5zcG9ydEFnZW50QW5kVHJhbnNjZWl2ZXJzKGlzSW5pdGlh
dG9yLCB0cmFuc2NlaXZlckNvbmZpZ3MpOworCisgICAgLy8gUHJlcGFyZSB0aGUgbmV3IHNlc3Np
b25zLgorICAgIGZvciAodW5zaWduZWQgaSA9IG1fbnVtYmVyT2ZSZWNlaXZlUHJlcGFyZWRTZXNz
aW9uczsgaSA8IG1fdHJhbnNjZWl2ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIE93clNlc3Np
b24qIHNlc3Npb24gPSBtX3RyYW5zY2VpdmVyc1tpXS0+c2Vzc2lvbigpOworICAgICAgICBwcmVw
YXJlTWVkaWFTZXNzaW9uKE9XUl9NRURJQV9TRVNTSU9OKHNlc3Npb24pLCBjb25maWd1cmF0aW9u
LT5tZWRpYURlc2NyaXB0aW9ucygpW2ldLmdldCgpLCBpc0luaXRpYXRvcik7CisgICAgICAgIG93
cl90cmFuc3BvcnRfYWdlbnRfYWRkX3Nlc3Npb24obV90cmFuc3BvcnRBZ2VudCwgc2Vzc2lvbik7
CisgICAgfQorCisgICAgbV9udW1iZXJPZlJlY2VpdmVQcmVwYXJlZFNlc3Npb25zID0gbV90cmFu
c2NlaXZlcnMuc2l6ZSgpOworCisgICAgcmV0dXJuIFVwZGF0ZVJlc3VsdDo6U3VjY2VzczsKK30K
Kworc3RhdGljIFJlZlB0cjxNZWRpYVBheWxvYWQ+IGZpbmRSdHhQYXlsb2FkKE1lZGlhUGF5bG9h
ZFZlY3RvciBwYXlsb2FkcywgdW5zaWduZWQgYXB0KQoreworICAgIGZvciAoYXV0byYgcGF5bG9h
ZCA6IHBheWxvYWRzKSB7CisgICAgICAgIGlmIChwYXlsb2FkLT5lbmNvZGluZ05hbWUoKS5jb252
ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpID09ICJSVFgiICYmIHBheWxvYWQtPnBhcmFtZXRlcnMoKS5j
b250YWlucygiYXB0IikKKyAgICAgICAgICAgICYmIChwYXlsb2FkLT5wYXJhbWV0ZXJzKCkuZ2V0
KCJhcHQiKSA9PSBhcHQpKQorICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorICAg
IHJldHVybiBudWxscHRyOworfQorCitNZWRpYUVuZHBvaW50OjpVcGRhdGVSZXN1bHQgTWVkaWFF
bmRwb2ludE93cjo6dXBkYXRlU2VuZENvbmZpZ3VyYXRpb24oTWVkaWFFbmRwb2ludFNlc3Npb25D
b25maWd1cmF0aW9uKiBjb25maWd1cmF0aW9uLCBjb25zdCBSZWFsdGltZU1lZGlhU291cmNlTWFw
JiBzZW5kU291cmNlTWFwLCBib29sIGlzSW5pdGlhdG9yKQoreworICAgIFZlY3RvcjxUcmFuc2Nl
aXZlckNvbmZpZz4gdHJhbnNjZWl2ZXJDb25maWdzOworICAgIGZvciAodW5zaWduZWQgaSA9IG1f
dHJhbnNjZWl2ZXJzLnNpemUoKTsgaSA8IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3JpcHRpb25z
KCkuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhbnNjZWl2ZXJDb25maWcgY29uZmlnOworICAg
ICAgICBjb25maWcudHlwZSA9IFNlc3Npb25UeXBlTWVkaWE7CisgICAgICAgIGNvbmZpZy5pc0R0
bHNDbGllbnQgPSBjb25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0aW9ucygpW2ldLT5kdGxzU2V0
dXAoKSAhPSAiYWN0aXZlIjsKKyAgICAgICAgY29uZmlnLm1pZCA9IGNvbmZpZ3VyYXRpb24tPm1l
ZGlhRGVzY3JpcHRpb25zKClbaV0tPm1pZCgpOworICAgICAgICB0cmFuc2NlaXZlckNvbmZpZ3Mu
YXBwZW5kKFdURk1vdmUoY29uZmlnKSk7CisgICAgfQorCisgICAgZW5zdXJlVHJhbnNwb3J0QWdl
bnRBbmRUcmFuc2NlaXZlcnMoaXNJbml0aWF0b3IsIHRyYW5zY2VpdmVyQ29uZmlncyk7CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV90cmFuc2NlaXZlcnMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgT3dyU2Vzc2lvbiogc2Vzc2lvbiA9IG1fdHJhbnNjZWl2ZXJzW2ldLT5zZXNzaW9u
KCk7CisgICAgICAgIFBlZXJNZWRpYURlc2NyaXB0aW9uJiBtZGVzYyA9ICpjb25maWd1cmF0aW9u
LT5tZWRpYURlc2NyaXB0aW9ucygpW2ldOworCisgICAgICAgIGlmIChtZGVzYy50eXBlKCkgPT0g
ImF1ZGlvIiB8fCBtZGVzYy50eXBlKCkgPT0gInZpZGVvIikKKyAgICAgICAgICAgIGdfb2JqZWN0
X3NldChzZXNzaW9uLCAicnRjcC1tdXgiLCBtZGVzYy5ydGNwTXV4KCksIG51bGxwdHIpOworCisg
ICAgICAgIGlmIChtZGVzYy5pY2VDYW5kaWRhdGVzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICBm
b3IgKGF1dG8mIGNhbmRpZGF0ZSA6IG1kZXNjLmljZUNhbmRpZGF0ZXMoKSkKKyAgICAgICAgICAg
ICAgICBpbnRlcm5hbEFkZFJlbW90ZUNhbmRpZGF0ZShzZXNzaW9uLCAqY2FuZGlkYXRlLCBtZGVz
Yy5pY2VVZnJhZygpLCBtZGVzYy5pY2VQYXNzd29yZCgpKTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmIChpIDwgbV9udW1iZXJPZlNlbmRQcmVwYXJlZFNlc3Npb25zKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgaWYgKCFzZW5kU291cmNlTWFwLmNvbnRhaW5zKG1kZXNjLm1pZCgp
KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIE1lZGlhUGF5bG9hZCogcGF5bG9h
ZCA9IG51bGxwdHI7CisgICAgICAgIGZvciAoYXV0byYgcCA6IG1kZXNjLnBheWxvYWRzKCkpIHsK
KyAgICAgICAgICAgIGlmIChwLT5lbmNvZGluZ05hbWUoKS5jb252ZXJ0VG9BU0NJSVVwcGVyY2Fz
ZSgpICE9ICJSVFgiKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHAuZ2V0KCk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIXBheWxvYWQpCisgICAgICAgICAgICByZXR1cm4gVXBkYXRlUmVzdWx0OjpGYWlsZWQ7CisK
KyAgICAgICAgUmVmUHRyPE1lZGlhUGF5bG9hZD4gcnR4UGF5bG9hZCA9IGZpbmRSdHhQYXlsb2Fk
KG1kZXNjLnBheWxvYWRzKCksIHBheWxvYWQtPnR5cGUoKSk7CisgICAgICAgIFJlYWx0aW1lTWVk
aWFTb3VyY2VPd3IqIHNvdXJjZSA9IHN0YXRpY19jYXN0PFJlYWx0aW1lTWVkaWFTb3VyY2VPd3Iq
PihzZW5kU291cmNlTWFwLmdldChtZGVzYy5taWQoKSkpOworCisgICAgICAgIEFTU0VSVChjb2Rl
Y1R5cGVzLmZpbmQocGF5bG9hZC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNh
c2UoKSkgIT0gbm90Rm91bmQpOworICAgICAgICBPd3JDb2RlY1R5cGUgY29kZWNUeXBlID0gc3Rh
dGljX2Nhc3Q8T3dyQ29kZWNUeXBlPihjb2RlY1R5cGVzLmZpbmQocGF5bG9hZC0+ZW5jb2RpbmdO
YW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNhc2UoKSkpOworCisgICAgICAgIE93clBheWxvYWQq
IHNlbmRQYXlsb2FkOworICAgICAgICBpZiAobWRlc2MudHlwZSgpID09ICJhdWRpbyIpCisgICAg
ICAgICAgICBzZW5kUGF5bG9hZCA9IG93cl9hdWRpb19wYXlsb2FkX25ldyhjb2RlY1R5cGUsIHBh
eWxvYWQtPnR5cGUoKSwgcGF5bG9hZC0+Y2xvY2tSYXRlKCksIHBheWxvYWQtPmNoYW5uZWxzKCkp
OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRQYXlsb2FkID0gb3dyX3ZpZGVvX3Bh
eWxvYWRfbmV3KGNvZGVjVHlwZSwgcGF5bG9hZC0+dHlwZSgpLCBwYXlsb2FkLT5jbG9ja1JhdGUo
KSwgcGF5bG9hZC0+Y2NtZmlyKCksIHBheWxvYWQtPm5hY2twbGkoKSk7CisgICAgICAgICAgICBn
X29iamVjdF9zZXQoc2VuZFBheWxvYWQsICJydHgtcGF5bG9hZC10eXBlIiwgcnR4UGF5bG9hZCA/
IHJ0eFBheWxvYWQtPnR5cGUoKSA6IC0xLAorICAgICAgICAgICAgICAgICJydHgtdGltZSIsIHJ0
eFBheWxvYWQgJiYgcnR4UGF5bG9hZC0+cGFyYW1ldGVycygpLmNvbnRhaW5zKCJydHhUaW1lIikg
PyBydHhQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuZ2V0KCJydHhUaW1lIikgOiAwLCBudWxscHRyKTsK
KyAgICAgICAgfQorCisgICAgICAgIG93cl9tZWRpYV9zZXNzaW9uX3NldF9zZW5kX3BheWxvYWQo
T1dSX01FRElBX1NFU1NJT04oc2Vzc2lvbiksIHNlbmRQYXlsb2FkKTsKKyAgICAgICAgb3dyX21l
ZGlhX3Nlc3Npb25fc2V0X3NlbmRfc291cmNlKE9XUl9NRURJQV9TRVNTSU9OKHNlc3Npb24pLCBz
b3VyY2UtPm1lZGlhU291cmNlKCkpOworCisgICAgICAgIG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRT
ZXNzaW9ucyA9IGkgKyAxOworICAgIH0KKworICAgIHJldHVybiBVcGRhdGVSZXN1bHQ6OlN1Y2Nl
c3M7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6YWRkUmVtb3RlQ2FuZGlkYXRlKEljZUNh
bmRpZGF0ZSYgY2FuZGlkYXRlLCBjb25zdCBTdHJpbmcmIG1pZCwgY29uc3QgU3RyaW5nJiB1ZnJh
ZywgY29uc3QgU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBmb3IgKGF1dG8mIHRyYW5zY2VpdmVy
IDogbV90cmFuc2NlaXZlcnMpIHsKKyAgICAgICAgaWYgKHRyYW5zY2VpdmVyLT5taWQoKSA9PSBt
aWQpIHsKKyAgICAgICAgICAgIGludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKHRyYW5zY2VpdmVy
LT5zZXNzaW9uKCksIGNhbmRpZGF0ZSwgdWZyYWcsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnJlcGxh
Y2VNdXRlZFJlbW90ZVNvdXJjZU1pZChjb25zdCBTdHJpbmcmIG9sZE1pZCwgY29uc3QgU3RyaW5n
JiBuZXdNaWQpCit7CisgICAgUmVmUHRyPFJlYWx0aW1lTWVkaWFTb3VyY2VPd3I+IHJlbW90ZVNv
dXJjZSA9IG1fbXV0ZWRSZW1vdGVTb3VyY2VzLnRha2Uob2xkTWlkKTsKKyAgICBtX211dGVkUmVt
b3RlU291cmNlcy5zZXQobmV3TWlkLCByZW1vdGVTb3VyY2UpOworfQorCitSZWY8UmVhbHRpbWVN
ZWRpYVNvdXJjZT4gTWVkaWFFbmRwb2ludE93cjo6Y3JlYXRlTXV0ZWRSZW1vdGVTb3VyY2UoY29u
c3QgU3RyaW5nJiBtaWQsIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGUgdHlwZSkKK3sKKyAgICBT
dHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgaWQoIm5vdCB1c2VkIik7CisKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIFJlYWx0aW1lTWVkaWFTb3VyY2U6OkF1ZGlvOiBuYW1lID0gInJlbW90
ZSBhdWRpbyI7IGJyZWFrOworICAgIGNhc2UgUmVhbHRpbWVNZWRpYVNvdXJjZTo6VmlkZW86IG5h
bWUgPSAicmVtb3RlIHZpZGVvIjsgYnJlYWs7CisgICAgY2FzZSBSZWFsdGltZU1lZGlhU291cmNl
OjpOb25lOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICBSZWZQ
dHI8UmVhbHRpbWVNZWRpYVNvdXJjZU93cj4gc291cmNlID0gYWRvcHRSZWYobmV3IFJlYWx0aW1l
TWVkaWFTb3VyY2VPd3IobnVsbHB0ciwgaWQsIHR5cGUsIG5hbWUpKTsKKyAgICBtX211dGVkUmVt
b3RlU291cmNlcy5zZXQobWlkLCBzb3VyY2UpOworCisgICAgcmV0dXJuICpzb3VyY2U7Cit9CisK
K3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6cmVwbGFjZVNlbmRTb3VyY2UoUmVhbHRpbWVNZWRpYVNv
dXJjZSYgbmV3U291cmNlLCBjb25zdCBTdHJpbmcmIG1pZCkKK3sKKyAgICBSZWFsdGltZU1lZGlh
U291cmNlT3dyJiBvd3JTb3VyY2UgPSBzdGF0aWNfY2FzdDxSZWFsdGltZU1lZGlhU291cmNlT3dy
Jj4obmV3U291cmNlKTsKKyAgICBPd3JUcmFuc2NlaXZlciogdHJhbnNjZWl2ZXIgPSBtYXRjaFRy
YW5zY2VpdmVyQnlNaWQobWlkKTsKKyAgICBBU1NFUlQodHJhbnNjZWl2ZXIpOworCisgICAgLy8g
RklYTUU6IFRoaXMgZG9lcyBub3Qgd29yayB5ZXQgKE9wZW5XZWJSVEMgYnVnOiBodHRwczovL2dp
dGh1Yi5jb20vRXJpY3Nzb25SZXNlYXJjaC9vcGVud2VicnRjL2lzc3Vlcy81MzMpCisgICAgb3dy
X21lZGlhX3Nlc3Npb25fc2V0X3NlbmRfc291cmNlKE9XUl9NRURJQV9TRVNTSU9OKHRyYW5zY2Vp
dmVyLT5zZXNzaW9uKCkpLCBvd3JTb3VyY2UubWVkaWFTb3VyY2UoKSk7Cit9CisKK3ZvaWQgTWVk
aWFFbmRwb2ludE93cjo6c3RvcCgpCit7CisgICAgaWYgKCFtX3RyYW5zcG9ydEFnZW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBmb3IgKGF1dG8mIHRyYW5zY2VpdmVyIDogbV90cmFuc2NlaXZl
cnMpCisgICAgICAgIG93cl9tZWRpYV9zZXNzaW9uX3NldF9zZW5kX3NvdXJjZShPV1JfTUVESUFf
U0VTU0lPTih0cmFuc2NlaXZlci0+c2Vzc2lvbigpKSwgbnVsbHB0cik7CisKKyAgICBnX29iamVj
dF91bnJlZihtX3RyYW5zcG9ydEFnZW50KTsKKyAgICBtX3RyYW5zcG9ydEFnZW50ID0gbnVsbHB0
cjsKK30KKworc2l6ZV90IE1lZGlhRW5kcG9pbnRPd3I6OnRyYW5zY2VpdmVySW5kZXhGb3JTZXNz
aW9uKE93clNlc3Npb24qIHNlc3Npb24pIGNvbnN0Cit7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1fdHJhbnNjZWl2ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtX3RyYW5z
Y2VpdmVyc1tpXS0+c2Vzc2lvbigpID09IHNlc3Npb24pCisgICAgICAgICAgICByZXR1cm4gaTsK
KyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gbm90Rm91bmQ7
Cit9CisKK2NvbnN0IFN0cmluZyYgTWVkaWFFbmRwb2ludE93cjo6c2Vzc2lvbk1pZChPd3JTZXNz
aW9uKiBzZXNzaW9uKSBjb25zdAoreworICAgIHNpemVfdCBpbmRleCA9IHRyYW5zY2VpdmVySW5k
ZXhGb3JTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBtX3RyYW5zY2VpdmVyc1tpbmRleF0t
Pm1pZCgpOworfQorCitPd3JUcmFuc2NlaXZlciogTWVkaWFFbmRwb2ludE93cjo6bWF0Y2hUcmFu
c2NlaXZlckJ5TWlkKGNvbnN0IFN0cmluZyYgbWlkKSBjb25zdAoreworICAgIGZvciAoYXV0byYg
dHJhbnNjZWl2ZXIgOiBtX3RyYW5zY2VpdmVycykgeworICAgICAgICBpZiAodHJhbnNjZWl2ZXIt
Pm1pZCgpID09IG1pZCkKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2NlaXZlci5nZXQoKTsKKyAg
ICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6ZGlz
cGF0Y2hOZXdJY2VDYW5kaWRhdGUoY29uc3QgU3RyaW5nJiBtaWQsIFJlZlB0cjxJY2VDYW5kaWRh
dGU+JiYgaWNlQ2FuZGlkYXRlKQoreworICAgIG1fY2xpZW50LmdvdEljZUNhbmRpZGF0ZShtaWQs
IFdURk1vdmUoaWNlQ2FuZGlkYXRlKSk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6ZGlz
cGF0Y2hHYXRoZXJpbmdEb25lKGNvbnN0IFN0cmluZyYgbWlkKQoreworICAgIG1fY2xpZW50LmRv
bmVHYXRoZXJpbmdDYW5kaWRhdGVzKG1pZCk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6
cHJvY2Vzc0ljZVRyYW5zcG9ydFN0YXRlQ2hhbmdlKE93clNlc3Npb24qIHNlc3Npb24pCit7Cisg
ICAgT3dySWNlU3RhdGUgb3dySWNlU3RhdGU7CisgICAgZ19vYmplY3RfZ2V0KHNlc3Npb24sICJp
Y2UtY29ubmVjdGlvbi1zdGF0ZSIsICZvd3JJY2VTdGF0ZSwgbnVsbHB0cik7CisKKyAgICBPd3JU
cmFuc2NlaXZlciYgdHJhbnNjZWl2ZXIgPSAqbV90cmFuc2NlaXZlcnNbdHJhbnNjZWl2ZXJJbmRl
eEZvclNlc3Npb24oc2Vzc2lvbildOworICAgIGlmIChvd3JJY2VTdGF0ZSA8IHRyYW5zY2VpdmVy
Lm93ckljZVN0YXRlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHRyYW5zY2VpdmVyLnNldE93
ckljZVN0YXRlKG93ckljZVN0YXRlKTsKKworICAgIC8vIFdlIGNhbm5vdCBnbyB0byBDb21wbGV0
ZWQgaWYgdGhlcmUgbWF5IGJlIG1vcmUgcmVtb3RlIGNhbmRpZGF0ZXMuCisgICAgaWYgKG93cklj
ZVN0YXRlID09IE9XUl9JQ0VfU1RBVEVfUkVBRFkgJiYgIXRyYW5zY2VpdmVyLmdvdEVuZE9mUmVt
b3RlQ2FuZGlkYXRlcygpKQorICAgICAgICByZXR1cm47CisKKyAgICBNZWRpYUVuZHBvaW50OjpJ
Y2VUcmFuc3BvcnRTdGF0ZSB0cmFuc3BvcnRTdGF0ZTsKKyAgICBzd2l0Y2ggKG93ckljZVN0YXRl
KSB7CisgICAgY2FzZSBPV1JfSUNFX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgIHRyYW5zcG9y
dFN0YXRlID0gTWVkaWFFbmRwb2ludDo6SWNlVHJhbnNwb3J0U3RhdGU6OkNoZWNraW5nOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIE9XUl9JQ0VfU1RBVEVfQ09OTkVDVEVEOgorICAgICAgICB0
cmFuc3BvcnRTdGF0ZSA9IE1lZGlhRW5kcG9pbnQ6OkljZVRyYW5zcG9ydFN0YXRlOjpDb25uZWN0
ZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1dSX0lDRV9TVEFURV9SRUFEWToKKyAgICAg
ICAgdHJhbnNwb3J0U3RhdGUgPSBNZWRpYUVuZHBvaW50OjpJY2VUcmFuc3BvcnRTdGF0ZTo6Q29t
cGxldGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9XUl9JQ0VfU1RBVEVfRkFJTEVEOgor
ICAgICAgICB0cmFuc3BvcnRTdGF0ZSA9IE1lZGlhRW5kcG9pbnQ6OkljZVRyYW5zcG9ydFN0YXRl
OjpGYWlsZWQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBtX2NsaWVudC5pY2VUcmFuc3BvcnRTdGF0ZUNoYW5nZWQodHJhbnNjZWl2
ZXIubWlkKCksIHRyYW5zcG9ydFN0YXRlKTsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjpk
aXNwYXRjaER0bHNGaW5nZXJwcmludChnY2hhciogcHJpdmF0ZUtleSwgZ2NoYXIqIGNlcnRpZmlj
YXRlLCBjb25zdCBTdHJpbmcmIGZpbmdlcnByaW50LCBjb25zdCBTdHJpbmcmIGZpbmdlcnByaW50
RnVuY3Rpb24pCit7CisgICAgbV9kdGxzUHJpdmF0ZUtleSA9IFN0cmluZyhwcml2YXRlS2V5KTsK
KyAgICBtX2R0bHNDZXJ0aWZpY2F0ZSA9IFN0cmluZyhjZXJ0aWZpY2F0ZSk7CisKKyAgICBnX2Zy
ZWUocHJpdmF0ZUtleSk7CisgICAgZ19mcmVlKGNlcnRpZmljYXRlKTsKKworICAgIG1fY2xpZW50
LmdvdER0bHNGaW5nZXJwcmludChmaW5nZXJwcmludCwgZmluZ2VycHJpbnRGdW5jdGlvbik7Cit9
CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6dW5tdXRlUmVtb3RlU291cmNlKGNvbnN0IFN0cmlu
ZyYgbWlkLCBPd3JNZWRpYVNvdXJjZSogcmVhbFNvdXJjZSkKK3sKKyAgICBSZWZQdHI8UmVhbHRp
bWVNZWRpYVNvdXJjZU93cj4gcmVtb3RlU291cmNlID0gbV9tdXRlZFJlbW90ZVNvdXJjZXMudGFr
ZShtaWQpOworICAgIGlmICghcmVtb3RlU291cmNlKSB7CisgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGZpbmQgbXV0ZWQgcmVtb3RlIHNvdXJjZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmICghcmVtb3RlU291cmNlLT5zdG9wcGVkKCkpCisgICAgICAgIHJlbW90ZVNv
dXJjZS0+c3dhcE91dFNoYWxsb3dTb3VyY2UoKnJlYWxTb3VyY2UpOworfQorCit2b2lkIE1lZGlh
RW5kcG9pbnRPd3I6OnByZXBhcmVTZXNzaW9uKE93clNlc3Npb24qIHNlc3Npb24sIFBlZXJNZWRp
YURlc2NyaXB0aW9uKiBtZWRpYURlc2NyaXB0aW9uKQoreworICAgIGdfb2JqZWN0X3NldF9kYXRh
X2Z1bGwoR19PQkpFQ1Qoc2Vzc2lvbiksICJpY2UtdWZyYWciLCBnX3N0cmR1cChtZWRpYURlc2Ny
aXB0aW9uLT5pY2VVZnJhZygpLmFzY2lpKCkuZGF0YSgpKSwgZ19mcmVlKTsKKyAgICBnX29iamVj
dF9zZXRfZGF0YV9mdWxsKEdfT0JKRUNUKHNlc3Npb24pLCAiaWNlLXBhc3N3b3JkIiwgZ19zdHJk
dXAobWVkaWFEZXNjcmlwdGlvbi0+aWNlUGFzc3dvcmQoKS5hc2NpaSgpLmRhdGEoKSksIGdfZnJl
ZSk7CisKKyAgICBnX3NpZ25hbF9jb25uZWN0KHNlc3Npb24sICJvbi1uZXctY2FuZGlkYXRlIiwg
R19DQUxMQkFDSyhnb3RDYW5kaWRhdGUpLCB0aGlzKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHNl
c3Npb24sICJvbi1jYW5kaWRhdGUtZ2F0aGVyaW5nLWRvbmUiLCBHX0NBTExCQUNLKGNhbmRpZGF0
ZUdhdGhlcmluZ0RvbmUpLCB0aGlzKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHNlc3Npb24sICJu
b3RpZnk6OmljZS1jb25uZWN0aW9uLXN0YXRlIiwgR19DQUxMQkFDSyhpY2VDb25uZWN0aW9uU3Rh
dGVDaGFuZ2UpLCB0aGlzKTsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjpwcmVwYXJlTWVk
aWFTZXNzaW9uKE93ck1lZGlhU2Vzc2lvbiogbWVkaWFTZXNzaW9uLCBQZWVyTWVkaWFEZXNjcmlw
dGlvbiogbWVkaWFEZXNjcmlwdGlvbiwgYm9vbCBpc0luaXRpYXRvcikKK3sKKyAgICBwcmVwYXJl
U2Vzc2lvbihPV1JfU0VTU0lPTihtZWRpYVNlc3Npb24pLCBtZWRpYURlc2NyaXB0aW9uKTsKKwor
ICAgIGJvb2wgdXNlUnRjcE11eCA9ICFpc0luaXRpYXRvciAmJiBtZWRpYURlc2NyaXB0aW9uLT5y
dGNwTXV4KCk7CisgICAgZ19vYmplY3Rfc2V0KG1lZGlhU2Vzc2lvbiwgInJ0Y3AtbXV4IiwgdXNl
UnRjcE11eCwgbnVsbHB0cik7CisKKyAgICBpZiAoIW1lZGlhRGVzY3JpcHRpb24tPmNuYW1lKCku
aXNFbXB0eSgpICYmIG1lZGlhRGVzY3JpcHRpb24tPnNzcmNzKCkuc2l6ZSgpKSB7CisgICAgICAg
IGdfb2JqZWN0X3NldChtZWRpYVNlc3Npb24sICJjbmFtZSIsIG1lZGlhRGVzY3JpcHRpb24tPmNu
YW1lKCkuYXNjaWkoKS5kYXRhKCksCisgICAgICAgICAgICAic2VuZC1zc3JjIiwgbWVkaWFEZXNj
cmlwdGlvbi0+c3NyY3MoKVswXSwKKyAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKworICAg
IGdfc2lnbmFsX2Nvbm5lY3QobWVkaWFTZXNzaW9uLCAib24taW5jb21pbmctc291cmNlIiwgR19D
QUxMQkFDSyhnb3RJbmNvbWluZ1NvdXJjZSksIHRoaXMpOworCisgICAgZm9yIChhdXRvJiBwYXls
b2FkIDogbWVkaWFEZXNjcmlwdGlvbi0+cGF5bG9hZHMoKSkgeworICAgICAgICBpZiAocGF5bG9h
ZC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNhc2UoKSA9PSAiUlRYIikKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFJlZlB0cjxNZWRpYVBheWxvYWQ+IHJ0eFBh
eWxvYWQgPSBmaW5kUnR4UGF5bG9hZChtZWRpYURlc2NyaXB0aW9uLT5wYXlsb2FkcygpLCBwYXls
b2FkLT50eXBlKCkpOworCisgICAgICAgIEFTU0VSVChjb2RlY1R5cGVzLmZpbmQocGF5bG9hZC0+
ZW5jb2RpbmdOYW1lKCkpICE9IG5vdEZvdW5kKTsKKyAgICAgICAgT3dyQ29kZWNUeXBlIGNvZGVj
VHlwZSA9IHN0YXRpY19jYXN0PE93ckNvZGVjVHlwZT4oY29kZWNUeXBlcy5maW5kKHBheWxvYWQt
PmVuY29kaW5nTmFtZSgpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkpKTsKKworICAgICAgICBP
d3JQYXlsb2FkKiByZWNlaXZlUGF5bG9hZDsKKyAgICAgICAgaWYgKG1lZGlhRGVzY3JpcHRpb24t
PnR5cGUoKSA9PSAiYXVkaW8iKQorICAgICAgICAgICAgcmVjZWl2ZVBheWxvYWQgPSBvd3JfYXVk
aW9fcGF5bG9hZF9uZXcoY29kZWNUeXBlLCBwYXlsb2FkLT50eXBlKCksIHBheWxvYWQtPmNsb2Nr
UmF0ZSgpLCBwYXlsb2FkLT5jaGFubmVscygpKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICByZWNlaXZlUGF5bG9hZCA9IG93cl92aWRlb19wYXlsb2FkX25ldyhjb2RlY1R5cGUsIHBheWxv
YWQtPnR5cGUoKSwgcGF5bG9hZC0+Y2xvY2tSYXRlKCksIHBheWxvYWQtPmNjbWZpcigpLCBwYXls
b2FkLT5uYWNrcGxpKCkpOworICAgICAgICAgICAgZ19vYmplY3Rfc2V0KHJlY2VpdmVQYXlsb2Fk
LCAicnR4LXBheWxvYWQtdHlwZSIsIHJ0eFBheWxvYWQgPyBydHhQYXlsb2FkLT50eXBlKCkgOiAt
MSwKKyAgICAgICAgICAgICAgICAicnR4LXRpbWUiLCBydHhQYXlsb2FkICYmIHJ0eFBheWxvYWQt
PnBhcmFtZXRlcnMoKS5jb250YWlucygicnR4VGltZSIpID8gcnR4UGF5bG9hZC0+cGFyYW1ldGVy
cygpLmdldCgicnR4VGltZSIpIDogMCwgbnVsbHB0cik7CisgICAgICAgIH0KKworICAgICAgICBv
d3JfbWVkaWFfc2Vzc2lvbl9hZGRfcmVjZWl2ZV9wYXlsb2FkKG1lZGlhU2Vzc2lvbiwgcmVjZWl2
ZVBheWxvYWQpOworICAgIH0KK30KKworc3RydWN0IEhlbHBlclNlcnZlclVybCB7CisgICAgU3Ry
aW5nIHByb3RvY29sOworICAgIFN0cmluZyBob3N0OworICAgIHVuc2lnbmVkIHNob3J0IHBvcnQ7
CisgICAgU3RyaW5nIHF1ZXJ5OworfTsKKworc3RhdGljIHZvaWQgcGFyc2VIZWxwZXJTZXJ2ZXJV
cmwoR1JlZ2V4JiByZWdleCwgY29uc3QgVVJMJiB1cmwsIEhlbHBlclNlcnZlclVybCYgb3V0VXJs
KQoreworICAgIEdNYXRjaEluZm8qIG1hdGNoSW5mbzsKKworICAgIGlmIChnX3JlZ2V4X21hdGNo
KCZyZWdleCwgdXJsLnN0cmluZygpLmFzY2lpKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxHUmVnZXhN
YXRjaEZsYWdzPigwKSwgJm1hdGNoSW5mbykpIHsKKyAgICAgICAgZ2NoYXIqKiBtYXRjaGVzID0g
IGdfbWF0Y2hfaW5mb19mZXRjaF9hbGwobWF0Y2hJbmZvKTsKKyAgICAgICAgZ2ludCBtYXRjaENv
dW50ID0gZ19zdHJ2X2xlbmd0aChtYXRjaGVzKTsKKworICAgICAgICBvdXRVcmwucHJvdG9jb2wg
PSBtYXRjaGVzWzFdOworICAgICAgICBvdXRVcmwuaG9zdCA9IG1hdGNoZXNbMl1bMF0gPT0gJ1sn
ID8gU3RyaW5nKG1hdGNoZXNbMl0gKyAxLCBzdHJsZW4obWF0Y2hlc1syXSkgLSAyKSAvLyBJUHY2
CisgICAgICAgICAgICA6IG1hdGNoZXNbMl07CisKKyAgICAgICAgb3V0VXJsLnBvcnQgPSAwOwor
ICAgICAgICBpZiAobWF0Y2hDb3VudCA+PSA0KSB7CisgICAgICAgICAgICBTdHJpbmcgcG9ydFN0
cmluZyA9IFN0cmluZyhtYXRjaGVzWzNdICsgMSk7IC8vIFNraXAgcG9ydCBjb2xvbgorICAgICAg
ICAgICAgb3V0VXJsLnBvcnQgPSBwb3J0U3RyaW5nLnRvVUludFN0cmljdCgpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKG1hdGNoQ291bnQgPT0gNSkKKyAgICAgICAgICAgIG91dFVybC5xdWVy
eSA9IFN0cmluZyhtYXRjaGVzWzRdICsgMSk7IC8vIFNraXAgcXVlc3Rpb24gbWFyaworCisgICAg
ICAgIGdfc3RyZnJlZXYobWF0Y2hlcyk7CisgICAgfQorCisgICAgZ19tYXRjaF9pbmZvX2ZyZWUo
bWF0Y2hJbmZvKTsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjplbnN1cmVUcmFuc3BvcnRB
Z2VudEFuZFRyYW5zY2VpdmVycyhib29sIGlzSW5pdGlhdG9yLCBjb25zdCBWZWN0b3I8VHJhbnNj
ZWl2ZXJDb25maWc+JiB0cmFuc2NlaXZlckNvbmZpZ3MpCit7CisgICAgQVNTRVJUKG1fZHRsc1By
aXZhdGVLZXkpOworICAgIEFTU0VSVChtX2R0bHNDZXJ0aWZpY2F0ZSk7CisKKyAgICBpZiAoIW1f
dHJhbnNwb3J0QWdlbnQpIHsKKyAgICAgICAgbV90cmFuc3BvcnRBZ2VudCA9IG93cl90cmFuc3Bv
cnRfYWdlbnRfbmV3KGZhbHNlKTsKKworICAgICAgICBmb3IgKGF1dG8mIHNlcnZlciA6IG1fY29u
ZmlndXJhdGlvbi0+aWNlU2VydmVycygpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHdlYmtp
dFVybCA6IHNlcnZlci0+dXJscygpKSB7CisgICAgICAgICAgICAgICAgSGVscGVyU2VydmVyVXJs
IHVybDsKKyAgICAgICAgICAgICAgICAvLyBXZWJLaXQncyBVUkwgY2xhc3MgY2FuJ3QgaGFuZGxl
IElDRSBoZWxwZXIgc2VydmVyIHVybHMgcHJvcGVybHkKKyAgICAgICAgICAgICAgICBwYXJzZUhl
bHBlclNlcnZlclVybCgqbV9oZWxwZXJTZXJ2ZXJSZWdFeCwgd2Via2l0VXJsLCB1cmwpOworCisg
ICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IHVybC5wb3J0ID8gdXJsLnBvcnQg
OiBoZWxwZXJTZXJ2ZXJEZWZhdWx0UG9ydDsKKworICAgICAgICAgICAgICAgIGlmICh1cmwucHJv
dG9jb2wgPT0gInN0dW4iKSB7CisgICAgICAgICAgICAgICAgICAgIG93cl90cmFuc3BvcnRfYWdl
bnRfYWRkX2hlbHBlcl9zZXJ2ZXIobV90cmFuc3BvcnRBZ2VudCwgT1dSX0hFTFBFUl9TRVJWRVJf
VFlQRV9TVFVOLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmhvc3QuYXNjaWkoKS5kYXRh
KCksIHBvcnQsIG51bGxwdHIsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlm
ICh1cmwucHJvdG9jb2wgPT0gInR1cm4iKSB7CisgICAgICAgICAgICAgICAgICAgIE93ckhlbHBl
clNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHVybC5xdWVyeSA9PSAidHJhbnNwb3J0PXRjcCIgPyBP
V1JfSEVMUEVSX1NFUlZFUl9UWVBFX1RVUk5fVENQCisgICAgICAgICAgICAgICAgICAgICAgICA6
IE9XUl9IRUxQRVJfU0VSVkVSX1RZUEVfVFVSTl9VRFA7CisKKyAgICAgICAgICAgICAgICAgICAg
b3dyX3RyYW5zcG9ydF9hZ2VudF9hZGRfaGVscGVyX3NlcnZlcihtX3RyYW5zcG9ydEFnZW50LCBz
ZXJ2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmhvc3QuYXNjaWkoKS5kYXRh
KCksIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnVzZXJuYW1lKCkuYXNj
aWkoKS5kYXRhKCksIHNlcnZlci0+Y3JlZGVudGlhbCgpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF9zZXQo
bV90cmFuc3BvcnRBZ2VudCwgImljZS1jb250cm9sbGluZy1tb2RlIiwgaXNJbml0aWF0b3IsIG51
bGxwdHIpOworCisgICAgZm9yIChhdXRvJiBjb25maWcgOiB0cmFuc2NlaXZlckNvbmZpZ3MpIHsK
KyAgICAgICAgT3dyU2Vzc2lvbiogc2Vzc2lvbiA9IE9XUl9TRVNTSU9OKG93cl9tZWRpYV9zZXNz
aW9uX25ldyhjb25maWcuaXNEdGxzQ2xpZW50KSk7CisgICAgICAgIGdfb2JqZWN0X3NldChzZXNz
aW9uLCAiZHRscy1jZXJ0aWZpY2F0ZSIsIG1fZHRsc0NlcnRpZmljYXRlLnV0ZjgoKS5kYXRhKCks
CisgICAgICAgICAgICAiZHRscy1rZXkiLCBtX2R0bHNQcml2YXRlS2V5LnV0ZjgoKS5kYXRhKCks
CisgICAgICAgICAgICBudWxscHRyKTsKKworICAgICAgICBtX3RyYW5zY2VpdmVycy5hcHBlbmQo
T3dyVHJhbnNjZWl2ZXI6OmNyZWF0ZShjb25maWcubWlkLCBzZXNzaW9uKSk7CisgICAgfQorfQor
Cit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OmludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKE93clNl
c3Npb24qIHNlc3Npb24sIEljZUNhbmRpZGF0ZSYgY2FuZGlkYXRlLCBjb25zdCBTdHJpbmcmIHVm
cmFnLCBjb25zdCBTdHJpbmcmIHBhc3N3b3JkKQoreworICAgIGdib29sZWFuIHJ0Y3BNdXg7Cisg
ICAgZ19vYmplY3RfZ2V0KHNlc3Npb24sICJydGNwLW11eCIsICZydGNwTXV4LCBudWxscHRyKTsK
KworICAgIGlmIChydGNwTXV4ICYmIGNhbmRpZGF0ZS5jb21wb25lbnRJZCgpID09IE9XUl9DT01Q
T05FTlRfVFlQRV9SVENQKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoY2FuZGlkYXRl
VHlwZXMuZmluZChjYW5kaWRhdGUudHlwZSgpKSAhPSBub3RGb3VuZCk7CisKKyAgICBPd3JDYW5k
aWRhdGVUeXBlIGNhbmRpZGF0ZVR5cGUgPSBzdGF0aWNfY2FzdDxPd3JDYW5kaWRhdGVUeXBlPihj
YW5kaWRhdGVUeXBlcy5maW5kKGNhbmRpZGF0ZS50eXBlKCkpKTsKKyAgICBPd3JDb21wb25lbnRU
eXBlIGNvbXBvbmVudElkID0gc3RhdGljX2Nhc3Q8T3dyQ29tcG9uZW50VHlwZT4oY2FuZGlkYXRl
LmNvbXBvbmVudElkKCkpOworICAgIE93clRyYW5zcG9ydFR5cGUgdHJhbnNwb3J0VHlwZTsKKwor
ICAgIGlmIChjYW5kaWRhdGUudHJhbnNwb3J0KCkuY29udmVydFRvQVNDSUlVcHBlcmNhc2UoKSA9
PSAiVURQIikKKyAgICAgICAgdHJhbnNwb3J0VHlwZSA9IE9XUl9UUkFOU1BPUlRfVFlQRV9VRFA7
CisgICAgZWxzZSB7CisgICAgICAgIEFTU0VSVChjYW5kaWRhdGVUY3BUeXBlcy5maW5kKGNhbmRp
ZGF0ZS50Y3BUeXBlKCkpICE9IG5vdEZvdW5kKTsKKyAgICAgICAgdHJhbnNwb3J0VHlwZSA9IHN0
YXRpY19jYXN0PE93clRyYW5zcG9ydFR5cGU+KGNhbmRpZGF0ZVRjcFR5cGVzLmZpbmQoY2FuZGlk
YXRlLnRjcFR5cGUoKSkpOworICAgIH0KKworICAgIE93ckNhbmRpZGF0ZSogb3dyQ2FuZGlkYXRl
ID0gb3dyX2NhbmRpZGF0ZV9uZXcoY2FuZGlkYXRlVHlwZSwgY29tcG9uZW50SWQpOworICAgIGdf
b2JqZWN0X3NldChvd3JDYW5kaWRhdGUsICJ0cmFuc3BvcnQtdHlwZSIsIHRyYW5zcG9ydFR5cGUs
CisgICAgICAgICJhZGRyZXNzIiwgY2FuZGlkYXRlLmFkZHJlc3MoKS5hc2NpaSgpLmRhdGEoKSwK
KyAgICAgICAgInBvcnQiLCBjYW5kaWRhdGUucG9ydCgpLAorICAgICAgICAiYmFzZS1hZGRyZXNz
IiwgY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzKCkuYXNjaWkoKS5kYXRhKCksCisgICAgICAgICJi
YXNlLXBvcnQiLCBjYW5kaWRhdGUucmVsYXRlZFBvcnQoKSwKKyAgICAgICAgInByaW9yaXR5Iiwg
Y2FuZGlkYXRlLnByaW9yaXR5KCksCisgICAgICAgICJmb3VuZGF0aW9uIiwgY2FuZGlkYXRlLmZv
dW5kYXRpb24oKS5hc2NpaSgpLmRhdGEoKSwKKyAgICAgICAgInVmcmFnIiwgdWZyYWcuYXNjaWko
KS5kYXRhKCksCisgICAgICAgICJwYXNzd29yZCIsIHBhc3N3b3JkLmFzY2lpKCkuZGF0YSgpLAor
ICAgICAgICBudWxscHRyKTsKKworICAgIG93cl9zZXNzaW9uX2FkZF9yZW1vdGVfY2FuZGlkYXRl
KHNlc3Npb24sIG93ckNhbmRpZGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdvdENhbmRpZGF0ZShP
d3JTZXNzaW9uKiBzZXNzaW9uLCBPd3JDYW5kaWRhdGUqIGNhbmRpZGF0ZSwgTWVkaWFFbmRwb2lu
dE93ciogbWVkaWFFbmRwb2ludCkKK3sKKyAgICBPd3JDYW5kaWRhdGVUeXBlIGNhbmRpZGF0ZVR5
cGU7CisgICAgZ2NoYXIqIGZvdW5kYXRpb247CisgICAgT3dyQ29tcG9uZW50VHlwZSBjb21wb25l
bnRJZDsKKyAgICBPd3JUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisgICAgZ2ludCBwcmlv
cml0eTsKKyAgICBnY2hhciogYWRkcmVzczsKKyAgICBndWludCBwb3J0OworICAgIGdjaGFyKiBy
ZWxhdGVkQWRkcmVzczsKKyAgICBndWludCByZWxhdGVkUG9ydDsKKworICAgIGdfb2JqZWN0X2dl
dChjYW5kaWRhdGUsICJ0eXBlIiwgJmNhbmRpZGF0ZVR5cGUsCisgICAgICAgICJmb3VuZGF0aW9u
IiwgJmZvdW5kYXRpb24sCisgICAgICAgICJjb21wb25lbnQtdHlwZSIsICZjb21wb25lbnRJZCwK
KyAgICAgICAgInRyYW5zcG9ydC10eXBlIiwgJnRyYW5zcG9ydFR5cGUsCisgICAgICAgICJwcmlv
cml0eSIsICZwcmlvcml0eSwKKyAgICAgICAgImFkZHJlc3MiLCAmYWRkcmVzcywKKyAgICAgICAg
InBvcnQiLCAmcG9ydCwKKyAgICAgICAgImJhc2UtYWRkcmVzcyIsICZyZWxhdGVkQWRkcmVzcywK
KyAgICAgICAgImJhc2UtcG9ydCIsICZyZWxhdGVkUG9ydCwKKyAgICAgICAgbnVsbHB0cik7CisK
KyAgICBBU1NFUlQoY2FuZGlkYXRlVHlwZSA+PSAwICYmIGNhbmRpZGF0ZVR5cGUgPCBjYW5kaWRh
dGVUeXBlcy5zaXplKCkpOworICAgIEFTU0VSVCh0cmFuc3BvcnRUeXBlID49IDAgJiYgdHJhbnNw
b3J0VHlwZSA8IGNhbmRpZGF0ZVRjcFR5cGVzLnNpemUoKSk7CisKKyAgICBSZWZQdHI8SWNlQ2Fu
ZGlkYXRlPiBpY2VDYW5kaWRhdGUgPSBJY2VDYW5kaWRhdGU6OmNyZWF0ZSgpOworICAgIGljZUNh
bmRpZGF0ZS0+c2V0VHlwZShjYW5kaWRhdGVUeXBlc1tjYW5kaWRhdGVUeXBlXSk7CisgICAgaWNl
Q2FuZGlkYXRlLT5zZXRGb3VuZGF0aW9uKGZvdW5kYXRpb24pOworICAgIGljZUNhbmRpZGF0ZS0+
c2V0Q29tcG9uZW50SWQoY29tcG9uZW50SWQpOworICAgIGljZUNhbmRpZGF0ZS0+c2V0UHJpb3Jp
dHkocHJpb3JpdHkpOworICAgIGljZUNhbmRpZGF0ZS0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAg
ICBpY2VDYW5kaWRhdGUtPnNldFBvcnQocG9ydCA/IHBvcnQgOiBjYW5kaWRhdGVEZWZhdWx0UG9y
dCk7CisKKyAgICBpZiAodHJhbnNwb3J0VHlwZSA9PSBPV1JfVFJBTlNQT1JUX1RZUEVfVURQKQor
ICAgICAgICBpY2VDYW5kaWRhdGUtPnNldFRyYW5zcG9ydCgiVURQIik7CisgICAgZWxzZSB7Cisg
ICAgICAgIGljZUNhbmRpZGF0ZS0+c2V0VHJhbnNwb3J0KCJUQ1AiKTsKKyAgICAgICAgaWNlQ2Fu
ZGlkYXRlLT5zZXRUY3BUeXBlKGNhbmRpZGF0ZVRjcFR5cGVzW3RyYW5zcG9ydFR5cGVdKTsKKyAg
ICB9CisKKyAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPSBPV1JfQ0FORElEQVRFX1RZUEVfSE9TVCkg
eworICAgICAgICBpY2VDYW5kaWRhdGUtPnNldFJlbGF0ZWRBZGRyZXNzKHJlbGF0ZWRBZGRyZXNz
KTsKKyAgICAgICAgaWNlQ2FuZGlkYXRlLT5zZXRSZWxhdGVkUG9ydChyZWxhdGVkUG9ydCA/IHJl
bGF0ZWRQb3J0IDogY2FuZGlkYXRlRGVmYXVsdFBvcnQpOworICAgIH0KKworICAgIGdfb2JqZWN0
X3NldChHX09CSkVDVChjYW5kaWRhdGUpLCAidWZyYWciLCBnX29iamVjdF9nZXRfZGF0YShHX09C
SkVDVChzZXNzaW9uKSwgImljZS11ZnJhZyIpLAorICAgICAgICAicGFzc3dvcmQiLCBnX29iamVj
dF9nZXRfZGF0YShHX09CSkVDVChzZXNzaW9uKSwgImljZS1wYXNzd29yZCIpLAorICAgICAgICBu
dWxscHRyKTsKKworICAgIG1lZGlhRW5kcG9pbnQtPmRpc3BhdGNoTmV3SWNlQ2FuZGlkYXRlKG1l
ZGlhRW5kcG9pbnQtPnNlc3Npb25NaWQoc2Vzc2lvbiksIFdURk1vdmUoaWNlQ2FuZGlkYXRlKSk7
CisKKyAgICBnX2ZyZWUoZm91bmRhdGlvbik7CisgICAgZ19mcmVlKGFkZHJlc3MpOworICAgIGdf
ZnJlZShyZWxhdGVkQWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbmRpZGF0ZUdhdGhlcmlu
Z0RvbmUoT3dyU2Vzc2lvbiogc2Vzc2lvbiwgTWVkaWFFbmRwb2ludE93ciogbWVkaWFFbmRwb2lu
dCkKK3sKKyAgICBtZWRpYUVuZHBvaW50LT5kaXNwYXRjaEdhdGhlcmluZ0RvbmUobWVkaWFFbmRw
b2ludC0+c2Vzc2lvbk1pZChzZXNzaW9uKSk7Cit9CisKK3N0YXRpYyB2b2lkIGljZUNvbm5lY3Rp
b25TdGF0ZUNoYW5nZShPd3JTZXNzaW9uKiBzZXNzaW9uLCBHUGFyYW1TcGVjKiwgTWVkaWFFbmRw
b2ludE93ciogbWVkaWFFbmRwb2ludCkKK3sKKyAgICBtZWRpYUVuZHBvaW50LT5wcm9jZXNzSWNl
VHJhbnNwb3J0U3RhdGVDaGFuZ2Uoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIGdvdEluY29t
aW5nU291cmNlKE93ck1lZGlhU2Vzc2lvbiogbWVkaWFTZXNzaW9uLCBPd3JNZWRpYVNvdXJjZSog
c291cmNlLCBNZWRpYUVuZHBvaW50T3dyKiBtZWRpYUVuZHBvaW50KQoreworICAgIG1lZGlhRW5k
cG9pbnQtPnVubXV0ZVJlbW90ZVNvdXJjZShtZWRpYUVuZHBvaW50LT5zZXNzaW9uTWlkKE9XUl9T
RVNTSU9OKG1lZGlhU2Vzc2lvbikpLCBzb3VyY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX1JUQykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9NZWRpYUVuZHBv
aW50T3dyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxZDE5MgotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL29wZW53
ZWJydGMvTWVkaWFFbmRwb2ludE93ci5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE1LCAyMDE2IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAg
ICBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEVyaWNzc29uIG5vciB0
aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaWYgRU5BQkxFKFdFQl9SVEMpCisKKyNpbmNsdWRlICJNZWRpYUVuZHBv
aW50LmgiCisjaW5jbHVkZSA8b3dyL293cl9tZWRpYV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8b3dy
L293cl90cmFuc3BvcnRfYWdlbnQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBQZWVy
TWVkaWFEZXNjcmlwdGlvbjsKK2NsYXNzIFJlYWx0aW1lTWVkaWFTb3VyY2VPd3I7CitjbGFzcyBS
VENDb25maWd1cmF0aW9uUHJpdmF0ZTsKKworY2xhc3MgT3dyVHJhbnNjZWl2ZXIgOiBwdWJsaWMg
UmVmQ291bnRlZDxPd3JUcmFuc2NlaXZlcj4geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8T3dy
VHJhbnNjZWl2ZXI+IGNyZWF0ZShjb25zdCBTdHJpbmcmIG1pZCwgT3dyU2Vzc2lvbiogc2Vzc2lv
bikKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IE93clRyYW5zY2VpdmVyKG1p
ZCwgc2Vzc2lvbikpOworICAgIH0KKyAgICB2aXJ0dWFsIH5Pd3JUcmFuc2NlaXZlcigpIHsgfQor
CisgICAgY29uc3QgU3RyaW5nJiBtaWQoKSBjb25zdCB7IHJldHVybiBtX21pZDsgfQorICAgIE93
clNlc3Npb24qIHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3Nlc3Npb247IH0KKworICAgIE93
ckljZVN0YXRlIG93ckljZVN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9vd3JJY2VTdGF0ZTsgfQor
ICAgIHZvaWQgc2V0T3dySWNlU3RhdGUoT3dySWNlU3RhdGUgc3RhdGUpIHsgbV9vd3JJY2VTdGF0
ZSA9IHN0YXRlOyB9CisKKyAgICBib29sIGdvdEVuZE9mUmVtb3RlQ2FuZGlkYXRlcygpIGNvbnN0
IHsgcmV0dXJuIG1fZ290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzOyB9CisgICAgdm9pZCBtYXJrR290
RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKCkgeyBtX2dvdEVuZE9mUmVtb3RlQ2FuZGlkYXRlcyA9IHRy
dWU7IH0KKworcHJpdmF0ZToKKyAgICBPd3JUcmFuc2NlaXZlcihjb25zdCBTdHJpbmcmIG1pZCwg
T3dyU2Vzc2lvbiogc2Vzc2lvbikKKyAgICAgICAgOiBtX21pZChtaWQpCisgICAgICAgICwgbV9z
ZXNzaW9uKHNlc3Npb24pCisgICAgeyB9CisKKyAgICBTdHJpbmcgbV9taWQ7CisgICAgT3dyU2Vz
c2lvbiogbV9zZXNzaW9uOworCisgICAgT3dySWNlU3RhdGUgbV9vd3JJY2VTdGF0ZSB7IE9XUl9J
Q0VfU1RBVEVfRElTQ09OTkVDVEVEIH07CisgICAgYm9vbCBtX2dvdEVuZE9mUmVtb3RlQ2FuZGlk
YXRlcyB7IGZhbHNlIH07Cit9OworCitjbGFzcyBNZWRpYUVuZHBvaW50T3dyIDogcHVibGljIE1l
ZGlhRW5kcG9pbnQgeworcHVibGljOgorICAgIE1lZGlhRW5kcG9pbnRPd3IoTWVkaWFFbmRwb2lu
dENsaWVudCYpOworICAgIH5NZWRpYUVuZHBvaW50T3dyKCk7CisKKyAgICB2b2lkIHNldENvbmZp
Z3VyYXRpb24oUmVmUHRyPE1lZGlhRW5kcG9pbnRDb25maWd1cmF0aW9uPiYmKSBvdmVycmlkZTsK
KworICAgIHZvaWQgZ2VuZXJhdGVEdGxzSW5mbygpIG92ZXJyaWRlOworICAgIE1lZGlhUGF5bG9h
ZFZlY3RvciBnZXREZWZhdWx0QXVkaW9QYXlsb2FkcygpIG92ZXJyaWRlOworICAgIE1lZGlhUGF5
bG9hZFZlY3RvciBnZXREZWZhdWx0VmlkZW9QYXlsb2FkcygpIG92ZXJyaWRlOworICAgIE1lZGlh
UGF5bG9hZFZlY3RvciBmaWx0ZXJQYXlsb2Fkcyhjb25zdCBNZWRpYVBheWxvYWRWZWN0b3ImIHJl
bW90ZVBheWxvYWRzLCBjb25zdCBNZWRpYVBheWxvYWRWZWN0b3ImIGRlZmF1bHRQYXlsb2Fkcykg
b3ZlcnJpZGU7CisKKyAgICBVcGRhdGVSZXN1bHQgdXBkYXRlUmVjZWl2ZUNvbmZpZ3VyYXRpb24o
TWVkaWFFbmRwb2ludFNlc3Npb25Db25maWd1cmF0aW9uKiwgYm9vbCBpc0luaXRpYXRvcikgb3Zl
cnJpZGU7CisgICAgVXBkYXRlUmVzdWx0IHVwZGF0ZVNlbmRDb25maWd1cmF0aW9uKE1lZGlhRW5k
cG9pbnRTZXNzaW9uQ29uZmlndXJhdGlvbiosIGNvbnN0IFJlYWx0aW1lTWVkaWFTb3VyY2VNYXAm
LCBib29sIGlzSW5pdGlhdG9yKSBvdmVycmlkZTsKKworICAgIHZvaWQgYWRkUmVtb3RlQ2FuZGlk
YXRlKEljZUNhbmRpZGF0ZSYsIGNvbnN0IFN0cmluZyYgbWlkLCBjb25zdCBTdHJpbmcmIHVmcmFn
LCBjb25zdCBTdHJpbmcmIHBhc3N3b3JkKSBvdmVycmlkZTsKKworICAgIFJlZjxSZWFsdGltZU1l
ZGlhU291cmNlPiBjcmVhdGVNdXRlZFJlbW90ZVNvdXJjZShjb25zdCBTdHJpbmcmIG1pZCwgUmVh
bHRpbWVNZWRpYVNvdXJjZTo6VHlwZSkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXBsYWNlTXV0ZWRS
ZW1vdGVTb3VyY2VNaWQoY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJikgZmluYWw7CisgICAg
dm9pZCByZXBsYWNlU2VuZFNvdXJjZShSZWFsdGltZU1lZGlhU291cmNlJiwgY29uc3QgU3RyaW5n
JiBtaWQpIG92ZXJyaWRlOworCisgICAgdm9pZCBzdG9wKCkgb3ZlcnJpZGU7CisKKyAgICBzaXpl
X3QgdHJhbnNjZWl2ZXJJbmRleEZvclNlc3Npb24oT3dyU2Vzc2lvbiopIGNvbnN0OworICAgIGNv
bnN0IFN0cmluZyYgc2Vzc2lvbk1pZChPd3JTZXNzaW9uKikgY29uc3Q7CisgICAgT3dyVHJhbnNj
ZWl2ZXIqIG1hdGNoVHJhbnNjZWl2ZXJCeU1pZChjb25zdCBTdHJpbmcmIG1pZCkgY29uc3Q7CisK
KyAgICB2b2lkIGRpc3BhdGNoTmV3SWNlQ2FuZGlkYXRlKGNvbnN0IFN0cmluZyYgbWlkLCBSZWZQ
dHI8SWNlQ2FuZGlkYXRlPiYmKTsKKyAgICB2b2lkIGRpc3BhdGNoR2F0aGVyaW5nRG9uZShjb25z
dCBTdHJpbmcmIG1pZCk7CisgICAgdm9pZCBwcm9jZXNzSWNlVHJhbnNwb3J0U3RhdGVDaGFuZ2Uo
T3dyU2Vzc2lvbiopOworICAgIHZvaWQgZGlzcGF0Y2hEdGxzRmluZ2VycHJpbnQoZ2NoYXIqIHBy
aXZhdGVLZXksIGdjaGFyKiBjZXJ0aWZpY2F0ZSwgY29uc3QgU3RyaW5nJiBmaW5nZXJwcmludCwg
Y29uc3QgU3RyaW5nJiBmaW5nZXJwcmludEZ1bmN0aW9uKTsKKyAgICB2b2lkIHVubXV0ZVJlbW90
ZVNvdXJjZShjb25zdCBTdHJpbmcmIG1pZCwgT3dyTWVkaWFTb3VyY2UqKTsKKworcHJpdmF0ZToK
KyAgICBlbnVtIFNlc3Npb25UeXBlIHsgU2Vzc2lvblR5cGVNZWRpYSB9OworCisgICAgc3RydWN0
IFRyYW5zY2VpdmVyQ29uZmlnIHsKKyAgICAgICAgU2Vzc2lvblR5cGUgdHlwZTsKKyAgICAgICAg
Ym9vbCBpc0R0bHNDbGllbnQ7CisgICAgICAgIFN0cmluZyBtaWQ7CisgICAgfTsKKworICAgIHZv
aWQgcHJlcGFyZVNlc3Npb24oT3dyU2Vzc2lvbiosIFBlZXJNZWRpYURlc2NyaXB0aW9uKik7Cisg
ICAgdm9pZCBwcmVwYXJlTWVkaWFTZXNzaW9uKE93ck1lZGlhU2Vzc2lvbiosIFBlZXJNZWRpYURl
c2NyaXB0aW9uKiwgYm9vbCBpc0luaXRpYXRvcik7CisKKyAgICB2b2lkIGVuc3VyZVRyYW5zcG9y
dEFnZW50QW5kVHJhbnNjZWl2ZXJzKGJvb2wgaXNJbml0aWF0b3IsIGNvbnN0IFZlY3RvcjxUcmFu
c2NlaXZlckNvbmZpZz4mIHRyYW5zY2VpdmVyQ29uZmlncyk7CisgICAgdm9pZCBpbnRlcm5hbEFk
ZFJlbW90ZUNhbmRpZGF0ZShPd3JTZXNzaW9uKiwgSWNlQ2FuZGlkYXRlJiwgY29uc3QgU3RyaW5n
JiB1ZnJhZywgY29uc3QgU3RyaW5nJiBwYXNzd29yZCk7CisKKyAgICBSZWZQdHI8TWVkaWFFbmRw
b2ludENvbmZpZ3VyYXRpb24+IG1fY29uZmlndXJhdGlvbjsKKyAgICBHUmVnZXgqIG1faGVscGVy
U2VydmVyUmVnRXg7CisKKyAgICBPd3JUcmFuc3BvcnRBZ2VudCogbV90cmFuc3BvcnRBZ2VudDsK
KyAgICBWZWN0b3I8UmVmUHRyPE93clRyYW5zY2VpdmVyPj4gbV90cmFuc2NlaXZlcnM7CisgICAg
SGFzaE1hcDxTdHJpbmcsIFJlZlB0cjxSZWFsdGltZU1lZGlhU291cmNlT3dyPj4gbV9tdXRlZFJl
bW90ZVNvdXJjZXM7CisKKyAgICBNZWRpYUVuZHBvaW50Q2xpZW50JiBtX2NsaWVudDsKKworICAg
IHVuc2lnbmVkIG1fbnVtYmVyT2ZSZWNlaXZlUHJlcGFyZWRTZXNzaW9uczsKKyAgICB1bnNpZ25l
ZCBtX251bWJlck9mU2VuZFByZXBhcmVkU2Vzc2lvbnM7CisKKyAgICBTdHJpbmcgbV9kdGxzUHJp
dmF0ZUtleTsKKyAgICBTdHJpbmcgbV9kdGxzQ2VydGlmaWNhdGU7Cit9OworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX1JUQykKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvUmVhbHRpbWVNZWRp
YVNvdXJjZU93ci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3Blbndl
YnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmgKaW5kZXggZDI0YjA2NS4uODY5NWM3YiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9S
ZWFsdGltZU1lZGlhU291cmNlT3dyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVk
aWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmgKQEAgLTU0LDYgKzU0
LDggQEAgUmVhbHRpbWVNZWRpYVNvdXJjZU93cihPd3JNZWRpYVNvdXJjZSogbWVkaWFTb3VyY2Us
IGNvbnN0IFN0cmluZyYgaWQsIFJlYWx0aW1lTWUKICAgICA6IFJlYWx0aW1lTWVkaWFTb3VyY2Uo
aWQsIHR5cGUsIG5hbWUpCiAgICAgLCBtX21lZGlhU291cmNlKG1lZGlhU291cmNlKQogICAgIHsK
KyAgICAgICAgaWYgKCFtZWRpYVNvdXJjZSkKKyAgICAgICAgICAgIG1fbXV0ZWQgPSB0cnVlOwog
ICAgIH0KIAogUmVhbHRpbWVNZWRpYVNvdXJjZU93cihjb25zdCBTdHJpbmcmIGlkLCBSZWFsdGlt
ZU1lZGlhU291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFtZSkKQEAgLTY0LDYgKzY2
LDEyIEBAIFJlYWx0aW1lTWVkaWFTb3VyY2VPd3IoY29uc3QgU3RyaW5nJiBpZCwgUmVhbHRpbWVN
ZWRpYVNvdXJjZTo6VHlwZSB0eXBlLCBjb25zdCBTCiAKICAgICB2aXJ0dWFsIH5SZWFsdGltZU1l
ZGlhU291cmNlT3dyKCkgeyB9CiAKKyAgICB2b2lkIHN3YXBPdXRTaGFsbG93U291cmNlKE93ck1l
ZGlhU291cmNlJiByZWFsU291cmNlKQorICAgIHsKKyAgICAgICAgbV9tZWRpYVNvdXJjZSA9ICZy
ZWFsU291cmNlOworICAgICAgICBzZXRNdXRlZChmYWxzZSk7CisgICAgfQorCiAgICAgdmlydHVh
bCBSZWZQdHI8UmVhbHRpbWVNZWRpYVNvdXJjZUNhcGFiaWxpdGllcz4gY2FwYWJpbGl0aWVzKCkg
eyByZXR1cm4gbV9jYXBhYmlsaXRpZXM7IH0KICAgICB2aXJ0dWFsIGNvbnN0IFJlYWx0aW1lTWVk
aWFTb3VyY2VTZXR0aW5ncyYgc2V0dGluZ3MoKSB7IHJldHVybiBtX2N1cnJlbnRTZXR0aW5nczsg
fQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>292334</attachid>
            <date>2016-10-21 02:00:55 -0700</date>
            <delta_ts>2016-10-21 03:23:09 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>add-media-endpoint-owr_2.patch</filename>
            <type>text/plain</type>
            <size>52347</size>
            <attacher name="Adam Bergkvist">adam.bergkvist</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4MDEwZWNjLi4xNmUwMWM3
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTYtMTAtMTkgIEFkYW0gQmVyZ2t2aXN0ICA8YWRhbS5iZXJna3Zpc3RAZXJpY3Nzb24uY29t
PgorCisgICAgICAgIFdlYlJUQzogW0dUS10gQWRkIE1lZGlhRW5kcG9pbnRPd3IgLSBhbiBPcGVu
V2ViUlRDIFdlYlJUQyBiYWNrZW5kCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNjMzMjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBBZGQgbWFudWFsIFdlYlJUQyB0ZXN0LiBUZXN0IGZlYXR1cmVzOgorICAg
ICAgICAtIFR3byBSVENQZWVyQ29ubmVjdGlvbiBpbnN0YW5jZXMgY29tbXVuaWNhdGUgaW4gYSBz
aW5nbGUgYnJvd3NlciB0YWIuCisgICAgICAgIC0gU3VwcG9ydHMgc2V0dGluZyB1cCBiaWRpcmVj
dGlvbmFsIG1lZGlhIHdpdGggYSBzaW5nbGUgU0RQIGRpYWxvZywgYXMKKyAgICAgICAgICB3ZWxs
IGFzIG9uZSBkaXJlY3Rpb24gYXQgYSB0aW1lLgorICAgICAgICAtIFN0cmlwcyB2ZW5kb3IgcHJl
Zml4ZXMgKHJ1bnMgaW4gQ2hyb21lIGFuZCBGaXJlZm94IGFzIHdlbGwpCisgICAgICAgIC0gU3Vw
cG9ydHMgbW9kZXJuIGFzIHdlbGwgYXMgbGVnYWN5IEFQSXMgKG1haW5seSB0byBtYWtlIHRoZSB0
ZXN0IHJ1bgorICAgICAgICAgIGluIENocm9tZSkKKworICAgICAgICAqIE1hbnVhbFRlc3RzL3dl
YnJ0Yy1vbmUtdGFiLXAycC5odG1sOiBBZGRlZC4KKwogMjAxNi0xMC0xMCAgWmFuIERvYmVyc2Vr
ICA8emRvYmVyc2VrQGlnYWxpYS5jb20+CiAKICAgICAgICAgQWRkIEVOQUJMRV9FTkNSWVBURURf
TUVESUEgY29uZmlndXJhdGlvbiBvcHRpb24KZGlmZiAtLWdpdCBhL01hbnVhbFRlc3RzL3dlYnJ0
Yy1vbmUtdGFiLXAycC5odG1sIGIvTWFudWFsVGVzdHMvd2VicnRjLW9uZS10YWItcDJwLmh0bWwK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmNzlmZAotLS0gL2Rldi9udWxs
CisrKyBiL01hbnVhbFRlc3RzL3dlYnJ0Yy1vbmUtdGFiLXAycC5odG1sCkBAIC0wLDAgKzEsMzQ0
IEBACis8IWRvY3R5cGUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+T25lIHRhYiBwMnA8
L3RpdGxlPgorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIHZpZGVvIHsgd2lkdGg6IDI0
MHB4OyBoZWlnaHQ6IDE2MHB4OyBib3JkZXI6IGJsYWNrIDFweCBkYXNoZWQ7IH0KKyAgICBpbnB1
dCB7IG1hcmdpbjogMnB4IH0KKzwvc3R5bGU+CisKKzxzY3JpcHQ+CisvLyBNYWtlIHVzZSBvZiBw
cmVmaXhlZCBBUElzIHRvIHJ1biB0aGlzIHRlc3QgaW4gQ2hyb21lIGFuZCBGaXJlZm94CitzZWxm
LlJUQ1BlZXJDb25uZWN0aW9uID0gc2VsZi5SVENQZWVyQ29ubmVjdGlvbiB8fCBzZWxmLndlYmtp
dFJUQ1BlZXJDb25uZWN0aW9uIHx8IHNlbGYubW96UlRDUGVlckNvbm5lY3Rpb247CituYXZpZ2F0
b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLmdldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3Iud2Vi
a2l0R2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWE7CisKK2xldCBsZWdh
Y3lDaGVja0JveDsKK2xldCBjbG9zZUJ1dHRvbjsKK2xldCBwY0E7CitsZXQgcGNCOworbGV0IGxv
Y2FsU3RyZWFtOworCitjb25zdCBwY05hbWVzID0geworICAgIGZpcnN0OiAiQSIsCisgICAgc2Vj
b25kOiAiQiIKK307CisKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgYW4gZW1w
dHkgY29uZmlndXJhdGlvbiAoYnVnOiBodHRwOi8vd2Via2l0Lm9yZy9iLzE1ODkzNikKK2NvbnN0
IGNvbmZpZ3VyYXRpb24gPSB7ICJpY2VTZXJ2ZXJzIjogW3sgInVybHMiOiAic3R1bjptbXQtc3R1
bi52ZXJrc3RhZC5uZXQiIH1dIH07CisKK2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNv
bnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7CisgICAgbGVnYWN5Q2hlY2tCb3ggPSBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjbGVnYWN5X2NoZWNrIik7CisgICAgY29uc3QgYXVkaW9DaGVja0Jv
eCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhdWRpb19jaGVjayIpOworICAgIGNvbnN0IHZp
ZGVvQ2hlY2tCb3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdmlkZW9fY2hlY2siKTsKKwor
ICAgIGNvbnN0IHN0YXJ0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3N0YXJ0X2J1
dCIpOworICAgIGNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Nsb3NlX2J1
dCIpOworCisgICAgY29uc3QgdGVzdEJ1dHRvbnMgPSB7CisgICAgICAgICJzaW5nbGUiOiBkb2N1
bWVudC5xdWVyeVNlbGVjdG9yKCIjc2luZ2xlX2J1dCIpLAorICAgICAgICAibWVkaWFBdG9CIjog
ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI21lZGlhX0FfdG9fQl9idXQiKSwKKyAgICAgICAgIm1l
ZGlhQnRvQSI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtZWRpYV9CX3RvX0FfYnV0IikKKyAg
ICB9OworCisgICAgZnVuY3Rpb24gc2V0VGVzdEJ1dHRvbnNEaXNhYmxlZChpc0Rpc2FibGVkKSB7
CisgICAgICAgIGZvciAobGV0IHAgaW4gdGVzdEJ1dHRvbnMpCisgICAgICAgICAgICB0ZXN0QnV0
dG9uc1twXS5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CisgICAgfQorCisgICAgc3RhcnRCdXR0b24u
b25jbGljayA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSh7
CisgICAgICAgICAgICAiYXVkaW8iOiBhdWRpb0NoZWNrQm94LmNoZWNrZWQsCisgICAgICAgICAg
ICAidmlkZW8iOiB2aWRlb0NoZWNrQm94LmNoZWNrZWQKKyAgICAgICAgfSwgZnVuY3Rpb24gKHN0
cmVhbSkgeworICAgICAgICAgICAgYXVkaW9DaGVja0JveC5kaXNhYmxlZCA9IHZpZGVvQ2hlY2tC
b3guZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgbG9jYWxTdHJlYW0gPSBzdHJlYW07Cisg
ICAgICAgICAgICBzdGFydEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzZXRU
ZXN0QnV0dG9uc0Rpc2FibGVkKGZhbHNlKTsKKyAgICAgICAgfSwgbG9nRXJyb3IpOworICAgIH07
CisKKyAgICBjbG9zZUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBl
dnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgY29uc29sZS5sb2coIkNsb3Npbmci
KTsKKyAgICAgICAgcGNBLmNsb3NlKCk7CisgICAgICAgIHBjQi5jbG9zZSgpOworICAgICAgICBw
Y0EgPSBudWxsOworICAgICAgICBwY0IgPSBudWxsOworCisgICAgICAgIHNldFRlc3RCdXR0b25z
RGlzYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHRlc3RCdXR0b25zLnNpbmdsZS5vbmNsaWNr
ID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUp
OworICAgICAgICBnZXRUZXN0RnVuY3Rpb24oInNpbmdsZURpYWxvZyIpKCk7CisgICAgfQorCisg
ICAgdGVzdEJ1dHRvbnMubWVkaWFBdG9CLm9uY2xpY2sgPSBmdW5jdGlvbiAoZXZ0KSB7CisgICAg
ICAgIHNldFRlc3RCdXR0b25zRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIGlmICghcGNBKQorICAg
ICAgICAgICAgY29tbW9uU2V0dXAoKTsKKyAgICAgICAgZ2V0VGVzdEZ1bmN0aW9uKCJhZGRPbmVX
YXlNZWRpYSIpKHBjQSwgcGNCLCB0ZXN0QnV0dG9ucy5tZWRpYUJ0b0EpOworICAgIH0KKworICAg
IHRlc3RCdXR0b25zLm1lZGlhQnRvQS5vbmNsaWNrID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAg
ICBzZXRUZXN0QnV0dG9uc0Rpc2FibGVkKHRydWUpOworICAgICAgICBpZiAoIXBjQSkKKyAgICAg
ICAgICAgIGNvbW1vblNldHVwKCk7CisgICAgICAgIGdldFRlc3RGdW5jdGlvbigiYWRkT25lV2F5
TWVkaWEiKShwY0IsIHBjQSwgdGVzdEJ1dHRvbnMubWVkaWFBdG9CKTsKKyAgICB9Cit9KTsKKwor
ZnVuY3Rpb24gZ2V0VGVzdEZ1bmN0aW9uKG5hbWUpIHsKKyAgICBjb25zdCBmdW5jdGlvbk5hbWUg
PSBsZWdhY3lDaGVja0JveC5jaGVja2VkID8gbmFtZSA6IGAke25hbWV9UHJvbWlzZWA7CisgICAg
cmV0dXJuIHNlbGZbZnVuY3Rpb25OYW1lXTsKK30KKworZnVuY3Rpb24gc2luZ2xlRGlhbG9nKCkg
eworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0obG9jYWxTdHJlYW0sIGRv
Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAgIHBjQS5hZGRTdHJlYW0o
bG9jYWxTdHJlYW0pOworCisgICAgcGNBLmNyZWF0ZU9mZmVyKGZ1bmN0aW9uIChvZmZlcikgewor
ICAgICAgICBwY0Euc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgb2ZmZXJUb0IocGNBLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dF
cnJvcik7CisgICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Iob2ZmZXIp
IHsKKyAgICAgICAgbG9nU2lnbmFsbGluZyhvZmZlciwgcGNBLCBwY0IpOworICAgICAgICBwY0Iu
c2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGFk
ZFN0b3JlZENhbmRpZGF0ZXMocGNCKTsKKyAgICAgICAgICAgIHJlbmRlclN0cmVhbShsb2NhbFN0
cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlbGZfdmlld0IiKSk7CisgICAgICAgICAg
ICBwY0IuYWRkU3RyZWFtKGxvY2FsU3RyZWFtKTsKKworICAgICAgICAgICAgcGNCLmNyZWF0ZUFu
c3dlcihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAgICAgICAgICAgcGNCLnNldExvY2FsRGVz
Y3JpcHRpb24oYW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dl
clRvQShwY0IubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9BKGFuc3dlcikgeworICAgICAgICBsb2dTaWduYWxs
aW5nKGFuc3dlciwgcGNCLCBwY0EpOworICAgICAgICBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
YW5zd2VyLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiSW5pdGlhdG9y
IGdvdCBhbnN3ZXIsIE8vQSBkaWFsb2cgY29tcGxldGVkIik7CisgICAgICAgICAgICBhZGRTdG9y
ZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgICAgICBjbG9zZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAgfQorfQorCitmdW5jdGlvbiBzaW5nbGVE
aWFsb2dQcm9taXNlKCkgeworICAgIGNvbW1vblNldHVwKCk7CisKKyAgICByZW5kZXJTdHJlYW0o
bG9jYWxTdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxmX3ZpZXdBIikpOworICAg
IGxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4geworICAgICAgICBwY0Eu
YWRkVHJhY2sodHJhY2ssIGxvY2FsU3RyZWFtKTsKKyAgICB9KTsKKworICAgIHBjQS5jcmVhdGVP
ZmZlcigpLnRoZW4oZnVuY3Rpb24gKG9mZmVyKSB7CisgICAgICAgIHJldHVybiBwY0Euc2V0TG9j
YWxEZXNjcmlwdGlvbihvZmZlcik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIGxvZ1NpZ25hbGxpbmcocGNBLmxvY2FsRGVzY3JpcHRpb24sIHBjQSwgcGNCKTsKKyAg
ICAgICAgcmV0dXJuIHBjQi5zZXRSZW1vdGVEZXNjcmlwdGlvbihwY0EubG9jYWxEZXNjcmlwdGlv
bik7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgIGFkZFN0b3JlZENh
bmRpZGF0ZXMocGNCKTsKKyAgICAgICAgcmVuZGVyU3RyZWFtKGxvY2FsU3RyZWFtLCBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCIjc2VsZl92aWV3QiIpKTsKKyAgICAgICAgbG9jYWxTdHJlYW0uZ2V0
VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB7CisgICAgICAgICAgICBwY0IuYWRkVHJhY2sodHJh
Y2ssIGxvY2FsU3RyZWFtKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwY0IuY3JlYXRl
QW5zd2VyKCk7CisgICAgfSkKKyAgICAudGhlbihmdW5jdGlvbiAoYW5zd2VyKSB7CisgICAgICAg
IHJldHVybiBwY0Iuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpOworICAgIH0pCisgICAgLnRo
ZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWduYWxsaW5nKHBjQi5sb2NhbERlc2NyaXB0
aW9uLCBwY0IsIHBjQSk7CisgICAgICAgIHJldHVybiBwY0Euc2V0UmVtb3RlRGVzY3JpcHRpb24o
cGNCLmxvY2FsRGVzY3JpcHRpb24pOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgewor
ICAgICAgICBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjQSk7CisgICAgICAgIGNvbnNvbGUubG9nKCJJ
bml0aWF0b3IgZ290IGFuc3dlciwgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgY2xv
c2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAgIC5jYXRjaChsb2dFcnJvcik7
Cit9CisKK2Z1bmN0aW9uIGFkZE9uZVdheU1lZGlhKG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBj
b250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQu
cXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2ZmZXJpbmdQYy5uYW1lfWApKTsKKyAgICBvZmZl
cmluZ1BjLmFkZFN0cmVhbShsb2NhbFN0cmVhbSk7CisKKyAgICBvZmZlcmluZ1BjLmNyZWF0ZU9m
ZmVyKGZ1bmN0aW9uIChvZmZlcikgeworICAgICAgICBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24ob2ZmZXIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIG9mZmVyVG9BbnN3ZXJpbmdQ
YyhvZmZlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24pOworICAgICAgICB9LCBsb2dFcnJvcik7Cisg
ICAgfSwgbG9nRXJyb3IpOworCisgICAgZnVuY3Rpb24gb2ZmZXJUb0Fuc3dlcmluZ1BjKG9mZmVy
KSB7CisgICAgICAgIGxvZ1NpZ25hbGxpbmcob2ZmZXIsIG9mZmVyaW5nUGMsIGFuc3dlcmluZ1Bj
KTsKKyAgICAgICAgYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0ZXMoYW5zd2VyaW5nUGMpOwor
ICAgICAgICAgICAgYW5zd2VyaW5nUGMuY3JlYXRlQW5zd2VyKGZ1bmN0aW9uIChhbnN3ZXIpIHsK
KyAgICAgICAgICAgICAgICBhbnN3ZXJpbmdQYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlciwg
ZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICBhbnN3ZXJUb09mZmVyaW5nUGMoYW5z
d2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSwgbG9nRXJyb3Ip
OworICAgICAgICAgICAgfSwgbG9nRXJyb3IpOworICAgICAgICB9LCBsb2dFcnJvcik7CisgICAg
fQorCisgICAgZnVuY3Rpb24gYW5zd2VyVG9PZmZlcmluZ1BjKGFuc3dlcikgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlciwgYW5zd2VyaW5nUGMsIG9mZmVyaW5nUGMpOworICAgICAgICBv
ZmZlcmluZ1BjLnNldFJlbW90ZURlc2NyaXB0aW9uKGFuc3dlciwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIsIHNpbmdsZSB3
YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIGFkZFN0b3JlZENhbmRpZGF0
ZXMob2ZmZXJpbmdQYyk7CisgICAgICAgICAgICBjb250aW51ZUJ1dHRvbi5kaXNhYmxlZCA9IGZh
bHNlOworICAgICAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICAgICAg
fSwgbG9nRXJyb3IpOworICAgIH0KK30KKworZnVuY3Rpb24gYWRkT25lV2F5TWVkaWFQcm9taXNl
KG9mZmVyaW5nUGMsIGFuc3dlcmluZ1BjLCBjb250aW51ZUJ1dHRvbikgeworICAgIHJlbmRlclN0
cmVhbShsb2NhbFN0cmVhbSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3NlbGZfdmlldyR7b2Zm
ZXJpbmdQYy5uYW1lfWApKTsKKyAgICBsb2NhbFN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKHRy
YWNrID0+IHsKKyAgICAgICAgb2ZmZXJpbmdQYy5hZGRUcmFjayh0cmFjaywgbG9jYWxTdHJlYW0p
OworICAgIH0pOworCisgICAgb2ZmZXJpbmdQYy5jcmVhdGVPZmZlcigpLnRoZW4oZnVuY3Rpb24g
KG9mZmVyKSB7CisgICAgICAgIHJldHVybiBvZmZlcmluZ1BjLnNldExvY2FsRGVzY3JpcHRpb24o
b2ZmZXIpOworICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBsb2dTaWdu
YWxsaW5nKG9mZmVyaW5nUGMubG9jYWxEZXNjcmlwdGlvbiwgb2ZmZXJpbmdQYywgYW5zd2VyaW5n
UGMpOworICAgICAgICByZXR1cm4gYW5zd2VyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2Zm
ZXJpbmdQYy5sb2NhbERlc2NyaXB0aW9uKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0aW9uICgp
IHsKKyAgICAgICAgYWRkU3RvcmVkQ2FuZGlkYXRlcyhhbnN3ZXJpbmdQYyk7CisgICAgICAgIHJl
dHVybiBhbnN3ZXJpbmdQYy5jcmVhdGVBbnN3ZXIoKTsKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uIChhbnN3ZXIpIHsKKyAgICAgICAgcmV0dXJuIGFuc3dlcmluZ1BjLnNldExvY2FsRGVzY3Jp
cHRpb24oYW5zd2VyKQorICAgIH0pCisgICAgLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICBs
b2dTaWduYWxsaW5nKGFuc3dlcmluZ1BjLmxvY2FsRGVzY3JpcHRpb24sIGFuc3dlcmluZ1BjLCBv
ZmZlcmluZ1BjKTsKKyAgICAgICAgcmV0dXJuIG9mZmVyaW5nUGMuc2V0UmVtb3RlRGVzY3JpcHRp
b24oYW5zd2VyaW5nUGMubG9jYWxEZXNjcmlwdGlvbikKKyAgICB9KQorICAgIC50aGVuKGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgY29uc29sZS5sb2coIkluaXRpYXRvciBzaWRlIGdvdCBhbnN3ZXIs
IHNpbmdsZSB3YXkgTy9BIGRpYWxvZyBjb21wbGV0ZWQiKTsKKyAgICAgICAgYWRkU3RvcmVkQ2Fu
ZGlkYXRlcyhvZmZlcmluZ1BjKTsKKyAgICAgICAgY29udGludWVCdXR0b24uZGlzYWJsZWQgPSBm
YWxzZTsKKyAgICAgICAgY2xvc2VCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKyAgICB9KQorICAg
IC5jYXRjaChsb2dFcnJvcik7Cit9CisKK2Z1bmN0aW9uIGNvbW1vblNldHVwKCkgeworICAgIHBj
QSA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBwY0IgPSBuZXcg
UlRDUGVlckNvbm5lY3Rpb24oY29uZmlndXJhdGlvbik7CisKKyAgICBwY0EubmFtZSA9IHBjTmFt
ZXMuZmlyc3Q7CisgICAgcGNCLm5hbWUgPSBwY05hbWVzLnNlY29uZDsKKworICAgIHN5bWV0cmlj
U2V0dXAocGNBLCBwY0IpOworICAgIHN5bWV0cmljU2V0dXAocGNCLCBwY0EpOworfQorCitmdW5j
dGlvbiBhZGRTdG9yZWRDYW5kaWRhdGVzKHBjKSB7CisgICAgaWYgKCFwYy5zdG9yZWRDYW5kaWRh
dGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzLmZvckVhY2go
Y2FuZGlkYXRlID0+IHsKKyAgICAgICAgcGMuYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkuY2F0
Y2gobG9nRXJyb3IpOworICAgIH0pOworCisgICAgY29uc29sZS5sb2coYEFkZGVkICR7cGMuc3Rv
cmVkQ2FuZGlkYXRlcy5sZW5ndGh9IHN0b3JlZCBjYW5kaWRhdGVzIChhcnJpdmVkIGJlZm9yZSBy
ZW1vdGUgZGVzY3JpcHRpb24gd2FzIHNldClgKTsKKyAgICBwYy5zdG9yZWRDYW5kaWRhdGVzID0g
bnVsbDsKK30KKworZnVuY3Rpb24gc3ltZXRyaWNTZXR1cChwYywgb3RoZXJQYykgeworICAgIHBj
Lm9uaWNlY2FuZGlkYXRlID0gZnVuY3Rpb24gKGV2dCkgeworICAgICAgICBpZiAoZXZ0LmNhbmRp
ZGF0ZSkgeworICAgICAgICAgICAgbG9nU2lnbmFsbGluZyhldnQuY2FuZGlkYXRlLCBwYywgb3Ro
ZXJQYyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3RlIGRlc2NyaXB0aW9uIGlzbid0IHNl
dCB5ZXQsIHN0b3JlIHRoZSBjYW5kaWRhdGUKKyAgICAgICAgICAgIGlmICghb3RoZXJQYy5yZW1v
dGVEZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghb3RoZXJQYy5zdG9yZWRDYW5k
aWRhdGVzKQorICAgICAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMgPSBb
XTsKKyAgICAgICAgICAgICAgICBvdGhlclBjLnN0b3JlZENhbmRpZGF0ZXMucHVzaChldnQuY2Fu
ZGlkYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG90aGVyUGMuYWRk
SWNlQ2FuZGlkYXRlKGV2dC5jYW5kaWRhdGUpLmNhdGNoKGxvZ0Vycm9yKTsKKyAgICAgICAgfQor
ICAgIH07CisKKyAgICBwYy5vbmFkZHN0cmVhbSA9IGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAg
cmVuZGVyU3RyZWFtKGV2dC5zdHJlYW0sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNyZW1vdGVf
dmlldyR7cGMubmFtZX1gKSk7CisgICAgfTsKK30KKworZnVuY3Rpb24gcmVuZGVyU3RyZWFtKHN0
cmVhbSwgdmlkZW8pIHsKKyAgICBpZiAodHlwZW9mIHZpZGVvLnNyY09iamVjdCAhPT0gInVuZGVm
aW5lZCIpCisgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTsKKyAgICBlbHNlCisgICAg
ICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTsKK30KKworZnVuY3Rp
b24gbG9nU2lnbmFsbGluZyhtc2csIGZyb21QYywgdG9QYykgeworICAgIGNvbnN0IHR5cGUgPSBt
c2cuY2FuZGlkYXRlID8gIkNhbmRpZGF0ZSIgOiBtc2cudHlwZS5yZXBsYWNlKC9eW2Etel0vLCBz
ID0+IHMudG9VcHBlckNhc2UoKSk7CisgICAgbGV0IGhlYWRlciA9IGAke3R5cGV9IGA7CisgICAg
aGVhZGVyICs9IGZyb21QYy5uYW1lID09IHBjTmFtZXMuZmlyc3QgPyBgJHtmcm9tUGMubmFtZX0g
LT4gJHt0b1BjLm5hbWV9YCA6IGAke3RvUGMubmFtZX0gPC0gJHtmcm9tUGMubmFtZX1gOworICAg
IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoaGVhZGVyKTsKKyAgICBjb25zb2xlLmxvZyhtc2cuY2Fu
ZGlkYXRlIHx8IG1zZy5zZHApOworICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKK30KKworZnVuY3Rp
b24gbG9nRXJyb3IoZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgaWYgKGVycm9y
Lm5hbWUgfHwgZXJyb3IubWVzc2FnZSkKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGxvZ0Vy
cm9yOiAke2Vycm9yLm5hbWUgfHwgIi0ifTogJHtlcnJvci5tZXNzYWdlIHx8ICItIn1gKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgY29uc29sZS5lcnJvcihgbG9nRXJyb3I6ICR7ZXJyb3J9
YCk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnNvbGUuZXJyb3IoImxvZ0Vycm9yOiAobm8gZXJy
b3IgbWVzc2FnZSkiKTsKK30KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKzxoMz5PbmUg
VGFiIFAyUCAtIFRlc3QgRGlmZmVyZW50IFNpZ25hbGluZyBTY2hlbWFzPC9oMz4KKzxwPkNsaWNr
IHN0YXJ0IHRvIHJlcXVlc3QgdXNlciBtZWRpYS4gVGhlIHNhbWUgc3RyZWFtIGlzIHNlbnQgaW4g
Ym90aCBkaXJlY3Rpb25zIHNvIGEgc3VjY2Vzc2Z1bAorYmlkaXJlY3Rpb25hbCBtZWRpYSBzZXR1
cCBzaG93cyB0aGUgc2FtZSBvdXRwdXQgaW4gYWxsIGZvdXIgdmlkZW8gZWxlbWVudHMuIE9wZW4g
Y29uc29sZSB0byB2aWV3CitzaWduYWxpbmcgZGV0YWlscy4gU29tZSBicm93c2VycyBvbmx5IGFs
bG93IGFjY2VzcyB0byB1c2VyIG1lZGlhIHZpYSBhIHNlY3VyZSBvcmlnaW4gKGUuZy4KK2xvY2Fs
aG9zdCkuPC9wPgorPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ibGVnYWN5X2NoZWNrIj5Vc2Ug
TGVnYWN5IEFQSXMgKENocm9tZSBjb21wYXRpYmxlKTxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2Jv
eCIgaWQ9ImF1ZGlvX2NoZWNrIj5BdWRpbzxicj4KKzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9
InZpZGVvX2NoZWNrIiBjaGVja2VkPlZpZGVvPGJyPgorCis8aW5wdXQgdHlwZT0iYnV0dG9uIiBp
ZD0ic3RhcnRfYnV0IiB2YWx1ZT0iU3RhcnQiPgorPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNs
b3NlX2J1dCIgdmFsdWU9IkNsb3NlIENvbm5lY3Rpb25zIiBkaXNhYmxlZD4KKzxicj4KK1NldHVw
IGJpZGlyZWN0aW9uYWwgbWVkaWE6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzaW5nbGVfYnV0
IiB2YWx1ZT0iU2luZ2xlIFNEUCBkaWFsb2ciIGRpc2FibGVkPgorPGJyPgorU2V0dXAgbWVkaWEg
aW4gb25lIGRpcmVjdGlvbiBhdCBhIHRpbWU6IDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJtZWRp
YV9BX3RvX0JfYnV0IiB2YWx1ZT0iTWVkaWEgQSB0byBCIiBkaXNhYmxlZD4KKzxpbnB1dCB0eXBl
PSJidXR0b24iIGlkPSJtZWRpYV9CX3RvX0FfYnV0IiB2YWx1ZT0iTWVkaWEgQiB0byBBIiBkaXNh
YmxlZD4KKzxicj4KKworPHRhYmxlPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkxvY2FsIChBKTwv
dGQ+PHRkPlJlbW90ZSAoQSk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+
PHZpZGVvIGlkPSJzZWxmX3ZpZXdBIiBhdXRvcGxheSBtdXRlZD48L3ZpZGVvPjwvdGQ+CisgICAg
ICAgIDx0ZD48dmlkZW8gaWQ9InJlbW90ZV92aWV3QSIgYXV0b3BsYXk+PC92aWRlbz48L3RkPgor
ICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+TG9jYWwgKEIpPC90ZD48dGQ+UmVtb3Rl
IChCKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dmlkZW8gaWQ9InNl
bGZfdmlld0IiIGF1dG9wbGF5IG11dGVkPjwvdmlkZW8+PC90ZD4KKyAgICAgICAgPHRkPjx2aWRl
byBpZD0icmVtb3RlX3ZpZXdCIiBhdXRvcGxheT48L3ZpZGVvPjwvdGQ+CisgICAgPC90cj4KKzwv
dGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DTWFr
ZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDk4ODIxOWYu
LjEzYTU4ZWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CisrKyBi
L1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0yMzA2LDcgKzIzMDYsNiBAQCBzZXQo
V2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2xh
dGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwCiAKICAgICBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRp
YUNvbnN0cmFpbnRzLmNwcAotICAgIHBsYXRmb3JtL21lZGlhc3RyZWFtL01lZGlhRW5kcG9pbnQu
Y3BwCiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFFbmRwb2ludENvbmZpZ3VyYXRpb24u
Y3BwCiAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1Qcml2YXRlLmNwcAogICAg
IHBsYXRmb3JtL21lZGlhc3RyZWFtL01lZGlhU3RyZWFtVHJhY2tQcml2YXRlLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDQ4ZDBlMzAuLmE5NDJjYTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw3MiBAQAorMjAx
Ni0xMC0xOSAgQWRhbSBCZXJna3Zpc3QgIDxhZGFtLmJlcmdrdmlzdEBlcmljc3Nvbi5jb20+CisK
KyAgICAgICAgV2ViUlRDOiBbR1RLXSBBZGQgTWVkaWFFbmRwb2ludE93ciAtIGFuIE9wZW5XZWJS
VEMgV2ViUlRDIGJhY2tlbmQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE2MzMyNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIEFkZCBNZWRpYUVuZHBvaW50T3dyIHdoaWNoIGlzIGEgTWVkaWFFbmRwb2ludCBp
bXBsZW1lbnRhdGlvbiAoV2ViUlRDIGJhY2tlbmQpIGJhc2VkIG9uCisgICAgICAgIE9wZW5XZWJS
VEMgWzFdLiBUaGUgV2ViUlRDIGJhY2tlbmQgY2FuIGJlIHRlc3RlZCB3aXRoIGEgbWFudWFsIHRl
c3QuIEF1dG9tYXRpYyB0ZXN0aW5nCisgICAgICAgIGlzIHN0aWxsIGRvbmUgd2l0aCBNb2NrTWVk
aWFFbmRwb2ludC4KKworICAgICAgICBbMV0gaHR0cDovL3d3dy5vcGVud2VicnRjLm9yZy8KKwor
ICAgICAgICBUZXN0aW5nOiBBZGRlZCBtYW51YWwgdGVzdCAod2VicnRjLW9uZS10YWItcDJwLmh0
bWwpCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBwbGF0Zm9ybS9HU3Ry
ZWFtZXIuY21ha2U6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9N
ZWRpYUVuZHBvaW50T3dyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVNZWRp
YUVuZHBvaW50T3dyKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6Ok1lZGlh
RW5kcG9pbnRPd3IpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6fk1lZGlh
RW5kcG9pbnRPd3IpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6c2V0Q29u
ZmlndXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpjcnlwdG9EYXRhQ2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6Z2VuZXJhdGVEdGxzSW5mbyk6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0QXVkaW9QYXlsb2Fkcyk6
CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0VmlkZW9QYXls
b2Fkcyk6CisgICAgICAgIChXZWJDb3JlOjpwYXlsb2Fkc0NvbnRhaW5UeXBlKToKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmZpbHRlclBheWxvYWRzKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OnVwZGF0ZVJlY2VpdmVDb25maWd1cmF0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OmZpbmRSdHhQYXlsb2FkKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlh
RW5kcG9pbnRPd3I6OnVwZGF0ZVNlbmRDb25maWd1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6
Ok1lZGlhRW5kcG9pbnRPd3I6OmFkZFJlbW90ZUNhbmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpNZWRpYUVuZHBvaW50T3dyOjpyZXBsYWNlTXV0ZWRSZW1vdGVTb3VyY2VNaWQpOgorICAgICAg
ICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6Y3JlYXRlTXV0ZWRSZW1vdGVTb3VyY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6cmVwbGFjZVNlbmRTb3VyY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6c3RvcCk6CisgICAgICAgIChXZWJD
b3JlOjpNZWRpYUVuZHBvaW50T3dyOjp0cmFuc2NlaXZlckluZGV4Rm9yU2Vzc2lvbik6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpzZXNzaW9uTWlkKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6Om1hdGNoVHJhbnNjZWl2ZXJCeU1pZCk6CisgICAgICAg
IChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpkaXNwYXRjaE5ld0ljZUNhbmRpZGF0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpkaXNwYXRjaEdhdGhlcmluZ0RvbmUp
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbmRwb2ludE93cjo6cHJvY2Vzc0ljZVRyYW5zcG9y
dFN0YXRlQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmRpc3Bh
dGNoRHRsc0ZpbmdlcnByaW50KToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6
OnVubXV0ZVJlbW90ZVNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dy
OjpwcmVwYXJlU2Vzc2lvbik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVuZHBvaW50T3dyOjpw
cmVwYXJlTWVkaWFTZXNzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6OnBhcnNlSGVscGVyU2VydmVy
VXJsKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRPd3I6OmVuc3VyZVRyYW5zcG9y
dEFnZW50QW5kVHJhbnNjZWl2ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhRW5kcG9pbnRP
d3I6OmludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmdvdENh
bmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpjYW5kaWRhdGVHYXRoZXJpbmdEb25lKToKKyAg
ICAgICAgKFdlYkNvcmU6OmljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSk6CisgICAgICAgIChXZWJD
b3JlOjpnb3RJbmNvbWluZ1NvdXJjZSk6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0v
b3BlbndlYnJ0Yy9NZWRpYUVuZHBvaW50T3dyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
T3dyVHJhbnNjZWl2ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpPd3JUcmFuc2NlaXZl
cjo6fk93clRyYW5zY2VpdmVyKToKKyAgICAgICAgKFdlYkNvcmU6Ok93clRyYW5zY2VpdmVyOjpt
aWQpOgorICAgICAgICAoV2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6OnNlc3Npb24pOgorICAgICAg
ICAoV2ViQ29yZTo6T3dyVHJhbnNjZWl2ZXI6Om93ckljZVN0YXRlKToKKyAgICAgICAgKFdlYkNv
cmU6Ok93clRyYW5zY2VpdmVyOjpzZXRPd3JJY2VTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpP
d3JUcmFuc2NlaXZlcjo6Z290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKToKKyAgICAgICAgKFdlYkNv
cmU6Ok93clRyYW5zY2VpdmVyOjptYXJrR290RW5kT2ZSZW1vdGVDYW5kaWRhdGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok93clRyYW5zY2VpdmVyOjpPd3JUcmFuc2NlaXZlcik6CisgICAgICAgICog
cGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmg6
CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZU1lZGlhU291cmNlT3dyOjpSZWFsdGltZU1lZGlh
U291cmNlT3dyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lTWVkaWFTb3VyY2VPd3I6OnN3
YXBPdXRTaGFsbG93U291cmNlKToKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGFuIGluaXRpYWxs
eSBtdXRlZCBzb3VyY2UuIFRoaXMgaXMgdXNlZCBmb3IgZWFybHkKKyAgICAgICAgY3JlYXRpb24g
b2YgcmVtb3RlIHNvdXJjZXMuCisKIDIwMTYtMTAtMTAgIFphbiBEb2JlcnNlayAgPHpkb2JlcnNl
a0BpZ2FsaWEuY29tPgogCiAgICAgICAgIEFkZCBFTkFCTEVfRU5DUllQVEVEX01FRElBIGNvbmZp
Z3VyYXRpb24gb3B0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3Ry
ZWFtZXIuY21ha2UgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9HU3RyZWFtZXIuY21ha2UKaW5k
ZXggMDMxYzlmMS4uMzdmZWQ2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
R1N0cmVhbWVyLmNtYWtlCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0dTdHJlYW1lci5j
bWFrZQpAQCAtMTQsNiArMTQsNyBAQCBpZiAoRU5BQkxFX01FRElBX1NUUkVBTSkKICAgICBsaXN0
KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVh
bWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lck93ci5jcHAKIAorICAgICAgICBwbGF0Zm9y
bS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuY3BwCiAgICAgICAgIHBs
YXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvT3BlbldlYlJUQ1V0aWxpdGllcy5jcHAKICAg
ICAgICAgcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3BlbndlYnJ0Yy9SZWFsdGltZU1lZGlhU291cmNl
Q2VudGVyT3dyLmNwcAogICAgICkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzExNjQKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01l
ZGlhRW5kcG9pbnRPd3IuY3BwCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE1LCAyMDE2IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0
cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEVyaWNzc29uIG5vciB0aGUgbmFt
ZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfUlRDKQorI2luY2x1ZGUgIk1lZGlhRW5kcG9p
bnRPd3IuaCIKKworI2luY2x1ZGUgIk1lZGlhRW5kcG9pbnRTZXNzaW9uQ29uZmlndXJhdGlvbi5o
IgorI2luY2x1ZGUgIk1lZGlhUGF5bG9hZC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CisjaW5jbHVkZSAiT3BlbldlYlJUQ1V0aWxpdGllcy5oIgorI2luY2x1ZGUgIlJlYWx0aW1lTWVk
aWFTb3VyY2VPd3IuaCIKKyNpbmNsdWRlIDxvd3Ivb3dyLmg+CisjaW5jbHVkZSA8b3dyL293cl9h
dWRpb19wYXlsb2FkLmg+CisjaW5jbHVkZSA8b3dyL293cl9jcnlwdG9fdXRpbHMuaD4KKyNpbmNs
dWRlIDxvd3Ivb3dyX21lZGlhX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxvd3Ivb3dyX3RyYW5zcG9y
dF9hZ2VudC5oPgorI2luY2x1ZGUgPG93ci9vd3JfdmlkZW9fcGF5bG9hZC5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9p
ZCBnb3RDYW5kaWRhdGUoT3dyU2Vzc2lvbiosIE93ckNhbmRpZGF0ZSosIE1lZGlhRW5kcG9pbnRP
d3IqKTsKK3N0YXRpYyB2b2lkIGNhbmRpZGF0ZUdhdGhlcmluZ0RvbmUoT3dyU2Vzc2lvbiosIE1l
ZGlhRW5kcG9pbnRPd3IqKTsKK3N0YXRpYyB2b2lkIGljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShP
d3JTZXNzaW9uKiwgR1BhcmFtU3BlYyosIE1lZGlhRW5kcG9pbnRPd3IqKTsKK3N0YXRpYyB2b2lk
IGdvdEluY29taW5nU291cmNlKE93ck1lZGlhU2Vzc2lvbiosIE93ck1lZGlhU291cmNlKiwgTWVk
aWFFbmRwb2ludE93ciopOworCitzdGF0aWMgY29uc3QgVmVjdG9yPFN0cmluZz4gY2FuZGlkYXRl
VHlwZXMgPSB7ICJob3N0IiwgInNyZmx4IiwgInByZmx4IiwgInJlbGF5IiB9Oworc3RhdGljIGNv
bnN0IFZlY3RvcjxTdHJpbmc+IGNhbmRpZGF0ZVRjcFR5cGVzID0geyAiIiwgImFjdGl2ZSIsICJw
YXNzaXZlIiwgInNvIiB9Oworc3RhdGljIGNvbnN0IFZlY3RvcjxTdHJpbmc+IGNvZGVjVHlwZXMg
PSB7ICJOT05FIiwgIlBDTVUiLCAiUENNQSIsICJPUFVTIiwgIkgyNjQiLCAiVlA4IiB9OworCitz
dGF0aWMgY29uc3QgY2hhciogaGVscGVyU2VydmVyUmVnRXggPSAiKHR1cm58c3R1bik6KFtcXHdc
XC5cXC1dK3xcXFtbXFx3XFw6XStcXF0pKDpcXGQrKT8oXFw/LispPyI7CisKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBzaG9ydCBoZWxwZXJTZXJ2ZXJEZWZhdWx0UG9ydCA9IDM0Nzg7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgc2hvcnQgY2FuZGlkYXRlRGVmYXVsdFBvcnQgPSA5OworCitzdGF0aWMg
c3RkOjp1bmlxdWVfcHRyPE1lZGlhRW5kcG9pbnQ+IGNyZWF0ZU1lZGlhRW5kcG9pbnRPd3IoTWVk
aWFFbmRwb2ludENsaWVudCYgY2xpZW50KQoreworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8
TWVkaWFFbmRwb2ludD4obmV3IE1lZGlhRW5kcG9pbnRPd3IoY2xpZW50KSk7Cit9CisKK0NyZWF0
ZU1lZGlhRW5kcG9pbnQgTWVkaWFFbmRwb2ludDo6Y3JlYXRlID0gY3JlYXRlTWVkaWFFbmRwb2lu
dE93cjsKKworTWVkaWFFbmRwb2ludE93cjo6TWVkaWFFbmRwb2ludE93cihNZWRpYUVuZHBvaW50
Q2xpZW50JiBjbGllbnQpCisgICAgOiBtX3RyYW5zcG9ydEFnZW50KG51bGxwdHIpCisgICAgLCBt
X2NsaWVudChjbGllbnQpCisgICAgLCBtX251bWJlck9mUmVjZWl2ZVByZXBhcmVkU2Vzc2lvbnMo
MCkKKyAgICAsIG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRTZXNzaW9ucygwKQoreworICAgIGluaXRp
YWxpemVPcGVuV2ViUlRDKCk7CisKKyAgICBHUmVnZXhDb21waWxlRmxhZ3MgY29tcGlsZUZsYWdz
ID0gR19SRUdFWF9KQVZBU0NSSVBUX0NPTVBBVDsKKyAgICBHUmVnZXhNYXRjaEZsYWdzIG1hdGNo
RmxhZ3MgPSBzdGF0aWNfY2FzdDxHUmVnZXhNYXRjaEZsYWdzPigwKTsKKyAgICBtX2hlbHBlclNl
cnZlclJlZ0V4ID0gZ19yZWdleF9uZXcoaGVscGVyU2VydmVyUmVnRXgsIGNvbXBpbGVGbGFncywg
bWF0Y2hGbGFncywgbnVsbHB0cik7Cit9CisKK01lZGlhRW5kcG9pbnRPd3I6On5NZWRpYUVuZHBv
aW50T3dyKCkKK3sKKyAgICBzdG9wKCk7CisKKyAgICBnX3JlZ2V4X3VucmVmKG1faGVscGVyU2Vy
dmVyUmVnRXgpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnNldENvbmZpZ3VyYXRpb24o
UmVmUHRyPE1lZGlhRW5kcG9pbnRDb25maWd1cmF0aW9uPiYmIGNvbmZpZ3VyYXRpb24pCit7Cisg
ICAgbV9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKK30KKworc3RhdGljIHZvaWQgY3J5
cHRvRGF0YUNhbGxiYWNrKGdjaGFyKiBwcml2YXRlS2V5LCBnY2hhciogY2VydGlmaWNhdGUsIGdj
aGFyKiBmaW5nZXJwcmludCwgZ2NoYXIqIGZpbmdlcnByaW50RnVuY3Rpb24sIGdwb2ludGVyIGRh
dGEpCit7CisgICAgTWVkaWFFbmRwb2ludE93ciogbWVkaWFFbmRwb2ludCA9IChNZWRpYUVuZHBv
aW50T3dyKikgZGF0YTsKKyAgICBtZWRpYUVuZHBvaW50LT5kaXNwYXRjaER0bHNGaW5nZXJwcmlu
dChnX3N0cmR1cChwcml2YXRlS2V5KSwgZ19zdHJkdXAoY2VydGlmaWNhdGUpLCBTdHJpbmcoZmlu
Z2VycHJpbnQpLCBTdHJpbmcoZmluZ2VycHJpbnRGdW5jdGlvbikpOworfQorCit2b2lkIE1lZGlh
RW5kcG9pbnRPd3I6OmdlbmVyYXRlRHRsc0luZm8oKQoreworICAgIG93cl9jcnlwdG9fY3JlYXRl
X2NyeXB0b19kYXRhKGNyeXB0b0RhdGFDYWxsYmFjaywgdGhpcyk7Cit9CisKK01lZGlhUGF5bG9h
ZFZlY3RvciBNZWRpYUVuZHBvaW50T3dyOjpnZXREZWZhdWx0QXVkaW9QYXlsb2FkcygpCit7Cisg
ICAgTWVkaWFQYXlsb2FkVmVjdG9yIHBheWxvYWRzOworCisgICAgLy8gRklYTUU6IFRoaXMgbGlz
dCBzaG91bGQgYmUgYmFzZWQgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gdGhlIHBsYXRmb3JtIChi
dWc6IGh0dHA6Ly93ZWJraXQub3JnL2IvMTYzNzIzKQorICAgIFJlZlB0cjxNZWRpYVBheWxvYWQ+
IHBheWxvYWQgPSBNZWRpYVBheWxvYWQ6OmNyZWF0ZSgpOworICAgIHBheWxvYWQtPnNldFR5cGUo
MTExKTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGluZ05hbWUoIk9QVVMiKTsKKyAgICBwYXlsb2Fk
LT5zZXRDbG9ja1JhdGUoNDgwMDApOworICAgIHBheWxvYWQtPnNldENoYW5uZWxzKDIpOworICAg
IHBheWxvYWRzLmFwcGVuZChwYXlsb2FkKTsKKworICAgIHBheWxvYWQgPSBNZWRpYVBheWxvYWQ6
OmNyZWF0ZSgpOworICAgIHBheWxvYWQtPnNldFR5cGUoOCk7CisgICAgcGF5bG9hZC0+c2V0RW5j
b2RpbmdOYW1lKCJQQ01BIik7CisgICAgcGF5bG9hZC0+c2V0Q2xvY2tSYXRlKDgwMDApOworICAg
IHBheWxvYWQtPnNldENoYW5uZWxzKDEpOworICAgIHBheWxvYWRzLmFwcGVuZChwYXlsb2FkKTsK
KworICAgIHBheWxvYWQgPSBNZWRpYVBheWxvYWQ6OmNyZWF0ZSgpOworICAgIHBheWxvYWQtPnNl
dFR5cGUoMCk7CisgICAgcGF5bG9hZC0+c2V0RW5jb2RpbmdOYW1lKCJQQ01VIik7CisgICAgcGF5
bG9hZC0+c2V0Q2xvY2tSYXRlKDgwMDApOworICAgIHBheWxvYWQtPnNldENoYW5uZWxzKDEpOwor
ICAgIHBheWxvYWRzLmFwcGVuZChwYXlsb2FkKTsKKworICAgIHJldHVybiBwYXlsb2FkczsKK30K
KworTWVkaWFQYXlsb2FkVmVjdG9yIE1lZGlhRW5kcG9pbnRPd3I6OmdldERlZmF1bHRWaWRlb1Bh
eWxvYWRzKCkKK3sKKyAgICBNZWRpYVBheWxvYWRWZWN0b3IgcGF5bG9hZHM7CisKKyAgICAvLyBG
SVhNRTogVGhpcyBsaXN0IHNob3VsZCBiZSBiYXNlZCBvbiB3aGF0IGlzIGF2YWlsYWJsZSBpbiB0
aGUgcGxhdGZvcm0gKGJ1ZzogaHR0cDovL3dlYmtpdC5vcmcvYi8xNjM3MjMpCisgICAgUmVmUHRy
PE1lZGlhUGF5bG9hZD4gcGF5bG9hZCA9IE1lZGlhUGF5bG9hZDo6Y3JlYXRlKCk7CisgICAgcGF5
bG9hZC0+c2V0VHlwZSgxMDMpOworICAgIHBheWxvYWQtPnNldEVuY29kaW5nTmFtZSgiSDI2NCIp
OworICAgIHBheWxvYWQtPnNldENsb2NrUmF0ZSg5MDAwMCk7CisgICAgcGF5bG9hZC0+c2V0Q2Nt
ZmlyKHRydWUpOworICAgIHBheWxvYWQtPnNldE5hY2twbGkodHJ1ZSk7CisgICAgcGF5bG9hZC0+
YWRkUGFyYW1ldGVyKCJwYWNrZXRpemF0aW9uTW9kZSIsIDEpOworICAgIHBheWxvYWRzLmFwcGVu
ZChwYXlsb2FkKTsKKworICAgIHBheWxvYWQgPSBNZWRpYVBheWxvYWQ6OmNyZWF0ZSgpOworICAg
IHBheWxvYWQtPnNldFR5cGUoMTAwKTsKKyAgICBwYXlsb2FkLT5zZXRFbmNvZGluZ05hbWUoIlZQ
OCIpOworICAgIHBheWxvYWQtPnNldENsb2NrUmF0ZSg5MDAwMCk7CisgICAgcGF5bG9hZC0+c2V0
Q2NtZmlyKHRydWUpOworICAgIHBheWxvYWQtPnNldE5hY2twbGkodHJ1ZSk7CisgICAgcGF5bG9h
ZC0+c2V0TmFjayh0cnVlKTsKKyAgICBwYXlsb2Fkcy5hcHBlbmQocGF5bG9hZCk7CisKKyAgICBw
YXlsb2FkID0gTWVkaWFQYXlsb2FkOjpjcmVhdGUoKTsKKyAgICBwYXlsb2FkLT5zZXRUeXBlKDEy
MCk7CisgICAgcGF5bG9hZC0+c2V0RW5jb2RpbmdOYW1lKCJSVFgiKTsKKyAgICBwYXlsb2FkLT5z
ZXRDbG9ja1JhdGUoOTAwMDApOworICAgIHBheWxvYWQtPmFkZFBhcmFtZXRlcigiYXB0IiwgMTAw
KTsKKyAgICBwYXlsb2FkLT5hZGRQYXJhbWV0ZXIoInJ0eFRpbWUiLCAyMDApOworICAgIHBheWxv
YWRzLmFwcGVuZChwYXlsb2FkKTsKKworICAgIHJldHVybiBwYXlsb2FkczsKK30KKworc3RhdGlj
IGJvb2wgcGF5bG9hZHNDb250YWluVHlwZShNZWRpYVBheWxvYWRWZWN0b3IgcGF5bG9hZHMsIHVu
c2lnbmVkIHBheWxvYWRUeXBlKQoreworICAgIGZvciAoYXV0byYgcGF5bG9hZCA6IHBheWxvYWRz
KSB7CisgICAgICAgIGlmIChwYXlsb2FkLT50eXBlKCkgPT0gcGF5bG9hZFR5cGUpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNZWRpYVBh
eWxvYWRWZWN0b3IgTWVkaWFFbmRwb2ludE93cjo6ZmlsdGVyUGF5bG9hZHMoY29uc3QgTWVkaWFQ
YXlsb2FkVmVjdG9yJiByZW1vdGVQYXlsb2FkcywgY29uc3QgTWVkaWFQYXlsb2FkVmVjdG9yJiBk
ZWZhdWx0UGF5bG9hZHMpCit7CisgICAgTWVkaWFQYXlsb2FkVmVjdG9yIGZpbHRlcmVkUGF5bG9h
ZHM7CisKKyAgICBmb3IgKGF1dG8mIHJlbW90ZVBheWxvYWQgOiByZW1vdGVQYXlsb2Fkcykgewor
ICAgICAgICBNZWRpYVBheWxvYWQqIGRlZmF1bHRQYXlsb2FkID0gbnVsbHB0cjsKKyAgICAgICAg
Zm9yIChhdXRvJiBwIDogZGVmYXVsdFBheWxvYWRzKSB7CisgICAgICAgICAgICBpZiAocC0+ZW5j
b2RpbmdOYW1lKCkgPT0gcmVtb3RlUGF5bG9hZC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVND
SUlVcHBlcmNhc2UoKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRQYXlsb2FkID0gcC5nZXQo
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICBpZiAoIWRlZmF1bHRQYXlsb2FkKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgaWYgKGRlZmF1bHRQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuY29udGFpbnMoInBhY2tldGl6YXRp
b25Nb2RlIikgJiYgcmVtb3RlUGF5bG9hZC0+cGFyYW1ldGVycygpLmNvbnRhaW5zKCJwYWNrZXRp
emF0aW9uTW9kZSIpCisgICAgICAgICAgICAmJiAoZGVmYXVsdFBheWxvYWQtPnBhcmFtZXRlcnMo
KS5nZXQoInBhY2tldGl6YXRpb25Nb2RlIikgIT0gZGVmYXVsdFBheWxvYWQtPnBhcmFtZXRlcnMo
KS5nZXQoInBhY2tldGl6YXRpb25Nb2RlIikpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgZmlsdGVyZWRQYXlsb2Fkcy5hcHBlbmQocmVtb3RlUGF5bG9hZCk7CisgICAgfQorCisg
ICAgTWVkaWFQYXlsb2FkVmVjdG9yIGZpbHRlcmVkQXB0UGF5bG9hZHM7CisKKyAgICBmb3IgKGF1
dG8mIGZpbHRlcmVkUGF5bG9hZCA6IGZpbHRlcmVkUGF5bG9hZHMpIHsKKyAgICAgICAgaWYgKGZp
bHRlcmVkUGF5bG9hZC0+cGFyYW1ldGVycygpLmNvbnRhaW5zKCJhcHQiKSAmJiAoIXBheWxvYWRz
Q29udGFpblR5cGUoZmlsdGVyZWRQYXlsb2FkcywgZmlsdGVyZWRQYXlsb2FkLT5wYXJhbWV0ZXJz
KCkuZ2V0KCJhcHQiKSkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZpbHRlcmVk
QXB0UGF5bG9hZHMuYXBwZW5kKGZpbHRlcmVkUGF5bG9hZCk7CisgICAgfQorCisgICAgcmV0dXJu
IGZpbHRlcmVkQXB0UGF5bG9hZHM7Cit9CisKK01lZGlhRW5kcG9pbnQ6OlVwZGF0ZVJlc3VsdCBN
ZWRpYUVuZHBvaW50T3dyOjp1cGRhdGVSZWNlaXZlQ29uZmlndXJhdGlvbihNZWRpYUVuZHBvaW50
U2Vzc2lvbkNvbmZpZ3VyYXRpb24qIGNvbmZpZ3VyYXRpb24sIGJvb2wgaXNJbml0aWF0b3IpCit7
CisgICAgVmVjdG9yPFRyYW5zY2VpdmVyQ29uZmlnPiB0cmFuc2NlaXZlckNvbmZpZ3M7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gbV90cmFuc2NlaXZlcnMuc2l6ZSgpOyBpIDwgY29uZmlndXJhdGlv
bi0+bWVkaWFEZXNjcmlwdGlvbnMoKS5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFuc2NlaXZl
ckNvbmZpZyBjb25maWc7CisgICAgICAgIGNvbmZpZy50eXBlID0gU2Vzc2lvblR5cGVNZWRpYTsK
KyAgICAgICAgY29uZmlnLmlzRHRsc0NsaWVudCA9IGNvbmZpZ3VyYXRpb24tPm1lZGlhRGVzY3Jp
cHRpb25zKClbaV0tPmR0bHNTZXR1cCgpID09ICJhY3RpdmUiOworICAgICAgICBjb25maWcubWlk
ID0gY29uZmlndXJhdGlvbi0+bWVkaWFEZXNjcmlwdGlvbnMoKVtpXS0+bWlkKCk7CisgICAgICAg
IHRyYW5zY2VpdmVyQ29uZmlncy5hcHBlbmQoV1RGTW92ZShjb25maWcpKTsKKyAgICB9CisKKyAg
ICBlbnN1cmVUcmFuc3BvcnRBZ2VudEFuZFRyYW5zY2VpdmVycyhpc0luaXRpYXRvciwgdHJhbnNj
ZWl2ZXJDb25maWdzKTsKKworICAgIC8vIFByZXBhcmUgdGhlIG5ldyBzZXNzaW9ucy4KKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSBtX251bWJlck9mUmVjZWl2ZVByZXBhcmVkU2Vzc2lvbnM7IGkgPCBt
X3RyYW5zY2VpdmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBPd3JTZXNzaW9uKiBzZXNzaW9u
ID0gbV90cmFuc2NlaXZlcnNbaV0tPnNlc3Npb24oKTsKKyAgICAgICAgcHJlcGFyZU1lZGlhU2Vz
c2lvbihPV1JfTUVESUFfU0VTU0lPTihzZXNzaW9uKSwgY29uZmlndXJhdGlvbi0+bWVkaWFEZXNj
cmlwdGlvbnMoKVtpXS5nZXQoKSwgaXNJbml0aWF0b3IpOworICAgICAgICBvd3JfdHJhbnNwb3J0
X2FnZW50X2FkZF9zZXNzaW9uKG1fdHJhbnNwb3J0QWdlbnQsIHNlc3Npb24pOworICAgIH0KKwor
ICAgIG1fbnVtYmVyT2ZSZWNlaXZlUHJlcGFyZWRTZXNzaW9ucyA9IG1fdHJhbnNjZWl2ZXJzLnNp
emUoKTsKKworICAgIHJldHVybiBVcGRhdGVSZXN1bHQ6OlN1Y2Nlc3M7Cit9CisKK3N0YXRpYyBS
ZWZQdHI8TWVkaWFQYXlsb2FkPiBmaW5kUnR4UGF5bG9hZChNZWRpYVBheWxvYWRWZWN0b3IgcGF5
bG9hZHMsIHVuc2lnbmVkIGFwdCkKK3sKKyAgICBmb3IgKGF1dG8mIHBheWxvYWQgOiBwYXlsb2Fk
cykgeworICAgICAgICBpZiAocGF5bG9hZC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlV
cHBlcmNhc2UoKSA9PSAiUlRYIiAmJiBwYXlsb2FkLT5wYXJhbWV0ZXJzKCkuY29udGFpbnMoImFw
dCIpCisgICAgICAgICAgICAmJiAocGF5bG9hZC0+cGFyYW1ldGVycygpLmdldCgiYXB0IikgPT0g
YXB0KSkKKyAgICAgICAgICAgIHJldHVybiBwYXlsb2FkOworICAgIH0KKyAgICByZXR1cm4gbnVs
bHB0cjsKK30KKworTWVkaWFFbmRwb2ludDo6VXBkYXRlUmVzdWx0IE1lZGlhRW5kcG9pbnRPd3I6
OnVwZGF0ZVNlbmRDb25maWd1cmF0aW9uKE1lZGlhRW5kcG9pbnRTZXNzaW9uQ29uZmlndXJhdGlv
biogY29uZmlndXJhdGlvbiwgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZU1hcCYgc2VuZFNvdXJj
ZU1hcCwgYm9vbCBpc0luaXRpYXRvcikKK3sKKyAgICBWZWN0b3I8VHJhbnNjZWl2ZXJDb25maWc+
IHRyYW5zY2VpdmVyQ29uZmlnczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBtX3RyYW5zY2VpdmVy
cy5zaXplKCk7IGkgPCBjb25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0aW9ucygpLnNpemUoKTsg
KytpKSB7CisgICAgICAgIFRyYW5zY2VpdmVyQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgY29uZmln
LnR5cGUgPSBTZXNzaW9uVHlwZU1lZGlhOworICAgICAgICBjb25maWcuaXNEdGxzQ2xpZW50ID0g
Y29uZmlndXJhdGlvbi0+bWVkaWFEZXNjcmlwdGlvbnMoKVtpXS0+ZHRsc1NldHVwKCkgIT0gImFj
dGl2ZSI7CisgICAgICAgIGNvbmZpZy5taWQgPSBjb25maWd1cmF0aW9uLT5tZWRpYURlc2NyaXB0
aW9ucygpW2ldLT5taWQoKTsKKyAgICAgICAgdHJhbnNjZWl2ZXJDb25maWdzLmFwcGVuZChXVEZN
b3ZlKGNvbmZpZykpOworICAgIH0KKworICAgIGVuc3VyZVRyYW5zcG9ydEFnZW50QW5kVHJhbnNj
ZWl2ZXJzKGlzSW5pdGlhdG9yLCB0cmFuc2NlaXZlckNvbmZpZ3MpOworCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG1fdHJhbnNjZWl2ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIE93
clNlc3Npb24qIHNlc3Npb24gPSBtX3RyYW5zY2VpdmVyc1tpXS0+c2Vzc2lvbigpOworICAgICAg
ICBQZWVyTWVkaWFEZXNjcmlwdGlvbiYgbWRlc2MgPSAqY29uZmlndXJhdGlvbi0+bWVkaWFEZXNj
cmlwdGlvbnMoKVtpXTsKKworICAgICAgICBpZiAobWRlc2MudHlwZSgpID09ICJhdWRpbyIgfHwg
bWRlc2MudHlwZSgpID09ICJ2aWRlbyIpCisgICAgICAgICAgICBnX29iamVjdF9zZXQoc2Vzc2lv
biwgInJ0Y3AtbXV4IiwgbWRlc2MucnRjcE11eCgpLCBudWxscHRyKTsKKworICAgICAgICBpZiAo
bWRlc2MuaWNlQ2FuZGlkYXRlcygpLnNpemUoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBj
YW5kaWRhdGUgOiBtZGVzYy5pY2VDYW5kaWRhdGVzKCkpCisgICAgICAgICAgICAgICAgaW50ZXJu
YWxBZGRSZW1vdGVDYW5kaWRhdGUoc2Vzc2lvbiwgKmNhbmRpZGF0ZSwgbWRlc2MuaWNlVWZyYWco
KSwgbWRlc2MuaWNlUGFzc3dvcmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IG1f
bnVtYmVyT2ZTZW5kUHJlcGFyZWRTZXNzaW9ucykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmICghc2VuZFNvdXJjZU1hcC5jb250YWlucyhtZGVzYy5taWQoKSkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBNZWRpYVBheWxvYWQqIHBheWxvYWQgPSBudWxscHRy
OworICAgICAgICBmb3IgKGF1dG8mIHAgOiBtZGVzYy5wYXlsb2FkcygpKSB7CisgICAgICAgICAg
ICBpZiAocC0+ZW5jb2RpbmdOYW1lKCkuY29udmVydFRvQVNDSUlVcHBlcmNhc2UoKSAhPSAiUlRY
IikgeworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBwLmdldCgpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwYXlsb2Fk
KQorICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVJlc3VsdDo6RmFpbGVkOworCisgICAgICAgIFJl
ZlB0cjxNZWRpYVBheWxvYWQ+IHJ0eFBheWxvYWQgPSBmaW5kUnR4UGF5bG9hZChtZGVzYy5wYXls
b2FkcygpLCBwYXlsb2FkLT50eXBlKCkpOworICAgICAgICBSZWFsdGltZU1lZGlhU291cmNlT3dy
KiBzb3VyY2UgPSBzdGF0aWNfY2FzdDxSZWFsdGltZU1lZGlhU291cmNlT3dyKj4oc2VuZFNvdXJj
ZU1hcC5nZXQobWRlc2MubWlkKCkpKTsKKworICAgICAgICBBU1NFUlQoY29kZWNUeXBlcy5maW5k
KHBheWxvYWQtPmVuY29kaW5nTmFtZSgpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkpICE9IG5v
dEZvdW5kKTsKKyAgICAgICAgT3dyQ29kZWNUeXBlIGNvZGVjVHlwZSA9IHN0YXRpY19jYXN0PE93
ckNvZGVjVHlwZT4oY29kZWNUeXBlcy5maW5kKHBheWxvYWQtPmVuY29kaW5nTmFtZSgpLmNvbnZl
cnRUb0FTQ0lJVXBwZXJjYXNlKCkpKTsKKworICAgICAgICBPd3JQYXlsb2FkKiBzZW5kUGF5bG9h
ZDsKKyAgICAgICAgaWYgKG1kZXNjLnR5cGUoKSA9PSAiYXVkaW8iKQorICAgICAgICAgICAgc2Vu
ZFBheWxvYWQgPSBvd3JfYXVkaW9fcGF5bG9hZF9uZXcoY29kZWNUeXBlLCBwYXlsb2FkLT50eXBl
KCksIHBheWxvYWQtPmNsb2NrUmF0ZSgpLCBwYXlsb2FkLT5jaGFubmVscygpKTsKKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICBzZW5kUGF5bG9hZCA9IG93cl92aWRlb19wYXlsb2FkX25ldyhj
b2RlY1R5cGUsIHBheWxvYWQtPnR5cGUoKSwgcGF5bG9hZC0+Y2xvY2tSYXRlKCksIHBheWxvYWQt
PmNjbWZpcigpLCBwYXlsb2FkLT5uYWNrcGxpKCkpOworICAgICAgICAgICAgZ19vYmplY3Rfc2V0
KHNlbmRQYXlsb2FkLCAicnR4LXBheWxvYWQtdHlwZSIsIHJ0eFBheWxvYWQgPyBydHhQYXlsb2Fk
LT50eXBlKCkgOiAtMSwKKyAgICAgICAgICAgICAgICAicnR4LXRpbWUiLCBydHhQYXlsb2FkICYm
IHJ0eFBheWxvYWQtPnBhcmFtZXRlcnMoKS5jb250YWlucygicnR4VGltZSIpID8gcnR4UGF5bG9h
ZC0+cGFyYW1ldGVycygpLmdldCgicnR4VGltZSIpIDogMCwgbnVsbHB0cik7CisgICAgICAgIH0K
KworICAgICAgICBvd3JfbWVkaWFfc2Vzc2lvbl9zZXRfc2VuZF9wYXlsb2FkKE9XUl9NRURJQV9T
RVNTSU9OKHNlc3Npb24pLCBzZW5kUGF5bG9hZCk7CisgICAgICAgIG93cl9tZWRpYV9zZXNzaW9u
X3NldF9zZW5kX3NvdXJjZShPV1JfTUVESUFfU0VTU0lPTihzZXNzaW9uKSwgc291cmNlLT5tZWRp
YVNvdXJjZSgpKTsKKworICAgICAgICBtX251bWJlck9mU2VuZFByZXBhcmVkU2Vzc2lvbnMgPSBp
ICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gVXBkYXRlUmVzdWx0OjpTdWNjZXNzOworfQorCit2
b2lkIE1lZGlhRW5kcG9pbnRPd3I6OmFkZFJlbW90ZUNhbmRpZGF0ZShJY2VDYW5kaWRhdGUmIGNh
bmRpZGF0ZSwgY29uc3QgU3RyaW5nJiBtaWQsIGNvbnN0IFN0cmluZyYgdWZyYWcsIGNvbnN0IFN0
cmluZyYgcGFzc3dvcmQpCit7CisgICAgZm9yIChhdXRvJiB0cmFuc2NlaXZlciA6IG1fdHJhbnNj
ZWl2ZXJzKSB7CisgICAgICAgIGlmICh0cmFuc2NlaXZlci0+bWlkKCkgPT0gbWlkKSB7CisgICAg
ICAgICAgICBpbnRlcm5hbEFkZFJlbW90ZUNhbmRpZGF0ZSh0cmFuc2NlaXZlci0+c2Vzc2lvbigp
LCBjYW5kaWRhdGUsIHVmcmFnLCBwYXNzd29yZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjpyZXBsYWNlTXV0ZWRSZW1v
dGVTb3VyY2VNaWQoY29uc3QgU3RyaW5nJiBvbGRNaWQsIGNvbnN0IFN0cmluZyYgbmV3TWlkKQor
eworICAgIFJlZlB0cjxSZWFsdGltZU1lZGlhU291cmNlT3dyPiByZW1vdGVTb3VyY2UgPSBtX211
dGVkUmVtb3RlU291cmNlcy50YWtlKG9sZE1pZCk7CisgICAgbV9tdXRlZFJlbW90ZVNvdXJjZXMu
c2V0KG5ld01pZCwgcmVtb3RlU291cmNlKTsKK30KKworUmVmPFJlYWx0aW1lTWVkaWFTb3VyY2U+
IE1lZGlhRW5kcG9pbnRPd3I6OmNyZWF0ZU11dGVkUmVtb3RlU291cmNlKGNvbnN0IFN0cmluZyYg
bWlkLCBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlIHR5cGUpCit7CisgICAgU3RyaW5nIG5hbWU7
CisgICAgU3RyaW5nIGlkKCJub3QgdXNlZCIpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBSZWFsdGltZU1lZGlhU291cmNlOjpBdWRpbzogbmFtZSA9ICJyZW1vdGUgYXVkaW8iOyBi
cmVhazsKKyAgICBjYXNlIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlZpZGVvOiBuYW1lID0gInJlbW90
ZSB2aWRlbyI7IGJyZWFrOworICAgIGNhc2UgUmVhbHRpbWVNZWRpYVNvdXJjZTo6Tm9uZToKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgUmVmUHRyPFJlYWx0aW1l
TWVkaWFTb3VyY2VPd3I+IHNvdXJjZSA9IGFkb3B0UmVmKG5ldyBSZWFsdGltZU1lZGlhU291cmNl
T3dyKG51bGxwdHIsIGlkLCB0eXBlLCBuYW1lKSk7CisgICAgbV9tdXRlZFJlbW90ZVNvdXJjZXMu
c2V0KG1pZCwgc291cmNlKTsKKworICAgIHJldHVybiAqc291cmNlOworfQorCit2b2lkIE1lZGlh
RW5kcG9pbnRPd3I6OnJlcGxhY2VTZW5kU291cmNlKFJlYWx0aW1lTWVkaWFTb3VyY2UmIG5ld1Nv
dXJjZSwgY29uc3QgU3RyaW5nJiBtaWQpCit7CisgICAgVU5VU0VEX1BBUkFNKG5ld1NvdXJjZSk7
CisgICAgVU5VU0VEX1BBUkFNKG1pZCk7CisKKyAgICAvLyBGSVhNRTogV2Ugd2FudCB0byB1c2Ug
b3dyX21lZGlhX3Nlc3Npb25fc2V0X3NlbmRfc291cmNlIGhlcmUsIGJ1dCBpdCBkb2Vzbid0IHdv
cmsgYXMgaW50ZW5kZWQuCisgICAgLy8gSXNzdWUgdHJhY2tlZCBieSBPcGVuV2ViUlRDIGJ1Zzog
aHR0cHM6Ly9naXRodWIuY29tL0VyaWNzc29uUmVzZWFyY2gvb3BlbndlYnJ0Yy9pc3N1ZXMvNTMz
CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnN0
b3AoKQoreworICAgIGlmICghbV90cmFuc3BvcnRBZ2VudCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgZm9yIChhdXRvJiB0cmFuc2NlaXZlciA6IG1fdHJhbnNjZWl2ZXJzKQorICAgICAgICBvd3Jf
bWVkaWFfc2Vzc2lvbl9zZXRfc2VuZF9zb3VyY2UoT1dSX01FRElBX1NFU1NJT04odHJhbnNjZWl2
ZXItPnNlc3Npb24oKSksIG51bGxwdHIpOworCisgICAgZ19vYmplY3RfdW5yZWYobV90cmFuc3Bv
cnRBZ2VudCk7CisgICAgbV90cmFuc3BvcnRBZ2VudCA9IG51bGxwdHI7Cit9CisKK3NpemVfdCBN
ZWRpYUVuZHBvaW50T3dyOjp0cmFuc2NlaXZlckluZGV4Rm9yU2Vzc2lvbihPd3JTZXNzaW9uKiBz
ZXNzaW9uKSBjb25zdAoreworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3RyYW5zY2Vp
dmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobV90cmFuc2NlaXZlcnNbaV0tPnNlc3Np
b24oKSA9PSBzZXNzaW9uKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIG5vdEZvdW5kOworfQorCitjb25zdCBTdHJp
bmcmIE1lZGlhRW5kcG9pbnRPd3I6OnNlc3Npb25NaWQoT3dyU2Vzc2lvbiogc2Vzc2lvbikgY29u
c3QKK3sKKyAgICBzaXplX3QgaW5kZXggPSB0cmFuc2NlaXZlckluZGV4Rm9yU2Vzc2lvbihzZXNz
aW9uKTsKKyAgICByZXR1cm4gbV90cmFuc2NlaXZlcnNbaW5kZXhdLT5taWQoKTsKK30KKworT3dy
VHJhbnNjZWl2ZXIqIE1lZGlhRW5kcG9pbnRPd3I6Om1hdGNoVHJhbnNjZWl2ZXJCeU1pZChjb25z
dCBTdHJpbmcmIG1pZCkgY29uc3QKK3sKKyAgICBmb3IgKGF1dG8mIHRyYW5zY2VpdmVyIDogbV90
cmFuc2NlaXZlcnMpIHsKKyAgICAgICAgaWYgKHRyYW5zY2VpdmVyLT5taWQoKSA9PSBtaWQpCisg
ICAgICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBu
dWxscHRyOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoTmV3SWNlQ2FuZGlk
YXRlKGNvbnN0IFN0cmluZyYgbWlkLCBSZWZQdHI8SWNlQ2FuZGlkYXRlPiYmIGljZUNhbmRpZGF0
ZSkKK3sKKyAgICBtX2NsaWVudC5nb3RJY2VDYW5kaWRhdGUobWlkLCBXVEZNb3ZlKGljZUNhbmRp
ZGF0ZSkpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OmRpc3BhdGNoR2F0aGVyaW5nRG9u
ZShjb25zdCBTdHJpbmcmIG1pZCkKK3sKKyAgICBtX2NsaWVudC5kb25lR2F0aGVyaW5nQ2FuZGlk
YXRlcyhtaWQpOworfQorCit2b2lkIE1lZGlhRW5kcG9pbnRPd3I6OnByb2Nlc3NJY2VUcmFuc3Bv
cnRTdGF0ZUNoYW5nZShPd3JTZXNzaW9uKiBzZXNzaW9uKQoreworICAgIE93ckljZVN0YXRlIG93
ckljZVN0YXRlOworICAgIGdfb2JqZWN0X2dldChzZXNzaW9uLCAiaWNlLWNvbm5lY3Rpb24tc3Rh
dGUiLCAmb3dySWNlU3RhdGUsIG51bGxwdHIpOworCisgICAgT3dyVHJhbnNjZWl2ZXImIHRyYW5z
Y2VpdmVyID0gKm1fdHJhbnNjZWl2ZXJzW3RyYW5zY2VpdmVySW5kZXhGb3JTZXNzaW9uKHNlc3Np
b24pXTsKKyAgICBpZiAob3dySWNlU3RhdGUgPCB0cmFuc2NlaXZlci5vd3JJY2VTdGF0ZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICB0cmFuc2NlaXZlci5zZXRPd3JJY2VTdGF0ZShvd3JJY2VT
dGF0ZSk7CisKKyAgICAvLyBXZSBjYW5ub3QgZ28gdG8gQ29tcGxldGVkIGlmIHRoZXJlIG1heSBi
ZSBtb3JlIHJlbW90ZSBjYW5kaWRhdGVzLgorICAgIGlmIChvd3JJY2VTdGF0ZSA9PSBPV1JfSUNF
X1NUQVRFX1JFQURZICYmICF0cmFuc2NlaXZlci5nb3RFbmRPZlJlbW90ZUNhbmRpZGF0ZXMoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgTWVkaWFFbmRwb2ludDo6SWNlVHJhbnNwb3J0U3RhdGUg
dHJhbnNwb3J0U3RhdGU7CisgICAgc3dpdGNoIChvd3JJY2VTdGF0ZSkgeworICAgIGNhc2UgT1dS
X0lDRV9TVEFURV9DT05ORUNUSU5HOgorICAgICAgICB0cmFuc3BvcnRTdGF0ZSA9IE1lZGlhRW5k
cG9pbnQ6OkljZVRyYW5zcG9ydFN0YXRlOjpDaGVja2luZzsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBPV1JfSUNFX1NUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgdHJhbnNwb3J0U3RhdGUgPSBN
ZWRpYUVuZHBvaW50OjpJY2VUcmFuc3BvcnRTdGF0ZTo6Q29ubmVjdGVkOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIE9XUl9JQ0VfU1RBVEVfUkVBRFk6CisgICAgICAgIHRyYW5zcG9ydFN0YXRl
ID0gTWVkaWFFbmRwb2ludDo6SWNlVHJhbnNwb3J0U3RhdGU6OkNvbXBsZXRlZDsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBPV1JfSUNFX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgdHJhbnNwb3J0
U3RhdGUgPSBNZWRpYUVuZHBvaW50OjpJY2VUcmFuc3BvcnRTdGF0ZTo6RmFpbGVkOworICAgICAg
ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9j
bGllbnQuaWNlVHJhbnNwb3J0U3RhdGVDaGFuZ2VkKHRyYW5zY2VpdmVyLm1pZCgpLCB0cmFuc3Bv
cnRTdGF0ZSk7Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6ZGlzcGF0Y2hEdGxzRmluZ2Vy
cHJpbnQoZ2NoYXIqIHByaXZhdGVLZXksIGdjaGFyKiBjZXJ0aWZpY2F0ZSwgY29uc3QgU3RyaW5n
JiBmaW5nZXJwcmludCwgY29uc3QgU3RyaW5nJiBmaW5nZXJwcmludEZ1bmN0aW9uKQoreworICAg
IG1fZHRsc1ByaXZhdGVLZXkgPSBTdHJpbmcocHJpdmF0ZUtleSk7CisgICAgbV9kdGxzQ2VydGlm
aWNhdGUgPSBTdHJpbmcoY2VydGlmaWNhdGUpOworCisgICAgZ19mcmVlKHByaXZhdGVLZXkpOwor
ICAgIGdfZnJlZShjZXJ0aWZpY2F0ZSk7CisKKyAgICBtX2NsaWVudC5nb3REdGxzRmluZ2VycHJp
bnQoZmluZ2VycHJpbnQsIGZpbmdlcnByaW50RnVuY3Rpb24pOworfQorCit2b2lkIE1lZGlhRW5k
cG9pbnRPd3I6OnVubXV0ZVJlbW90ZVNvdXJjZShjb25zdCBTdHJpbmcmIG1pZCwgT3dyTWVkaWFT
b3VyY2UqIHJlYWxTb3VyY2UpCit7CisgICAgUmVmUHRyPFJlYWx0aW1lTWVkaWFTb3VyY2VPd3I+
IHJlbW90ZVNvdXJjZSA9IG1fbXV0ZWRSZW1vdGVTb3VyY2VzLnRha2UobWlkKTsKKyAgICBpZiAo
IXJlbW90ZVNvdXJjZSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIG11dGVk
IHJlbW90ZSBzb3VyY2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXJl
bW90ZVNvdXJjZS0+c3RvcHBlZCgpKQorICAgICAgICByZW1vdGVTb3VyY2UtPnN3YXBPdXRTaGFs
bG93U291cmNlKCpyZWFsU291cmNlKTsKK30KKwordm9pZCBNZWRpYUVuZHBvaW50T3dyOjpwcmVw
YXJlU2Vzc2lvbihPd3JTZXNzaW9uKiBzZXNzaW9uLCBQZWVyTWVkaWFEZXNjcmlwdGlvbiogbWVk
aWFEZXNjcmlwdGlvbikKK3sKKyAgICBnX29iamVjdF9zZXRfZGF0YV9mdWxsKEdfT0JKRUNUKHNl
c3Npb24pLCAiaWNlLXVmcmFnIiwgZ19zdHJkdXAobWVkaWFEZXNjcmlwdGlvbi0+aWNlVWZyYWco
KS5hc2NpaSgpLmRhdGEoKSksIGdfZnJlZSk7CisgICAgZ19vYmplY3Rfc2V0X2RhdGFfZnVsbChH
X09CSkVDVChzZXNzaW9uKSwgImljZS1wYXNzd29yZCIsIGdfc3RyZHVwKG1lZGlhRGVzY3JpcHRp
b24tPmljZVBhc3N3b3JkKCkuYXNjaWkoKS5kYXRhKCkpLCBnX2ZyZWUpOworCisgICAgZ19zaWdu
YWxfY29ubmVjdChzZXNzaW9uLCAib24tbmV3LWNhbmRpZGF0ZSIsIEdfQ0FMTEJBQ0soZ290Q2Fu
ZGlkYXRlKSwgdGhpcyk7CisgICAgZ19zaWduYWxfY29ubmVjdChzZXNzaW9uLCAib24tY2FuZGlk
YXRlLWdhdGhlcmluZy1kb25lIiwgR19DQUxMQkFDSyhjYW5kaWRhdGVHYXRoZXJpbmdEb25lKSwg
dGhpcyk7CisgICAgZ19zaWduYWxfY29ubmVjdChzZXNzaW9uLCAibm90aWZ5OjppY2UtY29ubmVj
dGlvbi1zdGF0ZSIsIEdfQ0FMTEJBQ0soaWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKSwgdGhpcyk7
Cit9CisKK3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6cHJlcGFyZU1lZGlhU2Vzc2lvbihPd3JNZWRp
YVNlc3Npb24qIG1lZGlhU2Vzc2lvbiwgUGVlck1lZGlhRGVzY3JpcHRpb24qIG1lZGlhRGVzY3Jp
cHRpb24sIGJvb2wgaXNJbml0aWF0b3IpCit7CisgICAgcHJlcGFyZVNlc3Npb24oT1dSX1NFU1NJ
T04obWVkaWFTZXNzaW9uKSwgbWVkaWFEZXNjcmlwdGlvbik7CisKKyAgICBib29sIHVzZVJ0Y3BN
dXggPSAhaXNJbml0aWF0b3IgJiYgbWVkaWFEZXNjcmlwdGlvbi0+cnRjcE11eCgpOworICAgIGdf
b2JqZWN0X3NldChtZWRpYVNlc3Npb24sICJydGNwLW11eCIsIHVzZVJ0Y3BNdXgsIG51bGxwdHIp
OworCisgICAgaWYgKCFtZWRpYURlc2NyaXB0aW9uLT5jbmFtZSgpLmlzRW1wdHkoKSAmJiBtZWRp
YURlc2NyaXB0aW9uLT5zc3JjcygpLnNpemUoKSkgeworICAgICAgICBnX29iamVjdF9zZXQobWVk
aWFTZXNzaW9uLCAiY25hbWUiLCBtZWRpYURlc2NyaXB0aW9uLT5jbmFtZSgpLmFzY2lpKCkuZGF0
YSgpLAorICAgICAgICAgICAgInNlbmQtc3NyYyIsIG1lZGlhRGVzY3JpcHRpb24tPnNzcmNzKClb
MF0sCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICB9CisKKyAgICBnX3NpZ25hbF9jb25uZWN0
KG1lZGlhU2Vzc2lvbiwgIm9uLWluY29taW5nLXNvdXJjZSIsIEdfQ0FMTEJBQ0soZ290SW5jb21p
bmdTb3VyY2UpLCB0aGlzKTsKKworICAgIGZvciAoYXV0byYgcGF5bG9hZCA6IG1lZGlhRGVzY3Jp
cHRpb24tPnBheWxvYWRzKCkpIHsKKyAgICAgICAgaWYgKHBheWxvYWQtPmVuY29kaW5nTmFtZSgp
LmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkgPT0gIlJUWCIpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBSZWZQdHI8TWVkaWFQYXlsb2FkPiBydHhQYXlsb2FkID0gZmluZFJ0eFBh
eWxvYWQobWVkaWFEZXNjcmlwdGlvbi0+cGF5bG9hZHMoKSwgcGF5bG9hZC0+dHlwZSgpKTsKKwor
ICAgICAgICBBU1NFUlQoY29kZWNUeXBlcy5maW5kKHBheWxvYWQtPmVuY29kaW5nTmFtZSgpKSAh
PSBub3RGb3VuZCk7CisgICAgICAgIE93ckNvZGVjVHlwZSBjb2RlY1R5cGUgPSBzdGF0aWNfY2Fz
dDxPd3JDb2RlY1R5cGU+KGNvZGVjVHlwZXMuZmluZChwYXlsb2FkLT5lbmNvZGluZ05hbWUoKS5j
b252ZXJ0VG9BU0NJSVVwcGVyY2FzZSgpKSk7CisKKyAgICAgICAgT3dyUGF5bG9hZCogcmVjZWl2
ZVBheWxvYWQ7CisgICAgICAgIGlmIChtZWRpYURlc2NyaXB0aW9uLT50eXBlKCkgPT0gImF1ZGlv
IikKKyAgICAgICAgICAgIHJlY2VpdmVQYXlsb2FkID0gb3dyX2F1ZGlvX3BheWxvYWRfbmV3KGNv
ZGVjVHlwZSwgcGF5bG9hZC0+dHlwZSgpLCBwYXlsb2FkLT5jbG9ja1JhdGUoKSwgcGF5bG9hZC0+
Y2hhbm5lbHMoKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVjZWl2ZVBheWxvYWQg
PSBvd3JfdmlkZW9fcGF5bG9hZF9uZXcoY29kZWNUeXBlLCBwYXlsb2FkLT50eXBlKCksIHBheWxv
YWQtPmNsb2NrUmF0ZSgpLCBwYXlsb2FkLT5jY21maXIoKSwgcGF5bG9hZC0+bmFja3BsaSgpKTsK
KyAgICAgICAgICAgIGdfb2JqZWN0X3NldChyZWNlaXZlUGF5bG9hZCwgInJ0eC1wYXlsb2FkLXR5
cGUiLCBydHhQYXlsb2FkID8gcnR4UGF5bG9hZC0+dHlwZSgpIDogLTEsCisgICAgICAgICAgICAg
ICAgInJ0eC10aW1lIiwgcnR4UGF5bG9hZCAmJiBydHhQYXlsb2FkLT5wYXJhbWV0ZXJzKCkuY29u
dGFpbnMoInJ0eFRpbWUiKSA/IHJ0eFBheWxvYWQtPnBhcmFtZXRlcnMoKS5nZXQoInJ0eFRpbWUi
KSA6IDAsIG51bGxwdHIpOworICAgICAgICB9CisKKyAgICAgICAgb3dyX21lZGlhX3Nlc3Npb25f
YWRkX3JlY2VpdmVfcGF5bG9hZChtZWRpYVNlc3Npb24sIHJlY2VpdmVQYXlsb2FkKTsKKyAgICB9
Cit9CisKK3N0cnVjdCBIZWxwZXJTZXJ2ZXJVcmwgeworICAgIFN0cmluZyBwcm90b2NvbDsKKyAg
ICBTdHJpbmcgaG9zdDsKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OworICAgIFN0cmluZyBxdWVy
eTsKK307CisKK3N0YXRpYyB2b2lkIHBhcnNlSGVscGVyU2VydmVyVXJsKEdSZWdleCYgcmVnZXgs
IGNvbnN0IFVSTCYgdXJsLCBIZWxwZXJTZXJ2ZXJVcmwmIG91dFVybCkKK3sKKyAgICBHTWF0Y2hJ
bmZvKiBtYXRjaEluZm87CisKKyAgICBpZiAoZ19yZWdleF9tYXRjaCgmcmVnZXgsIHVybC5zdHJp
bmcoKS5hc2NpaSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8R1JlZ2V4TWF0Y2hGbGFncz4oMCksICZt
YXRjaEluZm8pKSB7CisgICAgICAgIGdjaGFyKiogbWF0Y2hlcyA9ICBnX21hdGNoX2luZm9fZmV0
Y2hfYWxsKG1hdGNoSW5mbyk7CisgICAgICAgIGdpbnQgbWF0Y2hDb3VudCA9IGdfc3Rydl9sZW5n
dGgobWF0Y2hlcyk7CisKKyAgICAgICAgb3V0VXJsLnByb3RvY29sID0gbWF0Y2hlc1sxXTsKKyAg
ICAgICAgb3V0VXJsLmhvc3QgPSBtYXRjaGVzWzJdWzBdID09ICdbJyA/IFN0cmluZyhtYXRjaGVz
WzJdICsgMSwgc3RybGVuKG1hdGNoZXNbMl0pIC0gMikgLy8gSVB2NgorICAgICAgICAgICAgOiBt
YXRjaGVzWzJdOworCisgICAgICAgIG91dFVybC5wb3J0ID0gMDsKKyAgICAgICAgaWYgKG1hdGNo
Q291bnQgPj0gNCkgeworICAgICAgICAgICAgU3RyaW5nIHBvcnRTdHJpbmcgPSBTdHJpbmcobWF0
Y2hlc1szXSArIDEpOyAvLyBTa2lwIHBvcnQgY29sb24KKyAgICAgICAgICAgIG91dFVybC5wb3J0
ID0gcG9ydFN0cmluZy50b1VJbnRTdHJpY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICht
YXRjaENvdW50ID09IDUpCisgICAgICAgICAgICBvdXRVcmwucXVlcnkgPSBTdHJpbmcobWF0Y2hl
c1s0XSArIDEpOyAvLyBTa2lwIHF1ZXN0aW9uIG1hcmsKKworICAgICAgICBnX3N0cmZyZWV2KG1h
dGNoZXMpOworICAgIH0KKworICAgIGdfbWF0Y2hfaW5mb19mcmVlKG1hdGNoSW5mbyk7Cit9CisK
K3ZvaWQgTWVkaWFFbmRwb2ludE93cjo6ZW5zdXJlVHJhbnNwb3J0QWdlbnRBbmRUcmFuc2NlaXZl
cnMoYm9vbCBpc0luaXRpYXRvciwgY29uc3QgVmVjdG9yPFRyYW5zY2VpdmVyQ29uZmlnPiYgdHJh
bnNjZWl2ZXJDb25maWdzKQoreworICAgIEFTU0VSVChtX2R0bHNQcml2YXRlS2V5KTsKKyAgICBB
U1NFUlQobV9kdGxzQ2VydGlmaWNhdGUpOworCisgICAgaWYgKCFtX3RyYW5zcG9ydEFnZW50KSB7
CisgICAgICAgIG1fdHJhbnNwb3J0QWdlbnQgPSBvd3JfdHJhbnNwb3J0X2FnZW50X25ldyhmYWxz
ZSk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX2NvbmZpZ3VyYXRpb24tPmljZVNl
cnZlcnMoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB3ZWJraXRVcmwgOiBzZXJ2ZXItPnVy
bHMoKSkgeworICAgICAgICAgICAgICAgIEhlbHBlclNlcnZlclVybCB1cmw7CisgICAgICAgICAg
ICAgICAgLy8gV2ViS2l0J3MgVVJMIGNsYXNzIGNhbid0IGhhbmRsZSBJQ0UgaGVscGVyIHNlcnZl
ciB1cmxzIHByb3Blcmx5CisgICAgICAgICAgICAgICAgcGFyc2VIZWxwZXJTZXJ2ZXJVcmwoKm1f
aGVscGVyU2VydmVyUmVnRXgsIHdlYmtpdFVybCwgdXJsKTsKKworICAgICAgICAgICAgICAgIHVu
c2lnbmVkIHNob3J0IHBvcnQgPSB1cmwucG9ydCA/IHVybC5wb3J0IDogaGVscGVyU2VydmVyRGVm
YXVsdFBvcnQ7CisKKyAgICAgICAgICAgICAgICBpZiAodXJsLnByb3RvY29sID09ICJzdHVuIikg
eworICAgICAgICAgICAgICAgICAgICBvd3JfdHJhbnNwb3J0X2FnZW50X2FkZF9oZWxwZXJfc2Vy
dmVyKG1fdHJhbnNwb3J0QWdlbnQsIE9XUl9IRUxQRVJfU0VSVkVSX1RZUEVfU1RVTiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHVybC5ob3N0LmFzY2lpKCkuZGF0YSgpLCBwb3J0LCBudWxscHRy
LCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLnByb3RvY29sID09
ICJ0dXJuIikgeworICAgICAgICAgICAgICAgICAgICBPd3JIZWxwZXJTZXJ2ZXJUeXBlIHNlcnZl
clR5cGUgPSB1cmwucXVlcnkgPT0gInRyYW5zcG9ydD10Y3AiID8gT1dSX0hFTFBFUl9TRVJWRVJf
VFlQRV9UVVJOX1RDUAorICAgICAgICAgICAgICAgICAgICAgICAgOiBPV1JfSEVMUEVSX1NFUlZF
Ul9UWVBFX1RVUk5fVURQOworCisgICAgICAgICAgICAgICAgICAgIG93cl90cmFuc3BvcnRfYWdl
bnRfYWRkX2hlbHBlcl9zZXJ2ZXIobV90cmFuc3BvcnRBZ2VudCwgc2VydmVyVHlwZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHVybC5ob3N0LmFzY2lpKCkuZGF0YSgpLCBwb3J0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgc2VydmVyLT51c2VybmFtZSgpLmFzY2lpKCkuZGF0YSgpLCBzZXJ2
ZXItPmNyZWRlbnRpYWwoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgZ19vYmplY3Rfc2V0KG1fdHJhbnNwb3J0QWdlbnQs
ICJpY2UtY29udHJvbGxpbmctbW9kZSIsIGlzSW5pdGlhdG9yLCBudWxscHRyKTsKKworICAgIGZv
ciAoYXV0byYgY29uZmlnIDogdHJhbnNjZWl2ZXJDb25maWdzKSB7CisgICAgICAgIE93clNlc3Np
b24qIHNlc3Npb24gPSBPV1JfU0VTU0lPTihvd3JfbWVkaWFfc2Vzc2lvbl9uZXcoY29uZmlnLmlz
RHRsc0NsaWVudCkpOworICAgICAgICBnX29iamVjdF9zZXQoc2Vzc2lvbiwgImR0bHMtY2VydGlm
aWNhdGUiLCBtX2R0bHNDZXJ0aWZpY2F0ZS51dGY4KCkuZGF0YSgpLAorICAgICAgICAgICAgImR0
bHMta2V5IiwgbV9kdGxzUHJpdmF0ZUtleS51dGY4KCkuZGF0YSgpLAorICAgICAgICAgICAgbnVs
bHB0cik7CisKKyAgICAgICAgbV90cmFuc2NlaXZlcnMuYXBwZW5kKE93clRyYW5zY2VpdmVyOjpj
cmVhdGUoY29uZmlnLm1pZCwgc2Vzc2lvbikpOworICAgIH0KK30KKwordm9pZCBNZWRpYUVuZHBv
aW50T3dyOjppbnRlcm5hbEFkZFJlbW90ZUNhbmRpZGF0ZShPd3JTZXNzaW9uKiBzZXNzaW9uLCBJ
Y2VDYW5kaWRhdGUmIGNhbmRpZGF0ZSwgY29uc3QgU3RyaW5nJiB1ZnJhZywgY29uc3QgU3RyaW5n
JiBwYXNzd29yZCkKK3sKKyAgICBnYm9vbGVhbiBydGNwTXV4OworICAgIGdfb2JqZWN0X2dldChz
ZXNzaW9uLCAicnRjcC1tdXgiLCAmcnRjcE11eCwgbnVsbHB0cik7CisKKyAgICBpZiAocnRjcE11
eCAmJiBjYW5kaWRhdGUuY29tcG9uZW50SWQoKSA9PSBPV1JfQ09NUE9ORU5UX1RZUEVfUlRDUCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGNhbmRpZGF0ZVR5cGVzLmZpbmQoY2FuZGlk
YXRlLnR5cGUoKSkgIT0gbm90Rm91bmQpOworCisgICAgT3dyQ2FuZGlkYXRlVHlwZSBjYW5kaWRh
dGVUeXBlID0gc3RhdGljX2Nhc3Q8T3dyQ2FuZGlkYXRlVHlwZT4oY2FuZGlkYXRlVHlwZXMuZmlu
ZChjYW5kaWRhdGUudHlwZSgpKSk7CisgICAgT3dyQ29tcG9uZW50VHlwZSBjb21wb25lbnRJZCA9
IHN0YXRpY19jYXN0PE93ckNvbXBvbmVudFR5cGU+KGNhbmRpZGF0ZS5jb21wb25lbnRJZCgpKTsK
KyAgICBPd3JUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisKKyAgICBpZiAoY2FuZGlkYXRl
LnRyYW5zcG9ydCgpLmNvbnZlcnRUb0FTQ0lJVXBwZXJjYXNlKCkgPT0gIlVEUCIpCisgICAgICAg
IHRyYW5zcG9ydFR5cGUgPSBPV1JfVFJBTlNQT1JUX1RZUEVfVURQOworICAgIGVsc2UgeworICAg
ICAgICBBU1NFUlQoY2FuZGlkYXRlVGNwVHlwZXMuZmluZChjYW5kaWRhdGUudGNwVHlwZSgpKSAh
PSBub3RGb3VuZCk7CisgICAgICAgIHRyYW5zcG9ydFR5cGUgPSBzdGF0aWNfY2FzdDxPd3JUcmFu
c3BvcnRUeXBlPihjYW5kaWRhdGVUY3BUeXBlcy5maW5kKGNhbmRpZGF0ZS50Y3BUeXBlKCkpKTsK
KyAgICB9CisKKyAgICBPd3JDYW5kaWRhdGUqIG93ckNhbmRpZGF0ZSA9IG93cl9jYW5kaWRhdGVf
bmV3KGNhbmRpZGF0ZVR5cGUsIGNvbXBvbmVudElkKTsKKyAgICBnX29iamVjdF9zZXQob3dyQ2Fu
ZGlkYXRlLCAidHJhbnNwb3J0LXR5cGUiLCB0cmFuc3BvcnRUeXBlLAorICAgICAgICAiYWRkcmVz
cyIsIGNhbmRpZGF0ZS5hZGRyZXNzKCkuYXNjaWkoKS5kYXRhKCksCisgICAgICAgICJwb3J0Iiwg
Y2FuZGlkYXRlLnBvcnQoKSwKKyAgICAgICAgImJhc2UtYWRkcmVzcyIsIGNhbmRpZGF0ZS5yZWxh
dGVkQWRkcmVzcygpLmFzY2lpKCkuZGF0YSgpLAorICAgICAgICAiYmFzZS1wb3J0IiwgY2FuZGlk
YXRlLnJlbGF0ZWRQb3J0KCksCisgICAgICAgICJwcmlvcml0eSIsIGNhbmRpZGF0ZS5wcmlvcml0
eSgpLAorICAgICAgICAiZm91bmRhdGlvbiIsIGNhbmRpZGF0ZS5mb3VuZGF0aW9uKCkuYXNjaWko
KS5kYXRhKCksCisgICAgICAgICJ1ZnJhZyIsIHVmcmFnLmFzY2lpKCkuZGF0YSgpLAorICAgICAg
ICAicGFzc3dvcmQiLCBwYXNzd29yZC5hc2NpaSgpLmRhdGEoKSwKKyAgICAgICAgbnVsbHB0cik7
CisKKyAgICBvd3Jfc2Vzc2lvbl9hZGRfcmVtb3RlX2NhbmRpZGF0ZShzZXNzaW9uLCBvd3JDYW5k
aWRhdGUpOworfQorCitzdGF0aWMgdm9pZCBnb3RDYW5kaWRhdGUoT3dyU2Vzc2lvbiogc2Vzc2lv
biwgT3dyQ2FuZGlkYXRlKiBjYW5kaWRhdGUsIE1lZGlhRW5kcG9pbnRPd3IqIG1lZGlhRW5kcG9p
bnQpCit7CisgICAgT3dyQ2FuZGlkYXRlVHlwZSBjYW5kaWRhdGVUeXBlOworICAgIGdjaGFyKiBm
b3VuZGF0aW9uOworICAgIE93ckNvbXBvbmVudFR5cGUgY29tcG9uZW50SWQ7CisgICAgT3dyVHJh
bnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICAgIGdpbnQgcHJpb3JpdHk7CisgICAgZ2NoYXIq
IGFkZHJlc3M7CisgICAgZ3VpbnQgcG9ydDsKKyAgICBnY2hhciogcmVsYXRlZEFkZHJlc3M7Cisg
ICAgZ3VpbnQgcmVsYXRlZFBvcnQ7CisKKyAgICBnX29iamVjdF9nZXQoY2FuZGlkYXRlLCAidHlw
ZSIsICZjYW5kaWRhdGVUeXBlLAorICAgICAgICAiZm91bmRhdGlvbiIsICZmb3VuZGF0aW9uLAor
ICAgICAgICAiY29tcG9uZW50LXR5cGUiLCAmY29tcG9uZW50SWQsCisgICAgICAgICJ0cmFuc3Bv
cnQtdHlwZSIsICZ0cmFuc3BvcnRUeXBlLAorICAgICAgICAicHJpb3JpdHkiLCAmcHJpb3JpdHks
CisgICAgICAgICJhZGRyZXNzIiwgJmFkZHJlc3MsCisgICAgICAgICJwb3J0IiwgJnBvcnQsCisg
ICAgICAgICJiYXNlLWFkZHJlc3MiLCAmcmVsYXRlZEFkZHJlc3MsCisgICAgICAgICJiYXNlLXBv
cnQiLCAmcmVsYXRlZFBvcnQsCisgICAgICAgIG51bGxwdHIpOworCisgICAgQVNTRVJUKGNhbmRp
ZGF0ZVR5cGUgPj0gMCAmJiBjYW5kaWRhdGVUeXBlIDwgY2FuZGlkYXRlVHlwZXMuc2l6ZSgpKTsK
KyAgICBBU1NFUlQodHJhbnNwb3J0VHlwZSA+PSAwICYmIHRyYW5zcG9ydFR5cGUgPCBjYW5kaWRh
dGVUY3BUeXBlcy5zaXplKCkpOworCisgICAgUmVmUHRyPEljZUNhbmRpZGF0ZT4gaWNlQ2FuZGlk
YXRlID0gSWNlQ2FuZGlkYXRlOjpjcmVhdGUoKTsKKyAgICBpY2VDYW5kaWRhdGUtPnNldFR5cGUo
Y2FuZGlkYXRlVHlwZXNbY2FuZGlkYXRlVHlwZV0pOworICAgIGljZUNhbmRpZGF0ZS0+c2V0Rm91
bmRhdGlvbihmb3VuZGF0aW9uKTsKKyAgICBpY2VDYW5kaWRhdGUtPnNldENvbXBvbmVudElkKGNv
bXBvbmVudElkKTsKKyAgICBpY2VDYW5kaWRhdGUtPnNldFByaW9yaXR5KHByaW9yaXR5KTsKKyAg
ICBpY2VDYW5kaWRhdGUtPnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgaWNlQ2FuZGlkYXRlLT5z
ZXRQb3J0KHBvcnQgPyBwb3J0IDogY2FuZGlkYXRlRGVmYXVsdFBvcnQpOworCisgICAgaWYgKHRy
YW5zcG9ydFR5cGUgPT0gT1dSX1RSQU5TUE9SVF9UWVBFX1VEUCkKKyAgICAgICAgaWNlQ2FuZGlk
YXRlLT5zZXRUcmFuc3BvcnQoIlVEUCIpOworICAgIGVsc2UgeworICAgICAgICBpY2VDYW5kaWRh
dGUtPnNldFRyYW5zcG9ydCgiVENQIik7CisgICAgICAgIGljZUNhbmRpZGF0ZS0+c2V0VGNwVHlw
ZShjYW5kaWRhdGVUY3BUeXBlc1t0cmFuc3BvcnRUeXBlXSk7CisgICAgfQorCisgICAgaWYgKGNh
bmRpZGF0ZVR5cGUgIT0gT1dSX0NBTkRJREFURV9UWVBFX0hPU1QpIHsKKyAgICAgICAgaWNlQ2Fu
ZGlkYXRlLT5zZXRSZWxhdGVkQWRkcmVzcyhyZWxhdGVkQWRkcmVzcyk7CisgICAgICAgIGljZUNh
bmRpZGF0ZS0+c2V0UmVsYXRlZFBvcnQocmVsYXRlZFBvcnQgPyByZWxhdGVkUG9ydCA6IGNhbmRp
ZGF0ZURlZmF1bHRQb3J0KTsKKyAgICB9CisKKyAgICBnX29iamVjdF9zZXQoR19PQkpFQ1QoY2Fu
ZGlkYXRlKSwgInVmcmFnIiwgZ19vYmplY3RfZ2V0X2RhdGEoR19PQkpFQ1Qoc2Vzc2lvbiksICJp
Y2UtdWZyYWciKSwKKyAgICAgICAgInBhc3N3b3JkIiwgZ19vYmplY3RfZ2V0X2RhdGEoR19PQkpF
Q1Qoc2Vzc2lvbiksICJpY2UtcGFzc3dvcmQiKSwKKyAgICAgICAgbnVsbHB0cik7CisKKyAgICBt
ZWRpYUVuZHBvaW50LT5kaXNwYXRjaE5ld0ljZUNhbmRpZGF0ZShtZWRpYUVuZHBvaW50LT5zZXNz
aW9uTWlkKHNlc3Npb24pLCBXVEZNb3ZlKGljZUNhbmRpZGF0ZSkpOworCisgICAgZ19mcmVlKGZv
dW5kYXRpb24pOworICAgIGdfZnJlZShhZGRyZXNzKTsKKyAgICBnX2ZyZWUocmVsYXRlZEFkZHJl
c3MpOworfQorCitzdGF0aWMgdm9pZCBjYW5kaWRhdGVHYXRoZXJpbmdEb25lKE93clNlc3Npb24q
IHNlc3Npb24sIE1lZGlhRW5kcG9pbnRPd3IqIG1lZGlhRW5kcG9pbnQpCit7CisgICAgbWVkaWFF
bmRwb2ludC0+ZGlzcGF0Y2hHYXRoZXJpbmdEb25lKG1lZGlhRW5kcG9pbnQtPnNlc3Npb25NaWQo
c2Vzc2lvbikpOworfQorCitzdGF0aWMgdm9pZCBpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UoT3dy
U2Vzc2lvbiogc2Vzc2lvbiwgR1BhcmFtU3BlYyosIE1lZGlhRW5kcG9pbnRPd3IqIG1lZGlhRW5k
cG9pbnQpCit7CisgICAgbWVkaWFFbmRwb2ludC0+cHJvY2Vzc0ljZVRyYW5zcG9ydFN0YXRlQ2hh
bmdlKHNlc3Npb24pOworfQorCitzdGF0aWMgdm9pZCBnb3RJbmNvbWluZ1NvdXJjZShPd3JNZWRp
YVNlc3Npb24qIG1lZGlhU2Vzc2lvbiwgT3dyTWVkaWFTb3VyY2UqIHNvdXJjZSwgTWVkaWFFbmRw
b2ludE93ciogbWVkaWFFbmRwb2ludCkKK3sKKyAgICBtZWRpYUVuZHBvaW50LT51bm11dGVSZW1v
dGVTb3VyY2UobWVkaWFFbmRwb2ludC0+c2Vzc2lvbk1pZChPV1JfU0VTU0lPTihtZWRpYVNlc3Np
b24pKSwgc291cmNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
RU5BQkxFKFdFQl9SVEMpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRp
YXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9pbnRPd3IuaCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21lZGlhc3RyZWFtL29wZW53ZWJydGMvTWVkaWFFbmRwb2ludE93ci5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDNkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL01lZGlhRW5kcG9p
bnRPd3IuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSwgMjAx
NiBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgor
ICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBFcmljc3NvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBj
b250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogICAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lm
IEVOQUJMRShXRUJfUlRDKQorCisjaW5jbHVkZSAiTWVkaWFFbmRwb2ludC5oIgorI2luY2x1ZGUg
PG93ci9vd3Jfc2Vzc2lvbi5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZlB0ci5oPgorCit0eXBlZGVmIHN0cnVjdCBfT3dyTWVkaWFTZXNzaW9uIE93ck1l
ZGlhU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9Pd3JNZWRpYVNvdXJjZSBPd3JNZWRpYVNvdXJj
ZTsKK3R5cGVkZWYgc3RydWN0IF9Pd3JUcmFuc3BvcnRBZ2VudCBPd3JUcmFuc3BvcnRBZ2VudDsK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBQZWVyTWVkaWFEZXNjcmlwdGlvbjsKK2Ns
YXNzIFJlYWx0aW1lTWVkaWFTb3VyY2VPd3I7CitjbGFzcyBSVENDb25maWd1cmF0aW9uUHJpdmF0
ZTsKKworY2xhc3MgT3dyVHJhbnNjZWl2ZXIgOiBwdWJsaWMgUmVmQ291bnRlZDxPd3JUcmFuc2Nl
aXZlcj4geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8T3dyVHJhbnNjZWl2ZXI+IGNyZWF0ZShj
b25zdCBTdHJpbmcmIG1pZCwgT3dyU2Vzc2lvbiogc2Vzc2lvbikKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZigqbmV3IE93clRyYW5zY2VpdmVyKG1pZCwgc2Vzc2lvbikpOworICAgIH0K
KyAgICB2aXJ0dWFsIH5Pd3JUcmFuc2NlaXZlcigpIHsgfQorCisgICAgY29uc3QgU3RyaW5nJiBt
aWQoKSBjb25zdCB7IHJldHVybiBtX21pZDsgfQorICAgIE93clNlc3Npb24qIHNlc3Npb24oKSBj
b25zdCB7IHJldHVybiBtX3Nlc3Npb247IH0KKworICAgIE93ckljZVN0YXRlIG93ckljZVN0YXRl
KCkgY29uc3QgeyByZXR1cm4gbV9vd3JJY2VTdGF0ZTsgfQorICAgIHZvaWQgc2V0T3dySWNlU3Rh
dGUoT3dySWNlU3RhdGUgc3RhdGUpIHsgbV9vd3JJY2VTdGF0ZSA9IHN0YXRlOyB9CisKKyAgICBi
b29sIGdvdEVuZE9mUmVtb3RlQ2FuZGlkYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fZ290RW5kT2ZS
ZW1vdGVDYW5kaWRhdGVzOyB9CisgICAgdm9pZCBtYXJrR290RW5kT2ZSZW1vdGVDYW5kaWRhdGVz
KCkgeyBtX2dvdEVuZE9mUmVtb3RlQ2FuZGlkYXRlcyA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAg
ICBPd3JUcmFuc2NlaXZlcihjb25zdCBTdHJpbmcmIG1pZCwgT3dyU2Vzc2lvbiogc2Vzc2lvbikK
KyAgICAgICAgOiBtX21pZChtaWQpCisgICAgICAgICwgbV9zZXNzaW9uKHNlc3Npb24pCisgICAg
eyB9CisKKyAgICBTdHJpbmcgbV9taWQ7CisgICAgT3dyU2Vzc2lvbiogbV9zZXNzaW9uOworCisg
ICAgT3dySWNlU3RhdGUgbV9vd3JJY2VTdGF0ZSB7IE9XUl9JQ0VfU1RBVEVfRElTQ09OTkVDVEVE
IH07CisgICAgYm9vbCBtX2dvdEVuZE9mUmVtb3RlQ2FuZGlkYXRlcyB7IGZhbHNlIH07Cit9Owor
CitjbGFzcyBNZWRpYUVuZHBvaW50T3dyIDogcHVibGljIE1lZGlhRW5kcG9pbnQgeworcHVibGlj
OgorICAgIE1lZGlhRW5kcG9pbnRPd3IoTWVkaWFFbmRwb2ludENsaWVudCYpOworICAgIH5NZWRp
YUVuZHBvaW50T3dyKCk7CisKKyAgICB2b2lkIHNldENvbmZpZ3VyYXRpb24oUmVmUHRyPE1lZGlh
RW5kcG9pbnRDb25maWd1cmF0aW9uPiYmKSBvdmVycmlkZTsKKworICAgIHZvaWQgZ2VuZXJhdGVE
dGxzSW5mbygpIG92ZXJyaWRlOworICAgIE1lZGlhUGF5bG9hZFZlY3RvciBnZXREZWZhdWx0QXVk
aW9QYXlsb2FkcygpIG92ZXJyaWRlOworICAgIE1lZGlhUGF5bG9hZFZlY3RvciBnZXREZWZhdWx0
VmlkZW9QYXlsb2FkcygpIG92ZXJyaWRlOworICAgIE1lZGlhUGF5bG9hZFZlY3RvciBmaWx0ZXJQ
YXlsb2Fkcyhjb25zdCBNZWRpYVBheWxvYWRWZWN0b3ImIHJlbW90ZVBheWxvYWRzLCBjb25zdCBN
ZWRpYVBheWxvYWRWZWN0b3ImIGRlZmF1bHRQYXlsb2Fkcykgb3ZlcnJpZGU7CisKKyAgICBVcGRh
dGVSZXN1bHQgdXBkYXRlUmVjZWl2ZUNvbmZpZ3VyYXRpb24oTWVkaWFFbmRwb2ludFNlc3Npb25D
b25maWd1cmF0aW9uKiwgYm9vbCBpc0luaXRpYXRvcikgb3ZlcnJpZGU7CisgICAgVXBkYXRlUmVz
dWx0IHVwZGF0ZVNlbmRDb25maWd1cmF0aW9uKE1lZGlhRW5kcG9pbnRTZXNzaW9uQ29uZmlndXJh
dGlvbiosIGNvbnN0IFJlYWx0aW1lTWVkaWFTb3VyY2VNYXAmLCBib29sIGlzSW5pdGlhdG9yKSBv
dmVycmlkZTsKKworICAgIHZvaWQgYWRkUmVtb3RlQ2FuZGlkYXRlKEljZUNhbmRpZGF0ZSYsIGNv
bnN0IFN0cmluZyYgbWlkLCBjb25zdCBTdHJpbmcmIHVmcmFnLCBjb25zdCBTdHJpbmcmIHBhc3N3
b3JkKSBvdmVycmlkZTsKKworICAgIFJlZjxSZWFsdGltZU1lZGlhU291cmNlPiBjcmVhdGVNdXRl
ZFJlbW90ZVNvdXJjZShjb25zdCBTdHJpbmcmIG1pZCwgUmVhbHRpbWVNZWRpYVNvdXJjZTo6VHlw
ZSkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXBsYWNlTXV0ZWRSZW1vdGVTb3VyY2VNaWQoY29uc3Qg
U3RyaW5nJiwgY29uc3QgU3RyaW5nJikgZmluYWw7CisgICAgdm9pZCByZXBsYWNlU2VuZFNvdXJj
ZShSZWFsdGltZU1lZGlhU291cmNlJiwgY29uc3QgU3RyaW5nJiBtaWQpIG92ZXJyaWRlOworCisg
ICAgdm9pZCBzdG9wKCkgb3ZlcnJpZGU7CisKKyAgICBzaXplX3QgdHJhbnNjZWl2ZXJJbmRleEZv
clNlc3Npb24oT3dyU2Vzc2lvbiopIGNvbnN0OworICAgIGNvbnN0IFN0cmluZyYgc2Vzc2lvbk1p
ZChPd3JTZXNzaW9uKikgY29uc3Q7CisgICAgT3dyVHJhbnNjZWl2ZXIqIG1hdGNoVHJhbnNjZWl2
ZXJCeU1pZChjb25zdCBTdHJpbmcmIG1pZCkgY29uc3Q7CisKKyAgICB2b2lkIGRpc3BhdGNoTmV3
SWNlQ2FuZGlkYXRlKGNvbnN0IFN0cmluZyYgbWlkLCBSZWZQdHI8SWNlQ2FuZGlkYXRlPiYmKTsK
KyAgICB2b2lkIGRpc3BhdGNoR2F0aGVyaW5nRG9uZShjb25zdCBTdHJpbmcmIG1pZCk7CisgICAg
dm9pZCBwcm9jZXNzSWNlVHJhbnNwb3J0U3RhdGVDaGFuZ2UoT3dyU2Vzc2lvbiopOworICAgIHZv
aWQgZGlzcGF0Y2hEdGxzRmluZ2VycHJpbnQoZ2NoYXIqIHByaXZhdGVLZXksIGdjaGFyKiBjZXJ0
aWZpY2F0ZSwgY29uc3QgU3RyaW5nJiBmaW5nZXJwcmludCwgY29uc3QgU3RyaW5nJiBmaW5nZXJw
cmludEZ1bmN0aW9uKTsKKyAgICB2b2lkIHVubXV0ZVJlbW90ZVNvdXJjZShjb25zdCBTdHJpbmcm
IG1pZCwgT3dyTWVkaWFTb3VyY2UqKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFNlc3Npb25UeXBl
IHsgU2Vzc2lvblR5cGVNZWRpYSB9OworCisgICAgc3RydWN0IFRyYW5zY2VpdmVyQ29uZmlnIHsK
KyAgICAgICAgU2Vzc2lvblR5cGUgdHlwZTsKKyAgICAgICAgYm9vbCBpc0R0bHNDbGllbnQ7Cisg
ICAgICAgIFN0cmluZyBtaWQ7CisgICAgfTsKKworICAgIHZvaWQgcHJlcGFyZVNlc3Npb24oT3dy
U2Vzc2lvbiosIFBlZXJNZWRpYURlc2NyaXB0aW9uKik7CisgICAgdm9pZCBwcmVwYXJlTWVkaWFT
ZXNzaW9uKE93ck1lZGlhU2Vzc2lvbiosIFBlZXJNZWRpYURlc2NyaXB0aW9uKiwgYm9vbCBpc0lu
aXRpYXRvcik7CisKKyAgICB2b2lkIGVuc3VyZVRyYW5zcG9ydEFnZW50QW5kVHJhbnNjZWl2ZXJz
KGJvb2wgaXNJbml0aWF0b3IsIGNvbnN0IFZlY3RvcjxUcmFuc2NlaXZlckNvbmZpZz4mKTsKKyAg
ICB2b2lkIGludGVybmFsQWRkUmVtb3RlQ2FuZGlkYXRlKE93clNlc3Npb24qLCBJY2VDYW5kaWRh
dGUmLCBjb25zdCBTdHJpbmcmIHVmcmFnLCBjb25zdCBTdHJpbmcmIHBhc3N3b3JkKTsKKworICAg
IFJlZlB0cjxNZWRpYUVuZHBvaW50Q29uZmlndXJhdGlvbj4gbV9jb25maWd1cmF0aW9uOworICAg
IEdSZWdleCogbV9oZWxwZXJTZXJ2ZXJSZWdFeDsKKworICAgIE93clRyYW5zcG9ydEFnZW50KiBt
X3RyYW5zcG9ydEFnZW50OworICAgIFZlY3RvcjxSZWZQdHI8T3dyVHJhbnNjZWl2ZXI+PiBtX3Ry
YW5zY2VpdmVyczsKKyAgICBIYXNoTWFwPFN0cmluZywgUmVmUHRyPFJlYWx0aW1lTWVkaWFTb3Vy
Y2VPd3I+PiBtX211dGVkUmVtb3RlU291cmNlczsKKworICAgIE1lZGlhRW5kcG9pbnRDbGllbnQm
IG1fY2xpZW50OworCisgICAgdW5zaWduZWQgbV9udW1iZXJPZlJlY2VpdmVQcmVwYXJlZFNlc3Np
b25zOworICAgIHVuc2lnbmVkIG1fbnVtYmVyT2ZTZW5kUHJlcGFyZWRTZXNzaW9uczsKKworICAg
IFN0cmluZyBtX2R0bHNQcml2YXRlS2V5OworICAgIFN0cmluZyBtX2R0bHNDZXJ0aWZpY2F0ZTsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfUlRD
KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vb3Blbndl
YnJ0Yy9SZWFsdGltZU1lZGlhU291cmNlT3dyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
ZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VPd3IuaAppbmRleCBkMjRi
MDY1Li44Njk1YzdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0
cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VPd3IuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9vcGVud2VicnRjL1JlYWx0aW1lTWVkaWFTb3VyY2VP
d3IuaApAQCAtNTQsNiArNTQsOCBAQCBSZWFsdGltZU1lZGlhU291cmNlT3dyKE93ck1lZGlhU291
cmNlKiBtZWRpYVNvdXJjZSwgY29uc3QgU3RyaW5nJiBpZCwgUmVhbHRpbWVNZQogICAgIDogUmVh
bHRpbWVNZWRpYVNvdXJjZShpZCwgdHlwZSwgbmFtZSkKICAgICAsIG1fbWVkaWFTb3VyY2UobWVk
aWFTb3VyY2UpCiAgICAgeworICAgICAgICBpZiAoIW1lZGlhU291cmNlKQorICAgICAgICAgICAg
bV9tdXRlZCA9IHRydWU7CiAgICAgfQogCiBSZWFsdGltZU1lZGlhU291cmNlT3dyKGNvbnN0IFN0
cmluZyYgaWQsIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGUgdHlwZSwgY29uc3QgU3RyaW5nJiBu
YW1lKQpAQCAtNjQsNiArNjYsMTIgQEAgUmVhbHRpbWVNZWRpYVNvdXJjZU93cihjb25zdCBTdHJp
bmcmIGlkLCBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFMKIAogICAgIHZp
cnR1YWwgflJlYWx0aW1lTWVkaWFTb3VyY2VPd3IoKSB7IH0KIAorICAgIHZvaWQgc3dhcE91dFNo
YWxsb3dTb3VyY2UoT3dyTWVkaWFTb3VyY2UmIHJlYWxTb3VyY2UpCisgICAgeworICAgICAgICBt
X21lZGlhU291cmNlID0gJnJlYWxTb3VyY2U7CisgICAgICAgIHNldE11dGVkKGZhbHNlKTsKKyAg
ICB9CisKICAgICB2aXJ0dWFsIFJlZlB0cjxSZWFsdGltZU1lZGlhU291cmNlQ2FwYWJpbGl0aWVz
PiBjYXBhYmlsaXRpZXMoKSB7IHJldHVybiBtX2NhcGFiaWxpdGllczsgfQogICAgIHZpcnR1YWwg
Y29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZVNldHRpbmdzJiBzZXR0aW5ncygpIHsgcmV0dXJuIG1f
Y3VycmVudFNldHRpbmdzOyB9CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>