<?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>24758</bug_id>
          
          <creation_ts>2009-03-23 08:49:24 -0700</creation_ts>
          <short_desc>[Gtk] Implement a WebDataSource for the gtk port</short_desc>
          <delta_ts>2009-09-02 06:07:58 -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>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jan Alonzo">jmalonzo</reporter>
          <assigned_to name="Jan Alonzo">jmalonzo</assigned_to>
          <cc>christian</cc>
    
    <cc>gustavo</cc>
    
    <cc>xan.lopez</cc>
    
    <cc>xfdbse</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>114772</commentid>
    <comment_count>0</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-03-23 08:49:24 -0700</bug_when>
    <thetext>We need an implementation of WebDataSource so we can get the data, request, response, resources, etc.. associated with a web frame. Sample use cases are:
* Viewing page&apos;s source
* Saving a frame/page on disk
* ...

Of course this is not handled by WebDataSource alone, but a WebDataSource implementation is a good start to start implementing the other stuff required to make these happen.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114773</commentid>
    <comment_count>1</comment_count>
      <attachid>28853</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-03-23 08:51:27 -0700</bug_when>
    <thetext>Created attachment 28853
initial implementation

This is just an an initial implementation. Feedback appreciated.

Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114857</commentid>
    <comment_count>2</comment_count>
      <attachid>28853</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-03-23 14:27:13 -0700</bug_when>
    <thetext>Comment on attachment 28853
initial implementation

&gt; +DocumentLoaderGtk::DocumentLoaderGtk(const ResourceRequest&amp; request, const SubstituteData&amp; substituteData)
&gt; +    : DocumentLoader(request, substituteData)
&gt; +    , m_isDataSourceReffed(false)
&gt; +    , m_dataSource(0)

Although mac seems to do it, I think GTK+ classes usually do not append &apos;Gtk&apos; to their name. If there is no reason to do this rename, I think we should go with DocumentLoader::DocumentLoader.

&gt; +void DocumentLoaderGtk::attachToFrame()
&gt; +{
&gt; +    DocumentLoader::attachToFrame();
&gt; +
&gt; +    refDataSource();
&gt; +}

Is this the cause for the rename?

&gt; -void FrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, unsigned long, ResourceRequest&amp;, const ResourceResponse&amp;)
&gt; +void FrameLoaderClient::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest&amp; request, const ResourceResponse&amp; redirectResponse)
&gt;  {
&gt; -    notImplemented();
&gt; +    if (redirectResponse.isNull())
&gt; +        static_cast&lt;DocumentLoaderGtk*&gt;(loader)-&gt;increaseLoadCount(identifier);
&gt;  }

These casts are not something I see in our other webcore support classes. Are they needed? If they are, perhaps it would be better to cook up a core()/kit() conversion pair, such as the ones that exist for things such as WebView and WebFrame.

&gt;      WebKitWebNavigationReason kit(WebCore::NavigationType type);
&gt;      WebCore::NavigationType core(WebKitWebNavigationReason reason);
&gt; +
&gt;  }

Here&apos;s the rogue blank line I mentioned.

&gt; +    // WebKitWebDataSource private
&gt; +    WEBKIT_API WebKitWebDataSource*
&gt; +    webkit_web_data_source_init_with_loader(PassRefPtr&lt;DocumentLoaderGtk&gt;);
&gt; +

I would make this webkit_web_data_source_new_with_core_loader, to match the already-existing history item one. If I remember correctly, I am using _with_core_request in my proposed NetworkRequest implementation, too.

&gt; +G_CONST_RETURN gchar* webkit_web_data_source_get_unreachable_url(WebKitWebDataSource* webDataSource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +    const KURL&amp; unreachableURL = priv-&gt;loader-&gt;unreachableURL();
&gt; +
&gt; +    if (unreachableURL.isEmpty())
&gt; +        return NULL;
&gt; +    else
&gt; +        return unreachableURL.string().utf8().data();
&gt; +}

What is this used for?

&gt; + * webkit_web_frame_get_provisional_data_source:
&gt; + * @frame: a #WebKitWebFrame
&gt; + *
&gt; + * Returns the provisional data source. You use the
&gt; + * webkit_web_frame_load_request method to initiate an asynchronous client
&gt; + * request which will create a provisional data source. The provisional data
&gt; + * source will transition to a committed data source once any data has been
&gt; + * received. Therefore this method returns NULL if either a load request is
&gt; + * not in progress, or a load request has completed.

I think this comment seems to imply that the user needs to take action to cause loads to initiate. It would be better to rephrase this, so that it is easily understandable that any loads initiated by WebKit or by the user explicitly with load_request will cause a provisional data source to be created.

Looking good to me. I think this is a very important missing piece in our API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114858</commentid>
    <comment_count>3</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2009-03-23 14:36:28 -0700</bug_when>
    <thetext>This is already looking interesting. I have a few comments for you :)

There are three files which don&apos;t attribute copyright to you and it looks as
though an Apple employée wrote them. You might want to add your name there, even
if they are based on existing code.

+static void webkit_web_data_source_init(WebKitWebDataSource* webDataSource)
+{
+    JSC::initializeThreading();
+    webDataSource-&gt;priv = WEBKIT_WEB_DATA_SOURCE_GET_PRIVATE(webDataSource);
+}

The initialisation call here looks out of place. Would it make sense to put
that inside webkit_init?

+WebKitWebDataSource* webkit_web_data_source_new(WebKitNetworkRequest* request)
+{
+    const gchar* uri = webkit_network_request_get_uri(request);
+    return webkit_web_data_source_init_with_loader(DocumentLoaderGtk::create(ResourceRequest(KURL(KURL(), String::fromUTF8(uri))), SubstituteData()));
+}

This line is just too long, please add a line break here ;)

+WebKitWebFrame* webkit_web_data_source_get_web_frame(WebKitWebDataSource* webDataSource)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
+
+    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
+    FrameLoader* frameLoader = priv-&gt;loader-&gt;frameLoader();
+    if (!frameLoader)
+        return NULL;

Do we usually expect a NULL value? In that case, we should document it,
otherwise it should be an ASSERT.

+WebKitNetworkRequest* webkit_web_data_source_get_request(WebKitWebDataSource* webDataSource)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
+
+    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
+    FrameLoader* frameLoader = priv-&gt;loader-&gt;frameLoader();
+    if (!frameLoader || !frameLoader-&gt;frameHasLoaded())
+        return NULL;
+
+    ResourceRequest request = priv-&gt;loader-&gt;request();
+    WebKitNetworkRequest* webRequest = webkit_network_request_new(request.url().string().utf8().data());
+
+    return webRequest;
+}

I&apos;m guessing this depends on the improvements of WebKitNetworkRequest so we can
use the actual request rather than creating a new one, so I suggest a FIXME
here. And we want to store the request, otherwise subsequent calls will lead
to unexpected results, ie. memory leaks and failing pointer comparisons.

+ * Returns %TRUE if @data_source is in the process of loading its content,
+ * otherwise it returns %FALSE
+ *
+ * Return value: %TRUE if the @data_source is still loading, %FALSE if it&apos;s
+ * already loaded
+ *
+ * Since: 1.1.4

You want to avoid the similar wording here. The main description could be
something like &quot;Determines whether the @data_source is currently in the process
of loading its content&quot; and the return value perhaps &quot;%TRUE if the @data_source
is currently loading, %FALSE otherwise&quot;.

+WEBKIT_API WebKitNetworkRequest *
+webkit_web_data_source_get_request            (WebKitWebDataSource  *data_source);

This should likely be _get_network_request.

+WEBKIT_API G_CONST_RETURN gchar *
+webkit_web_data_source_get_text_encoding_name (WebKitWebDataSource  *data_source);

We have functions _get_encoding and _set_encoding, I think we should use
_get_encoding here accordingly.

+WebKitWebDataSource* webkit_web_frame_get_provisional_data_source(WebKitWebFrame* frame)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+    Frame* coreFrame = core(frame);
+    WebKitWebDataSource* dataSource = webkit_web_frame_get_data_source_from_core_loader(coreFrame-&gt;loader()-&gt;provisionalDocumentLoader());
+
+    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(dataSource), NULL);
+
+    return dataSource;
+}

The return_if_fail in there is wrong. The comment says NULL is returned if there
is no provisional data source. And if you want to make sure WebCore doesn&apos;t
return anything else that must be an ASSERT.
The same for the non-provisional data source.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116553</commentid>
    <comment_count>4</comment_count>
      <attachid>29261</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-04 22:21:20 -0700</bug_when>
    <thetext>Created attachment 29261
WebKitWebResource implementation

Add a web resource implementation for the gtk port which is needed by some data source API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116556</commentid>
    <comment_count>5</comment_count>
      <attachid>29263</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-04 22:22:53 -0700</bug_when>
    <thetext>Created attachment 29263
web data source and documentloader impl for gtk port

This patch adds an implementation of web data source and the corresponding document loader for the gtk port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116559</commentid>
    <comment_count>6</comment_count>
      <attachid>29264</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-04 22:24:23 -0700</bug_when>
    <thetext>Created attachment 29264
implement data source API in webkitwebframe

This patch adds a couple of APIs needed to retrieve a data source from a web frame. This patch also adds a unit test for the web data source impl.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116560</commentid>
    <comment_count>7</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-04 22:31:05 -0700</bug_when>
    <thetext>&gt; &gt; +    : DocumentLoader(request, substituteData)
&gt; &gt; +    , m_isDataSourceReffed(false)
&gt; &gt; +    , m_dataSource(0)
&gt; 
&gt; Although mac seems to do it, I think GTK+ classes usually do not append &apos;Gtk&apos;
&gt; to their name. If there is no reason to do this rename, I think we should go
&gt; with DocumentLoader::DocumentLoader.

Ok, renamed. The Gtk port impl is now under the WebKit namespace.

&gt; 
&gt; &gt; -void FrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, unsigned long, ResourceRequest&amp;, const ResourceResponse&amp;)
&gt; &gt; +void FrameLoaderClient::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest&amp; request, const ResourceResponse&amp; redirectResponse)
&gt; &gt;  {
&gt; &gt; -    notImplemented();
&gt; &gt; +    if (redirectResponse.isNull())
&gt; &gt; +        static_cast&lt;DocumentLoaderGtk*&gt;(loader)-&gt;increaseLoadCount(identifier);
&gt; &gt;  }
&gt; 
&gt; These casts are not something I see in our other webcore support classes. Are
&gt; they needed? If they are, perhaps it would be better to cook up a core()/kit()
&gt; conversion pair, such as the ones that exist for things such as WebView and
&gt; WebFrame.

Yup it&apos;s needed. AFAIK core/kit is only for public API and since WebKit::DocumentLoader is not public, I don&apos;t think it&apos;s required.

&gt; &gt;      WebKitWebNavigationReason kit(WebCore::NavigationType type);
&gt; &gt;      WebCore::NavigationType core(WebKitWebNavigationReason reason);
&gt; &gt; +
&gt; &gt;  }
&gt; 
&gt; Here&apos;s the rogue blank line I mentioned.

Thanks fixed.

&gt; 
&gt; &gt; +    // WebKitWebDataSource private
&gt; &gt; +    WEBKIT_API WebKitWebDataSource*
&gt; &gt; +    webkit_web_data_source_init_with_loader(PassRefPtr&lt;DocumentLoaderGtk&gt;);
&gt; &gt; +
&gt; 
&gt; I would make this webkit_web_data_source_new_with_core_loader, to match the
&gt; already-existing history item one. If I remember correctly, I am using
&gt; _with_core_request in my proposed NetworkRequest implementation, too.

Done.

&gt; 
&gt; &gt; +G_CONST_RETURN gchar* webkit_web_data_source_get_unreachable_url(WebKitWebDataSource* webDataSource)
&gt; &gt; +{
&gt; &gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; &gt; +
&gt; &gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; &gt; +    const KURL&amp; unreachableURL = priv-&gt;loader-&gt;unreachableURL();
&gt; &gt; +
&gt; &gt; +    if (unreachableURL.isEmpty())
&gt; &gt; +        return NULL;
&gt; &gt; +    else
&gt; &gt; +        return unreachableURL.string().utf8().data();
&gt; &gt; +}
&gt; 
&gt; What is this used for?

It&apos;s used when a load was requested on a web frame using one of the methods that accept an unreachableURL parameter (n.b. we don&apos;t have this yet but i&apos;m looking into this now).

&gt; 
&gt; &gt; + * webkit_web_frame_get_provisional_data_source:
&gt; &gt; + * @frame: a #WebKitWebFrame
&gt; &gt; + *
&gt; &gt; + * Returns the provisional data source. You use the
&gt; &gt; + * webkit_web_frame_load_request method to initiate an asynchronous client
&gt; &gt; + * request which will create a provisional data source. The provisional data
&gt; &gt; + * source will transition to a committed data source once any data has been
&gt; &gt; + * received. Therefore this method returns NULL if either a load request is
&gt; &gt; + * not in progress, or a load request has completed.
&gt; 
&gt; I think this comment seems to imply that the user needs to take action to cause
&gt; loads to initiate. It would be better to rephrase this, so that it is easily
&gt; understandable that any loads initiated by WebKit or by the user explicitly
&gt; with load_request will cause a provisional data source to be created.

Doc reworded in the updated patch.

Cheers</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116561</commentid>
    <comment_count>8</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-04 22:35:41 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; This is already looking interesting. I have a few comments for you :)
&gt; 
&gt; There are three files which don&apos;t attribute copyright to you and it looks as
&gt; though an Apple employée wrote them. You might want to add your name there,
&gt; even
&gt; if they are based on existing code.

Thanks I&apos;ve updated the licence headers. Can you please check again?

&gt; 
&gt; +static void webkit_web_data_source_init(WebKitWebDataSource* webDataSource)
&gt; +{
&gt; +    JSC::initializeThreading();
&gt; +    webDataSource-&gt;priv = WEBKIT_WEB_DATA_SOURCE_GET_PRIVATE(webDataSource);
&gt; +}
&gt; 
&gt; The initialisation call here looks out of place. Would it make sense to put
&gt; that inside webkit_init?

I removed it for now. We already call it in webkit_init.

&gt; 
&gt; +WebKitWebDataSource* webkit_web_data_source_new(WebKitNetworkRequest* request)
&gt; +{
&gt; +    const gchar* uri = webkit_network_request_get_uri(request);
&gt; +    return
&gt; webkit_web_data_source_init_with_loader(DocumentLoaderGtk::create(ResourceRequest(KURL(KURL(),
&gt; String::fromUTF8(uri))), SubstituteData()));
&gt; +}
&gt; 
&gt; This line is just too long, please add a line break here ;)

Done - please see updated patch.

&gt; 
&gt; +WebKitWebFrame* webkit_web_data_source_get_web_frame(WebKitWebDataSource*
&gt; webDataSource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +    FrameLoader* frameLoader = priv-&gt;loader-&gt;frameLoader();
&gt; +    if (!frameLoader)
&gt; +        return NULL;
&gt; 
&gt; Do we usually expect a NULL value? In that case, we should document it,
&gt; otherwise it should be an ASSERT.

Ok, added an ASSERT.

&gt; 
&gt; +WebKitNetworkRequest* webkit_web_data_source_get_request(WebKitWebDataSource*
&gt; webDataSource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +    FrameLoader* frameLoader = priv-&gt;loader-&gt;frameLoader();
&gt; +    if (!frameLoader || !frameLoader-&gt;frameHasLoaded())
&gt; +        return NULL;
&gt; +
&gt; +    ResourceRequest request = priv-&gt;loader-&gt;request();
&gt; +    WebKitNetworkRequest* webRequest =
&gt; webkit_network_request_new(request.url().string().utf8().data());
&gt; +
&gt; +    return webRequest;
&gt; +}
&gt; 
&gt; I&apos;m guessing this depends on the improvements of WebKitNetworkRequest so we can
&gt; use the actual request rather than creating a new one, so I suggest a FIXME
&gt; here. And we want to store the request, otherwise subsequent calls will lead
&gt; to unexpected results, ie. memory leaks and failing pointer comparisons.

Done.

&gt; 
&gt; + * Returns %TRUE if @data_source is in the process of loading its content,
&gt; + * otherwise it returns %FALSE
&gt; + *
&gt; + * Return value: %TRUE if the @data_source is still loading, %FALSE if it&apos;s
&gt; + * already loaded
&gt; + *
&gt; + * Since: 1.1.4
&gt; 
&gt; You want to avoid the similar wording here. The main description could be
&gt; something like &quot;Determines whether the @data_source is currently in the process
&gt; of loading its content&quot; and the return value perhaps &quot;%TRUE if the @data_source
&gt; is currently loading, %FALSE otherwise&quot;.

Thanks I&apos;ve updated the doc.

&gt; 
&gt; +WEBKIT_API WebKitNetworkRequest *
&gt; +webkit_web_data_source_get_request            (WebKitWebDataSource 
&gt; *data_source);
&gt; 
&gt; This should likely be _get_network_request.
&gt; 
&gt; +WEBKIT_API G_CONST_RETURN gchar *
&gt; +webkit_web_data_source_get_text_encoding_name (WebKitWebDataSource 
&gt; *data_source);
&gt; 
&gt; We have functions _get_encoding and _set_encoding, I think we should use
&gt; _get_encoding here accordingly.

I missed this. I&apos;ll update the patch once I get more feedback here (or pre-commit)

&gt; 
&gt; +WebKitWebDataSource*
&gt; webkit_web_frame_get_provisional_data_source(WebKitWebFrame* frame)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
&gt; +
&gt; +    Frame* coreFrame = core(frame);
&gt; +    WebKitWebDataSource* dataSource =
&gt; webkit_web_frame_get_data_source_from_core_loader(coreFrame-&gt;loader()-&gt;provisionalDocumentLoader());
&gt; +
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(dataSource), NULL);
&gt; +
&gt; +    return dataSource;
&gt; +}
&gt; 
&gt; The return_if_fail in there is wrong. The comment says NULL is returned if
&gt; there
&gt; is no provisional data source. And if you want to make sure WebCore doesn&apos;t
&gt; return anything else that must be an ASSERT.
&gt; The same for the non-provisional data source.

Updated in the patch.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>118057</commentid>
    <comment_count>9</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-04-19 01:18:50 -0700</bug_when>
    <thetext>*** Bug 16104 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122505</commentid>
    <comment_count>10</comment_count>
      <attachid>29261</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-21 19:17:58 -0700</bug_when>
    <thetext>Comment on attachment 29261
WebKitWebResource implementation

No comments in over a month.  Please contact a Gtk reviewer directly for review.  Marking these attachments r- to remove them from the review queue since it&apos;s unlikely this patch will get reviewed any time soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122506</commentid>
    <comment_count>11</comment_count>
      <attachid>29263</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-21 19:18:12 -0700</bug_when>
    <thetext>Comment on attachment 29263
web data source and documentloader impl for gtk port

See comment above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122507</commentid>
    <comment_count>12</comment_count>
      <attachid>29264</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-21 19:18:28 -0700</bug_when>
    <thetext>Comment on attachment 29264
implement data source API in webkitwebframe

See comment above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122547</commentid>
    <comment_count>13</comment_count>
      <attachid>29261</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-05-21 22:47:43 -0700</bug_when>
    <thetext>Comment on attachment 29261
WebKitWebResource implementation

Reflagging for review - this still needs substantive review, ideally from a Gtk reviewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122548</commentid>
    <comment_count>14</comment_count>
      <attachid>29263</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-05-21 22:47:53 -0700</bug_when>
    <thetext>Comment on attachment 29263
web data source and documentloader impl for gtk port

Reflagging for review - this still needs substantive review, ideally from a Gtk reviewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122549</commentid>
    <comment_count>15</comment_count>
      <attachid>29264</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-05-21 22:48:01 -0700</bug_when>
    <thetext>Comment on attachment 29264
implement data source API in webkitwebframe

Reflagging for review - this still needs substantive review, ideally from a Gtk reviewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123090</commentid>
    <comment_count>16</comment_count>
      <attachid>29261</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-05-25 19:18:22 -0700</bug_when>
    <thetext>Comment on attachment 29261
WebKitWebResource implementation

&gt; +                                    &quot;url&quot;,
&gt; +                                    &quot;URL&quot;,
&gt; +                                    &quot;The url of the resource&quot;,
&gt; +                                    NULL,
&gt; +                                    WEBKIT_PARAM_READABLE));

Missing the i18n calls here.

&gt; +WEBKIT_API G_CONST_RETURN gchar *
&gt; +webkit_web_resource_get_data               (WebKitWebResource  *web_resource);

Hmm. Is it guaranteed that the data will always be null-terminated? Most probably not, since we&apos;ll have WebResources for all kinds of resources, right? Such as images, for instance? I think we may want to use GString, or something like:

WEBKIT_API G_CONST_RETURN gchar *
webkit_web_resource_get_data               (WebKitWebResource  *web_resource, gsize* length);

 159         const gchar* data;

Length here.

 160     };
 161     WebKitWebResource*
 162     webkit_web_resource_init_with_core_resource(PassRefPtr&lt;WebCore::ArchiveResource&gt;);

new_with_core_resource instead of init_with to match history item.

I&apos;d r+ with those changes, let me ping xan so that he can check on the API along with me =). r- for now, because of those issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123092</commentid>
    <comment_count>17</comment_count>
      <attachid>29263</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-05-25 19:44:15 -0700</bug_when>
    <thetext>Comment on attachment 29263
web data source and documentloader impl for gtk port

&gt; +void DocumentLoader::setDataSource(WebKitWebDataSource* dataSource, WebKitWebView* webView)
&gt; +{
&gt; +    ASSERT(!m_dataSource);
&gt; +
&gt; +    m_dataSource = dataSource;
&gt; +    refDataSource();
&gt; +}

What is the webView used for?

&gt; +#include &lt;wtf/HashSet.h&gt;
&gt; +
&gt; +#include &quot;DocumentLoader.h&quot;
&gt; +
&gt; +#include &quot;webkitdefines.h&quot;

I think you should order these, and make remove the empty lines.

&gt; +namespace WebCore {
&gt; +
&gt; +    class ResourceRequest;
&gt; +    class SubstituteData;
&gt; +}

Needless empty line, or add an additional one at the end.

&gt; -FrameLoaderClient::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
&gt; +FrameLoaderClient::shouldUseCredentialStorage(WebCore::DocumentLoader*, unsigned long  identifier)

Why these changes? There&apos;s a using statement already. Please remove these, they just add noise to the patch, IMO.

&gt; +#include &quot;config.h&quot;
&gt; +
&gt; +#include &quot;webkitwebdatasource.h&quot;

Join those.

&gt; +#include &quot;webkitwebresource.h&quot;
&gt; +#include &quot;webkitprivate.h&quot;
&gt; +
&gt; +#include &lt;glib.h&gt;
&gt; +#include &lt;runtime/InitializeThreading.h&gt;
&gt; +#include &lt;wtf/Assertions.h&gt;
&gt; +
&gt; +#include &quot;ArchiveResource.h&quot;
&gt; +#include &quot;DocumentLoaderGtk.h&quot;
&gt; +#include &quot;FrameLoaderClientGtk.h&quot;
&gt; +#include &quot;FrameLoader.h&quot;
&gt; +#include &quot;KURL.h&quot;
&gt; +#include &quot;PlatformString.h&quot;
&gt; +#include &quot;ResourceRequest.h&quot;
&gt; +#include &quot;SharedBuffer.h&quot;
&gt; +#include &quot;SubstituteData.h&quot;

Join and sort the rest.

&gt; +extern &quot;C&quot; {

Unnecessary, right?

&gt; + * Creates a new #WebKitWebDataSource from a #WebKitNetworkRequest. Normally,
&gt; + * #WebKitWebFrame objects create their data sources, so don&apos;t invoke this
&gt; + * method directly.

I think s/don&apos;t invoke/you will almost never want to invoke/, to match similar documentation on GTK+.

&gt; + * webkit_web_data_source_get_text_encoding_name:

Renaming these is still pending.

&gt; +G_CONST_RETURN gchar* webkit_web_data_source_get_data(WebKitWebDataSource* webDataSource)

My point about these still stands. We are not sure there are no \0&apos;s in the data, so we better return the length, too. So I suggest:

G_CONST_RETURN gchar* webkit_web_data_source_get_data(WebKitWebDataSource* webDataSource, gsize* length)

&gt; +    if (!priv-&gt;mainResource)
&gt; +        priv-&gt;mainResource = webkit_web_resource_init_with_core_resource(coreResource.release());

new_with_core, like history (still stands)

&gt; + * Return value: a #GArray of #WebKitWebResource. You need to free the array
&gt; + * and its subresources once you are done with it.

Uh? Why would the user need to free the GArray?

Also, Mac seems to use the identifier of the resource for various APIs. Should we return a GHashTable that maps identifiers to the actual sub resources, and allow for things such as requesting for a specific resource using the identifier?

&gt; +    // WebKitWebDataSource private
&gt; +    WebKitWebDataSource*
&gt; +    webkit_web_data_source_new_with_loader(PassRefPtr&lt;WebKit::DocumentLoader&gt;);
&gt; +

new_with_core_resource should be here, too?

&gt;      Frame* coreFrame = core(frame);
&gt; -    DocumentLoader* docLoader = coreFrame-&gt;loader()-&gt;documentLoader();
&gt; +    WebCore::DocumentLoader* docLoader = coreFrame-&gt;loader()-&gt;documentLoader();
&gt;      String mimeType = docLoader-&gt;responseMIMEType();
&gt;      return g_strdup(mimeType.utf8().data());

Not necessary?

r- for now</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123094</commentid>
    <comment_count>18</comment_count>
      <attachid>29264</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-05-25 19:50:03 -0700</bug_when>
    <thetext>Comment on attachment 29264
implement data source API in webkitwebframe

&gt; Index: WebKit/WebKit/gtk/tests/testwebdatasource.c

I think you should add the tests to the other patch. They look good to me, but will need to be adapted after the API changes are done.

&gt; +//    g_test_add(&quot;/webkit/webdatasource/get_text_encoding_name&quot;,
&gt; +//               WebDataSourceFixture, 0, web_data_source_fixture_setup,
&gt; +//               test_webkit_web_data_source_get_text_encoding_name, web_data_source_fixture_teardown);

?

&gt; +WebKitWebDataSource* webkit_web_frame_get_provisional_data_source(WebKitWebFrame* frame)

Hmm. Why would anyone want the provisional data source? Isn&apos;t it just a blank thing?

&gt; Index: WebKit/WebKit/gtk/ChangeLog
&gt; ===================================================================
&gt; --- WebKit.orig/WebKit/gtk/ChangeLog	2009-04-05 15:13:18.000000000 +1000
&gt; +++ WebKit/WebKit/gtk/ChangeLog	2009-04-05 15:16:12.000000000 +1000

This part of the patch looks like something wrong happened hehe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132865</commentid>
    <comment_count>19</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 00:28:56 -0700</bug_when>
    <thetext>
&gt; &gt; +WEBKIT_API G_CONST_RETURN gchar *
&gt; &gt; +webkit_web_resource_get_data               (WebKitWebResource  *web_resource);
&gt; 
&gt; Hmm. Is it guaranteed that the data will always be null-terminated? Most
&gt; probably not, since we&apos;ll have WebResources for all kinds of resources, right?
&gt; Such as images, for instance? I think we may want to use GString, or something
&gt; like:

Would using a GString be Ok here? I prefer to go that route as it simplifies things a bit.

&gt; I&apos;d r+ with those changes, let me ping xan so that he can check on the API
&gt; along with me =). r- for now, because of those issues.

I will be loading an updated patch soon with the changes you proposed. Thanks for the feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132868</commentid>
    <comment_count>20</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 00:35:37 -0700</bug_when>
    <thetext>&gt; What is the webView used for?

Removed the param.

&gt; &gt; -FrameLoaderClient::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
&gt; &gt; +FrameLoaderClient::shouldUseCredentialStorage(WebCore::DocumentLoader*, unsigned long  identifier)
&gt; 
&gt; Why these changes? There&apos;s a using statement already. Please remove these, they
&gt; just add noise to the patch, IMO.

No. We have two DocumentLoader&apos;s: one from WebCore and one from WebKit so the namespace prefix is necessary here.

&gt; &gt; +G_CONST_RETURN gchar* webkit_web_data_source_get_data(WebKitWebDataSource* webDataSource)
&gt; 
&gt; My point about these still stands. We are not sure there are no \0&apos;s in the
&gt; data, so we better return the length, too. So I suggest:

I&apos;ve changed this to GString just like the WebResource.

&gt; Also, Mac seems to use the identifier of the resource for various APIs. Should
&gt; we return a GHashTable that maps identifiers to the actual sub resources, and
&gt; allow for things such as requesting for a specific resource using the
&gt; identifier?

Indeed, I had a quick browse on the Mac API and the identifier/resource map is used a lot. Though I think it&apos;s outside of the scope of this datasource enhancement. I&apos;m happy to work on that in a different bug, if you want.

&gt; &gt;      Frame* coreFrame = core(frame);
&gt; &gt; -    DocumentLoader* docLoader = coreFrame-&gt;loader()-&gt;documentLoader();
&gt; &gt; +    WebCore::DocumentLoader* docLoader = coreFrame-&gt;loader()-&gt;documentLoader();
&gt; &gt;      String mimeType = docLoader-&gt;responseMIMEType();
&gt; &gt;      return g_strdup(mimeType.utf8().data());
&gt; 
&gt; Not necessary?

It is. See my reason above. 

I&apos;ve updated the patch with your proposed changes. Thanks a lot for the feedback.

&gt; 
&gt; r- for now</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132871</commentid>
    <comment_count>21</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 00:45:10 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 29264 [details])
&gt; &gt; Index: WebKit/WebKit/gtk/tests/testwebdatasource.c
&gt; 
&gt; I think you should add the tests to the other patch. They look good to me, but
&gt; will need to be adapted after the API changes are done.

It needs to be here as it uses the frame API to get to the data source.

&gt; &gt; +WebKitWebDataSource* webkit_web_frame_get_provisional_data_source(WebKitWebFrame* frame)
&gt; 
&gt; Hmm. Why would anyone want the provisional data source? Isn&apos;t it just a blank
&gt; thing?

If you want the initial request of the data source, you would want the provisional one and not a committed data source.

Thanks for the feedback. Again, really appreciate it :) 

I&apos;ll upload the updates in a bit...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132874</commentid>
    <comment_count>22</comment_count>
      <attachid>33014</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 01:02:26 -0700</bug_when>
    <thetext>Created attachment 33014
updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132875</commentid>
    <comment_count>23</comment_count>
      <attachid>33015</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 01:03:34 -0700</bug_when>
    <thetext>Created attachment 33015
updated datasource patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>132876</commentid>
    <comment_count>24</comment_count>
      <attachid>33016</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-18 01:04:35 -0700</bug_when>
    <thetext>Created attachment 33016
Updated frame data source API patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133120</commentid>
    <comment_count>25</comment_count>
      <attachid>33015</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-07-20 06:16:02 -0700</bug_when>
    <thetext>Comment on attachment 33015
updated datasource patch

&gt; +// helper methos to avoid ref count churn

-&gt; methods?

&gt; +WebKitWebFrame* webkit_web_data_source_get_web_frame(WebKitWebDataSource* webDataSource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +    FrameLoader* frameLoader = priv-&gt;loader-&gt;frameLoader();
&gt; +
&gt; +    ASSERT(frameLoader);
&gt; +
&gt; +    WebKit::FrameLoaderClient* frameLoaderClient = static_cast&lt;WebKit::FrameLoaderClient*&gt;(frameLoader-&gt;client());
&gt; +    return frameLoaderClient-&gt;webFrame();

It seems to me like a loader may be dettached from the frame. Should we check for this case and return NULL, here?

&gt; + * Return value: a #GArray of #WebKitWebResource. The array if owned by WebKit
&gt; + * and should not be freed or destroyed.

I keep thinking if we should not have a GHashtable here, instead, using the long identifier as key, and the WebResource object as value. Then we could have webkit_web_data_source_get_subresource(WebKitWebDataSource*, long identifier) to go straight to a subresource, if we know the resource we want (because, say, we&apos;re tracking it from willSendRequest).

Except for that, the patch looks very good to me. Let me poke Xan to look at it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133123</commentid>
    <comment_count>26</comment_count>
      <attachid>33016</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-07-20 06:35:46 -0700</bug_when>
    <thetext>Comment on attachment 33016
Updated frame data source API patch

Also looks fine to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134413</commentid>
    <comment_count>27</comment_count>
      <attachid>33014</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-07-24 00:24:26 -0700</bug_when>
    <thetext>Comment on attachment 33014
updated patch

&gt; +static void test_webkit_web_resource_get_url(WebResourceFixture* fixture, gconstpointer data)
&gt; +{
&gt; +    gchar* url;
&gt; +    g_object_get(G_OBJECT(fixture-&gt;webResource), &quot;url&quot;, &amp;url, NULL);
&gt; +    g_assert_cmpstr(url, ==, &quot;http://example.com/&quot;);
&gt; +    g_assert_cmpstr(webkit_web_resource_get_url(fixture-&gt;webResource) ,==,&quot;http://example.com/&quot;);
&gt; +}

You are leaking &apos;url&apos; here, g_object_get will dup the string.

&gt; +static void test_webkit_web_resource_get_mime_type(WebResourceFixture* fixture, gconstpointer data)
&gt; +{
&gt; +    gchar* mime_type;
&gt; +    g_object_get(G_OBJECT(fixture-&gt;webResource), &quot;mime-type&quot;, &amp;mime_type, NULL);
&gt; +    g_assert_cmpstr(mime_type, ==, &quot;text/html&quot;);
&gt; +    g_assert_cmpstr(webkit_web_resource_get_mime_type(fixture-&gt;webResource),==,&quot;text/html&quot;);
&gt; +}

Leaking &apos;mime_type&apos;; same issue for all remaining tests.

&gt; +static void webkit_web_resource_dispose(GObject* object)
&gt; +{
&gt; +    WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
&gt; +    WebKitWebResourcePrivate* priv = webResource-&gt;priv;
&gt; +
&gt; +    if (priv-&gt;resource)
&gt; +        priv-&gt;resource-&gt;deref();

Don&apos;t you need a priv-&gt;resource = 0; here?

&gt; +
&gt; +    G_OBJECT_CLASS(webkit_web_resource_parent_class)-&gt;dispose(object);
&gt; +}
&gt; +
&gt; +static void webkit_web_resource_finalize(GObject* object)
&gt; +{
&gt; +    WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
&gt; +    WebKitWebResourcePrivate* priv = webResource-&gt;priv;
&gt; +
&gt; +    priv-&gt;url = CString();
&gt; +    priv-&gt;mimeType = CString();
&gt; +    priv-&gt;textEncoding = CString();
&gt; +    priv-&gt;frameName = CString();

IIRC we had a discussion about this and we decided it was not a good method to free memory? Is the mac port doing something like this? I&apos;d say you&apos;ll be still leaking a full CString object this way...

&gt; +
&gt; +    if (priv-&gt;data)
&gt; +        g_string_free(priv-&gt;data, FALSE);

I think you want to pass TRUE, not FALSE.

&gt; +
&gt; +/**
&gt; + * webkit_web_resource_new:
&gt; + * @data: the data to initialize the #WebKitWebResource
&gt; + * @url: the url of the #WebKitWebResource
&gt; + * @mime_type: the MIME type of the #WebKitWebResource
&gt; + * @text_encoding_name: the text encoding name of the #WebKitWebResource
&gt; + * @frame_name: the frame name of the #WebKitWebResource
&gt; + *
&gt; + * Returns a new #WebKitWebResource. The @text_encoding_name can be %NULL. The
&gt; + * @frame_name argument can be used if the resource represents contents of an
&gt; + * entire HTML frame, otherwise pass %NULL.
&gt; + *
&gt; + * Return value: a new #WebKitWebResource
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +WebKitWebResource* webkit_web_resource_new(const gchar* data,
&gt; +                                           const gchar* url,
&gt; +                                           const gchar* mimeType,
&gt; +                                           const gchar* textEncodingName,
&gt; +                                           const gchar* frameName)
&gt; +{
&gt; +    ASSERT(data);
&gt; +    ASSERT(url);
&gt; +    ASSERT(mime_type);
&gt; +
&gt; +    RefPtr&lt;SharedBuffer&gt; buffer = SharedBuffer::create(data, strlen(data));

Mmm, data can&apos;t have explicit &apos;0&apos;? If it can strlen is wrong here (and I guess you&apos;d need an extra &apos;length&apos; parameter).

&gt; +    WebKitWebResource* webResource = webkit_web_resource_new_with_core_resource(ArchiveResource::create(buffer, KURL(KURL(),String::fromUTF8(url)), String::fromUTF8(mimeType), String::fromUTF8(textEncodingName), String::fromUTF8(frameName)));
&gt; +
&gt; +    return webResource;
&gt; +}
&gt; +
&gt; +/**
&gt; + * webkit_web_resource_get_data:
&gt; + * @web_resource: a #WebKitWebResource
&gt; + *
&gt; + * Returns the data of the @webResource.
&gt; + *
&gt; + * Return value: a #GString containing the character data of the @webResource.
&gt; + * The string is owned by WebKit and should not be freed or destroyed.
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +G_CONST_RETURN GString* webkit_web_resource_get_data(WebKitWebResource* webResource)

I believe in general &apos;const pointer object&apos; makes little sense in C APIs, so I&apos;d just return GString* with the note.

&gt; +/**
&gt; + * webkit_web_resource_get_url:
&gt; + * @web_resource: a #WebKitWebResource
&gt; + *
&gt; + * Returns the URL of the resource
&gt; + *
&gt; + * Return value: the URL of the resource
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +G_CONST_RETURN gchar* webkit_web_resource_get_url(WebKitWebResource* webResource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
&gt; +
&gt; +    WebKitWebResourcePrivate* priv = webResource-&gt;priv;
&gt; +    if (!priv-&gt;resource)
&gt; +        return NULL;
&gt; +
&gt; +    priv-&gt;url = priv-&gt;resource-&gt;url().string().utf8();
&gt; +
&gt; +    return priv-&gt;url.data();

Shouldn&apos;t you put the URL in priv-&gt;url once and then return always that? You are doing the same for the other properties.


&gt; + * webkit_web_resource_get_text_encoding_name:
&gt; + * @web_resource: a #WebKitWebResource
&gt; + *
&gt; + * Returns the text encoding name of the resource
&gt; + *
&gt; + * Return value: the text encoding name of the resource
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +G_CONST_RETURN gchar* webkit_web_resource_get_text_encoding_name(WebKitWebResource* webResource)

We have other APIs to get the encoding name and we call them simply &quot;get_encoding&quot;, so I think we should be consistent here probably.

Going to r- while we work on the issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135531</commentid>
    <comment_count>28</comment_count>
      <attachid>33015</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-07-29 02:19:18 -0700</bug_when>
    <thetext>Comment on attachment 33015
updated datasource patch

&gt; +void DocumentLoader::detachDataSource()
&gt; +{
&gt; +    ASSERT(!m_isDataSourceReffed);
&gt; +    unrefDataSource();
&gt; +}

Mmm, I don&apos;t think this ASSERT can be right, since unrefDataSource won&apos;t do anything if !m_isDataSourceReffed.

&gt; +
&gt; +void DocumentLoader::detachFromFrame()
&gt; +{
&gt; +    WebCore::DocumentLoader::detachFromFrame();
&gt; +
&gt; +    if (m_loadingResources.isEmpty())
&gt; +        unrefDataSource();
&gt; +
&gt; +}

So this will silently not do stuff if there are resources still being loaded. I suppose that&apos;s OK?

&gt; +
&gt; +void DocumentLoader::decreaseLoadCount(unsigned long identifier)
&gt; +{
&gt; +    HashSet&lt;unsigned long&gt;::iterator it = m_loadingResources.find(identifier);
&gt; +
&gt; +    // It is valid for a load to be cancelled before it&apos;s started.
&gt; +    if (it == m_loadingResources.end())
&gt; +        return;
&gt; +
&gt; +    m_loadingResources.remove(it);
&gt; +
&gt; +    if (m_loadingResources.isEmpty() &amp;&amp; !frame())
&gt; +        unrefDataSource();
&gt; +
&gt; +}

Mmm, this seems to not do one unref per call, as opposed to the increaseLoadCount function which does that (for different resources). Is this done elsewhere?


&gt;  WTF::PassRefPtr&lt;WebCore::DocumentLoader&gt; FrameLoaderClient::createDocumentLoader(const WebCore::ResourceRequest&amp; request, const SubstituteData&amp; substituteData)
&gt;  {
&gt; -    return DocumentLoader::create(request, substituteData);
&gt; +    RefPtr&lt;WebKit::DocumentLoader&gt; loader = WebKit::DocumentLoader::create(request, substituteData);
&gt; +
&gt; +    WebKitWebDataSource* webDataSource = webkit_web_data_source_new_with_loader(loader.get());
&gt; +    loader-&gt;setDataSource(webDataSource);
&gt; +    g_object_unref(webDataSource);

Mmm, this seems a bit pointless:

- Create a loader.
- Create a datasource from the loader (and nothing else).
- Set the datasource in the loader.

Couldn&apos;t this happen automatically with a &apos;create&apos; of our own or something like that?

&gt; +#define WEBKIT_WEB_DATA_SOURCE_GET_PRIVATE(obj)        (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_DATA_SOURCE, WebKitWebDataSourcePrivate))
&gt; +
&gt; +G_DEFINE_TYPE(WebKitWebDataSource, webkit_web_data_source, G_TYPE_OBJECT);
&gt; +
&gt; +static void webkit_web_data_source_dispose(GObject* object)
&gt; +{
&gt; +    WebKitWebDataSource* webDataSource = WEBKIT_WEB_DATA_SOURCE(object);
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +
&gt; +    ASSERT(priv-&gt;loader);
&gt; +    ASSERT(!priv-&gt;loader-&gt;isLoading());
&gt; +    priv-&gt;loader-&gt;detachDataSource();
&gt; +    priv-&gt;loader-&gt;deref();
&gt; +
&gt; +    if (priv-&gt;initialRequest)
&gt; +        g_object_unref(priv-&gt;initialRequest);
&gt; +
&gt; +    if (priv-&gt;networkRequest)
&gt; +        g_object_unref(priv-&gt;networkRequest);
&gt; +
&gt; +    if (priv-&gt;mainResource)
&gt; +        g_object_unref(priv-&gt;mainResource);
&gt; +
&gt; +    if (priv-&gt;data)
&gt; +        g_string_free(priv-&gt;data, FALSE);

You need to set all those to NULL, dispose can be called multiple times.

&gt; +
&gt; +    if (priv-&gt;subresources) {
&gt; +        for (unsigned i=0; i &lt; priv-&gt;subresources-&gt;len; i++) {
&gt; +            WebKitWebResource* res = &amp;g_array_index(priv-&gt;subresources, WebKitWebResource, i);
&gt; +            if (res)
&gt; +                g_object_unref(res);
&gt; +        }
&gt; +
&gt; +        g_array_free(priv-&gt;subresources, TRUE);
&gt; +    }

What&apos;s the point of using an array here? A list seems much more natural (seems Gustavo suggests a hash to be able to get easily a resource by its identifier, that might make sense too).

&gt; +
&gt; +    G_OBJECT_CLASS(webkit_web_data_source_parent_class)-&gt;dispose(object);
&gt; +}
&gt; +
&gt; +static void webkit_web_data_source_finalize(GObject* object)
&gt; +{
&gt; +    WebKitWebDataSource* dataSource = WEBKIT_WEB_DATA_SOURCE(object);
&gt; +    WebKitWebDataSourcePrivate* priv = dataSource-&gt;priv;
&gt; +
&gt; +    priv-&gt;unreachableURL = CString();

Same comment about this than in previous patch.

&gt; +/**
&gt; + * webkit_web_data_source_new:
&gt; + * @request: the #WebKitNetworkRequest to use to create this data source
&gt; + *
&gt; + * Creates a new #WebKitWebDataSource from a #WebKitNetworkRequest. Normally,
&gt; + * #WebKitWebFrame objects create their data sources so you will almost never
&gt; + * want to invoke this method directly.
&gt; + *
&gt; + * Returns: a new #WebKitWebDataSource
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +WebKitWebDataSource* webkit_web_data_source_new(WebKitNetworkRequest* request)
&gt; +{
&gt; +    ASSERT(request);
&gt; +
&gt; +    const gchar* uri = webkit_network_request_get_uri(request);
&gt; +
&gt; +    WebKitWebDataSource* datasource;
&gt; +    datasource = webkit_web_data_source_new_with_loader(
&gt; +        WebKit::DocumentLoader::create(ResourceRequest(KURL(KURL(), String::fromUTF8(uri))),
&gt; +                                       SubstituteData()));
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = datasource-&gt;priv;
&gt; +    priv-&gt;initialRequest = request;
&gt; +
&gt; +    return datasource;
&gt; +}

_new functions should, when possible, only be a call to g_object_new (otherwise bindings have to override them). This could probably be fixed by making the request/uri a property of the object and doing the needed setup there?

&gt; +
&gt; +/**
&gt; + * webkit_web_data_source_get_text_encoding_name:

Same than in the other patch, we might want to just call thes &quot;get_text_encoding&quot; to be consistent with existing APIs.

&gt; +
&gt; +/**
&gt; + * webkit_web_data_source_get_data:
&gt; + * @data_source: a #WebKitWebDataSource
&gt; + *
&gt; + * Returns the raw data that represents the the frame&apos;s content.The data will
&gt; + * be incomplete until the data has finished loading. Returns %NULL if the web
&gt; + * frame hasn&apos;t loaded any data. Use webkit_web_data_source_is_loading to test
&gt; + * if data source is in the process of loading.
&gt; + *
&gt; + * Return value: a #GString which contains the raw data that represents the @data_source or %NULL if the
&gt; + * @data_source hasn&apos;t loaded any data.
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +G_CONST_RETURN GString* webkit_web_data_source_get_data(WebKitWebDataSource* webDataSource)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_DATA_SOURCE(webDataSource), NULL);
&gt; +
&gt; +    WebKitWebDataSourcePrivate* priv = webDataSource-&gt;priv;
&gt; +
&gt; +    RefPtr&lt;SharedBuffer&gt; mainResourceData = priv-&gt;loader-&gt;mainResourceData();
&gt; +
&gt; +    if (!mainResourceData)
&gt; +        return NULL;
&gt; +
&gt; +    if (!priv-&gt;data)
&gt; +        priv-&gt;data = g_string_new(mainResourceData-&gt;data());

Can the data have &apos;0&apos;? If yes, then you need the length and do g_string_new_with_len.

&gt; +
&gt; +/**
&gt; + * webkit_web_data_source_get_subresources:
&gt; + * @data_source: a #WebKitWebDataSource
&gt; + *
&gt; + * Returns the @data_source subresources that have finished downloading
&gt; + *
&gt; + * Return value: a #GArray of #WebKitWebResource. The array if owned by WebKit
&gt; + * and should not be freed or destroyed.
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +GArray* webkit_web_data_source_get_subresources(WebKitWebDataSource* webDataSource)

See previous comment about using a list or a hash table here.

&gt; +
&gt; +/**
&gt; + * webkit_web_data_source_get_resource_for_url:
&gt; + * @data_source: a #WebKitWebDataSource
&gt; + * @url: the url of a resource
&gt; + *
&gt; + * Returns the #WebKitWebResource for the given URL
&gt; + *
&gt; + * Return value: the #WebKitWebResource for @url
&gt; + *
&gt; + * Since: 1.1.12
&gt; + */
&gt; +WebKitWebResource* webkit_web_data_source_get_resource_for_url(WebKitWebDataSource* webDataSource, const gchar* url)

Mmm, shouldn&apos;t this return one of the elements in the array we have?

Marking r- while we address some of the issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135565</commentid>
    <comment_count>29</comment_count>
      <attachid>33016</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-07-29 05:10:20 -0700</bug_when>
    <thetext>Comment on attachment 33016
Updated frame data source API patch

&gt; +static void web_data_source_fixture_teardown(WebDataSourceFixture* fixture,
&gt; +                                             gconstpointer data)
&gt; +{
&gt; +    g_assert(fixture-&gt;mainFrame != NULL);
&gt; +    g_assert(fixture-&gt;webView != NULL);

Just g_assert (fixture-&gt;mainFrame);, etc?


&gt;  /**
&gt; + * webkit_web_frame_get_data_source:
&gt; + * @frame: a #WebKitWebFrame
&gt; + *
&gt; + * Returns the committed data source.
&gt; + *
&gt; + * Return value: the committed #WebKitWebDataSource or %NULL if the
&gt; + * provisional data source is not done loading.
&gt; + *
&gt; + * Since: 1.1.5

1.1.5? :)

&gt; + */
&gt; +WebKitWebDataSource* webkit_web_frame_get_data_source(WebKitWebFrame* frame)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
&gt; +
&gt; +    Frame* coreFrame = core(frame);
&gt; +    WebKitWebDataSource* dataSource;

You need to initialize this to NULL here, otherwise you could crash below.

&gt; +
&gt; +    if (coreFrame &amp;&amp; coreFrame-&gt;loader()-&gt;frameHasLoaded())
&gt; +        dataSource = webkit_web_frame_get_data_source_from_core_loader(coreFrame-&gt;loader()-&gt;documentLoader());
&gt; +
&gt; +    if (!dataSource)
&gt; +        return NULL;
&gt; +
&gt; +    return dataSource;
&gt; +}
&gt; +
&gt; +/**
&gt; + * webkit_web_frame_get_provisional_data_source:
&gt; + * @frame: a #WebKitWebFrame
&gt; + *
&gt; + * You use the webkit_web_frame_load_request method to initiate a request that
&gt; + * creates a provisional data source. The provisional data source will
&gt; + * transition to a committed data source once any data has been received. Use
&gt; + * webkit_web_frame_get_data_source to get the committed data source.
&gt; + *
&gt; + * Return value: the provisional #WebKitWebDataSource or %NULL if a load
&gt; + * request is not in progress or has been completed.
&gt; + *
&gt; + * Since: 1.1.5

Version again.

&gt; + */
&gt; +WebKitWebDataSource* webkit_web_frame_get_provisional_data_source(WebKitWebFrame* frame)
&gt; +{
&gt; +    g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
&gt; +
&gt; +    Frame* coreFrame = core(frame);
&gt; +    WebKitWebDataSource* dataSource = webkit_web_frame_get_data_source_from_core_loader(coreFrame-&gt;loader()-&gt;provisionalDocumentLoader());
&gt; +
&gt; +    if (!dataSource)
&gt; +        return NULL;
&gt; +
&gt; +    return dataSource;

You can jsut return the dataSource, this does not really add anything.

Marking as r- for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136088</commentid>
    <comment_count>30</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-30 18:45:48 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; &gt; + * Return value: a #GArray of #WebKitWebResource. The array if owned by WebKit
&gt; &gt; + * and should not be freed or destroyed.
&gt; 
&gt; I keep thinking if we should not have a GHashtable here, instead, using the
&gt; long identifier as key, and the WebResource object as value. Then we could have
&gt; webkit_web_data_source_get_subresource(WebKitWebDataSource*, long identifier)
&gt; to go straight to a subresource, if we know the resource we want (because, say,
&gt; we&apos;re tracking it from willSendRequest).

Do you have a use case in mind for the identifier? For me, adding an identifier sounds like I need to keep track of the resources by their ID. How do I know which resource corresponds to which identifier (or vice-versa)? 

(In reply to comment #27)
&gt; &gt; +
&gt; &gt; +static void webkit_web_resource_finalize(GObject* object)
&gt; &gt; +{
&gt; &gt; +    WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
&gt; &gt; +    WebKitWebResourcePrivate* priv = webResource-&gt;priv;
&gt; &gt; +
&gt; &gt; +    priv-&gt;url = CString();
&gt; &gt; +    priv-&gt;mimeType = CString();
&gt; &gt; +    priv-&gt;textEncoding = CString();
&gt; &gt; +    priv-&gt;frameName = CString();
&gt; 
&gt; IIRC we had a discussion about this and we decided it was not a good method to
&gt; free memory? Is the mac port doing something like this? I&apos;d say you&apos;ll be still
&gt; leaking a full CString object this way...

The strings are owned by WebCore and the interface to get these strings return a const char*. Mac strings are NSStrings which I&apos;m guessing does its own stuff.

So since they&apos;re owned by WebCore, we could just store them as const char*?

(In reply to comment #28)
&gt; &gt; +void DocumentLoader::detachFromFrame()
&gt; &gt; +{
&gt; &gt; +    WebCore::DocumentLoader::detachFromFrame();
&gt; &gt; +
&gt; &gt; +    if (m_loadingResources.isEmpty())
&gt; &gt; +        unrefDataSource();
&gt; &gt; +
&gt; &gt; +}
&gt; 
&gt; So this will silently not do stuff if there are resources still being loaded. I
&gt; suppose that&apos;s OK?

I think it&apos;s fine but I&apos;m not aware of any issues, if any. We don&apos;t want to unref the DS while some resources are still loading either. Should I add a FIXME?

&gt; &gt; +
&gt; &gt; +void DocumentLoader::decreaseLoadCount(unsigned long identifier)
&gt; &gt; +{
&gt; &gt; +    HashSet&lt;unsigned long&gt;::iterator it = m_loadingResources.find(identifier);
&gt; &gt; +
&gt; &gt; +    // It is valid for a load to be cancelled before it&apos;s started.
&gt; &gt; +    if (it == m_loadingResources.end())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    m_loadingResources.remove(it);
&gt; &gt; +
&gt; &gt; +    if (m_loadingResources.isEmpty() &amp;&amp; !frame())
&gt; &gt; +        unrefDataSource();
&gt; &gt; +
&gt; &gt; +}
&gt; 
&gt; Mmm, this seems to not do one unref per call, as opposed to the
&gt; increaseLoadCount function which does that (for different resources). Is this
&gt; done elsewhere?

Mac does the same thing. We&apos;re checking if loadingResources is empty the same reason we&apos;re checking in ::detachFromFrame. 
&gt; 
&gt; &gt;  WTF::PassRefPtr&lt;WebCore::DocumentLoader&gt; FrameLoaderClient::createDocumentLoader(const WebCore::ResourceRequest&amp; request, const SubstituteData&amp; substituteData)
&gt; &gt;  {
&gt; &gt; -    return DocumentLoader::create(request, substituteData);
&gt; &gt; +    RefPtr&lt;WebKit::DocumentLoader&gt; loader = WebKit::DocumentLoader::create(request, substituteData);
&gt; &gt; +
&gt; &gt; +    WebKitWebDataSource* webDataSource = webkit_web_data_source_new_with_loader(loader.get());
&gt; &gt; +    loader-&gt;setDataSource(webDataSource);
&gt; &gt; +    g_object_unref(webDataSource);
&gt; 
&gt; Mmm, this seems a bit pointless:
&gt; 
&gt; - Create a loader.
&gt; - Create a datasource from the loader (and nothing else).
&gt; - Set the datasource in the loader.
&gt; 
&gt; Couldn&apos;t this happen automatically with a &apos;create&apos; of our own or something like
&gt; that?

Both depend on one another that&apos;s why it&apos;s like that. I can create a convenience function but I don&apos;t think it will simplify things. And besides you only need to do  it in this place.

Thanks for the reviews. I&apos;ll update the patches once we&apos;ve discussed the issues above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139050</commentid>
    <comment_count>31</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-11 11:40:12 -0700</bug_when>
    <thetext>(In reply to comment #30)
&gt; (In reply to comment #25)
&gt; &gt; I keep thinking if we should not have a GHashtable here, instead, using the
&gt; &gt; long identifier as key, and the WebResource object as value. Then we could have
&gt; &gt; webkit_web_data_source_get_subresource(WebKitWebDataSource*, long identifier)
&gt; &gt; to go straight to a subresource, if we know the resource we want (because, say,
&gt; &gt; we&apos;re tracking it from willSendRequest).
&gt; 
&gt; Do you have a use case in mind for the identifier? For me, adding an identifier
&gt; sounds like I need to keep track of the resources by their ID. How do I know
&gt; which resource corresponds to which identifier (or vice-versa)? 

It&apos;s not adding an identifier. It&apos;s using the identifier that webcore assigns to it, already. Say we will implement a new signal to notify the application that a resource has been loaded through a XMLHttpRequest (by implementing FrameLoaderClient::dispatchDidLoadResourceByXMLHttpRequest).

That method gets as its first argument the identifier, so I can get the Resource object from the DataSource in O(1), and emit the signal with it, or I can emit the signal with the identifier, and the application can grab the Resource object in O(1). If we don&apos;t map the identifiers to the Resource objects, we don&apos;t have a way of getting hold of the object at all when on FrameLoaderClient::dispatchDidLoadResourceByXMLHttpRequest.

Makes sense? Mac seems to do something similar to this, btw. It stores objects in a mapping, which is indexed by the identifiers. See_objectForIdentifier and surrounding code in their WebView.mm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139076</commentid>
    <comment_count>32</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-11 13:17:53 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; (In reply to comment #30)
&gt; &gt; (In reply to comment #25)
&gt; &gt; &gt; I keep thinking if we should not have a GHashtable here, instead, using the
&gt; &gt; &gt; long identifier as key, and the WebResource object as value. Then we could have
&gt; &gt; &gt; webkit_web_data_source_get_subresource(WebKitWebDataSource*, long identifier)
&gt; &gt; &gt; to go straight to a subresource, if we know the resource we want (because, say,
&gt; &gt; &gt; we&apos;re tracking it from willSendRequest).
&gt; &gt; 
&gt; &gt; Do you have a use case in mind for the identifier? For me, adding an identifier
&gt; &gt; sounds like I need to keep track of the resources by their ID. How do I know
&gt; &gt; which resource corresponds to which identifier (or vice-versa)? 
&gt; 
&gt; It&apos;s not adding an identifier. It&apos;s using the identifier that webcore assigns
&gt; to it, already. Say we will implement a new signal to notify the application
&gt; that a resource has been loaded through a XMLHttpRequest (by implementing
&gt; FrameLoaderClient::dispatchDidLoadResourceByXMLHttpRequest).

I meant you were sending the identifier as part of of the event. Why?

&gt; That method gets as its first argument the identifier, so I can get the
&gt; Resource object from the DataSource in O(1), and emit the signal with it, or I
&gt; can emit the signal with the identifier, and the application can grab the
&gt; Resource object in O(1). If we don&apos;t map the identifiers to the Resource
&gt; objects, we don&apos;t have a way of getting hold of the object at all when on
&gt; FrameLoaderClient::dispatchDidLoadResourceByXMLHttpRequest.
&gt; 
&gt; Makes sense? Mac seems to do something similar to this, btw. It stores objects
&gt; in a mapping, which is indexed by the identifiers. See_objectForIdentifier and
&gt; surrounding code in their WebView.mm.

Yeah and I think we can do the same by making the lookup internal and send the resource needed by the user. Isn&apos;t sending the identifier + &quot;get resource by id&quot; the same as doing the lookup internally and just send the resource as part of outgoing-request?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139701</commentid>
    <comment_count>33</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-12 18:40:39 -0700</bug_when>
    <thetext>(In reply to comment #32)
&gt; &gt; It&apos;s not adding an identifier. It&apos;s using the identifier that webcore assigns
&gt; &gt; to it, already. Say we will implement a new signal to notify the application
&gt; &gt; that a resource has been loaded through a XMLHttpRequest (by implementing
&gt; &gt; FrameLoaderClient::dispatchDidLoadResourceByXMLHttpRequest).
&gt; 
&gt; I meant you were sending the identifier as part of of the event. Why?

Oh. Just because we didn&apos;t have Resource. I plan to send the actual object, now, indeed, which is why I decided to not push it before DataSource is decided on and committed.

&gt; &gt; in a mapping, which is indexed by the identifiers. See_objectForIdentifier and
&gt; &gt; surrounding code in their WebView.mm.
&gt; 
&gt; Yeah and I think we can do the same by making the lookup internal and send the
&gt; resource needed by the user. Isn&apos;t sending the identifier + &quot;get resource by
&gt; id&quot; the same as doing the lookup internally and just send the resource as part
&gt; of outgoing-request?

So yeah, we can make the lookup internally, that sounds good to me. I am just saying we need this to be doable, thus my proposal of having the identifier as a mapping key to the resource object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140448</commentid>
    <comment_count>34</comment_count>
      <attachid>34892</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-15 01:01:20 -0700</bug_when>
    <thetext>Created attachment 34892
Updated WebResource patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140533</commentid>
    <comment_count>35</comment_count>
      <attachid>34920</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-15 22:28:37 -0700</bug_when>
    <thetext>Created attachment 34920
updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141452</commentid>
    <comment_count>36</comment_count>
      <attachid>34892</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-19 03:26:22 -0700</bug_when>
    <thetext>Comment on attachment 34892
Updated WebResource patch


&gt; +
&gt; +static void test_webkit_web_resource_get_data(WebResourceFixture* fixture, gconstpointer data)
&gt; +{
&gt; +    GString* charData = webkit_web_resource_get_data(fixture-&gt;webResource);
&gt; +    g_assert_cmpstr(charData-&gt;str, ==, &quot;&lt;html&gt;&lt;/html&gt;&quot;);
&gt; +}

It would be good to do a test with data that has zeros in it.

&gt; +    g_object_class_install_property(gobject_class,
&gt; +                                    PROP_URL,
&gt; +                                    g_param_spec_string(
&gt; +                                    &quot;url&quot;,
&gt; +                                    _(&quot;URL&quot;),
&gt; +                                    _(&quot;The url of the resource&quot;),
&gt; +                                    NULL,
&gt; +                                    WEBKIT_PARAM_READABLE));
&gt; +
&gt; +    g_object_class_install_property(gobject_class,
&gt; +                                    PROP_MIME_TYPE,
&gt; +                                    g_param_spec_string(
&gt; +                                    &quot;mime-type&quot;,
&gt; +                                    _(&quot;MIME Type&quot;),
&gt; +                                    _(&quot;The MIME type of the resource&quot;),
&gt; +                                    NULL,
&gt; +                                    WEBKIT_PARAM_READABLE));
&gt; +
&gt; +    g_object_class_install_property(gobject_class,
&gt; +                                    PROP_TEXT_ENCODING_NAME,
&gt; +                                    g_param_spec_string(
&gt; +                                    &quot;text-encoding-name&quot;,
&gt; +                                    _(&quot;Text Encoding Name&quot;),
&gt; +                                    _(&quot;The text encoding name of the resource&quot;),
&gt; +                                    NULL,
&gt; +                                    WEBKIT_PARAM_READABLE));
&gt; +
&gt; +    g_object_class_install_property(gobject_class,
&gt; +                                    PROP_FRAME_NAME,
&gt; +                                    g_param_spec_string(
&gt; +                                    &quot;frame-name&quot;,
&gt; +                                    _(&quot;Frame Name&quot;),
&gt; +                                    _(&quot;The frame name of the resource&quot;),
&gt; +                                    NULL,
&gt; +                                    WEBKIT_PARAM_READABLE));

Please document the properties before landing this. Otherwise looks great, r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141453</commentid>
    <comment_count>37</comment_count>
      <attachid>34892</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-19 03:35:56 -0700</bug_when>
    <thetext>Comment on attachment 34892
Updated WebResource patch

I&apos;ll land the patches in this bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141454</commentid>
    <comment_count>38</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-19 04:01:36 -0700</bug_when>
    <thetext>(In reply to comment #37)
&gt; (From update of attachment 34892 [details])
&gt; I&apos;ll land the patches in this bug.

Actually, I have one more comment for the resource bug:

in webkit_web_resource_new, the size parameter should be a gssize and &apos;-1&apos; would mean the data is zero terminated and the code would just use strlen itself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141461</commentid>
    <comment_count>39</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-19 05:58:04 -0700</bug_when>
    <thetext>Have been playing with the patches a bit, some comments:

- the frame APIs to get the provisional and normal DS shouldn&apos;t check if they are valid or not, they should rely on the loaders lifecycle and just try to create a DS from them. If it&apos;s NULL then we&apos;ll return NULL.

- the provisional DS seems to be missing all the data its loader has. On closer inspection the mainResource it has inside is also empty, but if you ask the loader for, for example, the URL, you&apos;ll get the right one. Not sure if the mainResource being empty or not is expected, but in any case the DS should return as much data as it can.

- the doc says the normal DS should be NULL until the load is committed, but this does not seem to happen.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141598</commentid>
    <comment_count>40</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-19 14:21:12 -0700</bug_when>
    <thetext>FYI, I have written the &apos;view source&apos; functionality for Epiphany based on this API, to serve as a simple test-drive: http://bugzilla.gnome.org/show_bug.cgi?id=503968

I plan to also implement &apos;save as&apos; using the datasource API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141746</commentid>
    <comment_count>41</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-19 23:33:44 -0700</bug_when>
    <thetext>(In reply to comment #39)
&gt; inspection the mainResource it has inside is also empty, but if you ask the
&gt; loader for, for example, the URL, you&apos;ll get the right one. Not sure if the
&gt; mainResource being empty or not is expected, but in any case the DS should
&gt; return as much data as it can.
&gt; 

So, this is because mainResource gets its data from the stored response, which in the case of the provisionalLoader will be completely empty for obvious reasons. Using the initialRequest (the request does not work, I&apos;m not completely sure of the difference here) has at least the URL, which is good enough for my needs in Epiphany in order to fix http://bugzilla.gnome.org/show_bug.cgi?id=591294</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142189</commentid>
    <comment_count>42</comment_count>
      <attachid>34920</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-22 23:45:06 -0700</bug_when>
    <thetext>Comment on attachment 34920
updated patch

I had already r- this... hopefully jan still has the mail around :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143322</commentid>
    <comment_count>43</comment_count>
      <attachid>38720</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-28 00:29:34 -0700</bug_when>
    <thetext>Created attachment 38720
Update web resource patch

Added documentation and some refinements.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143323</commentid>
    <comment_count>44</comment_count>
      <attachid>38721</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-28 00:30:15 -0700</bug_when>
    <thetext>Created attachment 38721
updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143324</commentid>
    <comment_count>45</comment_count>
      <attachid>38722</attachid>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-08-28 00:31:14 -0700</bug_when>
    <thetext>Created attachment 38722
Updated patch with working tests

Patch updated with (now) working unit test!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143330</commentid>
    <comment_count>46</comment_count>
      <attachid>38720</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-28 02:33:25 -0700</bug_when>
    <thetext>Comment on attachment 38720
Update web resource patch

&gt; +/**
&gt; + * webkit_web_resource_new:
&gt; + * @data: the data to initialize the #WebKitWebResource
&gt; + * @length: the length of @data

Please mention that length can be &lt; 0 to indicate that &apos;data&apos; is null-terminated.

&gt; + * @uri: the uri of the #WebKitWebResource
&gt; + * @mime_type: the MIME type of the #WebKitWebResource
&gt; + * @text_encoding_name: the text encoding name of the #WebKitWebResource
&gt; + * @frame_name: the frame name of the #WebKitWebResource
&gt; + *
&gt; + * Returns a new #WebKitWebResource. The @text_encoding_name can be %NULL. The
&gt; + * @frame_name argument can be used if the resource represents contents of an
&gt; + * entire HTML frame, otherwise pass %NULL.
&gt; + *
&gt; + * Return value: a new #WebKitWebResource
&gt; + *
&gt; + * Since: 1.1.14
&gt; + */
&gt; +WebKitWebResource* webkit_web_resource_new(const gchar* data,
&gt; +                                           gssize size,
&gt; +                                           const gchar* uri,
&gt; +                                           const gchar* mimeType,
&gt; +                                           const gchar* encoding,
&gt; +                                           const gchar* frameName)
&gt; +{
&gt; +    ASSERT(data);
&gt; +    ASSERT(uri);
&gt; +    ASSERT(mime_type);

I think this should be g_return_val_if_fail, not ASSERT. You don&apos;t want to crash at runtime in any case IMHO.

Still looks good to me with these two changes, 1/2 of r=me and kov can do the final r+ since it&apos;s new API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143346</commentid>
    <comment_count>47</comment_count>
      <attachid>38720</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-28 06:36:19 -0700</bug_when>
    <thetext>Comment on attachment 38720
Update web resource patch

&gt; +                                           const gchar* frameName)
&gt; +{
&gt; +    ASSERT(data);
&gt; +    ASSERT(uri);
&gt; +    ASSERT(mime_type);

+1 for Xan&apos;s comments; also notice that this check would only have any effect in debug builds, and we do want checks in runtime for release builds =).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143639</commentid>
    <comment_count>48</comment_count>
      <attachid>38721</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-31 05:43:23 -0700</bug_when>
    <thetext>Comment on attachment 38721
updated patch

Looks good to me. Xan? =)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143640</commentid>
    <comment_count>49</comment_count>
      <attachid>38722</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-08-31 05:44:35 -0700</bug_when>
    <thetext>Comment on attachment 38722
Updated patch with working tests

Same here, looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143650</commentid>
    <comment_count>50</comment_count>
      <attachid>38721</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-31 06:48:27 -0700</bug_when>
    <thetext>Comment on attachment 38721
updated patch

&gt; +    if (priv-&gt;data) {
&gt; +        g_string_free(priv-&gt;data, TRUE);
&gt; +        priv-&gt;data = NULL;
&gt; +    }

Being pedantic, priv-&gt;data should be freed in finalize, since it&apos;s not a reference counted object :)

&gt; +
&gt; +    G_OBJECT_CLASS(webkit_web_data_source_parent_class)-&gt;dispose(object);
&gt; +}
&gt; +


&gt; +/**
&gt; + * webkit_web_data_source_new_with_request:
&gt; + * @request: the #WebKitNetworkRequest to use to create this data source
&gt; + *
&gt; + * Creates a new #WebKitWebDataSource from a #WebKitNetworkRequest. Normally,
&gt; + * #WebKitWebFrame objects create their data sources so you will almost never
&gt; + * want to invoke this method directly.

Do you have any use case for users where it would make sense to use this? It would be good to mention it I think.

&gt; +/**
&gt; + * webkit_web_data_source_get_initial_request:
&gt; + * @data_source: a #WebKitWebDataSource
&gt; + *
&gt; + * Returns a reference to the original request that was used to load the web
&gt; + * content

I think I would use this to expand the introductory section at the begining of the file.

&gt; + *
&gt; + * Return value: the original #WebKitNetworkRequest
&gt; + *
&gt; + * Since: 1.1.14
&gt; + */

&gt; +
&gt; +/**
&gt; + * webkit_web_data_source_get_network_request:
&gt; + * @data_source: a #WebKitWebDataSource
&gt; + *
&gt; + * Returns a #WebKitNetworkRequest that was used to create this #WebKitWebDataSource
&gt; + *
&gt; + * Return value: the #WebKitNetworkRequest that created the @data_source or
&gt; + * %NULL if the @data_source is not attached to the frame or the frame hasn&apos;t been loaded.

It&apos;s still not clear to me from the doc what&apos;s the difference between this and the initial request. Only that if this function returns !NULL it means the resource has been loaded and attached to a frame? Ie, something similar to the provisional vs non-provisional data source? Could you clarify it in the documentation? And add tests for it :)

&gt; + *
&gt; + * Since 1.1.14
&gt; + */

I&apos;m going to r+, but let&apos;s clarify the documentation a bit and work on adding tests ASAP.
+        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [Gtk] Implement a WebDataSource for the gtk port
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=24758
&gt; +
&gt;          Implement WebKitWebResource for the resource-related API for
&gt;          WebKitWebDataSource.
&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143651</commentid>
    <comment_count>51</comment_count>
      <attachid>38722</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-31 07:09:25 -0700</bug_when>
    <thetext>Comment on attachment 38722
Updated patch with working tests

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144196</commentid>
    <comment_count>52</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-09-02 06:07:58 -0700</bug_when>
    <thetext>(In reply to comment #51)
&gt; (From update of attachment 38722 [details])
&gt; r=me

Landed as http://trac.webkit.org/changeset/47929, http://trac.webkit.org/changeset/47964 and http://trac.webkit.org/changeset/47965.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28853</attachid>
            <date>2009-03-23 08:51:27 -0700</date>
            <delta_ts>2009-04-04 22:21:20 -0700</delta_ts>
            <desc>initial implementation</desc>
            <filename>webdatasource.patch</filename>
            <type>text/plain</type>
            <size>34952</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0dOVW1ha2VmaWxlLmFtIGIvR05VbWFrZWZpbGUuYW0KaW5kZXggMTNjZjVl
ZS4uNDkyNTA4MyAxMDA2NDQKLS0tIGEvR05VbWFrZWZpbGUuYW0KKysrIGIvR05VbWFrZWZpbGUu
YW0KQEAgLTMxMSw2ICszMTEsNyBAQCB3ZWJraXRndGtfaF9hcGkgKz0gXAogCVdlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHNvdXBhdXRoZGlhbG9nLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtp
dHZlcnNpb24uaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViYmFja2ZvcndhcmRsaXN0
LmggXAorCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaCBcCiAJV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0
d2ViaGlzdG9yeWl0ZW0uaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9y
LmggXApAQCAtMzMzLDYgKzMzNCw4IEBAIHdlYmtpdGd0a19zb3VyY2VzICs9IFwKIAlXZWJLaXQv
Z3RrL1dlYkNvcmVTdXBwb3J0L0NvbnRleHRNZW51Q2xpZW50R3RrLmggXAogCVdlYktpdC9ndGsv
V2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEd0ay5jcHAgXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1
cHBvcnQvRHJhZ0NsaWVudEd0ay5oIFwKKwlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RvY3Vt
ZW50TG9hZGVyR3RrLmNwcCBcCisJV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExv
YWRlckd0ay5oIFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0VkaXRvckNsaWVudEd0ay5j
cHAgXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRWRpdG9yQ2xpZW50R3RrLmggXAogCVdl
YktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwIFwKQEAgLTM0
Nyw2ICszNTAsNyBAQCB3ZWJraXRndGtfc291cmNlcyArPSBcCiAJV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0c291cGF1dGhkaWFsb2cuYyBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0dmVyc2lv
bi5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmJhY2tmb3J3YXJkbGlzdC5jcHAg
XAorCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwIFwKIAlXZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtp
dHdlYmhpc3RvcnlpdGVtLmNwcCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVj
dG9yLmNwcCBcCkBAIC00ODcsNyArNDkxLDggQEAgd2Via2l0X3Rlc3RzX2xkYWRkID0gXAogCiBU
RVNUX1BST0dTICs9IFByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2ViZnJhbWUgXAogCVByb2dyYW1z
L3VuaXR0ZXN0cy90ZXN0d2ViYmFja2ZvcndhcmRsaXN0IFwKLQlQcm9ncmFtcy91bml0dGVzdHMv
dGVzdHdlYmhpc3RvcnlpdGVtCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJoaXN0b3J5aXRl
bSBcCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJkYXRhc291cmNlCiAKICMgQWRkIGFkZGl0
aW9uYWwgdGVzdHMgaGVyZQogUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJmcmFtZV9TT1VSQ0VT
ID0gV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2ViZnJhbWUuYwpAQCAtNTAyLDYgKzUwNyw5IEBAIFBy
b2dyYW1zX3VuaXR0ZXN0c190ZXN0d2ViaGlzdG9yeWl0ZW1fU09VUkNFUyA9IFdlYktpdC9ndGsv
dGVzdHMvdGVzdHdlYmhpc3RvcnlpCiBQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYmhpc3Rvcnlp
dGVtX0NGTEFHUyA9ICQod2Via2l0X3Rlc3RzX2NmbGFncykKIFByb2dyYW1zX3VuaXR0ZXN0c190
ZXN0d2ViaGlzdG9yeWl0ZW1fTERBREQgPSAkKHdlYmtpdF90ZXN0c19sZGFkZCkKIAorUHJvZ3Jh
bXNfdW5pdHRlc3RzX3Rlc3R3ZWJkYXRhc291cmNlX1NPVVJDRVMgPSBXZWJLaXQvZ3RrL3Rlc3Rz
L3Rlc3R3ZWJkYXRhc291cmNlLmMKK1Byb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2ViZGF0YXNvdXJj
ZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19jZmxhZ3MpCitQcm9ncmFtc191bml0dGVzdHNfdGVz
dHdlYmRhdGFzb3VyY2VfTERBREQgPSAkKHdlYmtpdF90ZXN0c19sZGFkZCkKIAogIyBBdXRvZ2Vu
ZXJhdGVkIHNvdXJjZXMKIEJVSUxUX1NPVVJDRVMgOj0gXApkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0
ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAgYi9XZWJLaXQvZ3RrL1dlYkNv
cmVTdXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5jMDA2MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2d0ay9XZWJDb3Jl
U3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlckd0ay5oIgorCisj
aW5jbHVkZSAid2Via2l0d2ViZGF0YXNvdXJjZS5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworRG9jdW1lbnRMb2FkZXJHdGs6OkRvY3VtZW50TG9hZGVyR3RrKGNvbnN0IFJlc291cmNl
UmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1dGVEYXRhKQor
ICAgIDogRG9jdW1lbnRMb2FkZXIocmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpCisgICAgLCBtX2lz
RGF0YVNvdXJjZVJlZmZlZChmYWxzZSkKKyAgICAsIG1fZGF0YVNvdXJjZSgwKQoreworfQorCit2
b2lkIERvY3VtZW50TG9hZGVyR3RrOjpzZXREYXRhU291cmNlKFdlYktpdFdlYkRhdGFTb3VyY2Uq
IGRhdGFTb3VyY2UsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcpCit7CisgICAgQVNTRVJUKCFtX2Rh
dGFTb3VyY2UpOworCisgICAgbV9kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICByZWZEYXRh
U291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXJHdGs6OmRldGFjaERhdGFTb3VyY2Uo
KQoreworICAgIEFTU0VSVCghbV9pc0RhdGFTb3VyY2VSZWZmZWQpOworICAgIHVucmVmRGF0YVNv
dXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyR3RrOjphdHRhY2hUb0ZyYW1lKCkKK3sK
KyAgICBEb2N1bWVudExvYWRlcjo6YXR0YWNoVG9GcmFtZSgpOworCisgICAgcmVmRGF0YVNvdXJj
ZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyR3RrOjpkZXRhY2hGcm9tRnJhbWUoKQorewor
ICAgIERvY3VtZW50TG9hZGVyOjpkZXRhY2hGcm9tRnJhbWUoKTsKKworICAgIGlmIChtX2xvYWRp
bmdSZXNvdXJjZXMuaXNFbXB0eSgpKQorICAgICAgICB1bnJlZkRhdGFTb3VyY2UoKTsKKworfQor
Cit2b2lkIERvY3VtZW50TG9hZGVyR3RrOjppbmNyZWFzZUxvYWRDb3VudCh1bnNpZ25lZCBsb25n
IGlkZW50aWZpZXIpCit7CisgICAgQVNTRVJUKG1fZGF0YVNvdXJjZSk7CisKKyAgICBpZiAobV9s
b2FkaW5nUmVzb3VyY2VzLmNvbnRhaW5zKGlkZW50aWZpZXIpKQorICAgICAgICByZXR1cm47Cisg
ICAgbV9sb2FkaW5nUmVzb3VyY2VzLmFkZChpZGVudGlmaWVyKTsKKyAgICByZWZEYXRhU291cmNl
KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXJHdGs6OmRlY3JlYXNlTG9hZENvdW50KHVuc2ln
bmVkIGxvbmcgaWRlbnRpZmllcikKK3sKKyAgICBIYXNoU2V0PHVuc2lnbmVkIGxvbmc+OjppdGVy
YXRvciBpdCA9IG1fbG9hZGluZ1Jlc291cmNlcy5maW5kKGlkZW50aWZpZXIpOworCisgICAgLy8g
SXQgaXMgdmFsaWQgZm9yIGEgbG9hZCB0byBiZSBjYW5jZWxsZWQgYmVmb3JlIGl0J3Mgc3RhcnRl
ZC4KKyAgICBpZiAoaXQgPT0gbV9sb2FkaW5nUmVzb3VyY2VzLmVuZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX2xvYWRpbmdSZXNvdXJjZXMucmVtb3ZlKGl0KTsKKworICAgIGlmIChtX2xv
YWRpbmdSZXNvdXJjZXMuaXNFbXB0eSgpICYmICFmcmFtZSgpKQorICAgICAgICB1bnJlZkRhdGFT
b3VyY2UoKTsKKworfQorCisvLyBoZWxwZXIgbWV0aG9zIHRvIGF2b2lkIHJlZiBjb3VudCBjaHVy
bgordm9pZCBEb2N1bWVudExvYWRlckd0azo6cmVmRGF0YVNvdXJjZSgpCit7CisgICAgaWYgKG1f
aXNEYXRhU291cmNlUmVmZmVkIHx8ICFtX2RhdGFTb3VyY2UpCisgICAgICAgIHJldHVybjsKKyAg
ICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IHRydWU7CisgICAgZ19vYmplY3RfcmVmKG1fZGF0YVNv
dXJjZSk7Cit9Cit2b2lkIERvY3VtZW50TG9hZGVyR3RrOjp1bnJlZkRhdGFTb3VyY2UoKQorewor
ICAgIGlmICghbV9pc0RhdGFTb3VyY2VSZWZmZWQpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NF
UlQobV9kYXRhU291cmNlKTsKKyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IGZhbHNlOworICAg
IGdfb2JqZWN0X3VucmVmKG1fZGF0YVNvdXJjZSk7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3Rr
L1dlYkNvcmVTdXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmggYi9XZWJLaXQvZ3RrL1dlYkNvcmVT
dXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uMWE4ZWM5NAotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBv
cnQvRG9jdW1lbnRMb2FkZXJHdGsuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAg
ZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSA8d3RmL0hhc2hTZXQuaD4KKworI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisKKyNpbmNs
dWRlICJ3ZWJraXRkZWZpbmVzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBjbGFzcyBS
ZXNvdXJjZVJlcXVlc3Q7CisgICAgY2xhc3MgU3Vic3RpdHV0ZURhdGE7Cit9CisKK2NsYXNzIERv
Y3VtZW50TG9hZGVyR3RrIDogcHVibGljIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVudExvYWRlckd0az4gY3JlYXRlKGNvbnN0
IFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgV2ViQ29yZTo6U3Vic3Rp
dHV0ZURhdGEmIGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IERvY3Vt
ZW50TG9hZGVyR3RrKHJlcXVlc3QsIGRhdGEpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERhdGFT
b3VyY2UoV2ViS2l0V2ViRGF0YVNvdXJjZSosIFdlYktpdFdlYlZpZXcqKTsKKyAgICB2b2lkIGRl
dGFjaERhdGFTb3VyY2UoKTsKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhU291cmNlKCkg
Y29uc3QgeyByZXR1cm4gbV9kYXRhU291cmNlOyB9CisKKyAgICB2b2lkIGluY3JlYXNlTG9hZENv
dW50KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcik7CisgICAgdm9pZCBkZWNyZWFzZUxvYWRDb3Vu
dCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIpOworCitwcml2YXRlOgorICAgIERvY3VtZW50TG9h
ZGVyR3RrKGNvbnN0IFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFdlYkNvcmU6OlN1
YnN0aXR1dGVEYXRhJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoVG9GcmFtZSgpOworICAg
IHZpcnR1YWwgdm9pZCBkZXRhY2hGcm9tRnJhbWUoKTsKKworICAgIHZvaWQgcmVmRGF0YVNvdXJj
ZSgpOworICAgIHZvaWQgdW5yZWZEYXRhU291cmNlKCk7CisKKyAgICBib29sIG1faXNEYXRhU291
cmNlUmVmZmVkOworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIG1fZGF0YVNvdXJjZTsKKyAgICBI
YXNoU2V0PHVuc2lnbmVkIGxvbmc+IG1fbG9hZGluZ1Jlc291cmNlczsKK307CmRpZmYgLS1naXQg
YS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50R3RrLmNwcCBiL1dl
YktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwCmluZGV4IDhl
MmMwMGMuLmFkZTdlMTUgMTAwNjQ0Ci0tLSBhL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJh
bWVMb2FkZXJDbGllbnRHdGsuY3BwCisrKyBiL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJh
bWVMb2FkZXJDbGllbnRHdGsuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJDb2xv
ci5oIgogI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2Fk
ZXJHdGsuaCIKICNpbmNsdWRlICJGb3JtU3RhdGUuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5o
IgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgpAQCAtMTY2LDcgKzE2NywxMyBAQCBTdHJpbmcgRnJh
bWVMb2FkZXJDbGllbnQ6OnVzZXJBZ2VudChjb25zdCBLVVJMJikKIAogV1RGOjpQYXNzUmVmUHRy
PFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyPiBGcmFtZUxvYWRlckNsaWVudDo6Y3JlYXRlRG9jdW1l
bnRMb2FkZXIoY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBT
dWJzdGl0dXRlRGF0YSYgc3Vic3RpdHV0ZURhdGEpCiB7Ci0gICAgcmV0dXJuIERvY3VtZW50TG9h
ZGVyOjpjcmVhdGUocmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpOworICAgIFJlZlB0cjxEb2N1bWVu
dExvYWRlckd0az4gbG9hZGVyID0gRG9jdW1lbnRMb2FkZXJHdGs6OmNyZWF0ZShyZXF1ZXN0LCBz
dWJzdGl0dXRlRGF0YSk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNl
ID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pbml0X3dpdGhfbG9hZGVyKGxvYWRlci5nZXQoKSk7
CisgICAgbG9hZGVyLT5zZXREYXRhU291cmNlKHdlYkRhdGFTb3VyY2UsIGdldFZpZXdGcm9tRnJh
bWUobV9mcmFtZSkpOworICAgIGdfb2JqZWN0X3VucmVmKHdlYkRhdGFTb3VyY2UpOworCisgICAg
cmV0dXJuIGxvYWRlci5yZWxlYXNlKCk7CiB9CiAKIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRp
c3BhdGNoV2lsbFN1Ym1pdEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiBwb2xpY3lGdW5jdGlvbiwg
UGFzc1JlZlB0cjxGb3JtU3RhdGU+KQpAQCAtMjIyLDkgKzIyOSwxMCBAQCB2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50OjpkaXNwYXRjaERpZENhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKERvY3Vt
ZW50TG9hZGVyKgogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6OmRpc3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQg
bG9uZywgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxTZW5kUmVxdWVzdChEb2N1bWVudExvYWRlciog
bG9hZGVyLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIFJlc291cmNlUmVxdWVzdCYgcmVxdWVz
dCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVkaXJlY3RSZXNwb25zZSkKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIGlmIChyZWRpcmVjdFJlc3BvbnNlLmlzTnVsbCgpKQorICAgICAg
ICBzdGF0aWNfY2FzdDxEb2N1bWVudExvYWRlckd0ayo+KGxvYWRlciktPmluY3JlYXNlTG9hZENv
dW50KGlkZW50aWZpZXIpOwogfQogCiB2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojphc3NpZ25JZGVu
dGlmaWVyVG9Jbml0aWFsUmVxdWVzdCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIERvY3VtZW50
TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikKQEAgLTc3MywxNCArNzgxLDE0IEBAIHZv
aWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoRG9j
dW1lbnRMb2FkZXIqLCB1bnNpZ25lCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBG
cmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGaW5pc2hMb2FkaW5nKERvY3VtZW50TG9hZGVy
KiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlz
cGF0Y2hEaWRGaW5pc2hMb2FkaW5nKERvY3VtZW50TG9hZGVyKiBsb2FkZXIsIHVuc2lnbmVkIGxv
bmcgaWRlbnRpZmllcikKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHN0YXRpY19jYXN0
PERvY3VtZW50TG9hZGVyR3RrKj4obG9hZGVyKS0+ZGVjcmVhc2VMb2FkQ291bnQoaWRlbnRpZmll
cik7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkRmFpbExvYWRpbmco
RG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNvbnN0IFJlc291cmNl
RXJyb3ImKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGYWlsTG9hZGluZyhE
b2N1bWVudExvYWRlciogbG9hZGVyLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNvbnN0IFJl
c291cmNlRXJyb3ImKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgc3RhdGljX2Nhc3Q8
RG9jdW1lbnRMb2FkZXJHdGsqPihsb2FkZXIpLT5kZWNyZWFzZUxvYWRDb3VudChpZGVudGlmaWVy
KTsKIH0KIAogYm9vbCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VG
cm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiwgaW50IGxlbmd0aCkKZGlmZiAtLWdpdCBhL1dlYktpdC9n
dGsvdGVzdHMvdGVzdHdlYmRhdGFzb3VyY2UuYyBiL1dlYktpdC9ndGsvdGVzdHMvdGVzdHdlYmRh
dGFzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI2ZTJjCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2ViZGF0YXNvdXJjZS5jCkBA
IC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEphbiBNaWNoYWVsIEFs
b256bworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDx3
ZWJraXQvd2Via2l0Lmg+CisKKyNpZiBHTElCX0NIRUNLX1ZFUlNJT04oMiwgMTYsIDApICYmIEdU
S19DSEVDS19WRVJTSU9OKDIsIDE0LCAwKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV2ViS2l0
V2ViVmlldyogd2ViVmlldzsKKyAgICBXZWJLaXRXZWJGcmFtZSogbWFpbkZyYW1lOworfSBXZWJE
YXRhU291cmNlRml4dHVyZTsKKworc3RhdGljIHZvaWQgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVf
c2V0dXAoV2ViRGF0YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgZml4dHVy
ZS0+d2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAg
IGdfb2JqZWN0X3JlZl9zaW5rKGZpeHR1cmUtPndlYlZpZXcpOworICAgIGZpeHR1cmUtPm1haW5G
cmFtZSA9IHdlYmtpdF93ZWJfdmlld19nZXRfbWFpbl9mcmFtZShmaXh0dXJlLT53ZWJWaWV3KTsK
K30KKworc3RhdGljIHZvaWQgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfdGVhcmRvd24oV2ViRGF0
YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgZ19hc3NlcnQoZml4dHVy
ZS0+bWFpbkZyYW1lICE9IE5VTEwpOworICAgIGdfYXNzZXJ0KGZpeHR1cmUtPndlYlZpZXcgIT0g
TlVMTCk7CisgICAgd2Via2l0X3dlYl9mcmFtZV9zdG9wX2xvYWRpbmcoZml4dHVyZS0+bWFpbkZy
YW1lKTsKKyAgICBnX29iamVjdF91bnJlZihmaXh0dXJlLT53ZWJWaWV3KTsKK30KKworc3RhdGlj
IHZvaWQgdGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QoV2Vi
RGF0YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7Cisg
ICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZTsKKyAgICBXZWJLaXROZXR3b3JrUmVx
dWVzdCogaW5pdGlhbFJlcXVlc3Q7CisKKyAgICBXZWJLaXROZXR3b3JrUmVxdWVzdCogcmVxdWVz
dCA9IHdlYmtpdF9uZXR3b3JrX3JlcXVlc3RfbmV3KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsK
KyAgICB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRfcmVxdWVzdChmaXh0dXJlLT5tYWluRnJhbWUsIHJl
cXVlc3QpOworICAgIGdfb2JqZWN0X3VucmVmKHJlcXVlc3QpOworCisgICAgZGF0YVNvdXJjZSA9
IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3Byb3Zpc2lvbmFsX2RhdGFfc291cmNlKGZpeHR1cmUtPm1h
aW5GcmFtZSk7CisgICAgZ19hc3NlcnQoZGF0YVNvdXJjZSk7CisgICAgaW5pdGlhbFJlcXVlc3Qg
PSB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QoZGF0YVNvdXJjZSk7
CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF9uZXR3b3JrX3JlcXVlc3RfZ2V0X3VyaShpbml0
aWFsUmVxdWVzdCksID09LCAiaHR0cDovL3d3dy5nb29nbGUuY29tLyIpOworCit9CisKK3N0YXRp
YyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1l
KFdlYkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRh
KQoreworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2U7CisKKyAgICB3ZWJraXRf
d2ViX2ZyYW1lX2xvYWRfc3RyaW5nKGZpeHR1cmUtPm1haW5GcmFtZSwgIjxodG1sPjwvaHRtbD4i
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsICJ1cy1hc2Np
aSIsIE5VTEwpOworICAgIGRhdGFTb3VyY2UgPSB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3Nv
dXJjZShmaXh0dXJlLT5tYWluRnJhbWUpOworCisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93
ZWJfdmlld19nZXRfZW5jb2RpbmcoZml4dHVyZS0+d2ViVmlldyksID09LCB3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX2dldF90ZXh0X2VuY29kaW5nX25hbWUoZGF0YVNvdXJjZSkpOworCit9CisKKwor
aW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGdfdGhyZWFkX2luaXQoTlVM
TCk7CisgICAgZ3RrX3Rlc3RfaW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgICAgZ190ZXN0
X2J1Z19iYXNlKCJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy8iKTsKKyAgICBnX3Rlc3RfYWRkKCIv
d2Via2l0L3dlYmRhdGFzb3VyY2UvZ2V0X3RleHRfZW5jb2RpbmdfbmFtZSIsCisgICAgICAgICAg
ICAgICBXZWJEYXRhU291cmNlRml4dHVyZSwgMCwgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfc2V0
dXAsCisgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRf
ZW5jb2RpbmdfbmFtZSwgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOworICAgIGdf
dGVzdF9hZGQoIi93ZWJraXQvd2ViZGF0YXNvdXJjZS9nZXRfaW5pdGlhbF9yZXF1ZXN0IiwKKyAg
ICAgICAgICAgICAgIFdlYkRhdGFTb3VyY2VGaXh0dXJlLCAwLCB3ZWJfZGF0YV9zb3VyY2VfZml4
dHVyZV9zZXR1cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9n
ZXRfaW5pdGlhbF9yZXF1ZXN0LCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV90ZWFyZG93bik7Cisg
ICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CisKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywg
Y2hhcioqIGFyZ3YpCit7CisgICAgZ19jcml0aWNhbCgiWW91IHdpbGwgbmVlZCBhdCBsZWFzdCBn
bGliLTIuMTYuMCBhbmQgZ3RrLTIuMTQuMCB0byBydW4gdGhlIHVuaXQgdGVzdHMuIERvaW5nIG5v
dGhpbmcgbm93LiIpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdC5oIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0LmgKaW5k
ZXggYzIyMTY1ZS4uZGQ1ODM4OCAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0
LmgKKysrIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0LmgKQEAgLTMyLDYgKzMyLDcgQEAKICNp
bmNsdWRlIDx3ZWJraXQvd2Via2l0d2Vid2luZG93ZmVhdHVyZXMuaD4KICNpbmNsdWRlIDx3ZWJr
aXQvd2Via2l0d2Vidmlldy5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJiYWNrZm9yd2Fy
ZGxpc3QuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZGF0YXNvdXJjZS5oPgogI2luY2x1
ZGUgPHdlYmtpdC93ZWJraXR3ZWJoaXN0b3J5aXRlbS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJr
aXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJuYXZpZ2F0
aW9uYWN0aW9uLmg+CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVz
LmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmgKaW5kZXggYjBhYjVlOS4uZWIy
NjAwYSAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCisrKyBi
L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdGRlZmluZXMuaApAQCAtNzEsNiArNzEsOSBAQCB0eXBl
ZGVmIHN0cnVjdCBfV2ViS2l0V2ViVmlld0NsYXNzIFdlYktpdFdlYlZpZXdDbGFzczsKIHR5cGVk
ZWYgc3RydWN0IF9XZWJLaXREb3dubG9hZCBXZWJLaXREb3dubG9hZDsKIHR5cGVkZWYgc3RydWN0
IF9XZWJLaXREb3dubG9hZENsYXNzIFdlYktpdERvd25sb2FkQ2xhc3M7CiAKK3R5cGVkZWYgc3Ry
dWN0IF9XZWJLaXRXZWJEYXRhU291cmNlIFdlYktpdFdlYkRhdGFTb3VyY2U7Cit0eXBlZGVmIHN0
cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJjZUNsYXNzIFdlYktpdFdlYkRhdGFTb3VyY2VDbGFzczsK
KwogR19FTkRfREVDTFMKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93
ZWJraXRwcml2YXRlLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgKaW5kZXgg
MGI4M2ExMS4uYzFhYzFkNiAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0cHJp
dmF0ZS5oCisrKyBiL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaApAQCAtNTEsNiAr
NTEsNyBAQAogI2luY2x1ZGUgPGdsaWIuaD4KIAogY2xhc3MgRG93bmxvYWRDbGllbnQ7CitjbGFz
cyBEb2N1bWVudExvYWRlckd0azsKIAogbmFtZXNwYWNlIFdlYktpdCB7CiAgICAgV2ViS2l0V2Vi
VmlldyogZ2V0Vmlld0Zyb21GcmFtZShXZWJLaXRXZWJGcmFtZSopOwpAQCAtNjgsNiArNjksNyBA
QCBuYW1lc3BhY2UgV2ViS2l0IHsKIAogICAgIFdlYktpdFdlYk5hdmlnYXRpb25SZWFzb24ga2l0
KFdlYkNvcmU6Ok5hdmlnYXRpb25UeXBlIHR5cGUpOwogICAgIFdlYkNvcmU6Ok5hdmlnYXRpb25U
eXBlIGNvcmUoV2ViS2l0V2ViTmF2aWdhdGlvblJlYXNvbiByZWFzb24pOworCiB9CiAKIGV4dGVy
biAiQyIgewpAQCAtMTQzLDYgKzE0NSwxMCBAQCBleHRlcm4gIkMiIHsKICAgICB3ZWJraXRfd2Vi
X2hpc3RvcnlfaXRlbV9nZXRfY2hpbGRyZW4oV2ViS2l0V2ViSGlzdG9yeUl0ZW0qKTsKICAgICAv
LyBlbmQgV2ViS2l0V2ViSGlzdG9yeUl0ZW0gcHJpdmF0ZQogCisgICAgLy8gV2ViS2l0V2ViRGF0
YVNvdXJjZSBwcml2YXRlCisgICAgV0VCS0lUX0FQSSBXZWJLaXRXZWJEYXRhU291cmNlKgorICAg
IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaW5pdF93aXRoX2xvYWRlcihQYXNzUmVmUHRyPERvY3Vt
ZW50TG9hZGVyR3RrPik7CisKICAgICB2b2lkCiAgICAgd2Via2l0X3dlYl9pbnNwZWN0b3Jfc2V0
X2luc3BlY3Rvcl9jbGllbnQoV2ViS2l0V2ViSW5zcGVjdG9yKiwgV2ViQ29yZTo6UGFnZSopOwog
CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmNwcCBi
L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTVlODcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmNwcApAQCAtMCwwICsxLDI2OCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
SmFuIE1pY2hhZWwgQy4gQWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIndl
YmtpdHdlYmRhdGFzb3VyY2UuaCIKKyNpbmNsdWRlICJ3ZWJraXRwcml2YXRlLmgiCisKKyNpbmNs
dWRlIDxnbGliLmg+CisjaW5jbHVkZSA8cnVudGltZS9Jbml0aWFsaXplVGhyZWFkaW5nLmg+Cisj
aW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyR3Rr
LmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRHdGsuaCIKKyNpbmNsdWRlICJGcmFtZUxv
YWRlci5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgor
I2luY2x1ZGUgIlJlc291cmNlUmVxdWVzdC5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgor
I2luY2x1ZGUgIlN1YnN0aXR1dGVEYXRhLmgiCisKKy8qKgorICogU0VDVElPTjp3ZWJraXR3ZWJk
YXRhc291cmNlCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEVuY2Fwc3VsYXRlcyB0aGUgc291cmNl
IG9mIGEgI1dlYktpdFdlYkZyYW1lCisgKiBAc2VlX2Fsc286ICNXZWJLaXRXZWJGcmFtZQorICoK
KyAqLworCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7
CisKK2V4dGVybiAiQyIgeworCitzdHJ1Y3QgX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlIHsK
KyAgICBEb2N1bWVudExvYWRlckd0ayogbG9hZGVyOworfTsKKworI2RlZmluZSBXRUJLSVRfV0VC
X0RBVEFfU09VUkNFX0dFVF9QUklWQVRFKG9iaikgICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VU
X1BSSVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSwgV2ViS2l0V2ViRGF0
YVNvdXJjZVByaXZhdGUpKQorCitHX0RFRklORV9UWVBFKFdlYktpdFdlYkRhdGFTb3VyY2UsIHdl
YmtpdF93ZWJfZGF0YV9zb3VyY2UsIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZCB3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2Rpc3Bvc2UoR09iamVjdCogb2JqZWN0KQoreworICAgIFdlYktp
dFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UgPSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9i
amVjdCk7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291
cmNlLT5wcml2OworCisgICAgQVNTRVJUKHByaXYtPmxvYWRlcik7CisgICAgQVNTRVJUKCFwcml2
LT5sb2FkZXItPmlzTG9hZGluZygpKTsKKyAgICBwcml2LT5sb2FkZXItPmRldGFjaERhdGFTb3Vy
Y2UoKTsKKyAgICBwcml2LT5sb2FkZXItPmRlcmVmKCk7CisKKyAgICBHX09CSkVDVF9DTEFTUyh3
ZWJraXRfd2ViX2RhdGFfc291cmNlX3BhcmVudF9jbGFzcyktPmRpc3Bvc2Uob2JqZWN0KTsKK30K
Kworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5hbGl6ZShHT2JqZWN0KiBv
YmplY3QpCit7CisgICAgR19PQkpFQ1RfQ0xBU1Mod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9wYXJl
bnRfY2xhc3MpLT5maW5hbGl6ZShvYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2Vi
X2RhdGFfc291cmNlX2NsYXNzX2luaXQoV2ViS2l0V2ViRGF0YVNvdXJjZUNsYXNzKiBrbGFzcykK
K3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFz
cyk7CisKKyAgICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gd2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9kaXNwb3NlOworICAgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9maW5hbGl6ZTsKKworICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShnb2JqZWN0
X2NsYXNzLCBzaXplb2YoV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUpKTsKK30KKworc3RhdGlj
IHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pbml0KFdlYktpdFdlYkRhdGFTb3VyY2UqIHdl
YkRhdGFTb3VyY2UpCit7CisgICAgSlNDOjppbml0aWFsaXplVGhyZWFkaW5nKCk7CisgICAgd2Vi
RGF0YVNvdXJjZS0+cHJpdiA9IFdFQktJVF9XRUJfREFUQV9TT1VSQ0VfR0VUX1BSSVZBVEUod2Vi
RGF0YVNvdXJjZSk7Cit9CisKK1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtpdF93ZWJfZGF0YV9z
b3VyY2VfaW5pdF93aXRoX2xvYWRlcihQYXNzUmVmUHRyPERvY3VtZW50TG9hZGVyR3RrPiBsb2Fk
ZXIpCit7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSA9IFdFQktJVF9X
RUJfREFUQV9TT1VSQ0UoZ19vYmplY3RfbmV3KFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSwg
TlVMTCkpOworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNv
dXJjZS0+cHJpdjsKKyAgICBwcml2LT5sb2FkZXIgPSBsb2FkZXIucmVsZWFzZVJlZigpOworCisg
ICAgcmV0dXJuIHdlYkRhdGFTb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3Nv
dXJjZV9uZXc6CisgKiBAcmVxdWVzdDogdGhlICNXZWJLaXROZXR3b3JrUmVxdWVzdCB0byB1c2Ug
dG8gY3JlYXRlIHRoaXMgZGF0YSBzb3VyY2UKKyAqCisgKiBDcmVhdGVzIGEgbmV3ICNXZWJLaXRX
ZWJEYXRhU291cmNlIGZyb20gYSAjV2ViS2l0TmV0d29ya1JlcXVlc3QuIE5vcm1hbGx5LAorICog
I1dlYktpdFdlYkZyYW1lIG9iamVjdHMgY3JlYXRlIHRoZWlyIGRhdGEgc291cmNlcywgc28gZG9u
J3QgaW52b2tlIHRoaXMKKyAqIG1ldGhvZCBkaXJlY3RseS4KKyAqCisgKiBSZXR1cm5zOiBhIG5l
dyAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuNAorICovCitXZWJLaXRX
ZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ldyhXZWJLaXROZXR3b3JrUmVx
dWVzdCogcmVxdWVzdCkKK3sKKyAgICBjb25zdCBnY2hhciogdXJpID0gd2Via2l0X25ldHdvcmtf
cmVxdWVzdF9nZXRfdXJpKHJlcXVlc3QpOworICAgIHJldHVybiB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2luaXRfd2l0aF9sb2FkZXIoRG9jdW1lbnRMb2FkZXJHdGs6OmNyZWF0ZShSZXNvdXJjZVJl
cXVlc3QoS1VSTChLVVJMKCksIFN0cmluZzo6ZnJvbVVURjgodXJpKSkpLCBTdWJzdGl0dXRlRGF0
YSgpKSk7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfd2ViX2ZyYW1l
CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm5z
IHRoZSAjV2ViS2l0V2ViRnJhbWUgdGhhdCByZXByZXNlbnRzIHRoaXMgZGF0YSBzb3VyY2UKKyAq
CisgKiBSZXR1cm4gdmFsdWU6IHRoZSAjV2ViS2l0V2ViRnJhbWUgdGhhdCByZXByZXNlbnRzIHRo
ZSBAZGF0YV9zb3VyY2UKKyAqCisgKiBTaW5jZTogMS4xLjQKKyAqLworV2ViS2l0V2ViRnJhbWUq
IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZShXZWJLaXRXZWJEYXRhU291cmNl
KiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19X
RUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIEZyYW1lTG9h
ZGVyKiBmcmFtZUxvYWRlciA9IHByaXYtPmxvYWRlci0+ZnJhbWVMb2FkZXIoKTsKKyAgICBpZiAo
IWZyYW1lTG9hZGVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBXZWJLaXQ6OkZyYW1lTG9h
ZGVyQ2xpZW50KiBmcmFtZUxvYWRlckNsaWVudCA9IHN0YXRpY19jYXN0PFdlYktpdDo6RnJhbWVM
b2FkZXJDbGllbnQqPihmcmFtZUxvYWRlci0+Y2xpZW50KCkpOworICAgIHJldHVybiBmcmFtZUxv
YWRlckNsaWVudC0+d2ViRnJhbWUoKTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9pbml0aWFsX3JlcXVlc3Q6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRh
dGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZXF1
ZXN0IHRoYXQgd2FzIHVzZWQgdG8gbG9hZCB0aGUgd2ViCisgKiBjb250ZW50CisgKgorICogUmV0
dXJuIHZhbHVlOiB0aGUgb3JpZ2luYWwgI1dlYktpdE5ldHdvcmtSZXF1ZXN0CisgKgorICogU2lu
Y2U6IDEuMS40CisgKi8KK1dlYktpdE5ldHdvcmtSZXF1ZXN0KiB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9pbml0aWFsX3JlcXVlc3QoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJj
ZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNF
KHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRl
KiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVz
dCA9IHByaXYtPmxvYWRlci0+b3JpZ2luYWxSZXF1ZXN0KCk7CisgICAgV2ViS2l0TmV0d29ya1Jl
cXVlc3QqIGluaXRpYWxSZXF1ZXN0ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXcocmVxdWVz
dC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBpbml0aWFsUmVx
dWVzdDsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0Ogor
ICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyBh
ICNXZWJLaXROZXR3b3JrUmVxdWVzdCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzICNXZWJL
aXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgI1dlYktpdE5ldHdvcmtS
ZXF1ZXN0IHRoYXQgY3JlYXRlZCB0aGUgQGRhdGFfc291cmNlCisgKgorICogU2luY2UgMS4xLjQK
KyAqLworV2ViS2l0TmV0d29ya1JlcXVlc3QqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3Jl
cXVlc3QoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVy
bl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBO
VUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNv
dXJjZS0+cHJpdjsKKyAgICBGcmFtZUxvYWRlciogZnJhbWVMb2FkZXIgPSBwcml2LT5sb2FkZXIt
PmZyYW1lTG9hZGVyKCk7CisgICAgaWYgKCFmcmFtZUxvYWRlciB8fCAhZnJhbWVMb2FkZXItPmZy
YW1lSGFzTG9hZGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUmVzb3VyY2VSZXF1
ZXN0IHJlcXVlc3QgPSBwcml2LT5sb2FkZXItPnJlcXVlc3QoKTsKKyAgICBXZWJLaXROZXR3b3Jr
UmVxdWVzdCogd2ViUmVxdWVzdCA9IHdlYmtpdF9uZXR3b3JrX3JlcXVlc3RfbmV3KHJlcXVlc3Qu
dXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gd2ViUmVxdWVzdDsK
K30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90ZXh0X2VuY29kaW5nX25h
bWU6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1
cm5zIHRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgYXMgc2V0IGluIHRoZSAjV2ViS2l0V2ViVmlldywg
b3IgaWYgbm90LCB0aGUKKyAqIHRleHQgZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlLgorICoKKyAq
IFJldHVybiB2YWx1ZTogdGhlIGVuY29kaW5nIG5hbWUgb2YgdGhlICNXZWJLaXRXZWJWaWV3IG9y
IG9mIHRoZSByZXNwb25zZQorICoKKyAqIFNpbmNlOiAxLjEuNAorICovCitHX0NPTlNUX1JFVFVS
TiBnY2hhciogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKFdl
YktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lm
X2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisK
KyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnBy
aXY7CisgICAgU3RyaW5nIHRleHRFbmNvZGluZ05hbWUgPSBwcml2LT5sb2FkZXItPm92ZXJyaWRl
RW5jb2RpbmcoKTsKKworICAgIGlmICghdGV4dEVuY29kaW5nTmFtZSkKKyAgICAgICAgdGV4dEVu
Y29kaW5nTmFtZSA9IHByaXYtPmxvYWRlci0+cmVzcG9uc2UoKS50ZXh0RW5jb2RpbmdOYW1lKCk7
CisKKyAgICByZXR1cm4gdGV4dEVuY29kaW5nTmFtZS51dGY4KCkuZGF0YSgpOworfQorCisvKioK
KyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZzoKKyAqIEBkYXRhX3NvdXJjZTog
YSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMgJVRSVUUgaWYgQGRhdGFfc291
cmNlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcgaXRzIGNvbnRlbnQsCisgKiBvdGhlcndp
c2UgaXQgcmV0dXJucyAlRkFMU0UKKyAqCisgKiBSZXR1cm4gdmFsdWU6ICVUUlVFIGlmIHRoZSBA
ZGF0YV9zb3VyY2UgaXMgc3RpbGwgbG9hZGluZywgJUZBTFNFIGlmIGl0J3MKKyAqIGFscmVhZHkg
bG9hZGVkCisgKgorICogU2luY2U6IDEuMS40CisgKi8KK2dib29sZWFuIHdlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfaXNfbG9hZGluZyhXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQor
eworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2Vi
RGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHBy
aXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAgcmV0dXJuIHByaXYtPmxvYWRlci0+aXNM
b2FkaW5nSW5BUElTZW5zZSgpOworfQorCitHX0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9nZXRfZGF0YShXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNl
KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uo
d2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUq
IHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4g
bWFpblJlc291cmNlRGF0YSA9IHByaXYtPmxvYWRlci0+bWFpblJlc291cmNlRGF0YSgpOworCisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwobWFpblJlc291cmNlRGF0YSwgTlVMTCk7CisKKyAgICBy
ZXR1cm4gbWFpblJlc291cmNlRGF0YS0+ZGF0YSgpOworCit9CisKKy8qCitHX0NPTlNUX1JFVFVS
TiBnY2hhciogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcGFnZV90aXRsZShXZWJLaXRXZWJE
YXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKKyAg
ICByZXR1cm4gTlVMTDsKK30KKworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VybChXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRh
U291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9T
T1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVBy
aXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIGNvbnN0IEtVUkwmIHVucmVh
Y2hhYmxlVVJMID0gcHJpdi0+bG9hZGVyLT51bnJlYWNoYWJsZVVSTCgpOworCisgICAgaWYgKHVu
cmVhY2hhYmxlVVJMLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQor
ICAgICAgICByZXR1cm4gdW5yZWFjaGFibGVVUkwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKTsKK30K
KyovCit9IC8qIGVuZCBleHRlcm4gIkMiICovCmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtp
dC93ZWJraXR3ZWJkYXRhc291cmNlLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRh
c291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OWVmOQotLS0g
L2Rldi9udWxsCisrKyBiL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaApA
QCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBD
LiBBbG9uem8KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2lmbmRlZiBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0gKKyNkZWZpbmUgV0VCS0lU
X1dFQl9EQVRBX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1v
YmplY3QuaD4KKworI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkZWZpbmVzLmg+CisjaW5jbHVkZSA8
d2Via2l0L3dlYmtpdHdlYmZyYW1lLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmty
ZXF1ZXN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRfVFlQRV9XRUJfREFU
QV9TT1VSQ0UgICAgICAgICAgICAod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdHlwZSgpKQor
I2RlZmluZSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NI
RUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSwgV2Vi
S2l0V2ViRGF0YVNvdXJjZSkpCisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9TT1VSQ0VfQ0xBU1Mo
a2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCAgV0VCS0lUX1RZUEVf
V0VCX0RBVEFfU09VUkNFLCBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MpKQorI2RlZmluZSBXRUJL
SVRfSVNfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNF
X1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSkpCisjZGVmaW5lIFdFQktJ
VF9JU19XRUJfREFUQV9TT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQ
RSgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFKSkKKyNkZWZpbmUgV0VCS0lU
X1dFQl9EQVRBX1NPVVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xB
U1MoKG9iaiksICBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktpdFdlYkRhdGFTb3Vy
Y2VDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSBX
ZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTsKKworc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNl
IHsKKyAgICBHT2JqZWN0IHBhcmVudF9pbnN0YW5jZTsKKworICAgIC8qPCBwcml2YXRlID4qLwor
ICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlICpwcml2OworfTsKKworc3RydWN0IF9XZWJL
aXRXZWJEYXRhU291cmNlQ2xhc3MgeworICAgIEdPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7CisK
KyAgICAvKiBQYWRkaW5nIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgdm9pZCAoKl93ZWJr
aXRfcmVzZXJ2ZWQwKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQxKSAodm9p
ZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQyKSAodm9pZCk7CisgICAgdm9pZCAoKl93
ZWJraXRfcmVzZXJ2ZWQzKSAodm9pZCk7Cit9OworCitXRUJLSVRfQVBJIEdUeXBlCit3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF90eXBlICh2b2lkKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJE
YXRhU291cmNlICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3ICAgICAgICAgICAgICAgICAg
ICAoV2ViS2l0TmV0d29ya1JlcXVlc3QgKnJlcXVlc3QpOworCitXRUJLSVRfQVBJIFdlYktpdFdl
YkZyYW1lICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZSAgICAgICAgICAo
V2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXRO
ZXR3b3JrUmVxdWVzdCAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVl
c3QgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkg
V2ViS2l0TmV0d29ya1JlcXVlc3QgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVxdWVz
dCAgICAgICAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJL
SVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0
X3RleHRfZW5jb2RpbmdfbmFtZSAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsK
KworV0VCS0lUX0FQSSBnYm9vbGVhbgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pc19sb2FkaW5n
ICAgICAgICAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJL
SVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0
X2RhdGEgICAgICAgICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsK
KworLyogRnV0dXJlLiBJdCBtaWdodCBjaGFuZ2UuCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJO
IGdjaGFyICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3BhZ2VfdGl0bGUgICAgICAgICAo
V2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNU
X1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF91bnJlYWNoYWJsZV91
cmwgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkg
V2ViS2l0V2ViRG9jdW1lbnRSZXByZXNlbnRhdGlvbiAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF9yZXByZXNlbnRhdGlvbiAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJj
ZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0TmV0d29ya1Jlc3BvbnNlICoKK3dlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfZ2V0X3Jlc3BvbnNlICAgICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRh
dGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJBcmNoaXZlICoKK3dlYmtpdF93ZWJf
ZGF0YV9zb3VyY2VfZ2V0X3dlYl9hcmNoaXZlICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAg
KmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF9tYWluX3Jlc291cmNlICAgICAgKFdlYktpdFdlYkRhdGFTb3Vy
Y2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgR0xpc3QgKgord2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9nZXRfc3VicmVzb3VyY2VzICAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0
YV9zb3VyY2UpOworCitXRUJLSVRfQVBJIFdlYktpdFdlYlJlc291cmNlICoKK3dlYmtpdF93ZWJf
ZGF0YV9zb3VyY2VfZ2V0X3Jlc291cmNlX2Zvcl91cmwgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAg
KmRhdGFfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBnY2hhciAgICAgICAgICAqdXJsKTsKKworV0VCS0lUX0FQSSB2b2lkCit3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2FkZF9zdWJyZXNvdXJjZSAgICAgICAgKFdlYktpdFdlYkRhdGFT
b3VyY2UgICpkYXRhX3NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV2ViS2l0V2ViUmVzb3VyY2UgICAgICAgICAgKnN1YnJlc291cmNlKTsKKyov
CitHX0VORF9ERUNMUworCisjZW5kaWYgLyogV0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9IICovCmRp
ZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAgYi9XZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAKaW5kZXggZTJiMTBiNi4uMDA5NzAzYiAxMDA2
NDQKLS0tIGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuY3BwCisrKyBiL1dlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1
ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJDU3RyaW5nLmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlckd0ay5oIgogI2lu
Y2x1ZGUgIkZyYW1lTG9hZGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRHdGsuaCIK
ICNpbmNsdWRlICJGcmFtZVRyZWUuaCIKQEAgLTEyMyw2ICsxMjQsMTEgQEAgdm9pZCB3ZWJraXRf
d2ViX2ZyYW1lX2NvcmVfZnJhbWVfZ29uZShXZWJLaXRXZWJGcmFtZSogZnJhbWUpCiAgICAgZnJh
bWUtPnByaXYtPmNvcmVGcmFtZSA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgV2ViS2l0V2ViRGF0
YVNvdXJjZSogd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2VfZnJvbV9jb3JlX2xvYWRl
cihEb2N1bWVudExvYWRlciogbG9hZGVyKQoreworICAgIHJldHVybiBsb2FkZXIgPyBzdGF0aWNf
Y2FzdDxEb2N1bWVudExvYWRlckd0ayo+KGxvYWRlciktPmRhdGFTb3VyY2UoKSA6IE5VTEw7Cit9
CisKIHN0YXRpYyB2b2lkIHdlYmtpdF93ZWJfZnJhbWVfZmluYWxpemUoR09iamVjdCogb2JqZWN0
KQogewogICAgIFdlYktpdFdlYkZyYW1lKiBmcmFtZSA9IFdFQktJVF9XRUJfRlJBTUUob2JqZWN0
KTsKQEAgLTUzOSw2ICs1NDUsNTkgQEAgSlNHbG9iYWxDb250ZXh0UmVmIHdlYmtpdF93ZWJfZnJh
bWVfZ2V0X2dsb2JhbF9jb250ZXh0KFdlYktpdFdlYkZyYW1lKiBmcmFtZSkKIH0KIAogLyoqCisg
KiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZToKKyAqIEBmcmFtZTogYSAjV2ViS2l0
V2ViRnJhbWUKKyAqCisgKiBSZXR1cm5zIHRoZSBjb21taXR0ZWQgZGF0YSBzb3VyY2UuCisgKgor
ICogUmV0dXJuIHZhbHVlOiB0aGUgY29tbWl0dGVkICNXZWJLaXRXZWJEYXRhU291cmNlIG9yICVO
VUxMIGlmIHRoZQorICogcHJvdmlzaW9uYWwgZGF0YSBzb3VyY2UgaXMgbm90IGRvbmUgbG9hZGlu
Zy4KKyAqCisgKiBTaW5jZTogMS4xLjQKKyAqLworV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Via2l0
X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2UoV2ViS2l0V2ViRnJhbWUqIGZyYW1lKQoreworICAg
IGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfRlJBTUUoZnJhbWUpLCBOVUxMKTsK
KworICAgIEZyYW1lKiBjb3JlRnJhbWUgPSBjb3JlKGZyYW1lKTsKKyAgICBXZWJLaXRXZWJEYXRh
U291cmNlKiBkYXRhU291cmNlOworCisgICAgaWYgKGNvcmVGcmFtZSAmJiBjb3JlRnJhbWUtPmxv
YWRlcigpLT5mcmFtZUhhc0xvYWRlZCgpKQorICAgICAgICBkYXRhU291cmNlID0gd2Via2l0X3dl
Yl9mcmFtZV9nZXRfZGF0YV9zb3VyY2VfZnJvbV9jb3JlX2xvYWRlcihjb3JlRnJhbWUtPmxvYWRl
cigpLT5kb2N1bWVudExvYWRlcigpKTsKKworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJ
VF9JU19XRUJfREFUQV9TT1VSQ0UoZGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgcmV0dXJuIGRh
dGFTb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlzaW9uYWxf
ZGF0YV9zb3VyY2U6CisgKiBAZnJhbWU6IGEgI1dlYktpdFdlYkZyYW1lCisgKgorICogUmV0dXJu
cyB0aGUgcHJvdmlzaW9uYWwgZGF0YSBzb3VyY2UuIFlvdSB1c2UgdGhlCisgKiB3ZWJraXRfd2Vi
X2ZyYW1lX2xvYWRfcmVxdWVzdCBtZXRob2QgdG8gaW5pdGlhdGUgYW4gYXN5bmNocm9ub3VzIGNs
aWVudAorICogcmVxdWVzdCB3aGljaCB3aWxsIGNyZWF0ZSBhIHByb3Zpc2lvbmFsIGRhdGEgc291
cmNlLiBUaGUgcHJvdmlzaW9uYWwgZGF0YQorICogc291cmNlIHdpbGwgdHJhbnNpdGlvbiB0byBh
IGNvbW1pdHRlZCBkYXRhIHNvdXJjZSBvbmNlIGFueSBkYXRhIGhhcyBiZWVuCisgKiByZWNlaXZl
ZC4gVGhlcmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMgTlVMTCBpZiBlaXRoZXIgYSBsb2FkIHJl
cXVlc3QgaXMKKyAqIG5vdCBpbiBwcm9ncmVzcywgb3IgYSBsb2FkIHJlcXVlc3QgaGFzIGNvbXBs
ZXRlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBwcm92aXNpb25hbCAjV2ViS2l0V2ViRGF0
YVNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuNAorICovCitXZWJLaXRXZWJEYXRhU291cmNlKiB3
ZWJraXRfd2ViX2ZyYW1lX2dldF9wcm92aXNpb25hbF9kYXRhX3NvdXJjZShXZWJLaXRXZWJGcmFt
ZSogZnJhbWUpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9GUkFN
RShmcmFtZSksIE5VTEwpOworCisgICAgRnJhbWUqIGNvcmVGcmFtZSA9IGNvcmUoZnJhbWUpOwor
ICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2UgPSB3ZWJraXRfd2ViX2ZyYW1lX2dl
dF9kYXRhX3NvdXJjZV9mcm9tX2NvcmVfbG9hZGVyKGNvcmVGcmFtZS0+bG9hZGVyKCktPnByb3Zp
c2lvbmFsRG9jdW1lbnRMb2FkZXIoKSk7CisKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJL
SVRfSVNfV0VCX0RBVEFfU09VUkNFKGRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIHJldHVybiBk
YXRhU291cmNlOworfQorCisvKioKICAqIHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2NoaWxkcmVuOgog
ICogQGZyYW1lOiBhICNXZWJLaXRXZWJGcmFtZQogICoKZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYmZyYW1lLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFt
ZS5oCmluZGV4IDdlMjQ1NjUuLjBjYzBmMzMgMTAwNjQ0Ci0tLSBhL1dlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHdlYmZyYW1lLmgKKysrIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUu
aApAQCAtMjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRlZmluZXMuaD4K
ICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0bmV0d29ya3JlcXVlc3QuaD4KKyNpbmNsdWRlIDx3ZWJr
aXQvd2Via2l0d2ViZGF0YXNvdXJjZS5oPgogCiBHX0JFR0lOX0RFQ0xTCiAKQEAgLTEwOCw2ICsx
MDksMTIgQEAgd2Via2l0X3dlYl9mcmFtZV9maW5kX2ZyYW1lICAgICAgICAgKFdlYktpdFdlYkZy
YW1lICAgICAgICpmcmFtZSwKIFdFQktJVF9BUEkgSlNHbG9iYWxDb250ZXh0UmVmCiB3ZWJraXRf
d2ViX2ZyYW1lX2dldF9nbG9iYWxfY29udGV4dCAoV2ViS2l0V2ViRnJhbWUgICAgICAgKmZyYW1l
KTsKIAorV0VCS0lUX0FQSSBXZWJLaXRXZWJEYXRhU291cmNlICoKK3dlYmtpdF93ZWJfZnJhbWVf
Z2V0X2RhdGFfc291cmNlICAgIChXZWJLaXRXZWJGcmFtZSAgICAgICAqZnJhbWUpOworCitXRUJL
SVRfQVBJIFdlYktpdFdlYkRhdGFTb3VyY2UgKgord2Via2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlz
aW9uYWxfZGF0YV9zb3VyY2UgKFdlYktpdFdlYkZyYW1lICpmcmFtZSk7CisKIEdfRU5EX0RFQ0xT
CiAKICNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29261</attachid>
            <date>2009-04-04 22:21:20 -0700</date>
            <delta_ts>2009-05-25 19:22:48 -0700</delta_ts>
            <desc>WebKitWebResource implementation</desc>
            <filename>webresource</filename>
            <type>text/plain</type>
            <size>25426</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9H
TlVtYWtlZmlsZS5hbQkyMDA5LTA0LTA1IDEzOjA2OjUzLjAwMDAwMDAwMCArMTAwMAorKysgV2Vi
S2l0L0dOVW1ha2VmaWxlLmFtCTIwMDktMDQtMDUgMTM6MzQ6MDcuMDAwMDAwMDAwICsxMDAwCkBA
IC0zMTYsNiArMzE2LDcgQEAKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJpbnNwZWN0b3Iu
aCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VibmF2aWdhdGlvbmFjdGlvbi5oIFwKIAlX
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oIFwKKwlXZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3
ZWJzZXR0aW5ncy5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJ3aW5kb3dmZWF0dXJl
cy5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJ2aWV3LmgKQEAgLTM1Miw2ICszNTMs
OCBAQAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmluc3BlY3Rvci5jcHAgXAogCVdlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uY3BwIFwKIAlXZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5jcHAgXAorCVdlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHdlYnJlc291cmNlLmNwcCBcCisJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicmVz
b3VyY2UuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vic2V0dGluZ3MuY3BwIFwKIAlX
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkb3dubG9hZC5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHdlYnZpZXcuY3BwIFwKQEAgLTQ5Myw3ICs0OTYsOCBAQAogVEVTVF9QUk9HUyArPSBQ
cm9ncmFtcy91bml0dGVzdHMvdGVzdHdlYmZyYW1lIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVz
dHdlYmJhY2tmb3J3YXJkbGlzdCBcCiAJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJoaXN0b3J5
aXRlbSBcCi0JUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3Rkb3dubG9hZAorCVByb2dyYW1zL3VuaXR0
ZXN0cy90ZXN0ZG93bmxvYWQgXAorCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2VicmVzb3VyY2UK
IAogIyBBZGQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlCiBQcm9ncmFtc191bml0dGVzdHNfdGVzdHdl
YmZyYW1lX1NPVVJDRVMgPSBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJmcmFtZS5jCkBAIC01MTIs
NiArNTE2LDEwIEBACiBQcm9ncmFtc191bml0dGVzdHNfdGVzdGRvd25sb2FkX0NGTEFHUyA9ICQo
d2Via2l0X3Rlc3RzX2NmbGFncykKIFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0ZG93bmxvYWRfTERB
REQgPSAkKHdlYmtpdF90ZXN0c19sZGFkZCkKIAorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJy
ZXNvdXJjZV9TT1VSQ0VTID0gV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2VicmVzb3VyY2UuYworUHJv
Z3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19j
ZmxhZ3MpCitQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX0xEQUREID0gJCh3ZWJr
aXRfdGVzdHNfbGRhZGQpCisKICMgQXV0b2dlbmVyYXRlZCBzb3VyY2VzCiBCVUlMVF9TT1VSQ0VT
IDo9IFwKIAkkKGphdmFzY3JpcHRjb3JlX2J1aWx0X3NvdXJjZXMpIFwKSW5kZXg6IFdlYktpdC9X
ZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJyZXNvdXJjZS5jCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVs
bAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9n
dGsvdGVzdHMvdGVzdHdlYnJlc291cmNlLmMJMjAwOS0wNC0wNSAxMzowNTo1My4wMDAwMDAwMDAg
KzEwMDAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1p
Y2hhZWwgQWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2lu
Y2x1ZGUgPHdlYmtpdC93ZWJraXQuaD4KKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAxNiwg
MCkgJiYgR1RLX0NIRUNLX1ZFUlNJT04oMiwgMTQsIDApCisKK3R5cGVkZWYgc3RydWN0IHsKKyAg
ICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2U7CisgICAgV2ViS2l0V2ViVmlldyogd2Vi
VmlldzsKK30gV2ViUmVzb3VyY2VGaXh0dXJlOworCitzdGF0aWMgdm9pZCB3ZWJfcmVzb3VyY2Vf
Zml4dHVyZV9zZXR1cChXZWJSZXNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIg
ZGF0YSkKK3sKKyAgICBmaXh0dXJlLT53ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93
ZWJfdmlld19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3NpbmsoZml4dHVyZS0+d2ViVmlldyk7
CisgICAgZml4dHVyZS0+d2ViUmVzb3VyY2UgPSB3ZWJraXRfd2ViX3Jlc291cmNlX25ldygiPGh0
bWw+PC9odG1sPiIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgInRleHQvaHRtbCIsICJ1dGY4Iiwg
IkV4YW1wbGUuY29tIik7CisgICAgZ19hc3NlcnQoZml4dHVyZS0+d2ViUmVzb3VyY2UpOworfQor
CitzdGF0aWMgdm9pZCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bihXZWJSZXNvdXJjZUZp
eHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnX2Fzc2VydChmaXh0
dXJlLT53ZWJSZXNvdXJjZSk7CisgICAgZ19vYmplY3RfdW5yZWYoZml4dHVyZS0+d2ViUmVzb3Vy
Y2UpOworICAgIGdfb2JqZWN0X3VucmVmKGZpeHR1cmUtPndlYlZpZXcpOworfQorCitzdGF0aWMg
dm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybChXZWJSZXNvdXJjZUZpeHR1cmUq
IGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnY2hhciogdXJsOworICAgIGdf
b2JqZWN0X2dldChHX09CSkVDVChmaXh0dXJlLT53ZWJSZXNvdXJjZSksICJ1cmwiLCAmdXJsLCBO
VUxMKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodXJsLCA9PSwgImh0dHA6Ly9leGFtcGxlLmNvbS8i
KTsKKyAgICBnX2Fzc2VydF9jbXBzdHIod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdXJsKGZpeHR1
cmUtPndlYlJlc291cmNlKSAsPT0sImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKK30KKworc3RhdGlj
IHZvaWQgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKFdlYlJlc291cmNlRml4dHVy
ZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGdfYXNzZXJ0X2NtcHN0cih3
ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKGZpeHR1cmUtPndlYlJlc291cmNlKSwgPT0sICI8
aHRtbD48L2h0bWw+Iik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfbWltZV90eXBlKFdlYlJlc291cmNlRml4dHVyZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRl
ciBkYXRhKQoreworICAgIGdjaGFyKiBtaW1lX3R5cGU7CisgICAgZ19vYmplY3RfZ2V0KEdfT0JK
RUNUKGZpeHR1cmUtPndlYlJlc291cmNlKSwgIm1pbWUtdHlwZSIsICZtaW1lX3R5cGUsIE5VTEwp
OworICAgIGdfYXNzZXJ0X2NtcHN0cihtaW1lX3R5cGUsID09LCAidGV4dC9odG1sIik7CisgICAg
Z19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZShmaXh0dXJl
LT53ZWJSZXNvdXJjZSksPT0sInRleHQvaHRtbCIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3dl
YmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3RleHRfZW5jb2RpbmdfbmFtZShXZWJSZXNvdXJjZUZpeHR1
cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnY2hhciogdGV4dF9lbmNv
ZGluZzsKKyAgICBnX29iamVjdF9nZXQoR19PQkpFQ1QoZml4dHVyZS0+d2ViUmVzb3VyY2UpLCAi
dGV4dC1lbmNvZGluZy1uYW1lIiwgJnRleHRfZW5jb2RpbmcsIE5VTEwpOworICAgIGdfYXNzZXJ0
X2NtcHN0cih0ZXh0X2VuY29kaW5nLCA9PSwgInV0ZjgiKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIo
d2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKGZpeHR1cmUtPndlYlJl
c291cmNlKSw9PSwidXRmOCIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVz
b3VyY2VfZ2V0X2ZyYW1lX25hbWUoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rw
b2ludGVyIGRhdGEpCit7CisgICAgZ2NoYXIqIGZyYW1lX25hbWU7CisgICAgZ19vYmplY3RfZ2V0
KEdfT0JKRUNUKGZpeHR1cmUtPndlYlJlc291cmNlKSwgImZyYW1lLW5hbWUiLCAmZnJhbWVfbmFt
ZSwgTlVMTCk7CisgICAgZ19hc3NlcnRfY21wc3RyKGZyYW1lX25hbWUsID09LCAiRXhhbXBsZS5j
b20iKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVf
bmFtZShmaXh0dXJlLT53ZWJSZXNvdXJjZSksPT0sIkV4YW1wbGUuY29tIik7Cit9CisKK2ludCBt
YWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBnX3RocmVhZF9pbml0KE5VTEwpOwor
ICAgIGd0a190ZXN0X2luaXQoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICAgIGdfdGVzdF9idWdf
YmFzZSgiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvIik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtp
dC93ZWJyZXNvdXJjZS9nZXRfdXJsIiwKKyAgICAgICAgICAgICAgIFdlYlJlc291cmNlRml4dHVy
ZSwgMCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAgICB0ZXN0X3dl
YmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfdGVhcmRvd24p
OworICAgIGdfdGVzdF9hZGQoIi93ZWJraXQvd2VicmVzb3VyY2UvZ2V0X21pbWVfdHlwZSIsCisg
ICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNvdXJjZV9maXh0dXJl
X3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1l
X3R5cGUsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rlc3RfYWRkKCIv
d2Via2l0L3dlYnJlc291cmNlL2dldF90ZXh0X2VuY29kaW5nX25hbWUiLAorICAgICAgICAgICAg
ICAgV2ViUmVzb3VyY2VGaXh0dXJlLCAwLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9zZXR1cCwKKyAg
ICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19u
YW1lLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dl
YmtpdC93ZWJyZXNvdXJjZS9nZXRfZnJhbWVfbmFtZSIsCisgICAgICAgICAgICAgICBXZWJSZXNv
dXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAg
ICAgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lLCB3ZWJfcmVzb3VyY2Vf
Zml4dHVyZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJyZXNvdXJjZS9n
ZXRfZGF0YSIsCisgICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNv
dXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX3Jlc291
cmNlX2dldF9kYXRhLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisgICAgcmV0dXJu
IGdfdGVzdF9ydW4gKCk7Cit9CisKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFy
Z3YpCit7CisgICAgZ19jcml0aWNhbCgiWW91IHdpbGwgbmVlZCBhdCBsZWFzdCBnbGliLTIuMTYu
MCBhbmQgZ3RrLTIuMTQuMCB0byBydW4gdGhlIHVuaXQgdGVzdHMuIERvaW5nIG5vdGhpbmcgbm93
LiIpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dl
YmtpdC93ZWJraXQuaAkyMDA5LTA0LTA1IDEzOjA1OjM3LjAwMDAwMDAwMCArMTAwMAorKysgV2Vi
S2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdC5oCTIwMDktMDQtMDUgMTM6MDc6NDMuMDAwMDAw
MDAwICsxMDAwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmhp
c3RvcnlpdGVtLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnBvbGljeWRlY2lzaW9uLmg+
CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uaD4KKyNpbmNsdWRl
IDx3ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZW51
bXR5cGVzLmg+CiAKICNlbmRpZiAvKiBfX1dFQktJVF9IX18gKi8KSW5kZXg6IFdlYktpdC9XZWJL
aXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcv
V2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCTIwMDktMDQtMDUgMTM6MDU6MzMuMDAw
MDAwMDAwICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5o
CTIwMDktMDQtMDUgMTM6MDc6NTAuMDAwMDAwMDAwICsxMDAwCkBAIC03MSw2ICs3MSw5IEBACiB0
eXBlZGVmIHN0cnVjdCBfV2ViS2l0RG93bmxvYWQgV2ViS2l0RG93bmxvYWQ7CiB0eXBlZGVmIHN0
cnVjdCBfV2ViS2l0RG93bmxvYWRDbGFzcyBXZWJLaXREb3dubG9hZENsYXNzOwogCit0eXBlZGVm
IHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2UgV2ViS2l0V2ViUmVzb3VyY2U7Cit0eXBlZGVmIHN0
cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VDbGFzcyBXZWJLaXRXZWJSZXNvdXJjZUNsYXNzOworCiBH
X0VORF9ERUNMUwogCiAjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJyZXNvdXJjZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCTE5NzAtMDEtMDEgMDA6
MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0
d2VicmVzb3VyY2UuY3BwCTIwMDktMDQtMDUgMTM6MDU6NTMuMDAwMDAwMDAwICsxMDAwCkBAIC0w
LDAgKzEsMzE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4KKyAqIENv
cHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBDLiBBbG9uem8KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorCisjaW5jbHVkZSAid2Via2l0d2VicmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ3ZWJraXRwcml2
YXRlLmgiCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4K
KworI2luY2x1ZGUgIkFyY2hpdmVSZXNvdXJjZS5oIgorI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNp
bmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJT
aGFyZWRCdWZmZXIuaCIKKworLyoqCisgKiBTRUNUSU9OOndlYmtpdHdlYnJlc291cmNlCisgKiBA
c2hvcnRfZGVzY3JpcHRpb246IFJlcHJlc2VudHMgYSBkb3dubG9hZGVkIFVSTC4KKyAqIEBzZWVf
YWxzbzogI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBBIHdlYiByZXNvdXJjZSBlbmNhcHN1
bGF0ZXMgdGhlIGRhdGEgb2YgdGhlIGRvd25sb2FkIGFzIHdlbGwgYXMgdGhlIFVSTCwKKyAqIE1J
TUUgdHlwZSBhbmQgZnJhbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKKyAqLworCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CisKK2V4dGVybiAiQyIgewor
CitlbnVtIHsKKyAgICBQUk9QXzAsCisKKyAgICBQUk9QX1VSTCwKKyAgICBQUk9QX01JTUVfVFlQ
RSwKKyAgICBQUk9QX1RFWFRfRU5DT0RJTkdfTkFNRSwKKyAgICBQUk9QX0ZSQU1FX05BTUUKK307
CisKK0dfREVGSU5FX1RZUEUoV2ViS2l0V2ViUmVzb3VyY2UsIHdlYmtpdF93ZWJfcmVzb3VyY2Us
IEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9w
cm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSogdmFsdWUsIEdQ
YXJhbVNwZWMqIHBzcGVjKTsKKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJjZV9kaXNw
b3NlKEdPYmplY3QqIG9iamVjdCkKK3sKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3Vy
Y2UgPSBXRUJLSVRfV0VCX1JFU09VUkNFKG9iamVjdCk7CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQ
cml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisKKyAgICBpZiAocHJpdi0+cmVzb3Vy
Y2UpCisgICAgICAgIHByaXYtPnJlc291cmNlLT5kZXJlZigpOworCisgICAgR19PQkpFQ1RfQ0xB
U1Mod2Via2l0X3dlYl9yZXNvdXJjZV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKG9iamVjdCk7Cit9
CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfcmVzb3VyY2VfZmluYWxpemUoR09iamVjdCogb2Jq
ZWN0KQoreworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSA9IFdFQktJVF9XRUJf
UkVTT1VSQ0Uob2JqZWN0KTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3
ZWJSZXNvdXJjZS0+cHJpdjsKKworICAgIHByaXYtPnVybCA9IENTdHJpbmcoKTsKKyAgICBwcml2
LT5taW1lVHlwZSA9IENTdHJpbmcoKTsKKyAgICBwcml2LT50ZXh0RW5jb2RpbmcgPSBDU3RyaW5n
KCk7CisgICAgcHJpdi0+ZnJhbWVOYW1lID0gQ1N0cmluZygpOworCisgICAgR19PQkpFQ1RfQ0xB
U1Mod2Via2l0X3dlYl9yZXNvdXJjZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShvYmplY3QpOwor
fQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2NsYXNzX2luaXQoV2ViS2l0V2Vi
UmVzb3VyY2VDbGFzcyoga2xhc3MpCit7CisgICAgR09iamVjdENsYXNzKiBnb2JqZWN0X2NsYXNz
ID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOworCisgICAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9
IHdlYmtpdF93ZWJfcmVzb3VyY2VfZGlzcG9zZTsKKyAgICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6
ZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfZmluYWxpemU7CisgICAgZ29iamVjdF9jbGFzcy0+Z2V0
X3Byb3BlcnR5ID0gd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfcHJvcGVydHk7CisKKyAgICBnX29i
amVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAidXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJVUkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB1cmwgb2Yg
dGhlIHJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEws
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBREFC
TEUpKTsKKworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdF9jbGFz
cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfTUlNRV9UWVBFLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZygK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1lLXR5cGUiLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTUUgVHlwZSIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiVGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVzb3VyY2UiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9QQVJBTV9SRUFEQUJMRSkpOworCisgICAgZ19v
YmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9URVhUX0VOQ09ESU5HX05BTUUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nKAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtZW5jb2RpbmctbmFtZSIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCBFbmNvZGluZyBOYW1lIiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgdGV4dCBlbmNvZGluZyBuYW1l
IG9mIHRoZSByZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBO
VUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JF
QURBQkxFKSk7CisKKyAgICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3Rf
Y2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX0ZSQU1FX05B
TUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3Ry
aW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lLW5hbWUiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lIE5hbWUiLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBmcmFtZSBuYW1lIG9mIHRoZSByZXNv
dXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisK
KyAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9mKFdlYktp
dFdlYlJlc291cmNlUHJpdmF0ZSkpOworfQorc3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfcHJvcGVydHkoR09iamVjdCogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUqIHZh
bHVlLCBHUGFyYW1TcGVjKiBwc3BlYykKK3sKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVz
b3VyY2UgPSBXRUJLSVRfV0VCX1JFU09VUkNFKG9iamVjdCk7CisKKyAgICBzd2l0Y2ggKHByb3Bf
aWQpIHsKKyAgICBjYXNlIFBST1BfVVJMOgorICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcodmFs
dWUsIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybCh3ZWJSZXNvdXJjZSkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFBST1BfTUlNRV9UWVBFOgorICAgICAgICBnX3ZhbHVlX3NldF9zdHJp
bmcodmFsdWUsIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZSh3ZWJSZXNvdXJjZSkp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEVYVF9FTkNPRElOR19OQU1FOgorICAg
ICAgICBnX3ZhbHVlX3NldF9zdHJpbmcodmFsdWUsIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3Rl
eHRfZW5jb2RpbmdfbmFtZSh3ZWJSZXNvdXJjZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFBST1BfRlJBTUVfTkFNRToKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nKHZhbHVlLCB3ZWJr
aXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKHdlYlJlc291cmNlKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJU
WV9JRChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQor
CitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2luaXQoV2ViS2l0V2ViUmVzb3VyY2Uq
IHdlYlJlc291cmNlKQoreworICAgIHdlYlJlc291cmNlLT5wcml2ID0gV0VCS0lUX1dFQl9SRVNP
VVJDRV9HRVRfUFJJVkFURSh3ZWJSZXNvdXJjZSk7Cit9CisKKy8vIGludGVybmFsIHVzZSBvbmx5
CitXZWJLaXRXZWJSZXNvdXJjZSogd2Via2l0X3dlYl9yZXNvdXJjZV9pbml0X3dpdGhfY29yZV9y
ZXNvdXJjZShQYXNzUmVmUHRyPEFyY2hpdmVSZXNvdXJjZT4gcmVzb3VyY2UpCit7CisgICAgV2Vi
S2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gV0VCS0lUX1dFQl9SRVNPVVJDRShnX29iamVj
dF9uZXcoV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBOVUxMKSk7CisgICAgV2ViS2l0V2ViUmVz
b3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisgICAgcHJpdi0+cmVzb3Vy
Y2UgPSByZXNvdXJjZS5yZWxlYXNlUmVmKCk7CisKKyAgICByZXR1cm4gd2ViUmVzb3VyY2U7Cit9
CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9uZXc6CisgKiBAZGF0YTogdGhlIGRhdGEg
dG8gaW5pdGlhbGl6ZSB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAdXJsOiB0aGUgdXJsIG9m
IHRoZSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqIEBtaW1lX3R5cGU6IHRoZSBNSU1FIHR5cGUgb2Yg
dGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICogQHRleHRfZW5jb2RpbmdfbmFtZTogdGhlIHRleHQg
ZW5jb2RpbmcgbmFtZSBvZiB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAZnJhbWVfbmFtZTog
dGhlIGZyYW1lIG5hbWUgb2YgdGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVybnMg
YSBuZXcgI1dlYktpdFdlYlJlc291cmNlLiBUaGUgQHRleHRfZW5jb2RpbmdfbmFtZSBjYW4gYmUg
JU5VTEwuIFRoZQorICogQGZyYW1lX25hbWUgYXJndW1lbnQgY2FuIGJlIHVzZWQgaWYgdGhlIHJl
c291cmNlIHJlcHJlc2VudHMgY29udGVudHMgb2YgYW4KKyAqIGVudGlyZSBIVE1MIGZyYW1lLCBv
dGhlcndpc2UgcGFzcyAlTlVMTC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgbmV3ICNXZWJLaXRX
ZWJSZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuNQorICovCitXZWJLaXRXZWJSZXNvdXJjZSog
d2Via2l0X3dlYl9yZXNvdXJjZV9uZXcoY29uc3QgZ2NoYXIqIGRhdGEsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIqIHVybCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciogbWltZV90eXBl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFy
KiB0ZXh0X2VuY29kaW5nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgZ2NoYXIqIGZyYW1lX25hbWUpCit7CisgICAgQVNTRVJUKGRhdGEpOwor
ICAgIEFTU0VSVCh1cmwpOworICAgIEFTU0VSVChtaW1lX3R5cGUpOworCisgICAgUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YSxnX3V0Zjhfc3Ry
bGVuKGRhdGEsIC0xKSk7CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gd2Vi
a2l0X3dlYl9yZXNvdXJjZV9pbml0X3dpdGhfY29yZV9yZXNvdXJjZShBcmNoaXZlUmVzb3VyY2U6
OmNyZWF0ZShidWZmZXIsIEtVUkwoS1VSTCgpLFN0cmluZzo6ZnJvbVVURjgodXJsKSksIFN0cmlu
Zzo6ZnJvbVVURjgobWltZV90eXBlKSwgU3RyaW5nOjpmcm9tVVRGOCh0ZXh0X2VuY29kaW5nX25h
bWUpLCBTdHJpbmc6OmZyb21VVEY4KGZyYW1lX25hbWUpKSk7CisKKyAgICByZXR1cm4gd2ViUmVz
b3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZGF0YToKKyAqIEB3
ZWJfcmVzb3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgZGF0
YSBvZiB0aGUgQHdlYlJlc291cmNlLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIGRhdGEgb2Yg
dGhlIEB3ZWJSZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuNQorICovCitHX0NPTlNUX1JFVFVS
TiBnY2hhciogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZGF0YShXZWJLaXRXZWJSZXNvdXJjZSog
d2ViUmVzb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9S
RVNPVVJDRSh3ZWJSZXNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2
YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisKKyAgICBpZiAoIXByaXYtPmRhdGEpCisg
ICAgICAgIHByaXYtPmRhdGEgPSBwcml2LT5yZXNvdXJjZS0+ZGF0YSgpLT5kYXRhKCk7CisKKyAg
ICByZXR1cm4gcHJpdi0+ZGF0YTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX3Jlc291cmNlX2dl
dF91cmw6CisgKiBAd2ViX3Jlc291cmNlOiBhICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJl
dHVybnMgdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBV
Ukwgb2YgdGhlIHJlc291cmNlCisgKgorICogU2luY2U6IDEuMS41CisgKi8KK0dfQ09OU1RfUkVU
VVJOIGdjaGFyKiB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwoV2ViS2l0V2ViUmVzb3VyY2Uq
IHdlYlJlc291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJf
UkVTT1VSQ0Uod2ViUmVzb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYlJlc291cmNlUHJp
dmF0ZSogcHJpdiA9IHdlYlJlc291cmNlLT5wcml2OworICAgIGlmICghcHJpdi0+cmVzb3VyY2Up
CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcHJpdi0+dXJsID0gcHJpdi0+cmVzb3VyY2Ut
PnVybCgpLnN0cmluZygpLnV0ZjgoKTsKKworICAgIHJldHVybiBwcml2LT51cmwuZGF0YSgpOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZToKKyAqIEB3ZWJf
cmVzb3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgTUlNRSB0
eXBlIG9mIHRoZSByZXNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIE1JTUUgdHlwZSBv
ZiB0aGUgcmVzb3VyY2UKKyAqCisgKiBTaW5jZSAxLjEuNQorICovCitHX0NPTlNUX1JFVFVSTiBn
Y2hhciogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKFdlYktpdFdlYlJlc291cmNl
KiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VC
X1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVBy
aXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBpZiAoIXByaXYtPnJlc291cmNl
KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHByaXYtPm1pbWVUeXBlID0gcHJpdi0+cmVz
b3VyY2UtPm1pbWVUeXBlKCkudXRmOCgpOworCisgICAgcmV0dXJuIHByaXYtPm1pbWVUeXBlLmRh
dGEoKTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF90ZXh0X2VuY29kaW5n
X25hbWU6CisgKiBAd2ViX3Jlc291cmNlOiBhICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJl
dHVybnMgdGhlIHRleHQgZW5jb2RpbmcgbmFtZSBvZiB0aGUgcmVzb3VyY2UKKyAqCisgKiBSZXR1
cm4gdmFsdWU6IHRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgb2YgdGhlIHJlc291cmNlCisgKgorICog
U2luY2U6IDEuMS41CisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRfd2ViX3Jlc291
cmNlX2dldF90ZXh0X2VuY29kaW5nX25hbWUoV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNl
KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfUkVTT1VSQ0Uod2Vi
UmVzb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSogcHJpdiA9
IHdlYlJlc291cmNlLT5wcml2OworICAgIGlmICghcHJpdi0+cmVzb3VyY2UpCisgICAgICAgIHJl
dHVybiBOVUxMOworCisgICAgcHJpdi0+dGV4dEVuY29kaW5nID0gcHJpdi0+cmVzb3VyY2UtPnRl
eHRFbmNvZGluZygpLnV0ZjgoKTsKKworICAgIHJldHVybiBwcml2LT50ZXh0RW5jb2RpbmcuZGF0
YSgpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25hbWU6Cisg
KiBAd2ViX3Jlc291cmNlOiBhICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVybnMgdGhl
IGZyYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgZnJh
bWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgKgorICogU2luY2U6IDEuMS41CisgKi8KK0dfQ09O
U1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKFdlYktp
dFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChX
RUJLSVRfSVNfV0VCX1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRX
ZWJSZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBpZiAoIXBy
aXYtPnJlc291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHByaXYtPmZyYW1lTmFt
ZSA9IHByaXYtPnJlc291cmNlLT5mcmFtZU5hbWUoKS51dGY4KCk7CisKKyAgICByZXR1cm4gcHJp
di0+ZnJhbWVOYW1lLmRhdGEoKTsKK30KKworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLwpJbmRleDog
V2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gL2Rldi9udWxsCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBXZWJL
aXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaAkyMDA5LTA0LTA1IDEzOjA1
OjUzLjAwMDAwMDAwMCArMTAwMApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEphbiBNaWNoYWVsIEMuIEFsb256bworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFdFQktJVF9XRUJfUkVTT1VSQ0Vf
SAorI2RlZmluZSBXRUJLSVRfV0VCX1JFU09VUkNFX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNp
bmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRlZmluZXMu
aD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSAg
ICAgICAgICAgICh3ZWJraXRfd2ViX3Jlc291cmNlX2dldF90eXBlKCkpCisjZGVmaW5lIFdFQktJ
VF9XRUJfUkVTT1VSQ0Uob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FT
VCgob2JqKSwgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBXZWJLaXRXZWJSZXNvdXJjZSkpCisj
ZGVmaW5lIFdFQktJVF9XRUJfUkVTT1VSQ0VfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tf
Q0xBU1NfQ0FTVCgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBXZWJLaXRXZWJS
ZXNvdXJjZUNsYXNzKSkKKyNkZWZpbmUgV0VCS0lUX0lTX1dFQl9SRVNPVVJDRShvYmopICAgICAg
ICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBXRUJLSVRfVFlQRV9XRUJfUkVT
T1VSQ0UpKQorI2RlZmluZSBXRUJLSVRfSVNfV0VCX1JFU09VUkNFX0NMQVNTKGtsYXNzKSAoR19U
WVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSkp
CisjZGVmaW5lIFdFQktJVF9XRUJfUkVTT1VSQ0VfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5T
VEFOQ0VfR0VUX0NMQVNTKChvYmopLCAgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBXZWJLaXRX
ZWJSZXNvdXJjZUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlUHJp
dmF0ZSBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGU7CisKK3N0cnVjdCBfV2ViS2l0V2ViUmVzb3Vy
Y2UgeworICAgIEdPYmplY3QgcGFyZW50X2luc3RhbmNlOworCisgICAgLyo8IHByaXZhdGUgPiov
CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlICpwcml2OworfTsKKworc3RydWN0IF9XZWJL
aXRXZWJSZXNvdXJjZUNsYXNzIHsKKyAgICBHT2JqZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworCisg
ICAgLyogUGFkZGluZyBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIHZvaWQgKCpfd2Via2l0
X3Jlc2VydmVkMCkgKHZvaWQpOworICAgIHZvaWQgKCpfd2Via2l0X3Jlc2VydmVkMSkgKHZvaWQp
OworICAgIHZvaWQgKCpfd2Via2l0X3Jlc2VydmVkMikgKHZvaWQpOworICAgIHZvaWQgKCpfd2Vi
a2l0X3Jlc2VydmVkMykgKHZvaWQpOworfTsKKworV0VCS0lUX0FQSSBHVHlwZQord2Via2l0X3dl
Yl9yZXNvdXJjZV9nZXRfdHlwZSAodm9pZCk7CisKK1dFQktJVF9BUEkgV2ViS2l0V2ViUmVzb3Vy
Y2UgKgord2Via2l0X3dlYl9yZXNvdXJjZV9uZXcgICAgICAgICAgICAgICAgICAgIChjb25zdCBn
Y2hhciAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqbWltZV90eXBlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAg
KnRleHRfZW5jb2RpbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICpmcmFtZV9uYW1lKTsKKworV0VCS0lUX0FQSSBH
X0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhICAgICAg
ICAgICAgICAgKFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lUX0FQ
SSBHX0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwgICAg
ICAgICAgICAgICAgKFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lU
X0FQSSBHX0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1l
X3R5cGUgICAgICAgICAgKFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VC
S0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF90
ZXh0X2VuY29kaW5nX25hbWUgKFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKwor
V0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dl
dF9mcmFtZV9uYW1lICAgICAgICAgKFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsK
KworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIFdFQktJVF9XRUJfUkVTT1VSQ0VfSCAqLwpJbmRl
eDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgJMjAwOS0wNC0w
NSAxMzoxMzowOS4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93
ZWJraXRwcml2YXRlLmgJMjAwOS0wNC0wNSAxMzoxMzoyMS4wMDAwMDAwMDAgKzEwMDAKQEAgLTMz
LDExICszMywxNCBAQAogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1
ZGUgPHdlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93
ZWJraXR3ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnJl
c291cmNlLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnNldHRpbmdzLmg+CiAjaW5jbHVk
ZSA8d2Via2l0L3dlYmtpdHdlYndpbmRvd2ZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dl
YmtpdHdlYmJhY2tmb3J3YXJkbGlzdC5oPgogCisjaW5jbHVkZSAiQXJjaGl2ZVJlc291cmNlLmgi
CiAjaW5jbHVkZSAiQmFja0ZvcndhcmRMaXN0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgogI2lu
Y2x1ZGUgIkhpc3RvcnlJdGVtLmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJQ
YWdlLmgiCkBAIC0xNDMsNiArMTQ2LDIyIEBACiAgICAgd2Via2l0X3dlYl9oaXN0b3J5X2l0ZW1f
Z2V0X2NoaWxkcmVuKFdlYktpdFdlYkhpc3RvcnlJdGVtKik7CiAgICAgLy8gZW5kIFdlYktpdFdl
Ykhpc3RvcnlJdGVtIHByaXZhdGUKIAorICAgIC8vIFdlYktpdFdlYlJlc291cmNlIHByaXZhdGUK
KyAgICAjZGVmaW5lIFdFQktJVF9XRUJfUkVTT1VSQ0VfR0VUX1BSSVZBVEUob2JqKSAgICAgICAg
KEdfVFlQRV9JTlNUQU5DRV9HRVRfUFJJVkFURSgob2JqKSwgV0VCS0lUX1RZUEVfV0VCX1JFU09V
UkNFLCBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUpKQorICAgIHN0cnVjdCBfV2ViS2l0V2ViUmVz
b3VyY2VQcml2YXRlIHsKKyAgICAgICAgV2ViQ29yZTo6QXJjaGl2ZVJlc291cmNlKiByZXNvdXJj
ZTsKKworICAgICAgICBXZWJDb3JlOjpDU3RyaW5nIHVybDsKKyAgICAgICAgV2ViQ29yZTo6Q1N0
cmluZyBtaW1lVHlwZTsKKyAgICAgICAgV2ViQ29yZTo6Q1N0cmluZyB0ZXh0RW5jb2Rpbmc7Cisg
ICAgICAgIFdlYkNvcmU6OkNTdHJpbmcgZnJhbWVOYW1lOworCisgICAgICAgIGNvbnN0IGdjaGFy
KiBkYXRhOworICAgIH07CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqCisgICAgd2Via2l0X3dlYl9y
ZXNvdXJjZV9pbml0X3dpdGhfY29yZV9yZXNvdXJjZShQYXNzUmVmUHRyPFdlYkNvcmU6OkFyY2hp
dmVSZXNvdXJjZT4pOworICAgIC8vIGVuZCBXZWJLaXRXZWJSZXNvdXJjZSBwcml2YXRlCisKICAg
ICB2b2lkCiAgICAgd2Via2l0X3dlYl9pbnNwZWN0b3Jfc2V0X2luc3BlY3Rvcl9jbGllbnQoV2Vi
S2l0V2ViSW5zcGVjdG9yKiwgV2ViQ29yZTo6UGFnZSopOwogCkluZGV4OiBXZWJLaXQvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5vcmlnL0NoYW5nZUxvZwkyMDA5LTA0LTA1IDEzOjIz
OjExLjAwMDAwMDAwMCArMTAwMAorKysgV2ViS2l0L0NoYW5nZUxvZwkyMDA5LTA0LTA1IDEzOjI5
OjIyLjAwMDAwMDAwMCArMTAwMApAQCAtMSwzICsxLDE0IEBACisyMDA5LTA0LTA0ICBKYW4gTWlj
aGFlbCBBbG9uem8gIDxqbWFsb256b0B3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3Vy
Y2UgZm9yIHRoZSBndGsgcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjQ3NTgKKworICAgICAgICBBZGQgV2ViS2l0V2ViUmVzb3VyY2UgdG8gdGhl
IGJ1aWxkIHNjcmlwdC4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorCiAyMDA5LTA0LTAz
ICBHdXN0YXZvIE5vcm9uaGEgU2lsdmEgIDxndXN0YXZvLm5vcm9uaGFAY29sbGFib3JhLmNvLnVr
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IEhvbGdlciBGcmV5dGhlci4KSW5kZXg6IFdlYktpdC9X
ZWJLaXQvZ3RrL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3Rr
L0NoYW5nZUxvZwkyMDA5LTA0LTA1IDEzOjE5OjMzLjAwMDAwMDAwMCArMTAwMAorKysgV2ViS2l0
L1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDQtMDUgMTM6Mjk6MDcuMDAwMDAwMDAwICsxMDAw
CkBAIC0xLDMgKzEsMjggQEAKKzIwMDktMDQtMDQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxv
bnpvQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAor
CisgICAgICAgIEltcGxlbWVudCBXZWJLaXRXZWJSZXNvdXJjZSBmb3IgdGhlIHJlc291cmNlLXJl
bGF0ZWQgQVBJIGZvcgorICAgICAgICBXZWJLaXRXZWJEYXRhU291cmNlLgorCisgICAgICAgICog
dGVzdHMvdGVzdHdlYnJlc291cmNlLmM6IEFkZGVkLgorICAgICAgICAod2ViX3Jlc291cmNlX2Zp
eHR1cmVfc2V0dXApOgorICAgICAgICAod2ViX3Jlc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOgor
ICAgICAgICAodGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwpOgorICAgICAgICAodGVz
dF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKToKKyAgICAgICAgKHRlc3Rfd2Via2l0X3dl
Yl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKToKKyAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNv
dXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKToKKyAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9y
ZXNvdXJjZV9nZXRfZnJhbWVfbmFtZSk6CisgICAgICAgIChtYWluKToKKyAgICAgICAgKiB3ZWJr
aXQvd2Via2l0Lmg6CisgICAgICAgICogd2Via2l0L3dlYmtpdGRlZmluZXMuaDoKKyAgICAgICAg
KiB3ZWJraXQvd2Via2l0cHJpdmF0ZS5oOgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJyZXNv
dXJjZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5oOiBB
ZGRlZC4KKwogMjAwOS0wNC0wMyAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8Z3VzdGF2by5ub3Jv
bmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBIb2xnZXIgRnJleXRo
ZXIuCg==
</data>
<flag name="review"
          id="14525"
          type_id="1"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29263</attachid>
            <date>2009-04-04 22:22:53 -0700</date>
            <delta_ts>2009-07-18 01:03:34 -0700</delta_ts>
            <desc>web data source and documentloader impl for gtk port</desc>
            <filename>datasource</filename>
            <type>text/plain</type>
            <size>42718</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9H
TlVtYWtlZmlsZS5hbQkyMDA5LTA0LTA1IDEzOjM1OjI5LjAwMDAwMDAwMCArMTAwMAorKysgV2Vi
S2l0L0dOVW1ha2VmaWxlLmFtCTIwMDktMDQtMDUgMTQ6MjI6MzMuMDAwMDAwMDAwICsxMDAwCkBA
IC0zMTEsNiArMzExLDcgQEAKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRzb3VwYXV0aGRpYWxv
Zy5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR2ZXJzaW9uLmggXAogCVdlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYmJhY2tmb3J3YXJkbGlzdC5oIFwKKwlXZWJLaXQvZ3RrL3dlYmtpdC93
ZWJraXR3ZWJkYXRhc291cmNlLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1l
LmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmhpc3RvcnlpdGVtLmggXAogCVdlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYmluc3BlY3Rvci5oIFwKQEAgLTMzMiw2ICszMzMsOCBAQAog
CVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50R3RrLmggXAogCVdlYktpdC9n
dGsvV2ViQ29yZVN1cHBvcnQvQ29udGV4dE1lbnVDbGllbnRHdGsuY3BwIFwKIAlXZWJLaXQvZ3Rr
L1dlYkNvcmVTdXBwb3J0L0NvbnRleHRNZW51Q2xpZW50R3RrLmggXAorCVdlYktpdC9ndGsvV2Vi
Q29yZVN1cHBvcnQvRG9jdW1lbnRMb2FkZXJHdGsuY3BwIFwKKwlXZWJLaXQvZ3RrL1dlYkNvcmVT
dXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmggXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQv
RHJhZ0NsaWVudEd0ay5jcHAgXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVu
dEd0ay5oIFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0VkaXRvckNsaWVudEd0ay5jcHAg
XApAQCAtMzQ4LDYgKzM1MSw3IEBACiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0c291cGF1dGhk
aWFsb2cuYyBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0dmVyc2lvbi5jcHAgXAogCVdlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYmJhY2tmb3J3YXJkbGlzdC5jcHAgXAorCVdlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJmcmFtZS5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmhpc3RvcnlpdGVt
LmNwcCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9yLmNwcCBcCkBAIC00
OTUsNiArNDk5LDcgQEAKIAogVEVTVF9QUk9HUyArPSBQcm9ncmFtcy91bml0dGVzdHMvdGVzdHdl
YmZyYW1lIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdHdlYmJhY2tmb3J3YXJkbGlzdCBcCisJ
UHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJkYXRhc291cmNlIFwKIAlQcm9ncmFtcy91bml0dGVz
dHMvdGVzdHdlYmhpc3RvcnlpdGVtIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdGRvd25sb2Fk
IFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdHdlYnJlc291cmNlCkBAIC01MjAsNiArNTI1LDEw
IEBACiBQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX0NGTEFHUyA9ICQod2Via2l0
X3Rlc3RzX2NmbGFncykKIFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2VicmVzb3VyY2VfTERBREQg
PSAkKHdlYmtpdF90ZXN0c19sZGFkZCkKIAorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJkYXRh
c291cmNlX1NPVVJDRVMgPSBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJkYXRhc291cmNlLmMKK1By
b2dyYW1zX3VuaXR0ZXN0c190ZXN0d2ViZGF0YXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0
c19jZmxhZ3MpCitQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYmRhdGFzb3VyY2VfTERBREQgPSAk
KHdlYmtpdF90ZXN0c19sZGFkZCkKKwogIyBBdXRvZ2VuZXJhdGVkIHNvdXJjZXMKIEJVSUxUX1NP
VVJDRVMgOj0gXAogCSQoamF2YXNjcmlwdGNvcmVfYnVpbHRfc291cmNlcykgXApJbmRleDogV2Vi
S2l0L1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRG9jdW1lbnRMb2FkZXJHdGsuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAor
KysgV2ViS2l0L1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRG9jdW1lbnRMb2FkZXJHdGsuY3Bw
CTIwMDktMDQtMDUgMTM6NDU6MTAuMDAwMDAwMDAwICsxMDAwCkBAIC0wLDAgKzEsMTE4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAgSmFuIE1pY2hhZWwgQWxvbnpvCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5j
LiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBm
cm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgICAgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyR3RrLmgiCisKKyNpbmNsdWRl
ICJ3ZWJraXR3ZWJkYXRhc291cmNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitu
YW1lc3BhY2UgV2ViS2l0IHsKKworRG9jdW1lbnRMb2FkZXI6OkRvY3VtZW50TG9hZGVyKGNvbnN0
IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1
dGVEYXRhKQorICAgIDogV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIocmVxdWVzdCwgc3Vic3RpdHV0
ZURhdGEpCisgICAgLCBtX2lzRGF0YVNvdXJjZVJlZmZlZChmYWxzZSkKKyAgICAsIG1fZGF0YVNv
dXJjZSgwKQoreworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpzZXREYXRhU291cmNlKFdlYktp
dFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2UsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcpCit7Cisg
ICAgQVNTRVJUKCFtX2RhdGFTb3VyY2UpOworCisgICAgbV9kYXRhU291cmNlID0gZGF0YVNvdXJj
ZTsKKyAgICByZWZEYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmRldGFj
aERhdGFTb3VyY2UoKQoreworICAgIEFTU0VSVCghbV9pc0RhdGFTb3VyY2VSZWZmZWQpOworICAg
IHVucmVmRGF0YVNvdXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjphdHRhY2hUb0Zy
YW1lKCkKK3sKKyAgICBXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6YXR0YWNoVG9GcmFtZSgpOwor
CisgICAgcmVmRGF0YVNvdXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpkZXRhY2hG
cm9tRnJhbWUoKQoreworICAgIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyOjpkZXRhY2hGcm9tRnJh
bWUoKTsKKworICAgIGlmIChtX2xvYWRpbmdSZXNvdXJjZXMuaXNFbXB0eSgpKQorICAgICAgICB1
bnJlZkRhdGFTb3VyY2UoKTsKKworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjppbmNyZWFzZUxv
YWRDb3VudCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIpCit7CisgICAgQVNTRVJUKG1fZGF0YVNv
dXJjZSk7CisKKyAgICBpZiAobV9sb2FkaW5nUmVzb3VyY2VzLmNvbnRhaW5zKGlkZW50aWZpZXIp
KQorICAgICAgICByZXR1cm47CisgICAgbV9sb2FkaW5nUmVzb3VyY2VzLmFkZChpZGVudGlmaWVy
KTsKKyAgICByZWZEYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmRlY3Jl
YXNlTG9hZENvdW50KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcikKK3sKKyAgICBIYXNoU2V0PHVu
c2lnbmVkIGxvbmc+OjppdGVyYXRvciBpdCA9IG1fbG9hZGluZ1Jlc291cmNlcy5maW5kKGlkZW50
aWZpZXIpOworCisgICAgLy8gSXQgaXMgdmFsaWQgZm9yIGEgbG9hZCB0byBiZSBjYW5jZWxsZWQg
YmVmb3JlIGl0J3Mgc3RhcnRlZC4KKyAgICBpZiAoaXQgPT0gbV9sb2FkaW5nUmVzb3VyY2VzLmVu
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xvYWRpbmdSZXNvdXJjZXMucmVtb3ZlKGl0
KTsKKworICAgIGlmIChtX2xvYWRpbmdSZXNvdXJjZXMuaXNFbXB0eSgpICYmICFmcmFtZSgpKQor
ICAgICAgICB1bnJlZkRhdGFTb3VyY2UoKTsKKworfQorCisvLyBoZWxwZXIgbWV0aG9zIHRvIGF2
b2lkIHJlZiBjb3VudCBjaHVybgordm9pZCBEb2N1bWVudExvYWRlcjo6cmVmRGF0YVNvdXJjZSgp
Cit7CisgICAgaWYgKG1faXNEYXRhU291cmNlUmVmZmVkIHx8ICFtX2RhdGFTb3VyY2UpCisgICAg
ICAgIHJldHVybjsKKyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IHRydWU7CisgICAgZ19vYmpl
Y3RfcmVmKG1fZGF0YVNvdXJjZSk7Cit9Cit2b2lkIERvY3VtZW50TG9hZGVyOjp1bnJlZkRhdGFT
b3VyY2UoKQoreworICAgIGlmICghbV9pc0RhdGFTb3VyY2VSZWZmZWQpCisgICAgICAgIHJldHVy
bjsKKyAgICBBU1NFUlQobV9kYXRhU291cmNlKTsKKyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9
IGZhbHNlOworICAgIGdfb2JqZWN0X3VucmVmKG1fZGF0YVNvdXJjZSk7Cit9CisKK30gLy8gZW5k
IG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0
L0RvY3VtZW50TG9hZGVyR3RrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCTE5NzAtMDEtMDEg
MDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3JlU3Vw
cG9ydC9Eb2N1bWVudExvYWRlckd0ay5oCTIwMDktMDQtMDUgMTM6NDU6MjkuMDAwMDAwMDAwICsx
MDAwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBKYW4g
TWljaGFlbCBBbG9uem8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKworI2luY2x1ZGUgIkRvY3Vt
ZW50TG9hZGVyLmgiCisKKyNpbmNsdWRlICJ3ZWJraXRkZWZpbmVzLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworICAgIGNsYXNzIFJlc291cmNlUmVxdWVzdDsKKyAgICBjbGFzcyBTdWJzdGl0
dXRlRGF0YTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIERvY3VtZW50TG9hZGVy
IDogcHVibGljIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyPiBjcmVhdGUoY29uc3QgV2ViQ29yZTo6
UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBXZWJDb3JlOjpTdWJzdGl0dXRlRGF0YSYg
ZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgRG9jdW1lbnRMb2FkZXIo
cmVxdWVzdCwgZGF0YSkpOworICAgIH0KKworICAgIHZvaWQgc2V0RGF0YVNvdXJjZShXZWJLaXRX
ZWJEYXRhU291cmNlKiwgV2ViS2l0V2ViVmlldyopOworICAgIHZvaWQgZGV0YWNoRGF0YVNvdXJj
ZSgpOworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2UoKSBjb25zdCB7IHJldHVy
biBtX2RhdGFTb3VyY2U7IH0KKworICAgIHZvaWQgaW5jcmVhc2VMb2FkQ291bnQodW5zaWduZWQg
bG9uZyBpZGVudGlmaWVyKTsKKyAgICB2b2lkIGRlY3JlYXNlTG9hZENvdW50KHVuc2lnbmVkIGxv
bmcgaWRlbnRpZmllcik7CisKK3ByaXZhdGU6CisgICAgRG9jdW1lbnRMb2FkZXIoY29uc3QgV2Vi
Q29yZTo6UmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgV2ViQ29yZTo6U3Vic3RpdHV0ZURhdGEmKTsK
KworICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hUb0ZyYW1lKCk7CisgICAgdmlydHVhbCB2b2lkIGRl
dGFjaEZyb21GcmFtZSgpOworCisgICAgdm9pZCByZWZEYXRhU291cmNlKCk7CisgICAgdm9pZCB1
bnJlZkRhdGFTb3VyY2UoKTsKKworICAgIGJvb2wgbV9pc0RhdGFTb3VyY2VSZWZmZWQ7CisgICAg
V2ViS2l0V2ViRGF0YVNvdXJjZSogbV9kYXRhU291cmNlOworICAgIEhhc2hTZXQ8dW5zaWduZWQg
bG9uZz4gbV9sb2FkaW5nUmVzb3VyY2VzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFdlYktp
dApJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGll
bnRHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5vcmlnL1dlYktpdC9ndGsvV2ViQ29yZVN1
cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwCTIwMDktMDQtMDUgMTM6Mzg6NTQuMDAwMDAw
MDAwICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEd0ay5jcHAJMjAwOS0wNC0wNSAxMzo0NToxMC4wMDAwMDAwMDAgKzEwMDAKQEAgLTI1
LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgIkNvbG9yLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2Fk
ZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlckd0ay5oIgogI2luY2x1ZGUgIkZvcm1TdGF0
ZS5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCkBA
IC0xNjYsNyArMTY3LDEzIEBACiAKIFdURjo6UGFzc1JlZlB0cjxXZWJDb3JlOjpEb2N1bWVudExv
YWRlcj4gRnJhbWVMb2FkZXJDbGllbnQ6OmNyZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0IFdlYkNv
cmU6OlJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0
aXR1dGVEYXRhKQogewotICAgIHJldHVybiBEb2N1bWVudExvYWRlcjo6Y3JlYXRlKHJlcXVlc3Qs
IHN1YnN0aXR1dGVEYXRhKTsKKyAgICBSZWZQdHI8V2ViS2l0OjpEb2N1bWVudExvYWRlcj4gbG9h
ZGVyID0gV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6Y3JlYXRlKHJlcXVlc3QsIHN1YnN0aXR1dGVE
YXRhKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UgPSB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX25ld193aXRoX2xvYWRlcihsb2FkZXIuZ2V0KCkpOworICAgIGxvYWRl
ci0+c2V0RGF0YVNvdXJjZSh3ZWJEYXRhU291cmNlLCBnZXRWaWV3RnJvbUZyYW1lKG1fZnJhbWUp
KTsKKyAgICBnX29iamVjdF91bnJlZih3ZWJEYXRhU291cmNlKTsKKworICAgIHJldHVybiBsb2Fk
ZXIucmVsZWFzZSgpOwogfQogCiB2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxT
dWJtaXRGb3JtKEZyYW1lUG9saWN5RnVuY3Rpb24gcG9saWN5RnVuY3Rpb24sIFBhc3NSZWZQdHI8
Rm9ybVN0YXRlPikKQEAgLTE3OSw3ICsxODYsNyBAQAogfQogCiAKLXZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6OmNvbW1pdHRlZExvYWQoRG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hhciog
ZGF0YSwgaW50IGxlbmd0aCkKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmNvbW1pdHRlZExvYWQo
V2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hhciogZGF0YSwgaW50IGxl
bmd0aCkKIHsKICAgICBpZiAoIW1fcGx1Z2luVmlldykgewogICAgICAgICBBU1NFUlQobG9hZGVy
LT5mcmFtZSgpKTsKQEAgLTIwNiwyOCArMjEzLDI5IEBACiB9CiAKIGJvb2wKLUZyYW1lTG9hZGVy
Q2xpZW50OjpzaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZShEb2N1bWVudExvYWRlciosIHVuc2ln
bmVkIGxvbmcgIGlkZW50aWZpZXIpCitGcmFtZUxvYWRlckNsaWVudDo6c2hvdWxkVXNlQ3JlZGVu
dGlhbFN0b3JhZ2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVu
dGlmaWVyKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQog
Ci12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2VpdmVBdXRoZW50aWNhdGlv
bkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcgIGlkZW50aWZpZXIsIGNv
bnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRp
c3BhdGNoRGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKFdlYkNvcmU6OkRvY3VtZW50
TG9hZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRlbnRpZmllciwgY29uc3QgQXV0aGVudGljYXRpb25D
aGFsbGVuZ2UmKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnQ6OmRpc3BhdGNoRGlkQ2FuY2VsQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9jdW1l
bnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVudGlmaWVyLCBjb25zdCBBdXRoZW50aWNhdGlv
bkNoYWxsZW5nZSYpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZENhbmNlbEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQg
bG9uZyAgaWRlbnRpZmllciwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKQogewogICAg
IG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNo
V2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZywgUmVzb3VyY2VS
ZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50
OjpkaXNwYXRjaFdpbGxTZW5kUmVxdWVzdChXZWJDb3JlOjpEb2N1bWVudExvYWRlciogbG9hZGVy
LCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29u
c3QgUmVzb3VyY2VSZXNwb25zZSYgcmVkaXJlY3RSZXNwb25zZSkKIHsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIGlmIChyZWRpcmVjdFJlc3BvbnNlLmlzTnVsbCgpKQorICAgICAgICBzdGF0
aWNfY2FzdDxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyKj4obG9hZGVyKS0+aW5jcmVhc2VMb2FkQ291
bnQoaWRlbnRpZmllcik7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmFzc2lnbklkZW50
aWZpZXJUb0luaXRpYWxSZXF1ZXN0KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllciwgRG9jdW1lbnRM
b2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6
YXNzaWduSWRlbnRpZmllclRvSW5pdGlhbFJlcXVlc3QodW5zaWduZWQgbG9uZyBpZGVudGlmaWVy
LCBXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291cmNlUmVxdWVzdCYpCiB7CiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KQEAgLTI2NSw3ICsyNzMsNyBAQAogICAgIGRlbGV0ZSB0
aGlzOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2VpdmVSZXNw
b25zZShEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IFJlc291cmNlUmVzcG9u
c2UmIHJlc3BvbnNlKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZl
UmVzcG9uc2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBS
ZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSkKIHsKICAgICBtX3Jlc3BvbnNlID0gcmVzcG9uc2U7
CiB9CkBAIC01NjYsNyArNTc0LDcgQEAKICAgICByZXR1cm4gaXRlbSAhPSAwOwogfQogCi12b2lk
IEZyYW1lTG9hZGVyQ2xpZW50OjptYWtlUmVwcmVzZW50YXRpb24oRG9jdW1lbnRMb2FkZXIqKQor
dm9pZCBGcmFtZUxvYWRlckNsaWVudDo6bWFrZVJlcHJlc2VudGF0aW9uKFdlYkNvcmU6OkRvY3Vt
ZW50TG9hZGVyKikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQpAQCAtNzE1LDIyICs3MjMs
MjIgQEAKICAgICAgICAgd2Via2l0X3dlYl9wb2xpY3lfZGVjaXNpb25fY2FuY2VsKG1fcG9saWN5
RGVjaXNpb24pOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRN
YWluUmVzb3VyY2UoRG9jdW1lbnRMb2FkZXIqKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlz
cGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKikKIHsKICAg
ICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpyZXZlcnRU
b1Byb3Zpc2lvbmFsU3RhdGUoRG9jdW1lbnRMb2FkZXIqKQordm9pZCBGcmFtZUxvYWRlckNsaWVu
dDo6cmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKikKIHsK
ICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojp3aWxs
Q2hhbmdlVGl0bGUoRG9jdW1lbnRMb2FkZXIqKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6d2ls
bENoYW5nZVRpdGxlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKikKIHsKICAgICBub3RJbXBsZW1l
bnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaWRDaGFuZ2VUaXRsZShEb2N1
bWVudExvYWRlciAqbCkKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpZENoYW5nZVRpdGxlKFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyICpsKQogewogICAgIHNldFRpdGxlKGwtPnRpdGxlKCksIGwt
PnVybCgpKTsKIH0KQEAgLTc1OSw3ICs3NjcsNyBAQAogICAgIHJldHVybiBTdHJpbmcoKTsKIH0K
IAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZmluaXNoZWRMb2FkaW5nKERvY3VtZW50TG9hZGVy
KiBkb2N1bWVudExvYWRlcikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmZpbmlzaGVkTG9hZGlu
ZyhXZWJDb3JlOjpEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIpCiB7CiAgICAgaWYgKCFt
X3BsdWdpblZpZXcpCiAgICAgICAgIGNvbW1pdHRlZExvYWQoZG9jdW1lbnRMb2FkZXIsIDAsIDAp
OwpAQCAtNzg5LDIyICs3OTcsMjIgQEAKICAgICBmcmFtZURhdGEtPnRpdGxlID0gZ19zdHJkdXAo
dGl0bGUudXRmOCgpLmRhdGEoKSk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3Bh
dGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25n
IGlkZW50aWZpZXIsIGludCBsZW5ndGhSZWNlaXZlZCkKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6
OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIq
LCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGludCBsZW5ndGhSZWNlaXZlZCkKIHsKICAgICBu
b3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERp
ZEZpbmlzaExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIp
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZpbmlzaExvYWRpbmcoV2ViQ29y
ZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKQogewot
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgc3RhdGljX2Nhc3Q8V2ViS2l0OjpEb2N1bWVudExv
YWRlcio+KGxvYWRlciktPmRlY3JlYXNlTG9hZENvdW50KGlkZW50aWZpZXIpOwogfQogCi12b2lk
IEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZhaWxMb2FkaW5nKERvY3VtZW50TG9hZGVy
KiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBjb25zdCBSZXNvdXJjZUVycm9yJikKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkRmFpbExvYWRpbmcoV2ViQ29yZTo6RG9jdW1l
bnRMb2FkZXIqIGxvYWRlciwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBjb25zdCBSZXNvdXJj
ZUVycm9yJikKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHN0YXRpY19jYXN0PFdlYktp
dDo6RG9jdW1lbnRMb2FkZXIqPihsb2FkZXIpLT5kZWNyZWFzZUxvYWRDb3VudChpZGVudGlmaWVy
KTsKIH0KIAotYm9vbCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VG
cm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiwgaW50IGxlbmd0aCkKK2Jvb2wgRnJhbWVMb2FkZXJDbGll
bnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNlRnJvbU1lbW9yeUNhY2hlKFdlYkNvcmU6OkRvY3Vt
ZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25z
ZSYsIGludCBsZW5ndGgpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gZmFs
c2U7CkBAIC05MDMsNyArOTExLDcgQEAKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lk
IEZyYW1lTG9hZGVyQ2xpZW50OjpzZXRNYWluRG9jdW1lbnRFcnJvcihEb2N1bWVudExvYWRlcios
IGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6c2V0
TWFpbkRvY3VtZW50RXJyb3IoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJj
ZUVycm9yJiBlcnJvcikKIHsKICAgICBpZiAobV9wbHVnaW5WaWV3KSB7CiAgICAgICAgIG1fcGx1
Z2luVmlldy0+ZGlkRmFpbChlcnJvcik7CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2ViZGF0YXNvdXJjZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCTE5NzAtMDEt
MDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2ViZGF0YXNvdXJjZS5jcHAJMjAwOS0wNC0wNSAxNToxMjozMS4wMDAwMDAwMDAgKzEw
MDAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hh
ZWwgQy4gQWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIndlYmtpdHdlYmRh
dGFzb3VyY2UuaCIKKyNpbmNsdWRlICJ3ZWJraXR3ZWJyZXNvdXJjZS5oIgorI2luY2x1ZGUgIndl
YmtpdHByaXZhdGUuaCIKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxydW50aW1lL0lu
aXRpYWxpemVUaHJlYWRpbmcuaD4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorCisjaW5j
bHVkZSAiQXJjaGl2ZVJlc291cmNlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIK
KyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEd0ay5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVy
LmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5j
bHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5j
bHVkZSAiU3Vic3RpdHV0ZURhdGEuaCIKKworLyoqCisgKiBTRUNUSU9OOndlYmtpdHdlYmRhdGFz
b3VyY2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogRW5jYXBzdWxhdGVzIHRoZSBjb250ZW50IHRv
IGJlIGRpc3BsYXllZCBpbiBhICNXZWJLaXRXZWJGcmFtZS4KKyAqIEBzZWVfYWxzbzogI1dlYktp
dFdlYkZyYW1lCisgKgorICogQSBkYXRhIHNvdXJjZSBlbmNhcHN1bGF0ZXMgdGhlIGNvbnRlbnQg
b2YgYSAjV2ViS2l0V2ViRnJhbWUuIEEKKyAqICNXZWJLaXRXZWJGcmFtZSBoYXMgYSBtYWluIHJl
c291cmNlIGFuZCBzdWJyZXNvdXJjZXMgYW5kIHRoZSBkYXRhIHNvdXJjZQorICogcHJvdmlkZXMg
bWV0aG9kcyB0byBhY2Nlc3MgdGhlc2UgcmVzb3VyY2VzLiAjV2ViS2l0V2ViRGF0YVNvdXJjZSBv
YmplY3RzCisgKiBoYXZlIGFuIGFzc29jaWF0ZWQgaW5pdGlhbCByZXF1ZXN0LiBNYWtlIHN1cmUg
dG8gY2hlY2sgaWYgdGhlIGRhdGEgc291cmNlCisgKiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWlu
ZyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBpdHMgZGF0YS4KKyAqLworCit1c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CisKK2V4dGVybiAiQyIgeworCitz
dHJ1Y3QgX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlIHsKKyAgICBXZWJLaXQ6OkRvY3VtZW50
TG9hZGVyKiBsb2FkZXI7CisKKyAgICBXZWJLaXROZXR3b3JrUmVxdWVzdCogaW5pdGlhbFJlcXVl
c3Q7CisgICAgV2ViS2l0TmV0d29ya1JlcXVlc3QqIG5ldHdvcmtSZXF1ZXN0OworICAgIFdlYktp
dFdlYlJlc291cmNlKiBtYWluUmVzb3VyY2U7CisgICAgR0FycmF5KiBzdWJyZXNvdXJjZXM7CisK
KyAgICBDU3RyaW5nIHVucmVhY2hhYmxlVVJMOworfTsKKworI2RlZmluZSBXRUJLSVRfV0VCX0RB
VEFfU09VUkNFX0dFVF9QUklWQVRFKG9iaikgICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BS
SVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSwgV2ViS2l0V2ViRGF0YVNv
dXJjZVByaXZhdGUpKQorCitHX0RFRklORV9UWVBFKFdlYktpdFdlYkRhdGFTb3VyY2UsIHdlYmtp
dF93ZWJfZGF0YV9zb3VyY2UsIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZCB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2Rpc3Bvc2UoR09iamVjdCogb2JqZWN0KQoreworICAgIFdlYktpdFdl
YkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UgPSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iamVj
dCk7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNl
LT5wcml2OworCisgICAgQVNTRVJUKHByaXYtPmxvYWRlcik7CisgICAgQVNTRVJUKCFwcml2LT5s
b2FkZXItPmlzTG9hZGluZygpKTsKKyAgICBwcml2LT5sb2FkZXItPmRldGFjaERhdGFTb3VyY2Uo
KTsKKyAgICBwcml2LT5sb2FkZXItPmRlcmVmKCk7CisKKyAgICBpZiAocHJpdi0+aW5pdGlhbFJl
cXVlc3QpCisgICAgICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPmluaXRpYWxSZXF1ZXN0KTsKKwor
ICAgIGlmIChwcml2LT5uZXR3b3JrUmVxdWVzdCkKKyAgICAgICAgZ19vYmplY3RfdW5yZWYocHJp
di0+bmV0d29ya1JlcXVlc3QpOworCisgICAgaWYgKHByaXYtPm1haW5SZXNvdXJjZSkKKyAgICAg
ICAgZ19vYmplY3RfdW5yZWYocHJpdi0+bWFpblJlc291cmNlKTsKKworICAgIGlmIChwcml2LT5z
dWJyZXNvdXJjZXMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpPTA7IGkgPCBwcml2LT5zdWJy
ZXNvdXJjZXMtPmxlbjsgaSsrKSB7CisgICAgICAgICAgICBXZWJLaXRXZWJSZXNvdXJjZSogcmVz
ID0gJmdfYXJyYXlfaW5kZXgocHJpdi0+c3VicmVzb3VyY2VzLCBXZWJLaXRXZWJSZXNvdXJjZSwg
aSk7CisgICAgICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVm
KHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBnX2FycmF5X2ZyZWUocHJpdi0+c3VicmVzb3Vy
Y2VzLCBUUlVFKTsKKyAgICB9CisKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX2RhdGFf
c291cmNlX3BhcmVudF9jbGFzcyktPmRpc3Bvc2Uob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQg
d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCit7CisgICAg
V2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZSA9IFdFQktJVF9XRUJfREFUQV9TT1VSQ0Uo
b2JqZWN0KTsKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IGRhdGFTb3Vy
Y2UtPnByaXY7CisKKyAgICBwcml2LT51bnJlYWNoYWJsZVVSTCA9IENTdHJpbmcoKTsKKworICAg
IEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfcGFyZW50X2NsYXNzKS0+Zmlu
YWxpemUob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9j
bGFzc19pbml0KFdlYktpdFdlYkRhdGFTb3VyY2VDbGFzcyoga2xhc3MpCit7CisgICAgR09iamVj
dENsYXNzKiBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOworCisgICAgZ29i
amVjdF9jbGFzcy0+ZGlzcG9zZSA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZGlzcG9zZTsKKyAg
ICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZmluYWxp
emU7CisKKyAgICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9m
KFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfaW5pdChXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQor
eworICAgIHdlYkRhdGFTb3VyY2UtPnByaXYgPSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0dFVF9Q
UklWQVRFKHdlYkRhdGFTb3VyY2UpOworfQorCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9uZXdfd2l0aF9sb2FkZXIoUGFzc1JlZlB0cjxXZWJLaXQ6OkRv
Y3VtZW50TG9hZGVyPiBsb2FkZXIpCit7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0
YVNvdXJjZSA9IFdFQktJVF9XRUJfREFUQV9TT1VSQ0UoZ19vYmplY3RfbmV3KFdFQktJVF9UWVBF
X1dFQl9EQVRBX1NPVVJDRSwgTlVMTCkpOworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRl
KiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBwcml2LT5sb2FkZXIgPSBsb2FkZXIu
cmVsZWFzZVJlZigpOworCisgICAgcmV0dXJuIHdlYkRhdGFTb3VyY2U7Cit9CisKKy8qKgorICog
d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXc6CisgKiBAcmVxdWVzdDogdGhlICNXZWJLaXROZXR3
b3JrUmVxdWVzdCB0byB1c2UgdG8gY3JlYXRlIHRoaXMgZGF0YSBzb3VyY2UKKyAqCisgKiBDcmVh
dGVzIGEgbmV3ICNXZWJLaXRXZWJEYXRhU291cmNlIGZyb20gYSAjV2ViS2l0TmV0d29ya1JlcXVl
c3QuIE5vcm1hbGx5LAorICogI1dlYktpdFdlYkZyYW1lIG9iamVjdHMgY3JlYXRlIHRoZWlyIGRh
dGEgc291cmNlcywgc28gZG9uJ3QgaW52b2tlIHRoaXMKKyAqIG1ldGhvZCBkaXJlY3RseS4KKyAq
CisgKiBSZXR1cm5zOiBhIG5ldyAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFNpbmNlOiAx
LjEuNQorICovCitXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25l
dyhXZWJLaXROZXR3b3JrUmVxdWVzdCogcmVxdWVzdCkKK3sKKyAgICBBU1NFUlQocmVxdWVzdCk7
CisKKyAgICBjb25zdCBnY2hhciogdXJpID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9nZXRfdXJp
KHJlcXVlc3QpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YXNvdXJjZTsKKyAgICBk
YXRhc291cmNlID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXdfd2l0aF9sb2FkZXIoCisgICAg
ICAgIFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmNyZWF0ZShSZXNvdXJjZVJlcXVlc3QoS1VSTChL
VVJMKCksIFN0cmluZzo6ZnJvbVVURjgodXJpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgU3Vic3RpdHV0ZURhdGEoKSkpOworCisgICAgV2ViS2l0V2ViRGF0YVNv
dXJjZVByaXZhdGUqIHByaXYgPSBkYXRhc291cmNlLT5wcml2OworICAgIHByaXYtPmluaXRpYWxS
ZXF1ZXN0ID0gcmVxdWVzdDsKKworICAgIHJldHVybiBkYXRhc291cmNlOworfQorCisvKioKKyAq
IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZQorICogQGRhdGFfc291cmNlOiBh
ICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyB0aGUgI1dlYktpdFdlYkZyYW1l
IHRoYXQgcmVwcmVzZW50cyB0aGlzIGRhdGEgc291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0
aGUgI1dlYktpdFdlYkZyYW1lIHRoYXQgcmVwcmVzZW50cyB0aGUgQGRhdGFfc291cmNlCisgKgor
ICogU2luY2U6IDEuMS41CisgKi8KK1dlYktpdFdlYkZyYW1lKiB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF93ZWJfZnJhbWUoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRh
dGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2
ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBGcmFtZUxvYWRlciogZnJhbWVMb2FkZXIgPSBw
cml2LT5sb2FkZXItPmZyYW1lTG9hZGVyKCk7CisKKyAgICBBU1NFUlQoZnJhbWVMb2FkZXIpOwor
CisgICAgV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudCogZnJhbWVMb2FkZXJDbGllbnQgPSBzdGF0
aWNfY2FzdDxXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Kj4oZnJhbWVMb2FkZXItPmNsaWVudCgp
KTsKKyAgICByZXR1cm4gZnJhbWVMb2FkZXJDbGllbnQtPndlYkZyYW1lKCk7Cit9CisKKy8qKgor
ICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0OgorICogQGRhdGFf
c291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyBhIHJlZmVyZW5j
ZSB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdCB0aGF0IHdhcyB1c2VkIHRvIGxvYWQgdGhlIHdlYgor
ICogY29udGVudAorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIG9yaWdpbmFsICNXZWJLaXROZXR3
b3JrUmVxdWVzdAorICoKKyAqIFNpbmNlOiAxLjEuNQorICovCitXZWJLaXROZXR3b3JrUmVxdWVz
dCogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0KFdlYktpdFdlYkRh
dGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VC
S0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJL
aXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisgICAg
UmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3QgPSBwcml2LT5sb2FkZXItPm9yaWdpbmFsUmVxdWVzdCgp
OworCisgICAgaWYgKCFwcml2LT5pbml0aWFsUmVxdWVzdCkKKyAgICAgICAgcHJpdi0+aW5pdGlh
bFJlcXVlc3QgPSB3ZWJraXRfbmV0d29ya19yZXF1ZXN0X25ldyhyZXF1ZXN0LnVybCgpLnN0cmlu
ZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIHByaXYtPmluaXRpYWxSZXF1ZXN0Owor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X25ldHdvcmtfcmVxdWVzdDoK
KyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMg
YSAjV2ViS2l0TmV0d29ya1JlcXVlc3QgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyAjV2Vi
S2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlICNXZWJLaXROZXR3b3Jr
UmVxdWVzdCB0aGF0IGNyZWF0ZWQgdGhlIEBkYXRhX3NvdXJjZQorICoKKyAqIFNpbmNlIDEuMS41
CisgKi8KK1dlYktpdE5ldHdvcmtSZXF1ZXN0KiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9y
ZXF1ZXN0KFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwg
TlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFT
b3VyY2UtPnByaXY7CisgICAgRnJhbWVMb2FkZXIqIGZyYW1lTG9hZGVyID0gcHJpdi0+bG9hZGVy
LT5mcmFtZUxvYWRlcigpOworICAgIGlmICghZnJhbWVMb2FkZXIgfHwgIWZyYW1lTG9hZGVyLT5m
cmFtZUhhc0xvYWRlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJlc291cmNlUmVx
dWVzdCByZXF1ZXN0ID0gcHJpdi0+bG9hZGVyLT5yZXF1ZXN0KCk7CisKKyAgICAvLyBGSVhNRTog
ZGVwZW5kcyBvbiBXZWJLaXROZXR3b3JrUmVxdWVzdCBpbXByb3ZlbWVudHMgdG8gc3RvcmUgdGhl
IFdlYkNvcmUgcmVxdWVzdAorICAgIGlmICghcHJpdi0+bmV0d29ya1JlcXVlc3QpCisgICAgICAg
IHByaXYtPm5ldHdvcmtSZXF1ZXN0ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXcocmVxdWVz
dC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBwcml2LT5uZXR3
b3JrUmVxdWVzdDsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90ZXh0
X2VuY29kaW5nX25hbWU6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UK
KyAqCisgKiBSZXR1cm5zIHRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgYXMgc2V0IGluIHRoZSAjV2Vi
S2l0V2ViVmlldywgb3IgaWYgbm90LCB0aGUKKyAqIHRleHQgZW5jb2Rpbmcgb2YgdGhlIHJlc3Bv
bnNlLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIGVuY29kaW5nIG5hbWUgb2YgdGhlICNXZWJL
aXRXZWJWaWV3IG9yIG9mIHRoZSByZXNwb25zZQorICoKKyAqIFNpbmNlOiAxLjEuNQorICovCitH
X0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdGV4dF9lbmNv
ZGluZ19uYW1lKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19y
ZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNl
KSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRh
dGFTb3VyY2UtPnByaXY7CisgICAgU3RyaW5nIHRleHRFbmNvZGluZ05hbWUgPSBwcml2LT5sb2Fk
ZXItPm92ZXJyaWRlRW5jb2RpbmcoKTsKKworICAgIGlmICghdGV4dEVuY29kaW5nTmFtZSkKKyAg
ICAgICAgdGV4dEVuY29kaW5nTmFtZSA9IHByaXYtPmxvYWRlci0+cmVzcG9uc2UoKS50ZXh0RW5j
b2RpbmdOYW1lKCk7CisKKyAgICByZXR1cm4gdGV4dEVuY29kaW5nTmFtZS51dGY4KCkuZGF0YSgp
OworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZzoKKyAqIEBk
YXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIERldGVybWluZXMgd2hl
dGhlciB0aGUgZGF0YSBzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGludCBpdHMgY29u
dGVudC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6ICVUUlVFIGlmIHRoZSBAZGF0YV9zb3VyY2UgaXMg
c3RpbGwgbG9hZGluZywgJUZBTFNFIG90aGVyd2lzZQorICoKKyAqIFNpbmNlOiAxLjEuNQorICov
CitnYm9vbGVhbiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2lzX2xvYWRpbmcoV2ViS2l0V2ViRGF0
YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJL
SVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktp
dFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKworICAg
IHJldHVybiBwcml2LT5sb2FkZXItPmlzTG9hZGluZ0luQVBJU2Vuc2UoKTsKK30KKworLyoqCisg
KiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9kYXRhOgorICogQGRhdGFfc291cmNlOiBhICNX
ZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyB0aGUgcmF3IGRhdGEgdGhhdCByZXBy
ZXNlbnRzIHRoZSB0aGUgZnJhbWUncyBjb250ZW50LlRoZSBkYXRhIHdpbGwKKyAqIGJlIGluY29t
cGxldGUgdW50aWwgdGhlIGRhdGEgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFJldHVybnMgJU5VTEwg
aWYgdGhlIHdlYgorICogZnJhbWUgaGFzbid0IGxvYWRlZCBhbnkgZGF0YS4gVXNlIHdlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZyB0byB0ZXN0CisgKiBpZiBkYXRhIHNvdXJjZSBpcyBp
biB0aGUgcHJvY2VzcyBvZiBsb2FkaW5nLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIHJhdyBk
YXRhIHRoYXQgcmVwcmVzZW50cyB0aGUgQGRhdGFfc291cmNlIG9yICVOVUxMIGlmIHRoZQorICog
QGRhdGFfc291cmNlIGhhc24ndCBsb2FkZWQgYW55IGRhdGEuCisgKgorICogU2luY2U6IDEuMS41
CisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9k
YXRhKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5f
dmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVM
TCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3Vy
Y2UtPnByaXY7CisKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtYWluUmVzb3VyY2VEYXRhID0g
cHJpdi0+bG9hZGVyLT5tYWluUmVzb3VyY2VEYXRhKCk7CisKKyAgICBpZiAoIW1haW5SZXNvdXJj
ZURhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG1haW5SZXNvdXJjZURh
dGEtPmRhdGEoKTsKKworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X21h
aW5fcmVzb3VyY2U6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAq
CisgKiBSZXR1cm5zIHRoZSBtYWluIHJlc291cmNlIG9mIHRoZSBAZGF0YV9zb3VyY2UKKyAqCisg
KiBSZXR1cm4gdmFsdWU6IGEgbmV3ICNXZWJLaXRXZWJSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhl
IG1haW4gcmVzb3VyY2Ugb2YKKyAqIHRoZSBAZGF0YV9zb3VyY2UuCisgKgorICogU2luY2U6IDEu
MS41CisgKi8KK1dlYktpdFdlYlJlc291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9t
YWluX3Jlc291cmNlKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAg
Z19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291
cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdl
YkRhdGFTb3VyY2UtPnByaXY7CisKKyAgICBSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiBjb3JlUmVz
b3VyY2UgPSBwcml2LT5sb2FkZXItPm1haW5SZXNvdXJjZSgpOworCisgICAgQVNTRVJUKGNvcmVS
ZXNvdXJjZSk7CisKKyAgICBpZiAoIXByaXYtPm1haW5SZXNvdXJjZSkKKyAgICAgICAgcHJpdi0+
bWFpblJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9pbml0X3dpdGhfY29yZV9yZXNvdXJj
ZShjb3JlUmVzb3VyY2UucmVsZWFzZSgpKTsKKworICAgIHJldHVybiBwcml2LT5tYWluUmVzb3Vy
Y2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfc3VicmVzb3VyY2Vz
OgorICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJu
cyB0aGUgQGRhdGFfc291cmNlIHN1YnJlc291cmNlcyB0aGF0IGhhdmUgZmluaXNoZWQgZG93bmxv
YWRpbmcKKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgI0dBcnJheSBvZiAjV2ViS2l0V2ViUmVzb3Vy
Y2UuIFlvdSBuZWVkIHRvIGZyZWUgdGhlIGFycmF5CisgKiBhbmQgaXRzIHN1YnJlc291cmNlcyBv
bmNlIHlvdSBhcmUgZG9uZSB3aXRoIGl0LgorICoKKyAqIFNpbmNlOiAxLjEuNQorICovCitHQXJy
YXkqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291cmNlcyhXZWJLaXRXZWJEYXRh
U291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJ
VF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0
V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAg
VmVjdG9yPFBhc3NSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiA+IGNvcmVTdWJyZXNvdXJjZXM7Cisg
ICAgcHJpdi0+bG9hZGVyLT5nZXRTdWJyZXNvdXJjZXMoY29yZVN1YnJlc291cmNlcyk7CisKKyAg
ICBpZiAoIXByaXYtPnN1YnJlc291cmNlcykgeworICAgICAgICBwcml2LT5zdWJyZXNvdXJjZXMg
PSBnX2FycmF5X25ldyhGQUxTRSwgRkFMU0UsIHNpemVvZihXZWJLaXRXZWJSZXNvdXJjZSkpOwor
CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3JlU3VicmVzb3VyY2VzLnNpemUo
KTsgaSsrKSB7CisgICAgICAgICAgICBXZWJLaXRXZWJSZXNvdXJjZSogcmVzb3VyY2UgPSB3ZWJr
aXRfd2ViX3Jlc291cmNlX2luaXRfd2l0aF9jb3JlX3Jlc291cmNlKGNvcmVTdWJyZXNvdXJjZXMu
YXQoaSkpOworICAgICAgICAgICAgaWYgKHJlc291cmNlKQorICAgICAgICAgICAgICAgIGdfYXJy
YXlfYXBwZW5kX3ZhbChwcml2LT5zdWJyZXNvdXJjZXMsIHJlc291cmNlKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiBwcml2LT5zdWJyZXNvdXJjZXM7Cit9CisKKy8qKgorICogd2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVzb3VyY2VfZm9yX3VybDoKKyAqIEBkYXRhX3NvdXJj
ZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICogQHVybDogdGhlIHVybCBvZiBhIHJlc291cmNl
CisgKgorICogUmV0dXJucyB0aGUgI1dlYktpdFdlYlJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJM
CisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgI1dlYktpdFdlYlJlc291cmNlIGZvciBAdXJsCisg
KgorICogU2luY2U6IDEuMS41CisgKi8KK1dlYktpdFdlYlJlc291cmNlKiB3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX2dldF9yZXNvdXJjZV9mb3JfdXJsKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRh
dGFTb3VyY2UsIGNvbnN0IGdjaGFyKiB1cmwpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwo
V0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBX
ZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisK
KyAgICBSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiBjb3JlUmVzb3VyY2UgPSBwcml2LT5sb2FkZXIt
PnN1YnJlc291cmNlKEtVUkwoS1VSTCgpLFN0cmluZzo6ZnJvbVVURjgodXJsKSkpOworICAgIGlm
ICghY29yZVJlc291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiB3ZWJr
aXRfd2ViX3Jlc291cmNlX2luaXRfd2l0aF9jb3JlX3Jlc291cmNlKGNvcmVSZXNvdXJjZS5yZWxl
YXNlKCkpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291
cmNlOgorICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKiBAc3VicmVz
b3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogQWRkcyBAc3VicmVzb3VyY2UgdG8g
dGhlIGxpc3Qgb2Ygc3VicmVzb3VyY2VzIG9mIEBkYXRhX3NvdXJjZQorICoKKyAqIFNpbmNlIDEu
MS41CisgKi8KK3ZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9hZGRfc3VicmVzb3VyY2UoV2Vi
S2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSwgV2ViS2l0V2ViUmVzb3VyY2UqIHN1YnJl
c291cmNlKQoreworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJD
RSh3ZWJEYXRhU291cmNlKSk7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfV0VCX1JF
U09VUkNFKHN1YnJlc291cmNlKSk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSog
cHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRl
KiByZXNvdXJjZVByaXYgPSBXRUJLSVRfV0VCX1JFU09VUkNFX0dFVF9QUklWQVRFKHN1YnJlc291
cmNlKTsKKworICAgIHByaXYtPmxvYWRlci0+YWRkQXJjaGl2ZVJlc291cmNlKHJlc291cmNlUHJp
di0+cmVzb3VyY2UpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3Vu
cmVhY2hhYmxlX3VybDoKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQor
ICoKKyAqIFJldHVybiB0aGUgdW5yZWFjaGFibGUgVVJMIG9mIEBkYXRhX3NvdXJjZS4gVGhlIEBk
YXRhX3NvdXJjZSB3aWxsIGhhdmUgYW4KKyAqIHVucmVhY2hhYmxlIFVSTCBpZiBpdCB3YXMgY3Jl
YXRlZCB1c2luZyAjV2ViS2l0V2ViRnJhbWUncworICogd2Via2l0X3dlYl9mcmFtZV9sb2FkX2Fs
dGVybmF0ZV9odG1sX3N0cmluZyBtZXRob2QuCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgdW5y
ZWFjaGFibGUgVVJMIG9mIEBkYXRhX3NvdXJjZSBvciAlTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0
LgorICoKKyAqIFNpbmNlIDEuMS41CisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF91bnJlYWNoYWJsZV91cmwoV2ViS2l0V2ViRGF0YVNvdXJjZSog
d2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VC
X0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFT
b3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBjb25zdCBLVVJM
JiB1bnJlYWNoYWJsZVVSTCA9IHByaXYtPmxvYWRlci0+dW5yZWFjaGFibGVVUkwoKTsKKworICAg
IGlmICh1bnJlYWNoYWJsZVVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisg
ICAgcHJpdi0+dW5yZWFjaGFibGVVUkwgPSB1bnJlYWNoYWJsZVVSTC5zdHJpbmcoKS51dGY4KCk7
CisKKyAgICByZXR1cm4gcHJpdi0+dW5yZWFjaGFibGVVUkwuZGF0YSgpOworfQorCit9IC8qIGVu
ZCBleHRlcm4gIkMiICovCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vi
ZGF0YXNvdXJjZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAw
LjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRh
dGFzb3VyY2UuaAkyMDA5LTA0LTA1IDEzOjQ1OjEwLjAwMDAwMDAwMCArMTAwMApAQCAtMCwwICsx
LDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBDLiBBbG9uem8K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2lmbmRlZiBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0gKKyNkZWZpbmUgV0VCS0lUX1dFQl9EQVRB
X1NPVVJDRV9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4K
KworI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2Via2l0L3dl
YmtpdHdlYmZyYW1lLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+
CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0Ug
ICAgICAgICAgICAod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdHlwZSgpKQorI2RlZmluZSBX
RUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RB
TkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSwgV2ViS2l0V2ViRGF0
YVNvdXJjZSkpCisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9TT1VSQ0VfQ0xBU1Moa2xhc3MpICAg
IChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX0RBVEFf
U09VUkNFLCBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MpKQorI2RlZmluZSBXRUJLSVRfSVNfV0VC
X0RBVEFfU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9i
aiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSkpCisjZGVmaW5lIFdFQktJVF9JU19XRUJf
REFUQV9TT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3Mp
LCAgV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9EQVRB
X1NPVVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiks
ICBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktpdFdlYkRhdGFTb3VyY2VDbGFzcykp
CisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSBXZWJLaXRXZWJE
YXRhU291cmNlUHJpdmF0ZTsKKworc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlIHsKKyAgICBH
T2JqZWN0IHBhcmVudF9pbnN0YW5jZTsKKworICAgIC8qPCBwcml2YXRlID4qLworICAgIFdlYktp
dFdlYkRhdGFTb3VyY2VQcml2YXRlICpwcml2OworfTsKKworc3RydWN0IF9XZWJLaXRXZWJEYXRh
U291cmNlQ2xhc3MgeworICAgIEdPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgICAvKiBQ
YWRkaW5nIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2
ZWQwKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQxKSAodm9pZCk7CisgICAg
dm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQyKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVz
ZXJ2ZWQzKSAodm9pZCk7Cit9OworCitXRUJLSVRfQVBJIEdUeXBlCit3ZWJraXRfd2ViX2RhdGFf
c291cmNlX2dldF90eXBlICh2b2lkKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJEYXRhU291cmNl
ICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3ICAgICAgICAgICAgICAgICAgICAoV2ViS2l0
TmV0d29ya1JlcXVlc3QgKnJlcXVlc3QpOworCitXRUJLSVRfQVBJIFdlYktpdFdlYkZyYW1lICoK
K3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZSAgICAgICAgICAoV2ViS2l0V2Vi
RGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXROZXR3b3JrUmVx
dWVzdCAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QgICAgKFdl
YktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0TmV0
d29ya1JlcXVlc3QgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVxdWVzdCAgICAoV2Vi
S2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JF
VFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90ZXh0X2VuY29kaW5nX25h
bWUgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgZ2Jv
b2xlYW4KK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZyAgICAgICAgICAgICAoV2Vi
S2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JF
VFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9kYXRhICAgICAgICAgICAg
ICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgV2Vi
S2l0V2ViUmVzb3VyY2UgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfbWFpbl9yZXNvdXJj
ZSAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJLSVRfQVBJ
IEdBcnJheSAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJjZXMgICAgICAg
KFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0
V2ViUmVzb3VyY2UgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVzb3VyY2VfZm9yX3Vy
bCAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICp1cmwp
OworCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291
cmNlICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJLaXRXZWJSZXNvdXJjZSAg
ICAqc3VicmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VybCAgICAoV2ViS2l0V2ViRGF0
YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIFdFQktJ
VF9XRUJfREFUQV9TT1VSQ0VfSCAqLwpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5vcmlnL1dlYktpdC9ndGsvd2Via2l0L3dlYmtp
dC5oCTIwMDktMDQtMDUgMTM6NTE6NDIuMDAwMDAwMDAwICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0LmgJMjAwOS0wNC0wNSAxMzo1MjoxMi4wMDAwMDAwMDAgKzEwMDAK
QEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZG93bmxvYWQuaD4KICNp
bmNsdWRlIDx3ZWJraXQvd2Via2l0bmV0d29ya3JlcXVlc3QuaD4KICNpbmNsdWRlIDx3ZWJraXQv
d2Via2l0c291cGF1dGhkaWFsb2cuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZGF0YXNv
dXJjZS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJzZXR0aW5ncy5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJpbnNw
ZWN0b3IuaD4KSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5l
cy5oCTIwMDktMDQtMDUgMTM6NTE6NDQuMDAwMDAwMDAwICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCTIwMDktMDQtMDUgMTM6NTI6MzAuMDAwMDAwMDAw
ICsxMDAwCkBAIC03NCw2ICs3NCw5IEBACiB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3Vy
Y2UgV2ViS2l0V2ViUmVzb3VyY2U7CiB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VD
bGFzcyBXZWJLaXRXZWJSZXNvdXJjZUNsYXNzOwogCit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2Vi
RGF0YVNvdXJjZSBXZWJLaXRXZWJEYXRhU291cmNlOwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdl
YkRhdGFTb3VyY2VDbGFzcyBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3M7CisKIEdfRU5EX0RFQ0xT
CiAKICNlbmRpZgpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2
YXRlLmgJMjAwOS0wNC0wNSAxMzo1MTo0OC4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9XZWJL
aXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgJMjAwOS0wNC0wNSAxMzo1Mzo1Mi4wMDAwMDAw
MDAgKzEwMDAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZGVmaW5l
cy5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkb3dubG9hZC5oPgogI2luY2x1ZGUgPHdlYmtp
dC93ZWJraXR3ZWJ2aWV3Lmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2Uu
aD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZnJhbWUuaD4KICNpbmNsdWRlIDx3ZWJraXQv
d2Via2l0d2VicG9saWN5ZGVjaXNpb24uaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2VibmF2
aWdhdGlvbmFjdGlvbi5oPgpAQCAtNTYsNiArNTcsOSBAQAogY2xhc3MgRG93bmxvYWRDbGllbnQ7
CiAKIG5hbWVzcGFjZSBXZWJLaXQgeworCisgICAgY2xhc3MgRG9jdW1lbnRMb2FkZXI7CisKICAg
ICBXZWJLaXRXZWJWaWV3KiBnZXRWaWV3RnJvbUZyYW1lKFdlYktpdFdlYkZyYW1lKik7CiAKICAg
ICBXZWJDb3JlOjpGcmFtZSogY29yZShXZWJLaXRXZWJGcmFtZSopOwpAQCAtMTQ2LDYgKzE1MCwx
MCBAQAogICAgIHdlYmtpdF93ZWJfaGlzdG9yeV9pdGVtX2dldF9jaGlsZHJlbihXZWJLaXRXZWJI
aXN0b3J5SXRlbSopOwogICAgIC8vIGVuZCBXZWJLaXRXZWJIaXN0b3J5SXRlbSBwcml2YXRlCiAK
KyAgICAvLyBXZWJLaXRXZWJEYXRhU291cmNlIHByaXZhdGUKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlKgorICAgIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfbG9hZGVyKFBhc3NSZWZQ
dHI8V2ViS2l0OjpEb2N1bWVudExvYWRlcj4pOworCiAgICAgLy8gV2ViS2l0V2ViUmVzb3VyY2Ug
cHJpdmF0ZQogICAgICNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJDRV9HRVRfUFJJVkFURShvYmop
ICAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKChvYmopLCBXRUJLSVRfVFlQRV9X
RUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSkpCiAgICAgc3RydWN0IF9XZWJL
aXRXZWJSZXNvdXJjZVByaXZhdGUgewpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdHdlYmZyYW1lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dl
YmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAJMjAwOS0wNC0wNSAxNDowMTo0NS4wMDAwMDAwMDAgKzEw
MDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAJMjAwOS0w
NC0wNSAxNToxMjoxNi4wMDAwMDAwMDAgKzEwMDAKQEAgLTcxMSw3ICs3MTEsNyBAQAogZ2NoYXIq
IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3Jlc3BvbnNlX21pbWVfdHlwZShXZWJLaXRXZWJGcmFtZSog
ZnJhbWUpCiB7CiAgICAgRnJhbWUqIGNvcmVGcmFtZSA9IGNvcmUoZnJhbWUpOwotICAgIERvY3Vt
ZW50TG9hZGVyKiBkb2NMb2FkZXIgPSBjb3JlRnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRl
cigpOworICAgIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBkb2NMb2FkZXIgPSBjb3JlRnJhbWUt
PmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpOwogICAgIFN0cmluZyBtaW1lVHlwZSA9IGRvY0xv
YWRlci0+cmVzcG9uc2VNSU1FVHlwZSgpOwogICAgIHJldHVybiBnX3N0cmR1cChtaW1lVHlwZS51
dGY4KCkuZGF0YSgpKTsKIH0KSW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0Lm9yaWcvQ2hhbmdlTG9nCTIwMDktMDQtMDUgMTQ6MDg6MTQuMDAwMDAwMDAwICsxMDAw
CisrKyBXZWJLaXQvQ2hhbmdlTG9nCTIwMDktMDQtMDUgMTQ6MTU6MTMuMDAwMDAwMDAwICsxMDAw
CkBAIC01LDYgKzUsMTcgQEAKICAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJj
ZSBmb3IgdGhlIGd0ayBwb3J0CiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNDc1OAogCisgICAgICAgIEFkZCBXZWJLaXRXZWJEYXRhU291cmNlIGFuZCBE
b2N1bWVudExvYWRlckd0ayB0byB0aGUgYnVpbGQgc2NyaXB0LgorCisgICAgICAgICogR05VbWFr
ZWZpbGUuYW06CisKKzIwMDktMDQtMDQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdl
YmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCiAgICAg
ICAgIEFkZCBXZWJLaXRXZWJSZXNvdXJjZSB0byB0aGUgYnVpbGQgc2NyaXB0LgogCiAgICAgICAg
ICogR05VbWFrZWZpbGUuYW06CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay9DaGFuZ2VMb2cJMjAwOS0wNC0wNSAx
NDowODoxNC4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwky
MDA5LTA0LTA1IDE0OjE0OjQ0LjAwMDAwMDAwMCArMTAwMApAQCAtNSw2ICs1LDc0IEBACiAgICAg
ICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9ydAogICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgKIAorICAg
ICAgICBTdWJjbGFzcyBEb2N1bWVudExvYWRlciBmb3IgR3RrIGFuZCBpbXBsZW1lbnQgaXQgdW5k
ZXIgdGhlIFdlYktpdAorICAgICAgICBuYW1lc3BhY2UuIEFkZCBXZWJLaXRXZWJEYXRhU291cmNl
IGltcGxlbWVudGF0aW9uIHRoYXQgY2xvc2VseQorICAgICAgICBmb2xsb3dzIHRoZSBtYWMgaW1w
bGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0RvY3Vt
ZW50TG9hZGVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVy
OjpEb2N1bWVudExvYWRlcik6CisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpzZXRE
YXRhU291cmNlKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaERhdGFT
b3VyY2UpOgorICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6YXR0YWNoVG9GcmFtZSk6
CisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpkZXRhY2hGcm9tRnJhbWUpOgorICAg
ICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6aW5jcmVhc2VMb2FkQ291bnQpOgorICAgICAg
ICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6ZGVjcmVhc2VMb2FkQ291bnQpOgorICAgICAgICAo
V2ViS2l0OjpEb2N1bWVudExvYWRlcjo6cmVmRGF0YVNvdXJjZSk6CisgICAgICAgIChXZWJLaXQ6
OkRvY3VtZW50TG9hZGVyOjp1bnJlZkRhdGFTb3VyY2UpOgorICAgICAgICAqIFdlYkNvcmVTdXBw
b3J0L0RvY3VtZW50TG9hZGVyR3RrLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpEb2N1bWVu
dExvYWRlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmRhdGFT
b3VyY2UpOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50R3RrLmNw
cDoKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmNyZWF0ZURvY3VtZW50TG9h
ZGVyKToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmNvbW1pdHRlZExvYWQp
OgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6c2hvdWxkVXNlQ3JlZGVudGlh
bFN0b3JhZ2UpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hE
aWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UpOgorICAgICAgICAoV2ViS2l0OjpGcmFt
ZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRDYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSk6
CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxTZW5kUmVx
dWVzdCk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojphc3NpZ25JZGVudGlm
aWVyVG9Jbml0aWFsUmVxdWVzdCk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50
OjpkaXNwYXRjaERpZFJlY2VpdmVSZXNwb25zZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9h
ZGVyQ2xpZW50OjptYWtlUmVwcmVzZW50YXRpb24pOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxv
YWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKToKKyAgICAgICAgKFdlYktp
dDo6RnJhbWVMb2FkZXJDbGllbnQ6OnJldmVydFRvUHJvdmlzaW9uYWxTdGF0ZSk6CisgICAgICAg
IChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojp3aWxsQ2hhbmdlVGl0bGUpOgorICAgICAgICAo
V2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlkQ2hhbmdlVGl0bGUpOgorICAgICAgICAoV2Vi
S2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZmluaXNoZWRMb2FkaW5nKToKKyAgICAgICAgKFdlYktp
dDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgpOgor
ICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGaW5pc2hMb2Fk
aW5nKToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkRmFp
bExvYWRpbmcpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hE
aWRMb2FkUmVzb3VyY2VGcm9tTWVtb3J5Q2FjaGUpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxv
YWRlckNsaWVudDo6c2V0TWFpbkRvY3VtZW50RXJyb3IpOgorICAgICAgICAqIHdlYmtpdC93ZWJr
aXQuaDoKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0ZGVmaW5lcy5oOgorICAgICAgICAqIHdlYmtp
dC93ZWJraXRwcml2YXRlLmg6CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2Uu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0
X3dlYl9kYXRhX3NvdXJjZV9kaXNwb3NlKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNl
UHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5hbGl6ZSk6CisgICAgICAgIChfV2Vi
S2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfY2xhc3NfaW5p
dCk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfaW5pdCk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6Ondl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfbG9hZGVyKToKKyAgICAgICAgKF9XZWJLaXRX
ZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXcpOgorICAgICAg
ICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dl
dF93ZWJfZnJhbWUpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QpOgorICAgICAgICAoX1dlYktp
dFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0
KToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRh
U291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pc19sb2FkaW5nKToKKyAgICAg
ICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9n
ZXRfZGF0YSk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfZ2V0X21haW5fcmVzb3VyY2UpOgorICAgICAgICAoX1dlYktpdFdlYkRh
dGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJjZXMp
OgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFf
c291cmNlX2dldF9yZXNvdXJjZV9mb3JfdXJsKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9hZGRfc3VicmVzb3VyY2UpOgorICAg
ICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF91bnJlYWNoYWJsZV91cmwpOgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJkYXRhc291
cmNlLmg6IEFkZGVkLgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHA6CisKKzIw
MDktMDQtMDQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1wbGVt
ZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCiAgICAgICAgIEltcGxlbWVudCBX
ZWJLaXRXZWJSZXNvdXJjZSBmb3IgdGhlIHJlc291cmNlLXJlbGF0ZWQgQVBJIGZvcgogICAgICAg
ICBXZWJLaXRXZWJEYXRhU291cmNlLgogCg==
</data>
<flag name="review"
          id="14526"
          type_id="1"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29264</attachid>
            <date>2009-04-04 22:24:23 -0700</date>
            <delta_ts>2009-07-18 01:04:35 -0700</delta_ts>
            <desc>implement data source API in webkitwebframe</desc>
            <filename>webframedatasource_api</filename>
            <type>text/plain</type>
            <size>15131</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJkYXRhc291cmNlLmMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gL2Rldi9udWxsCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisr
KyBXZWJLaXQvV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2ViZGF0YXNvdXJjZS5jCTIwMDktMDQtMDUg
MTU6MTI6MzYuMDAwMDAwMDAwICsxMDAwCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEphbiBNaWNoYWVsIEFsb256bworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1
ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0Lmg+CisKKyNpZiBHTElCX0NI
RUNLX1ZFUlNJT04oMiwgMTYsIDApICYmIEdUS19DSEVDS19WRVJTSU9OKDIsIDE0LCAwKQorCit0
eXBlZGVmIHN0cnVjdCB7CisgICAgV2ViS2l0V2ViVmlldyogd2ViVmlldzsKKyAgICBXZWJLaXRX
ZWJGcmFtZSogbWFpbkZyYW1lOworfSBXZWJEYXRhU291cmNlRml4dHVyZTsKKworc3RhdGljIHZv
aWQgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfc2V0dXAoV2ViRGF0YVNvdXJjZUZpeHR1cmUqIGZp
eHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rw
b2ludGVyIGRhdGEpCit7CisgICAgZml4dHVyZS0+d2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyh3
ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIGdfb2JqZWN0X3JlZl9zaW5rKGZpeHR1cmUtPndl
YlZpZXcpOworICAgIGZpeHR1cmUtPm1haW5GcmFtZSA9IHdlYmtpdF93ZWJfdmlld19nZXRfbWFp
bl9mcmFtZShmaXh0dXJlLT53ZWJWaWV3KTsKK30KKworc3RhdGljIHZvaWQgd2ViX2RhdGFfc291
cmNlX2ZpeHR1cmVfdGVhcmRvd24oV2ViRGF0YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRh
dGEpCit7CisgICAgZ19hc3NlcnQoZml4dHVyZS0+bWFpbkZyYW1lICE9IE5VTEwpOworICAgIGdf
YXNzZXJ0KGZpeHR1cmUtPndlYlZpZXcgIT0gTlVMTCk7CisgICAgd2Via2l0X3dlYl9mcmFtZV9z
dG9wX2xvYWRpbmcoZml4dHVyZS0+bWFpbkZyYW1lKTsKKyAgICBnX29iamVjdF91bnJlZihmaXh0
dXJlLT53ZWJWaWV3KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9pbml0aWFsX3JlcXVlc3QoV2ViRGF0YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNv
dXJjZTsKKyAgICBXZWJLaXROZXR3b3JrUmVxdWVzdCogaW5pdGlhbFJlcXVlc3Q7CisKKyAgICBX
ZWJLaXROZXR3b3JrUmVxdWVzdCogcmVxdWVzdCA9IHdlYmtpdF9uZXR3b3JrX3JlcXVlc3RfbmV3
KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKKyAgICB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRfcmVx
dWVzdChmaXh0dXJlLT5tYWluRnJhbWUsIHJlcXVlc3QpOworICAgIGdfb2JqZWN0X3VucmVmKHJl
cXVlc3QpOworCisgICAgZGF0YVNvdXJjZSA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3Byb3Zpc2lv
bmFsX2RhdGFfc291cmNlKGZpeHR1cmUtPm1haW5GcmFtZSk7CisgICAgZ19hc3NlcnQoZGF0YVNv
dXJjZSk7CisgICAgaW5pdGlhbFJlcXVlc3QgPSB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9p
bml0aWFsX3JlcXVlc3QoZGF0YVNvdXJjZSk7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF9u
ZXR3b3JrX3JlcXVlc3RfZ2V0X3VyaShpbml0aWFsUmVxdWVzdCksID09LCAiaHR0cDovL3d3dy5n
b29nbGUuY29tLyIpOworCit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3Nv
dXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKFdlYkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIFdlYktpdFdlYkRhdGFTb3VyY2Uq
IGRhdGFTb3VyY2U7CisKKyAgICB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRfc3RyaW5nKGZpeHR1cmUt
Pm1haW5GcmFtZSwgIjxodG1sPjwvaHRtbD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgInRleHQvaHRtbCIsICJ1dGY4IiwgImFib3V0OmJsYW5rIik7CisgICAgZGF0YVNvdXJj
ZSA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2RhdGFfc291cmNlKGZpeHR1cmUtPm1haW5GcmFtZSk7
CisKKyAgICBnX2Fzc2VydF9jbXBzdHIoInV0ZjgiLCA9PSwgd2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKGRhdGFTb3VyY2UpKTsKKworfQorCitzdGF0aWMgdm9p
ZCB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3QoV2ViRGF0YVNvdXJjZUZp
eHR1cmUqIGZpeHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIFdlYktpdFdlYkRhdGFTb3Vy
Y2UqIGRhdGFTb3VyY2U7CisKKyAgICB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRfdXJpKGZpeHR1cmUt
Pm1haW5GcmFtZSwgImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iKTsKKyAgICBkYXRhU291cmNlID0g
d2Via2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlzaW9uYWxfZGF0YV9zb3VyY2UoZml4dHVyZS0+bWFp
bkZyYW1lKTsKKworICAgIFdlYktpdE5ldHdvcmtSZXF1ZXN0KiByZXF1ZXN0ID0gd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9nZXRfcmVxdWVzdChkYXRhU291cmNlKTsKKyAgICBnX2Fzc2VydF9jbXBz
dHIod2Via2l0X25ldHdvcmtfcmVxdWVzdF9nZXRfdXJpKHJlcXVlc3QpLD09LCJodHRwOi8vd3d3
Lmdvb2dsZS5jb20vIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3Nv
dXJjZV9yZXNvdXJjZXMoV2ViRGF0YVNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgZGF0
YSkKK3sKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhU291cmNlOworCisgICAgV2ViS2l0
V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9uZXcoIjxpbWcv
PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgImltYWdlLmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWwiLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1dGY4IiwgTlVM
TCk7CisgICAgd2Via2l0X3dlYl9mcmFtZV9sb2FkX3N0cmluZyhmaXh0dXJlLT5tYWluRnJhbWUs
ICI8aHRtbD48L2h0bWw+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0
L2h0bWwiLCAidXRmOCIsICJodHRwOi8vZXhhbXBsZS5jb20iKTsKKyAgICBkYXRhU291cmNlID0g
d2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2UoZml4dHVyZS0+bWFpbkZyYW1lKTsKKyAg
ICBnX2Fzc2VydChkYXRhU291cmNlKTsKKyAgICBnX2Fzc2VydCh3ZWJSZXNvdXJjZSk7CisgICAg
d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9hZGRfc3VicmVzb3VyY2UoZGF0YVNvdXJjZSwgd2ViUmVz
b3VyY2UpOworICAgIFdlYktpdFdlYlJlc291cmNlKiByZXMgPSB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9yZXNvdXJjZV9mb3JfdXJsKGRhdGFTb3VyY2UsICJpbWFnZS5odG1sIik7CisKKyAg
ICBnX2Fzc2VydF9jbXBzdHIoImltYWdlLmh0bWwiLCA9PSwgd2Via2l0X3dlYl9yZXNvdXJjZV9n
ZXRfdXJsKHJlcykpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7Cisg
ICAgZ190aHJlYWRfaW5pdChOVUxMKTsKKyAgICBndGtfdGVzdF9pbml0KCZhcmdjLCAmYXJndiwg
TlVMTCk7CisKKyAgICBnX3Rlc3RfYnVnX2Jhc2UoImh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIp
OworLy8gICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJkYXRhc291cmNlL2dldF90ZXh0X2VuY29k
aW5nX25hbWUiLAorLy8gICAgICAgICAgICAgICBXZWJEYXRhU291cmNlRml4dHVyZSwgMCwgd2Vi
X2RhdGFfc291cmNlX2ZpeHR1cmVfc2V0dXAsCisvLyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0
X3dlYl9kYXRhX3NvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lLCB3ZWJfZGF0YV9zb3VyY2Vf
Zml4dHVyZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJkYXRhc291cmNl
L2dldF9pbml0aWFsX3JlcXVlc3QiLAorICAgICAgICAgICAgICAgV2ViRGF0YVNvdXJjZUZpeHR1
cmUsIDAsIHdlYl9kYXRhX3NvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVz
dF93ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QsIHdlYl9kYXRhX3Nv
dXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rlc3RfYWRkKCIvd2Via2l0L3dlYmRhdGFz
b3VyY2UvZ2V0X3JlcXVlc3QiLAorICAgICAgICAgICAgICAgV2ViRGF0YVNvdXJjZUZpeHR1cmUs
IDAsIHdlYl9kYXRhX3NvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93
ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0LCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVy
ZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJkYXRhc291cmNlL3Jlc291
cmNlcyIsCisgICAgICAgICAgICAgICBXZWJEYXRhU291cmNlRml4dHVyZSwgMCwgd2ViX2RhdGFf
c291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfcmVzb3VyY2VzLCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisK
KyAgICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KKworI2Vsc2UKK2ludCBtYWluKGludCBhcmdj
LCBjaGFyKiogYXJndikKK3sKKyAgICBnX2NyaXRpY2FsKCJZb3Ugd2lsbCBuZWVkIGF0IGxlYXN0
IGdsaWItMi4xNi4wIGFuZCBndGstMi4xNC4wIHRvIHJ1biB0aGUgdW5pdCB0ZXN0cy4gRG9pbmcg
bm90aGluZyBub3cuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpJbmRleDogV2ViS2l0
L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAJMjAwOS0wNC0wNSAx
NToxMjoxNi4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJmcmFtZS5jcHAJMjAwOS0wNC0wNSAxNToxMjozNi4wMDAwMDAwMDAgKzEwMDAKQEAgLTMz
LDYgKzMzLDcgQEAKICNpbmNsdWRlICJBbmltYXRpb25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAi
Q1N0cmluZy5oIgogI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1l
bnRMb2FkZXJHdGsuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgogI2luY2x1ZGUgIkZyYW1l
TG9hZGVyQ2xpZW50R3RrLmgiCiAjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCkBAIC0xMjMsNiArMTI0
LDExIEBACiAgICAgZnJhbWUtPnByaXYtPmNvcmVGcmFtZSA9IDA7CiB9CiAKK3N0YXRpYyBXZWJL
aXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZV9mcm9tX2Nv
cmVfbG9hZGVyKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBsb2FkZXIpCit7CisgICAgcmV0dXJu
IGxvYWRlciA/IHN0YXRpY19jYXN0PFdlYktpdDo6RG9jdW1lbnRMb2FkZXIqPihsb2FkZXIpLT5k
YXRhU291cmNlKCkgOiBOVUxMOworfQorCiBzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX2ZyYW1lX2Zp
bmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJLaXRXZWJGcmFtZSogZnJhbWUgPSBX
RUJLSVRfV0VCX0ZSQU1FKG9iamVjdCk7CkBAIC01MzksNiArNTQ1LDYwIEBACiB9CiAKIC8qKgor
ICogd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2U6CisgKiBAZnJhbWU6IGEgI1dlYktp
dFdlYkZyYW1lCisgKgorICogUmV0dXJucyB0aGUgY29tbWl0dGVkIGRhdGEgc291cmNlLgorICoK
KyAqIFJldHVybiB2YWx1ZTogdGhlIGNvbW1pdHRlZCAjV2ViS2l0V2ViRGF0YVNvdXJjZSBvciAl
TlVMTCBpZiB0aGUKKyAqIHByb3Zpc2lvbmFsIGRhdGEgc291cmNlIGlzIG5vdCBkb25lIGxvYWRp
bmcuCisgKgorICogU2luY2U6IDEuMS41CisgKi8KK1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtp
dF93ZWJfZnJhbWVfZ2V0X2RhdGFfc291cmNlKFdlYktpdFdlYkZyYW1lKiBmcmFtZSkKK3sKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0ZSQU1FKGZyYW1lKSwgTlVMTCk7
CisKKyAgICBGcmFtZSogY29yZUZyYW1lID0gY29yZShmcmFtZSk7CisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZSogZGF0YVNvdXJjZTsKKworICAgIGlmIChjb3JlRnJhbWUgJiYgY29yZUZyYW1lLT5s
b2FkZXIoKS0+ZnJhbWVIYXNMb2FkZWQoKSkKKyAgICAgICAgZGF0YVNvdXJjZSA9IHdlYmtpdF93
ZWJfZnJhbWVfZ2V0X2RhdGFfc291cmNlX2Zyb21fY29yZV9sb2FkZXIoY29yZUZyYW1lLT5sb2Fk
ZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKSk7CisKKyAgICBpZiAoIWRhdGFTb3VyY2UpCisgICAgICAg
IHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGRhdGFTb3VyY2U7Cit9CisKKy8qKgorICogd2Vi
a2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlzaW9uYWxfZGF0YV9zb3VyY2U6CisgKiBAZnJhbWU6IGEg
I1dlYktpdFdlYkZyYW1lCisgKgorICogWW91IHVzZSB0aGUgd2Via2l0X3dlYl9mcmFtZV9sb2Fk
X3JlcXVlc3QgbWV0aG9kIHRvIGluaXRpYXRlIGEgcmVxdWVzdCB0aGF0CisgKiBjcmVhdGVzIGEg
cHJvdmlzaW9uYWwgZGF0YSBzb3VyY2UuIFRoZSBwcm92aXNpb25hbCBkYXRhIHNvdXJjZSB3aWxs
CisgKiB0cmFuc2l0aW9uIHRvIGEgY29tbWl0dGVkIGRhdGEgc291cmNlIG9uY2UgYW55IGRhdGEg
aGFzIGJlZW4gcmVjZWl2ZWQuIFVzZQorICogd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3Vy
Y2UgdG8gZ2V0IHRoZSBjb21taXR0ZWQgZGF0YSBzb3VyY2UuCisgKgorICogUmV0dXJuIHZhbHVl
OiB0aGUgcHJvdmlzaW9uYWwgI1dlYktpdFdlYkRhdGFTb3VyY2Ugb3IgJU5VTEwgaWYgYSBsb2Fk
CisgKiByZXF1ZXN0IGlzIG5vdCBpbiBwcm9ncmVzcyBvciBoYXMgYmVlbiBjb21wbGV0ZWQuCisg
KgorICogU2luY2U6IDEuMS41CisgKi8KK1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtpdF93ZWJf
ZnJhbWVfZ2V0X3Byb3Zpc2lvbmFsX2RhdGFfc291cmNlKFdlYktpdFdlYkZyYW1lKiBmcmFtZSkK
K3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0ZSQU1FKGZyYW1lKSwg
TlVMTCk7CisKKyAgICBGcmFtZSogY29yZUZyYW1lID0gY29yZShmcmFtZSk7CisgICAgV2ViS2l0
V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZSA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2RhdGFfc291
cmNlX2Zyb21fY29yZV9sb2FkZXIoY29yZUZyYW1lLT5sb2FkZXIoKS0+cHJvdmlzaW9uYWxEb2N1
bWVudExvYWRlcigpKTsKKworICAgIGlmICghZGF0YVNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5V
TEw7CisKKyAgICByZXR1cm4gZGF0YVNvdXJjZTsKK30KKworLyoqCiAgKiB3ZWJraXRfd2ViX2Zy
YW1lX2dldF9jaGlsZHJlbjoKICAqIEBmcmFtZTogYSAjV2ViS2l0V2ViRnJhbWUKICAqCkluZGV4
OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5oCTIwMDktMDQt
MDUgMTU6MTI6MTYuMDAwMDAwMDAwICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2ViZnJhbWUuaAkyMDA5LTA0LTA1IDE1OjEyOjM2LjAwMDAwMDAwMCArMTAwMApAQCAt
MjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRlZmluZXMuaD4KICNpbmNs
dWRlIDx3ZWJraXQvd2Via2l0bmV0d29ya3JlcXVlc3QuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Vi
a2l0d2ViZGF0YXNvdXJjZS5oPgogCiBHX0JFR0lOX0RFQ0xTCiAKQEAgLTEwOCw2ICsxMDksMTIg
QEAKIFdFQktJVF9BUEkgSlNHbG9iYWxDb250ZXh0UmVmCiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9n
bG9iYWxfY29udGV4dCAoV2ViS2l0V2ViRnJhbWUgICAgICAgKmZyYW1lKTsKIAorV0VCS0lUX0FQ
SSBXZWJLaXRXZWJEYXRhU291cmNlICoKK3dlYmtpdF93ZWJfZnJhbWVfZ2V0X2RhdGFfc291cmNl
ICAgIChXZWJLaXRXZWJGcmFtZSAgICAgICAqZnJhbWUpOworCitXRUJLSVRfQVBJIFdlYktpdFdl
YkRhdGFTb3VyY2UgKgord2Via2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlzaW9uYWxfZGF0YV9zb3Vy
Y2UgKFdlYktpdFdlYkZyYW1lICpmcmFtZSk7CisKIEdfRU5EX0RFQ0xTCiAKICNlbmRpZgpJbmRl
eDogV2ViS2l0L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9DaGFuZ2VMb2cJ
MjAwOS0wNC0wNSAxNToxMzoxOC4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9DaGFuZ2VMb2cJ
MjAwOS0wNC0wNSAxNToxNDo0Ni4wMDAwMDAwMDAgKzEwMDAKQEAgLTIsNiArMiwxMSBAQAogCiAg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgogCisgICAgICAgIFtHdGtdIEltcGxl
bWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9ydAorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgKKworICAgICAgICBBZGQgV2ViS2l0
V2ViRGF0YVNvdXJjZSB1bml0IHRlc3QgdG8gdGhlIGJ1aWxkIHNjcmlwdAorCiAgICAgICAgICog
R05VbWFrZWZpbGUuYW06CiAKIDIwMDktMDQtMDQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxv
bnpvQHdlYmtpdC5vcmc+CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay9DaGFuZ2VMb2cJMjAwOS0wNC0wNSAxNTox
MzoxOC4wMDAwMDAwMDAgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwkyMDA5
LTA0LTA1IDE1OjE2OjEyLjAwMDAwMDAwMCArMTAwMApAQCAtMiw3NCArMiwyMiBAQAogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgogCi0gICAgICAgICogV2ViQ29yZVN1cHBv
cnQvRG9jdW1lbnRMb2FkZXJHdGsuY3BwOiBBZGRlZC4KLSAgICAgICAgKFdlYktpdDo6RG9jdW1l
bnRMb2FkZXI6OkRvY3VtZW50TG9hZGVyKToKLSAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2Fk
ZXI6OnNldERhdGFTb3VyY2UpOgotICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6ZGV0
YWNoRGF0YVNvdXJjZSk6Ci0gICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjphdHRhY2hU
b0ZyYW1lKToKLSAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaEZyb21GcmFt
ZSk6Ci0gICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjppbmNyZWFzZUxvYWRDb3VudCk6
Ci0gICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpkZWNyZWFzZUxvYWRDb3VudCk6Ci0g
ICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpyZWZEYXRhU291cmNlKToKLSAgICAgICAg
KFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OnVucmVmRGF0YVNvdXJjZSk6Ci0gICAgICAgICogV2Vi
Q29yZVN1cHBvcnQvRG9jdW1lbnRMb2FkZXJHdGsuaDogQWRkZWQuCi0gICAgICAgIChXZWJLaXQ6
OkRvY3VtZW50TG9hZGVyOjpjcmVhdGUpOgotICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRl
cjo6ZGF0YVNvdXJjZSk6Ci0gICAgICAgICogV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGll
bnRHdGsuY3BwOgotICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6Y3JlYXRlRG9j
dW1lbnRMb2FkZXIpOgotICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6Y29tbWl0
dGVkTG9hZCk6Ci0gICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpzaG91bGRVc2VD
cmVkZW50aWFsU3RvcmFnZSk6Ci0gICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojpk
aXNwYXRjaERpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSk6Ci0gICAgICAgIChXZWJL
aXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZENhbmNlbEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlKToKLSAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2ls
bFNlbmRSZXF1ZXN0KToKLSAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmFzc2ln
bklkZW50aWZpZXJUb0luaXRpYWxSZXF1ZXN0KToKLSAgICAgICAgKFdlYktpdDo6RnJhbWVMb2Fk
ZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZVJlc3BvbnNlKToKLSAgICAgICAgKFdlYktpdDo6
RnJhbWVMb2FkZXJDbGllbnQ6Om1ha2VSZXByZXNlbnRhdGlvbik6Ci0gICAgICAgIChXZWJLaXQ6
OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRNYWluUmVzb3VyY2UpOgotICAgICAg
ICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6cmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKToK
LSAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OndpbGxDaGFuZ2VUaXRsZSk6Ci0g
ICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaWRDaGFuZ2VUaXRsZSk6Ci0gICAg
ICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpmaW5pc2hlZExvYWRpbmcpOgotICAgICAg
ICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlQ29udGVudExl
bmd0aCk6Ci0gICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZp
bmlzaExvYWRpbmcpOgotICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0
Y2hEaWRGYWlsTG9hZGluZyk6Ci0gICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojpk
aXNwYXRjaERpZExvYWRSZXNvdXJjZUZyb21NZW1vcnlDYWNoZSk6Ci0gICAgICAgIChXZWJLaXQ6
OkZyYW1lTG9hZGVyQ2xpZW50OjpzZXRNYWluRG9jdW1lbnRFcnJvcik6Ci0gICAgICAgICogdGVz
dHMvdGVzdHdlYnJlc291cmNlLmM6IEFkZGVkLgotICAgICAgICAod2ViX3Jlc291cmNlX2ZpeHR1
cmVfc2V0dXApOgotICAgICAgICAod2ViX3Jlc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOgotICAg
ICAgICAodGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwpOgotICAgICAgICAodGVzdF93
ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKToKLSAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9y
ZXNvdXJjZV9nZXRfbWltZV90eXBlKToKLSAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKToKLSAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNv
dXJjZV9nZXRfZnJhbWVfbmFtZSk6CisgICAgICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFT
b3VyY2UgZm9yIHRoZSBndGsgcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjQ3NTgKKworICAgICAgICBBZGQgZGF0YSBzb3VyY2UgQVBJIGdldHRl
cnMgdG8gV2ViS2l0V2ViRnJhbWUuCisgICAgICAgIEFsc28gYWRkIFdlYktpdFdlYkRhdGFTb3Vy
Y2UgdW5pdCB0ZXN0LgorCisgICAgICAgICogdGVzdHMvdGVzdHdlYmRhdGFzb3VyY2UuYzogQWRk
ZWQuCisgICAgICAgICh3ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV9zZXR1cCk6CisgICAgICAgICh3
ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV90ZWFyZG93bik6CisgICAgICAgICh0ZXN0X3dlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfZ2V0X2luaXRpYWxfcmVxdWVzdCk6CisgICAgICAgICh0ZXN0X3dlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRfZW5jb2RpbmdfbmFtZSk6CisgICAgICAgICh0ZXN0
X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3QpOgorICAgICAgICAodGVzdF93ZWJr
aXRfd2ViX2RhdGFfc291cmNlX3Jlc291cmNlcyk6CiAgICAgICAgIChtYWluKToKLSAgICAgICAg
KiB3ZWJraXQvd2Via2l0Lmg6Ci0gICAgICAgICogd2Via2l0L3dlYmtpdGRlZmluZXMuaDoKLSAg
ICAgICAgKiB3ZWJraXQvd2Via2l0cHJpdmF0ZS5oOgotICAgICAgICAqIHdlYmtpdC93ZWJraXR3
ZWJkYXRhc291cmNlLmNwcDogQWRkZWQuCi0gICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVBy
aXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZGlzcG9zZSk6Ci0gICAgICAgIChfV2ViS2l0
V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZmluYWxpemUpOgot
ICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2NsYXNzX2luaXQpOgotICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3
ZWJraXRfd2ViX2RhdGFfc291cmNlX2luaXQpOgotICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3Vy
Y2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ld193aXRoX2xvYWRlcik6Ci0gICAg
ICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
bmV3KToKLSAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9nZXRfd2ViX2ZyYW1lKToKLSAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNl
UHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0KToKLSAg
ICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfcmVxdWVzdCk6Ci0gICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6Ondl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRfZW5jb2RpbmdfbmFtZSk6Ci0gICAgICAgIChf
V2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9h
ZGluZyk6Ci0gICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJf
ZGF0YV9zb3VyY2VfZ2V0X2RhdGEpOgotICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2
YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9tYWluX3Jlc291cmNlKToKLSAgICAgICAg
KF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRf
c3VicmVzb3VyY2VzKToKLSAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVzb3VyY2VfZm9yX3VybCk6Ci0gICAgICAgIChfV2Vi
S2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJl
c291cmNlKToKLSAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9nZXRfdW5yZWFjaGFibGVfdXJsKToKLSAgICAgICAgKiB3ZWJraXQvd2Vi
a2l0d2ViZGF0YXNvdXJjZS5oOiBBZGRlZC4KICAgICAgICAgKiB3ZWJraXQvd2Via2l0d2ViZnJh
bWUuY3BwOgogICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oOgotICAgICAgICAqIHdl
YmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5jcHA6IEFkZGVkLgotICAgICAgICAqIHdlYmtpdC93ZWJr
aXR3ZWJyZXNvdXJjZS5oOiBBZGRlZC4KIAogMjAwOS0wNC0wNCAgSmFuIE1pY2hhZWwgQWxvbnpv
ICA8am1hbG9uem9Ad2Via2l0Lm9yZz4KIAo=
</data>
<flag name="review"
          id="14527"
          type_id="1"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33014</attachid>
            <date>2009-07-18 01:02:26 -0700</date>
            <delta_ts>2009-08-15 01:01:20 -0700</delta_ts>
            <desc>updated patch</desc>
            <filename>webresource</filename>
            <type>text/plain</type>
            <size>25838</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvQ2hhbmdl
TG9nCTIwMDktMDctMTggMDY6NTM6MjIuMTMxNzc3NTEzICsxMDAwCisrKyBXZWJLaXQvQ2hhbmdl
TG9nCTIwMDktMDctMTggMTc6NTg6MTUuNjM0NzgwMzM5ICsxMDAwCkBAIC0xLDMgKzEsMTQgQEAK
KzIwMDktMDctMTggIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1w
bGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCisgICAgICAgIEFkZCBXZWJL
aXRXZWJSZXNvdXJjZSB0byB0aGUgYnVpbGQgc2NyaXB0LgorCisgICAgICAgICogR05VbWFrZWZp
bGUuYW06CisKIDIwMDktMDctMTYgIEZ1bWl0b3NoaSBVa2FpICA8dWthaUBjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCkluZGV4OiBXZWJLaXQvR05VbWFr
ZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvR05VbWFrZWZpbGUuYW0JMjAwOS0w
Ny0xOCAwNjo1Mjo0NC42MzA3NjcxMTkgKzEwMDAKKysrIFdlYktpdC9HTlVtYWtlZmlsZS5hbQky
MDA5LTA3LTE4IDE3OjU4OjE1LjY0Mjc2NDU5NCArMTAwMApAQCAtMzI4LDYgKzMyOCw3IEBAIHdl
YmtpdGd0a19oX2FwaSArPSBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9y
LmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uaCBcCiAJ
V2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicG9saWN5ZGVjaXNpb24uaCBcCisJV2ViS2l0L2d0
ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0
d2Vic2V0dGluZ3MuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vid2luZG93ZmVhdHVy
ZXMuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vidmlldy5oCkBAIC0zNjYsNiArMzY3
LDggQEAgd2Via2l0Z3RrX3NvdXJjZXMgKz0gXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdl
Ymluc3BlY3Rvci5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYm5hdmlnYXRpb25h
Y3Rpb24uY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5j
cHAgXAorCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmNwcCBcCisJV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Vi
a2l0d2Vic2V0dGluZ3MuY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJ2aWV3LmNw
cCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vid2luZG93ZmVhdHVyZXMuY3BwCkBAIC01
MzMsNyArNTM2LDggQEAgVEVTVF9QUk9HUyArPSBQcm9ncmFtcy91bml0dGVzdHMvdGVzdGh0dAog
CVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2ViaGlzdG9yeWl0ZW0gXAogCVByb2dyYW1zL3VuaXR0
ZXN0cy90ZXN0ZG93bmxvYWQgXAogCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0YXRrIFwKLQlQcm9n
cmFtcy91bml0dGVzdHMvdGVzdHdlYnNldHRpbmdzCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3
ZWJzZXR0aW5ncyBcCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJyZXNvdXJjZQogCiAjIEFk
ZCBhZGRpdGlvbmFsIHRlc3RzIGhlcmUKIFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0aHR0cGJhY2tl
bmRfU09VUkNFUyA9IFdlYktpdC9ndGsvdGVzdHMvdGVzdGh0dHBiYWNrZW5kLmMKQEAgLTU4MSw2
ICs1ODUsMTAgQEAgUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJzZXR0aW5nc19DRkxBRwogUHJv
Z3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJzZXR0aW5nc19MREFERCA9ICQod2Via2l0X3Rlc3RzX2xk
YWRkKQogUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJzZXR0aW5nc19MREZMQUdTID0gJCh3ZWJr
aXRfdGVzdHNfbGRmbGFncykKIAorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9T
T1VSQ0VTID0gV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2VicmVzb3VyY2UuYworUHJvZ3JhbXNfdW5p
dHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19jZmxhZ3MpCitQ
cm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX0xEQUREID0gJCh3ZWJraXRfdGVzdHNf
bGRhZGQpCisKICMgQXV0b2dlbmVyYXRlZCBzb3VyY2VzCiBCVUlMVF9TT1VSQ0VTIDo9IFwKIAkk
KGphdmFzY3JpcHRjb3JlX2J1aWx0X3NvdXJjZXMpIFwKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3Rr
L3Rlc3RzL3Rlc3R3ZWJyZXNvdXJjZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAx
LTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvdGVzdHMv
dGVzdHdlYnJlc291cmNlLmMJMjAwOS0wNy0xOCAxNjowMToxMC43MzQ4MDU0MDcgKzEwMDAKQEAg
LTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQWxv
bnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXQuaD4KKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAxNiwgMCkgJiYgR1RL
X0NIRUNLX1ZFUlNJT04oMiwgMTQsIDApCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBXZWJLaXRX
ZWJSZXNvdXJjZSogd2ViUmVzb3VyY2U7CisgICAgV2ViS2l0V2ViVmlldyogd2ViVmlldzsKK30g
V2ViUmVzb3VyY2VGaXh0dXJlOworCitzdGF0aWMgdm9pZCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9z
ZXR1cChXZWJSZXNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sK
KyAgICBmaXh0dXJlLT53ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJfdmlld19u
ZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3NpbmsoZml4dHVyZS0+d2ViVmlldyk7CisgICAgZml4
dHVyZS0+d2ViUmVzb3VyY2UgPSB3ZWJraXRfd2ViX3Jlc291cmNlX25ldygiPGh0bWw+PC9odG1s
PiIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgInRleHQvaHRtbCIsICJ1dGY4IiwgIkV4YW1wbGUu
Y29tIik7CisgICAgZ19hc3NlcnQoZml4dHVyZS0+d2ViUmVzb3VyY2UpOworfQorCitzdGF0aWMg
dm9pZCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bihXZWJSZXNvdXJjZUZpeHR1cmUqIGZp
eHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnX2Fzc2VydChmaXh0dXJlLT53ZWJS
ZXNvdXJjZSk7CisgICAgZ19vYmplY3RfdW5yZWYoZml4dHVyZS0+d2ViUmVzb3VyY2UpOworICAg
IGdfb2JqZWN0X3VucmVmKGZpeHR1cmUtPndlYlZpZXcpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0
X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybChXZWJSZXNvdXJjZUZpeHR1cmUqIGZpeHR1cmUs
IGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnY2hhciogdXJsOworICAgIGdfb2JqZWN0X2dl
dChHX09CSkVDVChmaXh0dXJlLT53ZWJSZXNvdXJjZSksICJ1cmwiLCAmdXJsLCBOVUxMKTsKKyAg
ICBnX2Fzc2VydF9jbXBzdHIodXJsLCA9PSwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKKyAgICBn
X2Fzc2VydF9jbXBzdHIod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdXJsKGZpeHR1cmUtPndlYlJl
c291cmNlKSAsPT0sImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKK30KKworc3RhdGljIHZvaWQgdGVz
dF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKFdlYlJlc291cmNlRml4dHVyZSogZml4dHVy
ZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIEdTdHJpbmcqIGNoYXJEYXRhID0gd2Via2l0
X3dlYl9yZXNvdXJjZV9nZXRfZGF0YShmaXh0dXJlLT53ZWJSZXNvdXJjZSk7CisgICAgZ19hc3Nl
cnRfY21wc3RyKGNoYXJEYXRhLT5zdHIsID09LCAiPGh0bWw+PC9odG1sPiIpOworfQorCitzdGF0
aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZShXZWJSZXNvdXJj
ZUZpeHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgICBnY2hhciogbWlt
ZV90eXBlOworICAgIGdfb2JqZWN0X2dldChHX09CSkVDVChmaXh0dXJlLT53ZWJSZXNvdXJjZSks
ICJtaW1lLXR5cGUiLCAmbWltZV90eXBlLCBOVUxMKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIobWlt
ZV90eXBlLCA9PSwgInRleHQvaHRtbCIpOworICAgIGdfYXNzZXJ0X2NtcHN0cih3ZWJraXRfd2Vi
X3Jlc291cmNlX2dldF9taW1lX3R5cGUoZml4dHVyZS0+d2ViUmVzb3VyY2UpLD09LCJ0ZXh0L2h0
bWwiKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF90ZXh0
X2VuY29kaW5nX25hbWUoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVy
IGRhdGEpCit7CisgICAgZ2NoYXIqIHRleHRfZW5jb2Rpbmc7CisgICAgZ19vYmplY3RfZ2V0KEdf
T0JKRUNUKGZpeHR1cmUtPndlYlJlc291cmNlKSwgInRleHQtZW5jb2RpbmctbmFtZSIsICZ0ZXh0
X2VuY29kaW5nLCBOVUxMKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodGV4dF9lbmNvZGluZywgPT0s
ICJ1dGY4Iik7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3Rl
eHRfZW5jb2RpbmdfbmFtZShmaXh0dXJlLT53ZWJSZXNvdXJjZSksPT0sInV0ZjgiKTsKK30KKwor
c3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKFdlYlJl
c291cmNlRml4dHVyZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGdjaGFy
KiBmcmFtZV9uYW1lOworICAgIGdfb2JqZWN0X2dldChHX09CSkVDVChmaXh0dXJlLT53ZWJSZXNv
dXJjZSksICJmcmFtZS1uYW1lIiwgJmZyYW1lX25hbWUsIE5VTEwpOworICAgIGdfYXNzZXJ0X2Nt
cHN0cihmcmFtZV9uYW1lLCA9PSwgIkV4YW1wbGUuY29tIik7CisgICAgZ19hc3NlcnRfY21wc3Ry
KHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25hbWUoZml4dHVyZS0+d2ViUmVzb3VyY2Up
LD09LCJFeGFtcGxlLmNvbSIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3Yp
Cit7CisgICAgZ190aHJlYWRfaW5pdChOVUxMKTsKKyAgICBndGtfdGVzdF9pbml0KCZhcmdjLCAm
YXJndiwgTlVMTCk7CisKKyAgICBnX3Rlc3RfYnVnX2Jhc2UoImh0dHBzOi8vYnVncy53ZWJraXQu
b3JnLyIpOworICAgIGdfdGVzdF9hZGQoIi93ZWJraXQvd2VicmVzb3VyY2UvZ2V0X3VybCIsCisg
ICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNvdXJjZV9maXh0dXJl
X3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmws
IHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rlc3RfYWRkKCIvd2Via2l0
L3dlYnJlc291cmNlL2dldF9taW1lX3R5cGUiLAorICAgICAgICAgICAgICAgV2ViUmVzb3VyY2VG
aXh0dXJlLCAwLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9zZXR1cCwKKyAgICAgICAgICAgICAgIHRl
c3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlLCB3ZWJfcmVzb3VyY2VfZml4dHVy
ZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJyZXNvdXJjZS9nZXRfdGV4
dF9lbmNvZGluZ19uYW1lIiwKKyAgICAgICAgICAgICAgIFdlYlJlc291cmNlRml4dHVyZSwgMCwg
d2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93
ZWJfcmVzb3VyY2VfZ2V0X3RleHRfZW5jb2RpbmdfbmFtZSwgd2ViX3Jlc291cmNlX2ZpeHR1cmVf
dGVhcmRvd24pOworICAgIGdfdGVzdF9hZGQoIi93ZWJraXQvd2VicmVzb3VyY2UvZ2V0X2ZyYW1l
X25hbWUiLAorICAgICAgICAgICAgICAgV2ViUmVzb3VyY2VGaXh0dXJlLCAwLCB3ZWJfcmVzb3Vy
Y2VfZml4dHVyZV9zZXR1cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfZnJhbWVfbmFtZSwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOworICAgIGdf
dGVzdF9hZGQoIi93ZWJraXQvd2VicmVzb3VyY2UvZ2V0X2RhdGEiLAorICAgICAgICAgICAgICAg
V2ViUmVzb3VyY2VGaXh0dXJlLCAwLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9zZXR1cCwKKyAgICAg
ICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZGF0YSwgd2ViX3Jlc291cmNl
X2ZpeHR1cmVfdGVhcmRvd24pOworICAgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQorCisjZWxz
ZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGdfY3JpdGljYWwoIllv
dSB3aWxsIG5lZWQgYXQgbGVhc3QgZ2xpYi0yLjE2LjAgYW5kIGd0ay0yLjE0LjAgdG8gcnVuIHRo
ZSB1bml0IHRlc3RzLiBEb2luZyBub3RoaW5nIG5vdy4iKTsKKyAgICByZXR1cm4gMDsKK30KKwor
I2VuZGlmCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0LmgJMjAwOS0wNy0xOCAw
Njo1Mjo0NC41MTA4MDEyMzYgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXQuaAkyMDA5LTA3LTE4IDE3OjU4OjE1LjU3ODc2NTMyNSArMTAwMApAQCAtMzUsNiArMzUsNyBA
QAogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJoaXN0b3J5aXRlbS5oPgogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnJlc291cmNl
Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGVudW10eXBlcy5oPgogCiAjZW5kaWYgLyogX19X
RUJLSVRfSF9fICovCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5l
cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC5vcmlnL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdGRl
ZmluZXMuaAkyMDA5LTA3LTE4IDA2OjUyOjQ0LjUyNjgwMDgyNSArMTAwMAorKysgV2ViS2l0L1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdGRlZmluZXMuaAkyMDA5LTA3LTE4IDE3OjU4OjE1LjU4Njc5
NDkwOCArMTAwMApAQCAtNzEsNiArNzEsOSBAQCB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViVmll
d0NsYXNzIFdlYktpCiB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0RG93bmxvYWQgV2ViS2l0RG93bmxv
YWQ7CiB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0RG93bmxvYWRDbGFzcyBXZWJLaXREb3dubG9hZENs
YXNzOwogCit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2UgV2ViS2l0V2ViUmVzb3Vy
Y2U7Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VDbGFzcyBXZWJLaXRXZWJSZXNv
dXJjZUNsYXNzOworCiBHX0VORF9ERUNMUwogCiAjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2Vi
S2l0L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0ZS5oCTIwMDktMDctMTggMDY6NTI6NDQuNDkwNzY3
NTQ0ICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0ZS5oCTIw
MDktMDctMTggMTc6NTg6MTUuNTY2Nzk5NjI3ICsxMDAwCkBAIC0zNSwxMiArMzUsMTUgQEAKICNp
bmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZnJhbWUuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0
d2VicG9saWN5ZGVjaXNpb24uaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2VibmF2aWdhdGlv
bmFjdGlvbi5oPgorI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5oPgogI2luY2x1
ZGUgPHdlYmtpdC93ZWJraXR3ZWJzZXR0aW5ncy5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJ3aW5kb3dmZWF0dXJlcy5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJiYWNrZm9yd2Fy
ZGxpc3QuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0bmV0d29ya3JlcXVlc3QuaD4KIAorI2lu
Y2x1ZGUgIkFyY2hpdmVSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkJhY2tGb3J3YXJkTGlzdC5oIgor
I2luY2x1ZGUgIkNTdHJpbmcuaCIKICNpbmNsdWRlIDxlbmNoYW50Lmg+CiAjaW5jbHVkZSAiSGlz
dG9yeUl0ZW0uaCIKICNpbmNsdWRlICJTZXR0aW5ncy5oIgpAQCAtMTU2LDYgKzE1OSwyMiBAQCBl
eHRlcm4gIkMiIHsKICAgICB3ZWJraXRfd2ViX2hpc3RvcnlfaXRlbV9nZXRfY2hpbGRyZW4oV2Vi
S2l0V2ViSGlzdG9yeUl0ZW0qKTsKICAgICAvLyBlbmQgV2ViS2l0V2ViSGlzdG9yeUl0ZW0gcHJp
dmF0ZQogCisgICAgLy8gV2ViS2l0V2ViUmVzb3VyY2UgcHJpdmF0ZQorICAgICNkZWZpbmUgV0VC
S0lUX1dFQl9SRVNPVVJDRV9HRVRfUFJJVkFURShvYmopICAgICAgICAoR19UWVBFX0lOU1RBTkNF
X0dFVF9QUklWQVRFKChvYmopLCBXRUJLSVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJl
c291cmNlUHJpdmF0ZSkpCisgICAgc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUgewor
ICAgICAgICBXZWJDb3JlOjpBcmNoaXZlUmVzb3VyY2UqIHJlc291cmNlOworCisgICAgICAgIFdl
YkNvcmU6OkNTdHJpbmcgdXJsOworICAgICAgICBXZWJDb3JlOjpDU3RyaW5nIG1pbWVUeXBlOwor
ICAgICAgICBXZWJDb3JlOjpDU3RyaW5nIHRleHRFbmNvZGluZzsKKyAgICAgICAgV2ViQ29yZTo6
Q1N0cmluZyBmcmFtZU5hbWU7CisKKyAgICAgICAgR1N0cmluZyogZGF0YTsKKyAgICB9OworICAg
IFdlYktpdFdlYlJlc291cmNlKgorICAgIHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3X3dpdGhfY29y
ZV9yZXNvdXJjZShQYXNzUmVmUHRyPFdlYkNvcmU6OkFyY2hpdmVSZXNvdXJjZT4pOworICAgIC8v
IGVuZCBXZWJLaXRXZWJSZXNvdXJjZSBwcml2YXRlCisKICAgICB2b2lkCiAgICAgd2Via2l0X3dl
Yl9pbnNwZWN0b3Jfc2V0X2luc3BlY3Rvcl9jbGllbnQoV2ViS2l0V2ViSW5zcGVjdG9yKiwgV2Vi
Q29yZTo6UGFnZSopOwogCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vi
cmVzb3VyY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAw
LjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJl
c291cmNlLmNwcAkyMDA5LTA3LTE4IDE3OjU5OjQ4LjExODgwMjMzMCArMTAwMApAQCAtMCwwICsx
LDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBDLiBBbG9uem8K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAid2Via2l0d2VicmVzb3VyY2UuaCIKKyNp
bmNsdWRlICJ3ZWJraXRwcml2YXRlLmgiCisKKyNpbmNsdWRlICJBcmNoaXZlUmVzb3VyY2UuaCIK
KyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAid3RmL0Fz
c2VydGlvbnMuaCIKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dpMThuLWxp
Yi5oPgorCisvKioKKyAqIFNFQ1RJT046d2Via2l0d2VicmVzb3VyY2UKKyAqIEBzaG9ydF9kZXNj
cmlwdGlvbjogUmVwcmVzZW50cyBhIGRvd25sb2FkZWQgVVJMLgorICogQHNlZV9hbHNvOiAjV2Vi
S2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIEEgd2ViIHJlc291cmNlIGVuY2Fwc3VsYXRlcyB0aGUg
ZGF0YSBvZiB0aGUgZG93bmxvYWQgYXMgd2VsbCBhcyB0aGUgVVJMLAorICogTUlNRSB0eXBlIGFu
ZCBmcmFtZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAqLworCit1c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CisKK2VudW0geworICAgIFBST1BfMCwKKwor
ICAgIFBST1BfVVJMLAorICAgIFBST1BfTUlNRV9UWVBFLAorICAgIFBST1BfVEVYVF9FTkNPRElO
R19OQU1FLAorICAgIFBST1BfRlJBTUVfTkFNRQorfTsKKworR19ERUZJTkVfVFlQRShXZWJLaXRX
ZWJSZXNvdXJjZSwgd2Via2l0X3dlYl9yZXNvdXJjZSwgR19UWVBFX09CSkVDVCk7CisKK3N0YXRp
YyB2b2lkIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3Byb3BlcnR5KEdPYmplY3QqIG9iamVjdCwg
Z3VpbnQgcHJvcF9pZCwgR1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3BlYyogcHNwZWMpOworCitzdGF0
aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2Rpc3Bvc2UoR09iamVjdCogb2JqZWN0KQorewor
ICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSA9IFdFQktJVF9XRUJfUkVTT1VSQ0Uo
b2JqZWN0KTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJj
ZS0+cHJpdjsKKworICAgIGlmIChwcml2LT5yZXNvdXJjZSkKKyAgICAgICAgcHJpdi0+cmVzb3Vy
Y2UtPmRlcmVmKCk7CisKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX3Jlc291cmNlX3Bh
cmVudF9jbGFzcyktPmRpc3Bvc2Uob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dl
Yl9yZXNvdXJjZV9maW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCit7CisgICAgV2ViS2l0V2ViUmVz
b3VyY2UqIHdlYlJlc291cmNlID0gV0VCS0lUX1dFQl9SRVNPVVJDRShvYmplY3QpOworICAgIFdl
YktpdFdlYlJlc291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYlJlc291cmNlLT5wcml2OworCisgICAg
cHJpdi0+dXJsID0gQ1N0cmluZygpOworICAgIHByaXYtPm1pbWVUeXBlID0gQ1N0cmluZygpOwor
ICAgIHByaXYtPnRleHRFbmNvZGluZyA9IENTdHJpbmcoKTsKKyAgICBwcml2LT5mcmFtZU5hbWUg
PSBDU3RyaW5nKCk7CisKKyAgICBpZiAocHJpdi0+ZGF0YSkKKyAgICAgICAgZ19zdHJpbmdfZnJl
ZShwcml2LT5kYXRhLCBGQUxTRSk7CisKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX3Jl
c291cmNlX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lk
IHdlYmtpdF93ZWJfcmVzb3VyY2VfY2xhc3NfaW5pdChXZWJLaXRXZWJSZXNvdXJjZUNsYXNzKiBr
bGFzcykKK3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFT
UyhrbGFzcyk7CisKKyAgICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gd2Via2l0X3dlYl9yZXNv
dXJjZV9kaXNwb3NlOworICAgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3dlYl9y
ZXNvdXJjZV9maW5hbGl6ZTsKKyAgICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB3ZWJr
aXRfd2ViX3Jlc291cmNlX2dldF9wcm9wZXJ0eTsKKworICAgIGdfb2JqZWN0X2NsYXNzX2luc3Rh
bGxfcHJvcGVydHkoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFBST1BfVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19w
YXJhbV9zcGVjX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1
cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiVVJMIiksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJUaGUgdXJsIG9mIHRoZSByZXNvdXJj
ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9QQVJBTV9SRUFEQUJMRSkpOworCisg
ICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0X2NsYXNzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9NSU1FX1RZUEUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nKAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWUtdHlwZSIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBfKCJNSU1FIFR5cGUiKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIF8oIlRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlc291cmNlIiksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisKKyAgICBnX29iamVj
dF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBQUk9QX1RFWFRfRU5DT0RJTkdfTkFNRSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1lbmNvZGluZy1uYW1lIiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIlRleHQgRW5jb2RpbmcgTmFtZSIpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiVGhlIHRleHQgZW5jb2RpbmcgbmFt
ZSBvZiB0aGUgcmVzb3VyY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1f
UkVBREFCTEUpKTsKKworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVj
dF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfRlJBTUVf
TkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3BlY19z
dHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUtbmFtZSIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJGcmFtZSBOYW1lIiksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJUaGUgZnJhbWUgbmFtZSBvZiB0
aGUgcmVzb3VyY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEws
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBREFC
TEUpKTsKKworICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShnb2JqZWN0X2NsYXNzLCBzaXpl
b2YoV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93
ZWJfcmVzb3VyY2VfZ2V0X3Byb3BlcnR5KEdPYmplY3QqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwg
R1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3BlYyogcHNwZWMpCit7CisgICAgV2ViS2l0V2ViUmVzb3Vy
Y2UqIHdlYlJlc291cmNlID0gV0VCS0lUX1dFQl9SRVNPVVJDRShvYmplY3QpOworCisgICAgc3dp
dGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1VSTDoKKyAgICAgICAgZ192YWx1ZV9zZXRf
c3RyaW5nKHZhbHVlLCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwod2ViUmVzb3VyY2UpKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTUVfVFlQRToKKyAgICAgICAgZ192YWx1
ZV9zZXRfc3RyaW5nKHZhbHVlLCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGUod2Vi
UmVzb3VyY2UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RFWFRfRU5DT0RJTkdf
TkFNRToKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nKHZhbHVlLCB3ZWJraXRfd2ViX3Jlc291
cmNlX2dldF90ZXh0X2VuY29kaW5nX25hbWUod2ViUmVzb3VyY2UpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBQUk9QX0ZSQU1FX05BTUU6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyh2
YWx1ZSwgd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZSh3ZWJSZXNvdXJjZSkpOwor
ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFM
SURfUFJPUEVSVFlfSUQob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJjZV9pbml0KFdlYktpdFdl
YlJlc291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICB3ZWJSZXNvdXJjZS0+cHJpdiA9IFdFQktJ
VF9XRUJfUkVTT1VSQ0VfR0VUX1BSSVZBVEUod2ViUmVzb3VyY2UpOworfQorCisvLyBpbnRlcm5h
bCB1c2Ugb25seQorV2ViS2l0V2ViUmVzb3VyY2UqIHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3X3dp
dGhfY29yZV9yZXNvdXJjZShQYXNzUmVmUHRyPEFyY2hpdmVSZXNvdXJjZT4gcmVzb3VyY2UpCit7
CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gV0VCS0lUX1dFQl9SRVNPVVJD
RShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBOVUxMKSk7CisgICAgV2Vi
S2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisgICAgcHJp
di0+cmVzb3VyY2UgPSByZXNvdXJjZS5yZWxlYXNlUmVmKCk7CisKKyAgICByZXR1cm4gd2ViUmVz
b3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9uZXc6CisgKiBAZGF0YTog
dGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAdXJsOiB0
aGUgdXJsIG9mIHRoZSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqIEBtaW1lX3R5cGU6IHRoZSBNSU1F
IHR5cGUgb2YgdGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICogQHRleHRfZW5jb2RpbmdfbmFtZTog
dGhlIHRleHQgZW5jb2RpbmcgbmFtZSBvZiB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAZnJh
bWVfbmFtZTogdGhlIGZyYW1lIG5hbWUgb2YgdGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAq
IFJldHVybnMgYSBuZXcgI1dlYktpdFdlYlJlc291cmNlLiBUaGUgQHRleHRfZW5jb2RpbmdfbmFt
ZSBjYW4gYmUgJU5VTEwuIFRoZQorICogQGZyYW1lX25hbWUgYXJndW1lbnQgY2FuIGJlIHVzZWQg
aWYgdGhlIHJlc291cmNlIHJlcHJlc2VudHMgY29udGVudHMgb2YgYW4KKyAqIGVudGlyZSBIVE1M
IGZyYW1lLCBvdGhlcndpc2UgcGFzcyAlTlVMTC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgbmV3
ICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLworV2ViS2l0V2Vi
UmVzb3VyY2UqIHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3KGNvbnN0IGdjaGFyKiBkYXRhLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyKiB1cmws
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIq
IG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IGdjaGFyKiB0ZXh0RW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyKiBmcmFtZU5hbWUpCit7CisgICAgQVNTRVJUKGRh
dGEpOworICAgIEFTU0VSVCh1cmwpOworICAgIEFTU0VSVChtaW1lX3R5cGUpOworCisgICAgUmVm
UHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YSwgc3Ry
bGVuKGRhdGEpKTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UgPSB3ZWJraXRf
d2ViX3Jlc291cmNlX25ld193aXRoX2NvcmVfcmVzb3VyY2UoQXJjaGl2ZVJlc291cmNlOjpjcmVh
dGUoYnVmZmVyLCBLVVJMKEtVUkwoKSxTdHJpbmc6OmZyb21VVEY4KHVybCkpLCBTdHJpbmc6OmZy
b21VVEY4KG1pbWVUeXBlKSwgU3RyaW5nOjpmcm9tVVRGOCh0ZXh0RW5jb2RpbmdOYW1lKSwgU3Ry
aW5nOjpmcm9tVVRGOChmcmFtZU5hbWUpKSk7CisKKyAgICByZXR1cm4gd2ViUmVzb3VyY2U7Cit9
CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZGF0YToKKyAqIEB3ZWJfcmVzb3Vy
Y2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUg
QHdlYlJlc291cmNlLgorICoKKyAqIFJldHVybiB2YWx1ZTogYSAjR1N0cmluZyBjb250YWluaW5n
IHRoZSBjaGFyYWN0ZXIgZGF0YSBvZiB0aGUgQHdlYlJlc291cmNlLgorICogVGhlIHN0cmluZyBp
cyBvd25lZCBieSBXZWJLaXQgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQgb3IgZGVzdHJveWVkLgor
ICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLworR19DT05TVF9SRVRVUk4gR1N0cmluZyogd2Via2l0
X3dlYl9yZXNvdXJjZV9nZXRfZGF0YShXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UpCit7
CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRSh3ZWJSZXNv
dXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2Vi
UmVzb3VyY2UtPnByaXY7CisKKyAgICBpZiAoIXByaXYtPmRhdGEpCisgICAgICAgIHByaXYtPmRh
dGEgPSBnX3N0cmluZ19uZXdfbGVuKHByaXYtPnJlc291cmNlLT5kYXRhKCktPmRhdGEoKSwgcHJp
di0+cmVzb3VyY2UtPmRhdGEoKS0+c2l6ZSgpKTsKKworICAgIHJldHVybiBwcml2LT5kYXRhOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybDoKKyAqIEB3ZWJfcmVzb3Vy
Y2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSBy
ZXNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UKKyAq
CisgKiBTaW5jZTogMS4xLjEyCisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRfd2Vi
X3Jlc291cmNlX2dldF91cmwoV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlKQoreworICAg
IGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfUkVTT1VSQ0Uod2ViUmVzb3VyY2Up
LCBOVUxMKTsKKworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYlJlc291
cmNlLT5wcml2OworICAgIGlmICghcHJpdi0+cmVzb3VyY2UpCisgICAgICAgIHJldHVybiBOVUxM
OworCisgICAgcHJpdi0+dXJsID0gcHJpdi0+cmVzb3VyY2UtPnVybCgpLnN0cmluZygpLnV0Zjgo
KTsKKworICAgIHJldHVybiBwcml2LT51cmwuZGF0YSgpOworfQorCisvKioKKyAqIHdlYmtpdF93
ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZToKKyAqIEB3ZWJfcmVzb3VyY2U6IGEgI1dlYktpdFdl
YlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSByZXNvdXJjZQor
ICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVzb3VyY2UKKyAqCisg
KiBTaW5jZSAxLjEuMTIKKyAqLworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfcmVz
b3VyY2VfZ2V0X21pbWVfdHlwZShXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UpCit7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRSh3ZWJSZXNvdXJj
ZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVz
b3VyY2UtPnByaXY7CisgICAgaWYgKCFwcml2LT5yZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5V
TEw7CisKKyAgICBwcml2LT5taW1lVHlwZSA9IHByaXYtPnJlc291cmNlLT5taW1lVHlwZSgpLnV0
ZjgoKTsKKworICAgIHJldHVybiBwcml2LT5taW1lVHlwZS5kYXRhKCk7Cit9CisKKy8qKgorICog
d2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lOgorICogQHdlYl9yZXNv
dXJjZTogYSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSB0ZXh0IGVuY29k
aW5nIG5hbWUgb2YgdGhlIHJlc291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgdGV4dCBl
bmNvZGluZyBuYW1lIG9mIHRoZSByZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLwor
R19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3RleHRfZW5jb2Rp
bmdfbmFtZShXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UpCit7CisgICAgZ19yZXR1cm5f
dmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRSh3ZWJSZXNvdXJjZSksIE5VTEwpOwor
CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7
CisgICAgaWYgKCFwcml2LT5yZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBw
cml2LT50ZXh0RW5jb2RpbmcgPSBwcml2LT5yZXNvdXJjZS0+dGV4dEVuY29kaW5nKCkudXRmOCgp
OworCisgICAgcmV0dXJuIHByaXYtPnRleHRFbmNvZGluZy5kYXRhKCk7Cit9CisKKy8qKgorICog
d2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZToKKyAqIEB3ZWJfcmVzb3VyY2U6IGEg
I1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJucyB0aGUgZnJhbWUgbmFtZSBvZiB0aGUg
cmVzb3VyY2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBmcmFtZSBuYW1lIG9mIHRoZSByZXNv
dXJjZS4KKyAqCisgKiBTaW5jZTogMS4xLjEyCisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3
ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKFdlYktpdFdlYlJlc291cmNlKiB3ZWJS
ZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX1JFU09V
UkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUq
IHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBpZiAoIXByaXYtPnJlc291cmNlKQorICAg
ICAgICByZXR1cm4gTlVMTDsKKworICAgIHByaXYtPmZyYW1lTmFtZSA9IHByaXYtPnJlc291cmNl
LT5mcmFtZU5hbWUoKS51dGY4KCk7CisKKyAgICByZXR1cm4gcHJpdi0+ZnJhbWVOYW1lLmRhdGEo
KTsKK30KSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCAr
MDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmgJMjAw
OS0wNy0xOCAxNzo1ODo1MS43MjY3NjY1MzYgKzEwMDAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBDLiBBbG9uem8KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXRUJLSVRf
V0VCX1JFU09VUkNFX0gKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJDRV9ICisKKyNpbmNsdWRl
IDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHdlYmtpdC93
ZWJraXRkZWZpbmVzLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRfVFlQRV9X
RUJfUkVTT1VSQ0UgICAgICAgICAgICAod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdHlwZSgpKQor
I2RlZmluZSBXRUJLSVRfV0VCX1JFU09VUkNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNL
X0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSwgV2ViS2l0V2Vi
UmVzb3VyY2UpKQorI2RlZmluZSBXRUJLSVRfV0VCX1JFU09VUkNFX0NMQVNTKGtsYXNzKSAgICAo
R19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJD
RSwgV2ViS2l0V2ViUmVzb3VyY2VDbGFzcykpCisjZGVmaW5lIFdFQktJVF9JU19XRUJfUkVTT1VS
Q0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgV0VCS0lU
X1RZUEVfV0VCX1JFU09VUkNFKSkKKyNkZWZpbmUgV0VCS0lUX0lTX1dFQl9SRVNPVVJDRV9DTEFT
UyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksICBXRUJLSVRfVFlQRV9X
RUJfUkVTT1VSQ0UpKQorI2RlZmluZSBXRUJLSVRfV0VCX1JFU09VUkNFX0dFVF9DTEFTUyhvYmop
ICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSwgIFdFQktJVF9UWVBFX1dFQl9SRVNP
VVJDRSwgV2ViS2l0V2ViUmVzb3VyY2VDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRX
ZWJSZXNvdXJjZVByaXZhdGUgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlOworCitzdHJ1Y3QgX1dl
YktpdFdlYlJlc291cmNlIHsKKyAgICBHT2JqZWN0IHBhcmVudF9pbnN0YW5jZTsKKworICAgIC8q
PCBwcml2YXRlID4qLworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSAqcHJpdjsKK307CisK
K3N0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VDbGFzcyB7CisgICAgR09iamVjdENsYXNzIHBhcmVu
dF9jbGFzczsKKworICAgIC8qIFBhZGRpbmcgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICB2
b2lkICgqX3dlYmtpdF9yZXNlcnZlZDApICh2b2lkKTsKKyAgICB2b2lkICgqX3dlYmtpdF9yZXNl
cnZlZDEpICh2b2lkKTsKKyAgICB2b2lkICgqX3dlYmtpdF9yZXNlcnZlZDIpICh2b2lkKTsKKyAg
ICB2b2lkICgqX3dlYmtpdF9yZXNlcnZlZDMpICh2b2lkKTsKK307CisKK1dFQktJVF9BUEkgR1R5
cGUKK3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCitXRUJLSVRfQVBJIFdl
YktpdFdlYlJlc291cmNlICoKK3dlYmtpdF93ZWJfcmVzb3VyY2VfbmV3ICAgICAgICAgICAgICAg
ICAgICAoY29uc3QgZ2NoYXIgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKnVybCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICptaW1l
X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IGdjaGFyICAgICAgICAqdGV4dF9lbmNvZGluZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKmZyYW1lX25hbWUpOwor
CitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIEdTdHJpbmcgKgord2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfZGF0YSAgICAgICAgICAgICAgIChXZWJLaXRXZWJSZXNvdXJjZSAgKndlYl9yZXNvdXJj
ZSk7CisKK1dFQktJVF9BUEkgR19DT05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0X3dlYl9yZXNv
dXJjZV9nZXRfdXJsICAgICAgICAgICAgICAgIChXZWJLaXRXZWJSZXNvdXJjZSAgKndlYl9yZXNv
dXJjZSk7CisKK1dFQktJVF9BUEkgR19DT05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0X3dlYl9y
ZXNvdXJjZV9nZXRfbWltZV90eXBlICAgICAgICAgIChXZWJLaXRXZWJSZXNvdXJjZSAgKndlYl9y
ZXNvdXJjZSk7CisKK1dFQktJVF9BUEkgR19DT05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0X3dl
Yl9yZXNvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lIChXZWJLaXRXZWJSZXNvdXJjZSAgKndl
Yl9yZXNvdXJjZSk7CisKK1dFQktJVF9BUEkgR19DT05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0
X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZSAgICAgICAgIChXZWJLaXRXZWJSZXNvdXJjZSAg
KndlYl9yZXNvdXJjZSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBXRUJLSVRfV0VCX1JF
U09VUkNFX0ggKi8KSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL0NoYW5nZUxvZwkyMDA5LTA3LTE4IDA2OjUzOjIy
LjE5NTc3NDI2NCArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDct
MTggMTc6NTg6MTUuNTk4NzY5Njg1ICsxMDAwCkBAIC0xLDMgKzEsMjggQEAKKzIwMDktMDctMTcg
IEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2Vi
RGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCisgICAgICAgIEltcGxlbWVudCBXZWJLaXRXZWJS
ZXNvdXJjZSBmb3IgdGhlIHJlc291cmNlLXJlbGF0ZWQgQVBJIGZvcgorICAgICAgICBXZWJLaXRX
ZWJEYXRhU291cmNlLgorCisgICAgICAgICogdGVzdHMvdGVzdHdlYnJlc291cmNlLmM6IEFkZGVk
LgorICAgICAgICAod2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXApOgorICAgICAgICAod2ViX3Jl
c291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOgorICAgICAgICAodGVzdF93ZWJraXRfd2ViX3Jlc291
cmNlX2dldF91cmwpOgorICAgICAgICAodGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRh
KToKKyAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKToKKyAg
ICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKToK
KyAgICAgICAgKHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZSk6CisgICAg
ICAgIChtYWluKToKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0Lmg6CisgICAgICAgICogd2Via2l0
L3dlYmtpdGRlZmluZXMuaDoKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0cHJpdmF0ZS5oOgorICAg
ICAgICAqIHdlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHdl
YmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5oOiBBZGRlZC4KKwogMjAwOS0wNy0xNiAgSG9sZ2VyIEhh
bnMgUGV0ZXIgRnJleXRoZXIgIDx6ZWNrZUBzZWxmaXNoLm9yZz4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBKYW4gQWxvbnpvLgo=
</data>
<flag name="review"
          id="17355"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33015</attachid>
            <date>2009-07-18 01:03:34 -0700</date>
            <delta_ts>2009-08-15 22:28:37 -0700</delta_ts>
            <desc>updated datasource patch</desc>
            <filename>datasource</filename>
            <type>text/plain</type>
            <size>42775</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvQ2hhbmdl
TG9nCTIwMDktMDctMTggMTY6MDQ6NTEuOTM1ODAxODI2ICsxMDAwCisrKyBXZWJLaXQvQ2hhbmdl
TG9nCTIwMDktMDctMTggMTY6MDU6NDMuNTc0NzY1MzA0ICsxMDAwCkBAIC01LDYgKzUsMTcgQEAK
ICAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0
CiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAog
CisgICAgICAgIEFkZCBXZWJLaXRXZWJEYXRhU291cmNlIGFuZCBEb2N1bWVudExvYWRlckd0ayB0
byB0aGUgYnVpbGQgc2NyaXB0LgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisKKzIwMDkt
MDQtMDQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1wbGVtZW50
IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCiAgICAgICAgIEFkZCBXZWJLaXRXZWJS
ZXNvdXJjZSB0byB0aGUgYnVpbGQgc2NyaXB0LgogCiAgICAgICAgICogR05VbWFrZWZpbGUuYW06
CkluZGV4OiBXZWJLaXQvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcv
R05VbWFrZWZpbGUuYW0JMjAwOS0wNy0xOCAxNjowNDo1MS44NzE3NjY1ODkgKzEwMDAKKysrIFdl
YktpdC9HTlVtYWtlZmlsZS5hbQkyMDA5LTA3LTE4IDE3OjE0OjI1LjI5MDc2NzE5NSArMTAwMApA
QCAtMzIzLDYgKzMyMyw3IEBAIHdlYmtpdGd0a19oX2FwaSArPSBcCiAJV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0c291cGF1dGhkaWFsb2cuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0dmVy
c2lvbi5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJiYWNrZm9yd2FyZGxpc3QuaCBc
CisJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZGF0YXNvdXJjZS5oIFwKIAlXZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJo
aXN0b3J5aXRlbS5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJpbnNwZWN0b3IuaCBc
CkBAIC0zNDQsNiArMzQ1LDggQEAgd2Via2l0Z3RrX3NvdXJjZXMgKz0gXAogCVdlYktpdC9ndGsv
V2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50R3RrLmggXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1
cHBvcnQvQ29udGV4dE1lbnVDbGllbnRHdGsuY3BwIFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBw
b3J0L0NvbnRleHRNZW51Q2xpZW50R3RrLmggXAorCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQv
RG9jdW1lbnRMb2FkZXJHdGsuY3BwIFwKKwlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RvY3Vt
ZW50TG9hZGVyR3RrLmggXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEd0
ay5jcHAgXAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEd0ay5oIFwKIAlX
ZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0VkaXRvckNsaWVudEd0ay5jcHAgXApAQCAtMzYyLDYg
KzM2NSw3IEBAIHdlYmtpdGd0a19zb3VyY2VzICs9IFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXRzb3VwYXV0aGRpYWxvZy5jIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR2ZXJzaW9uLmNw
cCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViYmFja2ZvcndhcmRsaXN0LmNwcCBcCisJ
V2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZGF0YXNvdXJjZS5jcHAgXAogCVdlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vi
aGlzdG9yeWl0ZW0uY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJpbnNwZWN0b3Iu
Y3BwIFwKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQub3JpZy9XZWJLaXQvZ3RrL0NoYW5nZUxvZwkyMDA5LTA3LTE4IDE2OjA0OjUxLjk5OTc2
NjMxMiArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDctMTggMTY6
MDU6NDMuNTgyNzY1NDE0ICsxMDAwCkBAIC01LDYgKzUsNzQgQEAKICAgICAgICAgW0d0a10gSW1w
bGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CiAgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAogCisgICAgICAgIFN1YmNsYXNz
IERvY3VtZW50TG9hZGVyIGZvciBHdGsgYW5kIGltcGxlbWVudCBpdCB1bmRlciB0aGUgV2ViS2l0
CisgICAgICAgIG5hbWVzcGFjZS4gQWRkIFdlYktpdFdlYkRhdGFTb3VyY2UgaW1wbGVtZW50YXRp
b24gdGhhdCBjbG9zZWx5CisgICAgICAgIGZvbGxvd3MgdGhlIG1hYyBpbXBsZW1lbnRhdGlvbiBv
ZiB0aGUgQVBJLgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvRG9jdW1lbnRMb2FkZXJHdGsu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OkRvY3VtZW50TG9h
ZGVyKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OnNldERhdGFTb3VyY2UpOgor
ICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6ZGV0YWNoRGF0YVNvdXJjZSk6CisgICAg
ICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjphdHRhY2hUb0ZyYW1lKToKKyAgICAgICAgKFdl
YktpdDo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaEZyb21GcmFtZSk6CisgICAgICAgIChXZWJLaXQ6
OkRvY3VtZW50TG9hZGVyOjppbmNyZWFzZUxvYWRDb3VudCk6CisgICAgICAgIChXZWJLaXQ6OkRv
Y3VtZW50TG9hZGVyOjpkZWNyZWFzZUxvYWRDb3VudCk6CisgICAgICAgIChXZWJLaXQ6OkRvY3Vt
ZW50TG9hZGVyOjpyZWZEYXRhU291cmNlKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2Fk
ZXI6OnVucmVmRGF0YVNvdXJjZSk6CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvRG9jdW1lbnRM
b2FkZXJHdGsuaDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpjcmVh
dGUpOgorICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6ZGF0YVNvdXJjZSk6CisgICAg
ICAgICogV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwOgorICAgICAgICAo
V2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6Y3JlYXRlRG9jdW1lbnRMb2FkZXIpOgorICAgICAg
ICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6Y29tbWl0dGVkTG9hZCk6CisgICAgICAgIChX
ZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpzaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZSk6Cisg
ICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2VpdmVBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50
OjpkaXNwYXRjaERpZENhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKToKKyAgICAgICAgKFdl
YktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2lsbFNlbmRSZXF1ZXN0KToKKyAgICAg
ICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmFzc2lnbklkZW50aWZpZXJUb0luaXRpYWxS
ZXF1ZXN0KToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlk
UmVjZWl2ZVJlc3BvbnNlKToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6Om1h
a2VSZXByZXNlbnRhdGlvbik6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojpk
aXNwYXRjaERpZExvYWRNYWluUmVzb3VyY2UpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRl
ckNsaWVudDo6cmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKToKKyAgICAgICAgKFdlYktpdDo6RnJh
bWVMb2FkZXJDbGllbnQ6OndpbGxDaGFuZ2VUaXRsZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1l
TG9hZGVyQ2xpZW50OjpkaWRDaGFuZ2VUaXRsZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9h
ZGVyQ2xpZW50OjpmaW5pc2hlZExvYWRpbmcpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRl
ckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlQ29udGVudExlbmd0aCk6CisgICAgICAgIChXZWJL
aXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZpbmlzaExvYWRpbmcpOgorICAgICAg
ICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGYWlsTG9hZGluZyk6Cisg
ICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRSZXNvdXJj
ZUZyb21NZW1vcnlDYWNoZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojpz
ZXRNYWluRG9jdW1lbnRFcnJvcik6CisgICAgICAgICogd2Via2l0L3dlYmtpdC5oOgorICAgICAg
ICAqIHdlYmtpdC93ZWJraXRkZWZpbmVzLmg6CisgICAgICAgICogd2Via2l0L3dlYmtpdHByaXZh
dGUuaDoKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0d2ViZGF0YXNvdXJjZS5jcHA6IEFkZGVkLgor
ICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2Rpc3Bvc2UpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2ZpbmFsaXplKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9jbGFzc19pbml0KToKKyAgICAgICAg
KF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pbml0
KToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9uZXdfd2l0aF9sb2FkZXIpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQ
cml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ldyk6CisgICAgICAgIChfV2ViS2l0V2Vi
RGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZSk6
CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9z
b3VyY2VfZ2V0X2luaXRpYWxfcmVxdWVzdCk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJj
ZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3QpOgorICAgICAgICAo
X1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90
ZXh0X2VuY29kaW5nX25hbWUpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRl
Ojp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2lzX2xvYWRpbmcpOgorICAgICAgICAoX1dlYktpdFdl
YkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9kYXRhKToKKyAg
ICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfbWFpbl9yZXNvdXJjZSk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZh
dGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291cmNlcyk6CisgICAgICAgIChf
V2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3Jl
c291cmNlX2Zvcl91cmwpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3
ZWJraXRfd2ViX2RhdGFfc291cmNlX2FkZF9zdWJyZXNvdXJjZSk6CisgICAgICAgIChfV2ViS2l0
V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3VucmVhY2hh
YmxlX3VybCk6CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaDogQWRkZWQu
CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcDoKKworMjAwOS0wNC0wNCAgSmFu
IE1pY2hhZWwgQWxvbnpvICA8am1hbG9uem9Ad2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRh
U291cmNlIGZvciB0aGUgZ3RrIHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTI0NzU4CisKICAgICAgICAgSW1wbGVtZW50IFdlYktpdFdlYlJlc291
cmNlIGZvciB0aGUgcmVzb3VyY2UtcmVsYXRlZCBBUEkgZm9yCiAgICAgICAgIFdlYktpdFdlYkRh
dGFTb3VyY2UuCiAKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RvY3Vt
ZW50TG9hZGVyR3RrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwJMTk3MC0wMS0wMSAwMDow
MDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0
L0RvY3VtZW50TG9hZGVyR3RrLmNwcAkyMDA5LTA3LTE4IDE2OjEyOjU0LjQxMDc2NzkxOCArMTAw
MApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIEphbiBN
aWNoYWVsIEFsb256bworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEb2N1bWVudExv
YWRlckd0ay5oIgorCisjaW5jbHVkZSAid2Via2l0d2ViZGF0YXNvdXJjZS5oIgorCit1c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK0RvY3VtZW50TG9hZGVy
OjpEb2N1bWVudExvYWRlcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFN1
YnN0aXR1dGVEYXRhJiBzdWJzdGl0dXRlRGF0YSkKKyAgICA6IFdlYkNvcmU6OkRvY3VtZW50TG9h
ZGVyKHJlcXVlc3QsIHN1YnN0aXR1dGVEYXRhKQorICAgICwgbV9pc0RhdGFTb3VyY2VSZWZmZWQo
ZmFsc2UpCisgICAgLCBtX2RhdGFTb3VyY2UoMCkKK3sKK30KKwordm9pZCBEb2N1bWVudExvYWRl
cjo6c2V0RGF0YVNvdXJjZShXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhU291cmNlKQoreworICAg
IEFTU0VSVCghbV9kYXRhU291cmNlKTsKKworICAgIG1fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7
CisgICAgcmVmRGF0YVNvdXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpkZXRhY2hE
YXRhU291cmNlKCkKK3sKKyAgICBBU1NFUlQoIW1faXNEYXRhU291cmNlUmVmZmVkKTsKKyAgICB1
bnJlZkRhdGFTb3VyY2UoKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6YXR0YWNoVG9GcmFt
ZSgpCit7CisgICAgV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXI6OmF0dGFjaFRvRnJhbWUoKTsKKwor
ICAgIHJlZkRhdGFTb3VyY2UoKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6ZGV0YWNoRnJv
bUZyYW1lKCkKK3sKKyAgICBXZWJDb3JlOjpEb2N1bWVudExvYWRlcjo6ZGV0YWNoRnJvbUZyYW1l
KCk7CisKKyAgICBpZiAobV9sb2FkaW5nUmVzb3VyY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgdW5y
ZWZEYXRhU291cmNlKCk7CisKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6aW5jcmVhc2VMb2Fk
Q291bnQodW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKQoreworICAgIEFTU0VSVChtX2RhdGFTb3Vy
Y2UpOworCisgICAgaWYgKG1fbG9hZGluZ1Jlc291cmNlcy5jb250YWlucyhpZGVudGlmaWVyKSkK
KyAgICAgICAgcmV0dXJuOworICAgIG1fbG9hZGluZ1Jlc291cmNlcy5hZGQoaWRlbnRpZmllcik7
CisgICAgcmVmRGF0YVNvdXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpkZWNyZWFz
ZUxvYWRDb3VudCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIpCit7CisgICAgSGFzaFNldDx1bnNp
Z25lZCBsb25nPjo6aXRlcmF0b3IgaXQgPSBtX2xvYWRpbmdSZXNvdXJjZXMuZmluZChpZGVudGlm
aWVyKTsKKworICAgIC8vIEl0IGlzIHZhbGlkIGZvciBhIGxvYWQgdG8gYmUgY2FuY2VsbGVkIGJl
Zm9yZSBpdCdzIHN0YXJ0ZWQuCisgICAgaWYgKGl0ID09IG1fbG9hZGluZ1Jlc291cmNlcy5lbmQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9sb2FkaW5nUmVzb3VyY2VzLnJlbW92ZShpdCk7
CisKKyAgICBpZiAobV9sb2FkaW5nUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAhZnJhbWUoKSkKKyAg
ICAgICAgdW5yZWZEYXRhU291cmNlKCk7CisKK30KKworLy8gaGVscGVyIG1ldGhvcyB0byBhdm9p
ZCByZWYgY291bnQgY2h1cm4KK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OnJlZkRhdGFTb3VyY2UoKQor
eworICAgIGlmIChtX2lzRGF0YVNvdXJjZVJlZmZlZCB8fCAhbV9kYXRhU291cmNlKQorICAgICAg
ICByZXR1cm47CisgICAgbV9pc0RhdGFTb3VyY2VSZWZmZWQgPSB0cnVlOworICAgIGdfb2JqZWN0
X3JlZihtX2RhdGFTb3VyY2UpOworfQordm9pZCBEb2N1bWVudExvYWRlcjo6dW5yZWZEYXRhU291
cmNlKCkKK3sKKyAgICBpZiAoIW1faXNEYXRhU291cmNlUmVmZmVkKQorICAgICAgICByZXR1cm47
CisgICAgQVNTRVJUKG1fZGF0YVNvdXJjZSk7CisgICAgbV9pc0RhdGFTb3VyY2VSZWZmZWQgPSBm
YWxzZTsKKyAgICBnX29iamVjdF91bnJlZihtX2RhdGFTb3VyY2UpOworfQorCit9IC8vIGVuZCBu
YW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9E
b2N1bWVudExvYWRlckd0ay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAw
OjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvV2ViQ29yZVN1cHBv
cnQvRG9jdW1lbnRMb2FkZXJHdGsuaAkyMDA5LTA3LTE4IDE2OjE0OjIwLjU3MDc2NzMxMCArMTAw
MApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAgSmFuIE1p
Y2hhZWwgQWxvbnpvCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBv
ZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAg
IGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAid2Via2l0
ZGVmaW5lcy5oIgorI2luY2x1ZGUgInd0Zi9IYXNoU2V0LmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKyAgICBjbGFzcyBSZXNvdXJjZVJlcXVlc3Q7CisgICAgY2xhc3MgU3Vic3RpdHV0ZURhdGE7
Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBEb2N1bWVudExvYWRlciA6IHB1Ymxp
YyBXZWJDb3JlOjpEb2N1bWVudExvYWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8V2ViS2l0OjpEb2N1bWVudExvYWRlcj4gY3JlYXRlKGNvbnN0IFdlYkNvcmU6OlJlc291cmNl
UmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgV2ViQ29yZTo6U3Vic3RpdHV0ZURhdGEmIGRhdGEpCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IERvY3VtZW50TG9hZGVyKHJlcXVlc3Qs
IGRhdGEpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERhdGFTb3VyY2UoV2ViS2l0V2ViRGF0YVNv
dXJjZSopOworICAgIHZvaWQgZGV0YWNoRGF0YVNvdXJjZSgpOworICAgIFdlYktpdFdlYkRhdGFT
b3VyY2UqIGRhdGFTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX2RhdGFTb3VyY2U7IH0KKworICAg
IHZvaWQgaW5jcmVhc2VMb2FkQ291bnQodW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKTsKKyAgICB2
b2lkIGRlY3JlYXNlTG9hZENvdW50KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcik7CisKK3ByaXZh
dGU6CisgICAgRG9jdW1lbnRMb2FkZXIoY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0Jiwg
Y29uc3QgV2ViQ29yZTo6U3Vic3RpdHV0ZURhdGEmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhdHRh
Y2hUb0ZyYW1lKCk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaEZyb21GcmFtZSgpOworCisgICAg
dm9pZCByZWZEYXRhU291cmNlKCk7CisgICAgdm9pZCB1bnJlZkRhdGFTb3VyY2UoKTsKKworICAg
IGJvb2wgbV9pc0RhdGFTb3VyY2VSZWZmZWQ7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogbV9k
YXRhU291cmNlOworICAgIEhhc2hTZXQ8dW5zaWduZWQgbG9uZz4gbV9sb2FkaW5nUmVzb3VyY2Vz
OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFdlYktpdApJbmRleDogV2ViS2l0L1dlYktpdC9n
dGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC5vcmlnL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRH
dGsuY3BwCTIwMDktMDctMTggMTY6MDQ6NTIuNDk4NzY3NTEzICsxMDAwCisrKyBXZWJLaXQvV2Vi
S2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEd0ay5jcHAJMjAwOS0wNy0x
OCAxNzoxNToxMy45NjI3NjY1NjcgKzEwMDAKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUg
IkNvbG9yLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dExvYWRlckd0ay5oIgogI2luY2x1ZGUgIkZvcm1TdGF0ZS5oIgogI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCkBAIC0xMTEsNyArMTEyLDEzIEBAIHN0YXRp
YyB2b2lkIGxvYWREb25lKFdlYktpdFdlYkZyYW1lKiBmcmEKIAogV1RGOjpQYXNzUmVmUHRyPFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyPiBGcmFtZUxvYWRlckNsaWVudDo6Y3JlYXRlRG9jdW1lbnRM
b2FkZXIoY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBTdWJz
dGl0dXRlRGF0YSYgc3Vic3RpdHV0ZURhdGEpCiB7Ci0gICAgcmV0dXJuIERvY3VtZW50TG9hZGVy
OjpjcmVhdGUocmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpOworICAgIFJlZlB0cjxXZWJLaXQ6OkRv
Y3VtZW50TG9hZGVyPiBsb2FkZXIgPSBXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpjcmVhdGUocmVx
dWVzdCwgc3Vic3RpdHV0ZURhdGEpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0
YVNvdXJjZSA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfbG9hZGVyKGxvYWRlci5n
ZXQoKSk7CisgICAgbG9hZGVyLT5zZXREYXRhU291cmNlKHdlYkRhdGFTb3VyY2UpOworICAgIGdf
b2JqZWN0X3VucmVmKHdlYkRhdGFTb3VyY2UpOworCisgICAgcmV0dXJuIGxvYWRlci5yZWxlYXNl
KCk7CiB9CiAKIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2lsbFN1Ym1pdEZvcm0o
RnJhbWVQb2xpY3lGdW5jdGlvbiBwb2xpY3lGdW5jdGlvbiwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+
KQpAQCAtMTI0LDcgKzEzMSw3IEBAIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2ls
bFN1Ym0KIH0KIAogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojpjb21taXR0ZWRMb2FkKERvY3Vt
ZW50TG9hZGVyKiBsb2FkZXIsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50Ojpjb21taXR0ZWRMb2FkKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBs
b2FkZXIsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7CiAgICAgaWYgKCFtX3BsdWdp
blZpZXcpIHsKICAgICAgICAgQVNTRVJUKGxvYWRlci0+ZnJhbWUoKSk7CkBAIC0xNTgsMjggKzE2
NSwyOSBAQCB2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojpjb21taXR0ZWRMb2FkKERvCiB9CiAKIGJv
b2wKLUZyYW1lTG9hZGVyQ2xpZW50OjpzaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZShEb2N1bWVu
dExvYWRlciosIHVuc2lnbmVkIGxvbmcgIGlkZW50aWZpZXIpCitGcmFtZUxvYWRlckNsaWVudDo6
c2hvdWxkVXNlQ3JlZGVudGlhbFN0b3JhZ2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNp
Z25lZCBsb25nICBpZGVudGlmaWVyKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0
dXJuIGZhbHNlOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2Vp
dmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcg
IGlkZW50aWZpZXIsIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRlbnRpZmllciwgY29uc3Qg
QXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAK
LXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkQ2FuY2VsQXV0aGVudGljYXRpb25D
aGFsbGVuZ2UoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVudGlmaWVyLCBjb25z
dCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNw
YXRjaERpZENhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKFdlYkNvcmU6OkRvY3VtZW50TG9h
ZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRlbnRpZmllciwgY29uc3QgQXV0aGVudGljYXRpb25DaGFs
bGVuZ2UmKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6OmRpc3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQg
bG9uZywgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxTZW5kUmVxdWVzdChXZWJDb3JlOjpEb2N1bWVu
dExvYWRlciogbG9hZGVyLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIFJlc291cmNlUmVxdWVz
dCYgcmVxdWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVkaXJlY3RSZXNwb25zZSkKIHsK
LSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGlmIChyZWRpcmVjdFJlc3BvbnNlLmlzTnVsbCgp
KQorICAgICAgICBzdGF0aWNfY2FzdDxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyKj4obG9hZGVyKS0+
aW5jcmVhc2VMb2FkQ291bnQoaWRlbnRpZmllcik7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGll
bnQ6OmFzc2lnbklkZW50aWZpZXJUb0luaXRpYWxSZXF1ZXN0KHVuc2lnbmVkIGxvbmcgaWRlbnRp
ZmllciwgRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmKQordm9pZCBGcmFt
ZUxvYWRlckNsaWVudDo6YXNzaWduSWRlbnRpZmllclRvSW5pdGlhbFJlcXVlc3QodW5zaWduZWQg
bG9uZyBpZGVudGlmaWVyLCBXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291cmNl
UmVxdWVzdCYpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KQEAgLTIyMSw3ICsyMjksNyBA
QCB2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpmcmFtZUxvYWRlckRlc3RyCiAgICAgZGVsZXRlIHRo
aXM7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZVJlc3Bv
bnNlKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZywgY29uc3QgUmVzb3VyY2VSZXNwb25z
ZSYgcmVzcG9uc2UpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2VpdmVS
ZXNwb25zZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IFJl
c291cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQogewogICAgIG1fcmVzcG9uc2UgPSByZXNwb25zZTsK
IH0KQEAgLTU0NSw3ICs1NTMsNyBAQCBib29sIEZyYW1lTG9hZGVyQ2xpZW50OjpzaG91bGRHb1Rv
SGlzdG9yCiAgICAgcmV0dXJuIGl0ZW0gIT0gMDsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVu
dDo6bWFrZVJlcHJlc2VudGF0aW9uKERvY3VtZW50TG9hZGVyKikKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6Om1ha2VSZXByZXNlbnRhdGlvbihXZWJDb3JlOjpEb2N1bWVudExvYWRlciopCiB7CiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KQEAgLTY5OSwyMiArNzA3LDIyIEBAIHZvaWQgRnJhbWVM
b2FkZXJDbGllbnQ6OmNhbmNlbFBvbGljeUNoZWMKICAgICAgICAgd2Via2l0X3dlYl9wb2xpY3lf
ZGVjaXNpb25fY2FuY2VsKG1fcG9saWN5RGVjaXNpb24pOwogfQogCi12b2lkIEZyYW1lTG9hZGVy
Q2xpZW50OjpkaXNwYXRjaERpZExvYWRNYWluUmVzb3VyY2UoRG9jdW1lbnRMb2FkZXIqKQordm9p
ZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKFdlYkNvcmU6
OkRvY3VtZW50TG9hZGVyKikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZy
YW1lTG9hZGVyQ2xpZW50OjpyZXZlcnRUb1Byb3Zpc2lvbmFsU3RhdGUoRG9jdW1lbnRMb2FkZXIq
KQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6cmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKFdlYkNv
cmU6OkRvY3VtZW50TG9hZGVyKikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lk
IEZyYW1lTG9hZGVyQ2xpZW50Ojp3aWxsQ2hhbmdlVGl0bGUoRG9jdW1lbnRMb2FkZXIqKQordm9p
ZCBGcmFtZUxvYWRlckNsaWVudDo6d2lsbENoYW5nZVRpdGxlKFdlYkNvcmU6OkRvY3VtZW50TG9h
ZGVyKikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50OjpkaWRDaGFuZ2VUaXRsZShEb2N1bWVudExvYWRlciAqbCkKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6OmRpZENoYW5nZVRpdGxlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyICpsKQogewogICAg
IHNldFRpdGxlKGwtPnRpdGxlKCksIGwtPnVybCgpKTsKIH0KQEAgLTc0Myw3ICs3NTEsNyBAQCBT
dHJpbmcgRnJhbWVMb2FkZXJDbGllbnQ6OmdlbmVyYXRlZE1JTUVUCiAgICAgcmV0dXJuIFN0cmlu
ZygpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpmaW5pc2hlZExvYWRpbmcoRG9jdW1l
bnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZmluaXNo
ZWRMb2FkaW5nKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlcikKIHsKICAg
ICBpZiAoIW1fcGx1Z2luVmlldykKICAgICAgICAgY29tbWl0dGVkTG9hZChkb2N1bWVudExvYWRl
ciwgMCwgMCk7CkBAIC03NzMsMjAgKzc4MSwyMSBAQCB2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojpz
ZXRUaXRsZShjb25zdCBTCiAgICAgZnJhbWVEYXRhLT50aXRsZSA9IGdfc3RyZHVwKHRpdGxlLnV0
ZjgoKS5kYXRhKCkpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJl
Y2VpdmVDb250ZW50TGVuZ3RoKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyBpZGVudGlm
aWVyLCBpbnQgbGVuZ3RoUmVjZWl2ZWQpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRj
aERpZFJlY2VpdmVDb250ZW50TGVuZ3RoKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiwgdW5zaWdu
ZWQgbG9uZyBpZGVudGlmaWVyLCBpbnQgbGVuZ3RoUmVjZWl2ZWQpCiB7CiAgICAgbm90SW1wbGVt
ZW50ZWQoKTsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGaW5pc2hM
b2FkaW5nKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKQordm9pZCBG
cmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGaW5pc2hMb2FkaW5nKFdlYkNvcmU6OkRvY3Vt
ZW50TG9hZGVyKiBsb2FkZXIsIHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcikKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHN0YXRpY19jYXN0PFdlYktpdDo6RG9jdW1lbnRMb2FkZXIqPihs
b2FkZXIpLT5kZWNyZWFzZUxvYWRDb3VudChpZGVudGlmaWVyKTsKIH0KIAotdm9pZCBGcmFtZUxv
YWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGYWlsTG9hZGluZyhEb2N1bWVudExvYWRlciosIHVuc2ln
bmVkIGxvbmcgaWRlbnRpZmllciwgY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZhaWxMb2FkaW5nKFdlYkNvcmU6OkRvY3VtZW50
TG9hZGVyKiBsb2FkZXIsIHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllciwgY29uc3QgUmVzb3VyY2VF
cnJvciYgZXJyb3IpCiB7CiAgICAgLy8gRklYTUU6IHdoZW4gZG9lcyB0aGlzIG9jY3VyIGFuZCB3
aGF0IHNob3VsZCBoYXBwZW4/Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIHN0YXRpY19j
YXN0PFdlYktpdDo6RG9jdW1lbnRMb2FkZXIqPihsb2FkZXIpLT5kZWNyZWFzZUxvYWRDb3VudChp
ZGVudGlmaWVyKTsKIH0KIAogdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2Fk
UmVzb3VyY2VCeVhNTEh0dHBSZXF1ZXN0KHVuc2lnbmVkIGxvbmcsIGNvbnN0IFNjcmlwdFN0cmlu
ZyYpCkBAIC03OTQsNyArODAzLDcgQEAgdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hE
aWRMb2FkUgogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLWJvb2wgRnJhbWVMb2FkZXJDbGll
bnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNlRnJvbU1lbW9yeUNhY2hlKERvY3VtZW50TG9hZGVy
KiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYsIGludCBs
ZW5ndGgpCitib29sIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRSZXNvdXJjZUZy
b21NZW1vcnlDYWNoZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291cmNlUmVx
dWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmLCBpbnQgbGVuZ3RoKQogewogICAgIG5vdElt
cGxlbWVudGVkKCk7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTQyLDcgKzk1MSw3IEBAIHZvaWQg
RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoVW5hYmxlVG8KICAgICBub3RJbXBsZW1lbnRlZCgp
OwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpzZXRNYWluRG9jdW1lbnRFcnJvcihEb2N1
bWVudExvYWRlciosIGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQordm9pZCBGcmFtZUxvYWRl
ckNsaWVudDo6c2V0TWFpbkRvY3VtZW50RXJyb3IoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCBj
b25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikKIHsKICAgICBpZiAobV9wbHVnaW5WaWV3KSB7CiAg
ICAgICAgIG1fcGx1Z2luVmlldy0+ZGlkRmFpbChlcnJvcik7CkluZGV4OiBXZWJLaXQvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0
ay93ZWJraXQvd2Via2l0LmgJMjAwOS0wNy0xOCAxNjowNDo1Mi4yOTg3NzA4NjYgKzEwMDAKKysr
IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAkyMDA5LTA3LTE4IDE2OjA1OjQzLjU2
Nzc5NjI2MSArMTAwMApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRk
b3dubG9hZC5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRuZXR3b3JrcmVxdWVzdC5oPgogI2lu
Y2x1ZGUgPHdlYmtpdC93ZWJraXRzb3VwYXV0aGRpYWxvZy5oPgorI2luY2x1ZGUgPHdlYmtpdC93
ZWJraXR3ZWJkYXRhc291cmNlLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmZyYW1lLmg+
CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnNldHRpbmdzLmg+CiAjaW5jbHVkZSA8d2Via2l0
L3dlYmtpdHdlYmluc3BlY3Rvci5oPgpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdGRlZmluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtp
dC93ZWJraXRkZWZpbmVzLmgJMjAwOS0wNy0xOCAxNjowNDo1Mi4xMTk4MDI4NzUgKzEwMDAKKysr
IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmgJMjAwOS0wNy0xOCAxNjow
NTo0My41Njc3OTYyNjEgKzEwMDAKQEAgLTc0LDYgKzc0LDkgQEAgdHlwZWRlZiBzdHJ1Y3QgX1dl
YktpdERvd25sb2FkQ2xhc3MgV2ViSwogdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNl
IFdlYktpdFdlYlJlc291cmNlOwogdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlQ2xh
c3MgV2ViS2l0V2ViUmVzb3VyY2VDbGFzczsKIAordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYkRh
dGFTb3VyY2UgV2ViS2l0V2ViRGF0YVNvdXJjZTsKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJE
YXRhU291cmNlQ2xhc3MgV2ViS2l0V2ViRGF0YVNvdXJjZUNsYXNzOworCiBHX0VORF9ERUNMUwog
CiAjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0
ZS5oCTIwMDktMDctMTggMTY6MDQ6NTIuMjMwNzY3MTg3ICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0ZS5oCTIwMDktMDctMTggMTY6MDU6NDMuNTY3Nzk2MjYx
ICsxMDAwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRvd25sb2Fk
Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8
d2Via2l0L3dlYmtpdHdlYnZpZXcuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZGF0YXNv
dXJjZS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+CkBAIC02Miw2ICs2Myw5IEBACiBjbGFzcyBEb3dubG9hZENs
aWVudDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CisKKyAgICBjbGFzcyBEb2N1bWVudExvYWRlcjsK
KwogICAgIFdlYktpdFdlYlZpZXcqIGdldFZpZXdGcm9tRnJhbWUoV2ViS2l0V2ViRnJhbWUqKTsK
IAogICAgIFdlYkNvcmU6OkZyYW1lKiBjb3JlKFdlYktpdFdlYkZyYW1lKik7CkBAIC0xNTksNiAr
MTYzLDEwIEBAIGV4dGVybiAiQyIgewogICAgIHdlYmtpdF93ZWJfaGlzdG9yeV9pdGVtX2dldF9j
aGlsZHJlbihXZWJLaXRXZWJIaXN0b3J5SXRlbSopOwogICAgIC8vIGVuZCBXZWJLaXRXZWJIaXN0
b3J5SXRlbSBwcml2YXRlCiAKKyAgICAvLyBXZWJLaXRXZWJEYXRhU291cmNlIHByaXZhdGUKKyAg
ICBXZWJLaXRXZWJEYXRhU291cmNlKgorICAgIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dp
dGhfbG9hZGVyKFBhc3NSZWZQdHI8V2ViS2l0OjpEb2N1bWVudExvYWRlcj4pOworCiAgICAgLy8g
V2ViS2l0V2ViUmVzb3VyY2UgcHJpdmF0ZQogICAgICNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJD
RV9HRVRfUFJJVkFURShvYmopICAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKChv
YmopLCBXRUJLSVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSkp
CiAgICAgc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUgewpJbmRleDogV2ViS2l0L1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9k
ZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCTIwMDktMDctMTggMTc6MDU6
MDAuMzM5NzY2OTIzICsxMDAwCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEphbiBNaWNoYWVsIEMuIEFsb256bworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAid2Via2l0d2ViZGF0YXNvdXJjZS5oIgorCisjaW5jbHVkZSAiQXJjaGl2ZVJlc291cmNlLmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNs
aWVudEd0ay5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiS1VSTC5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0Lmgi
CisjaW5jbHVkZSAicnVudGltZS9Jbml0aWFsaXplVGhyZWFkaW5nLmgiCisjaW5jbHVkZSAiU2hh
cmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiU3Vic3RpdHV0ZURhdGEuaCIKKyNpbmNsdWRlICJ3ZWJr
aXR3ZWJyZXNvdXJjZS5oIgorI2luY2x1ZGUgIndlYmtpdHByaXZhdGUuaCIKKyNpbmNsdWRlICJ3
dGYvQXNzZXJ0aW9ucy5oIgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisvKioKKyAqIFNFQ1RJT046
d2Via2l0d2ViZGF0YXNvdXJjZQorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBFbmNhcHN1bGF0ZXMg
dGhlIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIGluIGEgI1dlYktpdFdlYkZyYW1lLgorICogQHNl
ZV9hbHNvOiAjV2ViS2l0V2ViRnJhbWUKKyAqCisgKiBBIGRhdGEgc291cmNlIGVuY2Fwc3VsYXRl
cyB0aGUgY29udGVudCBvZiBhICNXZWJLaXRXZWJGcmFtZS4gQQorICogI1dlYktpdFdlYkZyYW1l
IGhhcyBhIG1haW4gcmVzb3VyY2UgYW5kIHN1YnJlc291cmNlcyBhbmQgdGhlIGRhdGEgc291cmNl
CisgKiBwcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcyB0aGVzZSByZXNvdXJjZXMuICNXZWJLaXRX
ZWJEYXRhU291cmNlIG9iamVjdHMKKyAqIGhhdmUgYW4gYXNzb2NpYXRlZCBpbml0aWFsIHJlcXVl
c3QuIE1ha2Ugc3VyZSB0byBjaGVjayBpZiB0aGUgZGF0YSBzb3VyY2UKKyAqIGlzIGluIHRoZSBw
cm9jZXNzIG9mIGJlaW5nIGxvYWRlZCBiZWZvcmUgYWNjZXNzaW5nIGl0cyBkYXRhLgorICovCisK
K3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKKworc3Ry
dWN0IF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSB7CisgICAgV2ViS2l0OjpEb2N1bWVudExv
YWRlciogbG9hZGVyOworCisgICAgV2ViS2l0TmV0d29ya1JlcXVlc3QqIGluaXRpYWxSZXF1ZXN0
OworICAgIFdlYktpdE5ldHdvcmtSZXF1ZXN0KiBuZXR3b3JrUmVxdWVzdDsKKyAgICBXZWJLaXRX
ZWJSZXNvdXJjZSogbWFpblJlc291cmNlOworICAgIEdBcnJheSogc3VicmVzb3VyY2VzOworICAg
IEdTdHJpbmcqIGRhdGE7CisKKyAgICBDU3RyaW5nIHVucmVhY2hhYmxlVVJMOworfTsKKworI2Rl
ZmluZSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0dFVF9QUklWQVRFKG9iaikgICAgICAgIChHX1RZ
UEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJD
RSwgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUpKQorCitHX0RFRklORV9UWVBFKFdlYktpdFdl
YkRhdGFTb3VyY2UsIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2UsIEdfVFlQRV9PQkpFQ1QpOworCitz
dGF0aWMgdm9pZCB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2Rpc3Bvc2UoR09iamVjdCogb2JqZWN0
KQoreworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UgPSBXRUJLSVRfV0VC
X0RBVEFfU09VUkNFKG9iamVjdCk7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHBy
aXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAgQVNTRVJUKHByaXYtPmxvYWRlcik7Cisg
ICAgQVNTRVJUKCFwcml2LT5sb2FkZXItPmlzTG9hZGluZygpKTsKKyAgICBwcml2LT5sb2FkZXIt
PmRldGFjaERhdGFTb3VyY2UoKTsKKyAgICBwcml2LT5sb2FkZXItPmRlcmVmKCk7CisKKyAgICBp
ZiAocHJpdi0+aW5pdGlhbFJlcXVlc3QpCisgICAgICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPmlu
aXRpYWxSZXF1ZXN0KTsKKworICAgIGlmIChwcml2LT5uZXR3b3JrUmVxdWVzdCkKKyAgICAgICAg
Z19vYmplY3RfdW5yZWYocHJpdi0+bmV0d29ya1JlcXVlc3QpOworCisgICAgaWYgKHByaXYtPm1h
aW5SZXNvdXJjZSkKKyAgICAgICAgZ19vYmplY3RfdW5yZWYocHJpdi0+bWFpblJlc291cmNlKTsK
KworICAgIGlmIChwcml2LT5kYXRhKQorICAgICAgICBnX3N0cmluZ19mcmVlKHByaXYtPmRhdGEs
IEZBTFNFKTsKKworICAgIGlmIChwcml2LT5zdWJyZXNvdXJjZXMpIHsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBpPTA7IGkgPCBwcml2LT5zdWJyZXNvdXJjZXMtPmxlbjsgaSsrKSB7CisgICAgICAg
ICAgICBXZWJLaXRXZWJSZXNvdXJjZSogcmVzID0gJmdfYXJyYXlfaW5kZXgocHJpdi0+c3VicmVz
b3VyY2VzLCBXZWJLaXRXZWJSZXNvdXJjZSwgaSk7CisgICAgICAgICAgICBpZiAocmVzKQorICAg
ICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVmKHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBn
X2FycmF5X2ZyZWUocHJpdi0+c3VicmVzb3VyY2VzLCBUUlVFKTsKKyAgICB9CisKKyAgICBHX09C
SkVDVF9DTEFTUyh3ZWJraXRfd2ViX2RhdGFfc291cmNlX3BhcmVudF9jbGFzcyktPmRpc3Bvc2Uo
b2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5hbGl6
ZShHT2JqZWN0KiBvYmplY3QpCit7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJj
ZSA9IFdFQktJVF9XRUJfREFUQV9TT1VSQ0Uob2JqZWN0KTsKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZSogcHJpdiA9IGRhdGFTb3VyY2UtPnByaXY7CisKKyAgICBwcml2LT51bnJlYWNo
YWJsZVVSTCA9IENTdHJpbmcoKTsKKworICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfZGF0
YV9zb3VyY2VfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworc3RhdGljIHZv
aWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9jbGFzc19pbml0KFdlYktpdFdlYkRhdGFTb3VyY2VD
bGFzcyoga2xhc3MpCit7CisgICAgR09iamVjdENsYXNzKiBnb2JqZWN0X2NsYXNzID0gR19PQkpF
Q1RfQ0xBU1Moa2xhc3MpOworCisgICAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHdlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfZGlzcG9zZTsKKyAgICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHdl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfZmluYWxpemU7CisKKyAgICBnX3R5cGVfY2xhc3NfYWRkX3By
aXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9mKFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKSk7
Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaW5pdChXZWJLaXRXZWJE
YXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIHdlYkRhdGFTb3VyY2UtPnByaXYgPSBX
RUJLSVRfV0VCX0RBVEFfU09VUkNFX0dFVF9QUklWQVRFKHdlYkRhdGFTb3VyY2UpOworfQorCitX
ZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ld193aXRoX2xvYWRl
cihQYXNzUmVmUHRyPFdlYktpdDo6RG9jdW1lbnRMb2FkZXI+IGxvYWRlcikKK3sKKyAgICBXZWJL
aXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlID0gV0VCS0lUX1dFQl9EQVRBX1NPVVJDRShn
X29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFLCBOVUxMKSk7CisgICAgV2Vi
S2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAg
IHByaXYtPmxvYWRlciA9IGxvYWRlci5yZWxlYXNlUmVmKCk7CisKKyAgICByZXR1cm4gd2ViRGF0
YVNvdXJjZTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ldzoKKyAqIEBy
ZXF1ZXN0OiB0aGUgI1dlYktpdE5ldHdvcmtSZXF1ZXN0IHRvIHVzZSB0byBjcmVhdGUgdGhpcyBk
YXRhIHNvdXJjZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgI1dlYktpdFdlYkRhdGFTb3VyY2UgZnJv
bSBhICNXZWJLaXROZXR3b3JrUmVxdWVzdC4gTm9ybWFsbHksCisgKiAjV2ViS2l0V2ViRnJhbWUg
b2JqZWN0cyBjcmVhdGUgdGhlaXIgZGF0YSBzb3VyY2VzIHNvIHlvdSB3aWxsIGFsbW9zdCBuZXZl
cgorICogd2FudCB0byBpbnZva2UgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgKgorICogUmV0dXJu
czogYSBuZXcgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBTaW5jZTogMS4xLjEyCisgKi8K
K1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3KFdlYktpdE5l
dHdvcmtSZXF1ZXN0KiByZXF1ZXN0KQoreworICAgIEFTU0VSVChyZXF1ZXN0KTsKKworICAgIGNv
bnN0IGdjaGFyKiB1cmkgPSB3ZWJraXRfbmV0d29ya19yZXF1ZXN0X2dldF91cmkocmVxdWVzdCk7
CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhc291cmNlOworICAgIGRhdGFzb3VyY2Ug
PSB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ld193aXRoX2xvYWRlcigKKyAgICAgICAgV2ViS2l0
OjpEb2N1bWVudExvYWRlcjo6Y3JlYXRlKFJlc291cmNlUmVxdWVzdChLVVJMKEtVUkwoKSwgU3Ry
aW5nOjpmcm9tVVRGOCh1cmkpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBTdWJzdGl0dXRlRGF0YSgpKSk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0
ZSogcHJpdiA9IGRhdGFzb3VyY2UtPnByaXY7CisgICAgcHJpdi0+aW5pdGlhbFJlcXVlc3QgPSBy
ZXF1ZXN0OworCisgICAgcmV0dXJuIGRhdGFzb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9nZXRfd2ViX2ZyYW1lCisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdl
YkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSAjV2ViS2l0V2ViRnJhbWUgdGhhdCByZXBy
ZXNlbnRzIHRoaXMgZGF0YSBzb3VyY2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSAjV2ViS2l0
V2ViRnJhbWUgdGhhdCByZXByZXNlbnRzIHRoZSBAZGF0YV9zb3VyY2UKKyAqCisgKiBTaW5jZTog
MS4xLjEyCisgKi8KK1dlYktpdFdlYkZyYW1lKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF93
ZWJfZnJhbWUoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3Jl
dHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2Up
LCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0
YVNvdXJjZS0+cHJpdjsKKyAgICBGcmFtZUxvYWRlciogZnJhbWVMb2FkZXIgPSBwcml2LT5sb2Fk
ZXItPmZyYW1lTG9hZGVyKCk7CisKKyAgICBBU1NFUlQoZnJhbWVMb2FkZXIpOworCisgICAgV2Vi
S2l0OjpGcmFtZUxvYWRlckNsaWVudCogZnJhbWVMb2FkZXJDbGllbnQgPSBzdGF0aWNfY2FzdDxX
ZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Kj4oZnJhbWVMb2FkZXItPmNsaWVudCgpKTsKKyAgICBy
ZXR1cm4gZnJhbWVMb2FkZXJDbGllbnQtPndlYkZyYW1lKCk7Cit9CisKKy8qKgorICogd2Via2l0
X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0OgorICogQGRhdGFfc291cmNlOiBh
ICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUg
b3JpZ2luYWwgcmVxdWVzdCB0aGF0IHdhcyB1c2VkIHRvIGxvYWQgdGhlIHdlYgorICogY29udGVu
dAorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIG9yaWdpbmFsICNXZWJLaXROZXR3b3JrUmVxdWVz
dAorICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLworV2ViS2l0TmV0d29ya1JlcXVlc3QqIHdlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2luaXRpYWxfcmVxdWVzdChXZWJLaXRXZWJEYXRhU291cmNl
KiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19X
RUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIFJlc291cmNl
UmVxdWVzdCByZXF1ZXN0ID0gcHJpdi0+bG9hZGVyLT5vcmlnaW5hbFJlcXVlc3QoKTsKKworICAg
IGlmICghcHJpdi0+aW5pdGlhbFJlcXVlc3QpCisgICAgICAgIHByaXYtPmluaXRpYWxSZXF1ZXN0
ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXcocmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBwcml2LT5pbml0aWFsUmVxdWVzdDsKK30KKworLyoq
CisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9uZXR3b3JrX3JlcXVlc3Q6CisgKiBAZGF0
YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIGEgI1dlYktp
dE5ldHdvcmtSZXF1ZXN0IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgI1dlYktpdFdlYkRh
dGFTb3VyY2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSAjV2ViS2l0TmV0d29ya1JlcXVlc3Qg
dGhhdCBjcmVhdGVkIHRoZSBAZGF0YV9zb3VyY2UKKyAqCisgKiBTaW5jZSAxLjEuMTIKKyAqLwor
V2ViS2l0TmV0d29ya1JlcXVlc3QqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3Qo
V2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsK
KworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+
cHJpdjsKKyAgICBGcmFtZUxvYWRlciogZnJhbWVMb2FkZXIgPSBwcml2LT5sb2FkZXItPmZyYW1l
TG9hZGVyKCk7CisgICAgaWYgKCFmcmFtZUxvYWRlciB8fCAhZnJhbWVMb2FkZXItPmZyYW1lSGFz
TG9hZGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUmVzb3VyY2VSZXF1ZXN0IHJl
cXVlc3QgPSBwcml2LT5sb2FkZXItPnJlcXVlc3QoKTsKKworICAgICBpZiAoIXByaXYtPm5ldHdv
cmtSZXF1ZXN0KQorICAgICAgICAgcHJpdi0+bmV0d29ya1JlcXVlc3QgPSB3ZWJraXRfbmV0d29y
a19yZXF1ZXN0X25ld193aXRoX2NvcmVfcmVxdWVzdChyZXF1ZXN0KTsKKworICAgIHJldHVybiBw
cml2LT5uZXR3b3JrUmVxdWVzdDsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF90ZXh0X2VuY29kaW5nX25hbWU6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRh
dGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgYXMgc2V0IGlu
IHRoZSAjV2ViS2l0V2ViVmlldywgb3IgaWYgbm90LCB0aGUKKyAqIHRleHQgZW5jb2Rpbmcgb2Yg
dGhlIHJlc3BvbnNlLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIGVuY29kaW5nIG5hbWUgb2Yg
dGhlICNXZWJLaXRXZWJWaWV3IG9yIG9mIHRoZSByZXNwb25zZQorICoKKyAqIFNpbmNlOiAxLjEu
MTIKKyAqLworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0
X3RleHRfZW5jb2RpbmdfbmFtZShXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQor
eworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2Vi
RGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHBy
aXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIFN0cmluZyB0ZXh0RW5jb2RpbmdOYW1lID0g
cHJpdi0+bG9hZGVyLT5vdmVycmlkZUVuY29kaW5nKCk7CisKKyAgICBpZiAoIXRleHRFbmNvZGlu
Z05hbWUpCisgICAgICAgIHRleHRFbmNvZGluZ05hbWUgPSBwcml2LT5sb2FkZXItPnJlc3BvbnNl
KCkudGV4dEVuY29kaW5nTmFtZSgpOworCisgICAgcmV0dXJuIHRleHRFbmNvZGluZ05hbWUudXRm
OCgpLmRhdGEoKTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2lzX2xvYWRp
bmc6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBEZXRl
cm1pbmVzIHdoZXRoZXIgdGhlIGRhdGEgc291cmNlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRp
bnQgaXRzIGNvbnRlbnQuCisgKgorICogUmV0dXJuIHZhbHVlOiAlVFJVRSBpZiB0aGUgQGRhdGFf
c291cmNlIGlzIHN0aWxsIGxvYWRpbmcsICVGQUxTRSBvdGhlcndpc2UKKyAqCisgKiBTaW5jZTog
MS4xLjEyCisgKi8KK2dib29sZWFuIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZyhX
ZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9p
Zl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOwor
CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5w
cml2OworCisgICAgcmV0dXJuIHByaXYtPmxvYWRlci0+aXNMb2FkaW5nSW5BUElTZW5zZSgpOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2RhdGE6CisgKiBAZGF0YV9z
b3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSByYXcgZGF0
YSB0aGF0IHJlcHJlc2VudHMgdGhlIHRoZSBmcmFtZSdzIGNvbnRlbnQuVGhlIGRhdGEgd2lsbAor
ICogYmUgaW5jb21wbGV0ZSB1bnRpbCB0aGUgZGF0YSBoYXMgZmluaXNoZWQgbG9hZGluZy4gUmV0
dXJucyAlTlVMTCBpZiB0aGUgd2ViCisgKiBmcmFtZSBoYXNuJ3QgbG9hZGVkIGFueSBkYXRhLiBV
c2Ugd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pc19sb2FkaW5nIHRvIHRlc3QKKyAqIGlmIGRhdGEg
c291cmNlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcuCisgKgorICogUmV0dXJuIHZhbHVl
OiBhICNHU3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSByYXcgZGF0YSB0aGF0IHJlcHJlc2VudHMg
dGhlIEBkYXRhX3NvdXJjZSBvciAlTlVMTCBpZiB0aGUKKyAqIEBkYXRhX3NvdXJjZSBoYXNuJ3Qg
bG9hZGVkIGFueSBkYXRhLgorICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLworR19DT05TVF9SRVRV
Uk4gR1N0cmluZyogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfZGF0YShXZWJLaXRXZWJEYXRh
U291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJ
VF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0
V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAg
UmVmUHRyPFNoYXJlZEJ1ZmZlcj4gbWFpblJlc291cmNlRGF0YSA9IHByaXYtPmxvYWRlci0+bWFp
blJlc291cmNlRGF0YSgpOworCisgICAgaWYgKCFtYWluUmVzb3VyY2VEYXRhKQorICAgICAgICBy
ZXR1cm4gTlVMTDsKKworICAgIGlmICghcHJpdi0+ZGF0YSkKKyAgICAgICAgcHJpdi0+ZGF0YSA9
IGdfc3RyaW5nX25ldyhtYWluUmVzb3VyY2VEYXRhLT5kYXRhKCkpOworCisgICAgcmV0dXJuIHBy
aXYtPmRhdGE7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfbWFpbl9y
ZXNvdXJjZToKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAq
IFJldHVybnMgdGhlIG1haW4gcmVzb3VyY2Ugb2YgdGhlIEBkYXRhX3NvdXJjZQorICoKKyAqIFJl
dHVybiB2YWx1ZTogYSBuZXcgI1dlYktpdFdlYlJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgbWFp
biByZXNvdXJjZSBvZgorICogdGhlIEBkYXRhX3NvdXJjZS4KKyAqCisgKiBTaW5jZTogMS4xLjEy
CisgKi8KK1dlYktpdFdlYlJlc291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9tYWlu
X3Jlc291cmNlKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19y
ZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNl
KSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRh
dGFTb3VyY2UtPnByaXY7CisKKyAgICBSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiBjb3JlUmVzb3Vy
Y2UgPSBwcml2LT5sb2FkZXItPm1haW5SZXNvdXJjZSgpOworCisgICAgQVNTRVJUKGNvcmVSZXNv
dXJjZSk7CisKKyAgICBpZiAoIXByaXYtPm1haW5SZXNvdXJjZSkKKyAgICAgICAgcHJpdi0+bWFp
blJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9uZXdfd2l0aF9jb3JlX3Jlc291cmNlKGNv
cmVSZXNvdXJjZS5yZWxlYXNlKCkpOworCisgICAgcmV0dXJuIHByaXYtPm1haW5SZXNvdXJjZTsK
K30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJjZXM6Cisg
KiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRo
ZSBAZGF0YV9zb3VyY2Ugc3VicmVzb3VyY2VzIHRoYXQgaGF2ZSBmaW5pc2hlZCBkb3dubG9hZGlu
ZworICoKKyAqIFJldHVybiB2YWx1ZTogYSAjR0FycmF5IG9mICNXZWJLaXRXZWJSZXNvdXJjZS4g
VGhlIGFycmF5IGlmIG93bmVkIGJ5IFdlYktpdAorICogYW5kIHNob3VsZCBub3QgYmUgZnJlZWQg
b3IgZGVzdHJveWVkLgorICoKKyAqIFNpbmNlOiAxLjEuMTIKKyAqLworR0FycmF5KiB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJjZXMoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Vi
RGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RB
VEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3Vy
Y2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKworICAgIFZlY3RvcjxQYXNz
UmVmUHRyPEFyY2hpdmVSZXNvdXJjZT4gPiBjb3JlU3VicmVzb3VyY2VzOworICAgIHByaXYtPmxv
YWRlci0+Z2V0U3VicmVzb3VyY2VzKGNvcmVTdWJyZXNvdXJjZXMpOworCisgICAgaWYgKCFwcml2
LT5zdWJyZXNvdXJjZXMpIHsKKyAgICAgICAgcHJpdi0+c3VicmVzb3VyY2VzID0gZ19hcnJheV9u
ZXcoRkFMU0UsIEZBTFNFLCBzaXplb2YoV2ViS2l0V2ViUmVzb3VyY2UpKTsKKworICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29yZVN1YnJlc291cmNlcy5zaXplKCk7IGkrKykgewor
ICAgICAgICAgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHJlc291cmNlID0gd2Via2l0X3dlYl9yZXNv
dXJjZV9uZXdfd2l0aF9jb3JlX3Jlc291cmNlKGNvcmVTdWJyZXNvdXJjZXMuYXQoaSkpOworICAg
ICAgICAgICAgaWYgKHJlc291cmNlKQorICAgICAgICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3Zh
bChwcml2LT5zdWJyZXNvdXJjZXMsIHJlc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiBwcml2LT5zdWJyZXNvdXJjZXM7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9nZXRfcmVzb3VyY2VfZm9yX3VybDoKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0
V2ViRGF0YVNvdXJjZQorICogQHVybDogdGhlIHVybCBvZiBhIHJlc291cmNlCisgKgorICogUmV0
dXJucyB0aGUgI1dlYktpdFdlYlJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJMCisgKgorICogUmV0
dXJuIHZhbHVlOiB0aGUgI1dlYktpdFdlYlJlc291cmNlIGZvciBAdXJsCisgKgorICogU2luY2U6
IDEuMS4xMgorICovCitXZWJLaXRXZWJSZXNvdXJjZSogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9n
ZXRfcmVzb3VyY2VfZm9yX3VybChXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlLCBj
b25zdCBnY2hhciogdXJsKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19X
RUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworCisgICAgUmVmUHRy
PEFyY2hpdmVSZXNvdXJjZT4gY29yZVJlc291cmNlID0gcHJpdi0+bG9hZGVyLT5zdWJyZXNvdXJj
ZShLVVJMKEtVUkwoKSxTdHJpbmc6OmZyb21VVEY4KHVybCkpKTsKKyAgICBpZiAoIWNvcmVSZXNv
dXJjZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gd2Via2l0X3dlYl9yZXNv
dXJjZV9uZXdfd2l0aF9jb3JlX3Jlc291cmNlKGNvcmVSZXNvdXJjZS5yZWxlYXNlKCkpOworfQor
CisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291cmNlOgorICogQGRh
dGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKiBAc3VicmVzb3VyY2U6IGEgI1dl
YktpdFdlYlJlc291cmNlCisgKgorICogQWRkcyBAc3VicmVzb3VyY2UgdG8gdGhlIGxpc3Qgb2Yg
c3VicmVzb3VyY2VzIG9mIEBkYXRhX3NvdXJjZQorICoKKyAqIFNpbmNlIDEuMS4xMgorICovCit2
b2lkIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291cmNlKFdlYktpdFdlYkRhdGFT
b3VyY2UqIHdlYkRhdGFTb3VyY2UsIFdlYktpdFdlYlJlc291cmNlKiBzdWJyZXNvdXJjZSkKK3sK
KyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNv
dXJjZSkpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRShzdWJy
ZXNvdXJjZSkpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJE
YXRhU291cmNlLT5wcml2OworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSogcmVzb3VyY2VQ
cml2ID0gV0VCS0lUX1dFQl9SRVNPVVJDRV9HRVRfUFJJVkFURShzdWJyZXNvdXJjZSk7CisKKyAg
ICBwcml2LT5sb2FkZXItPmFkZEFyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVByaXYtPnJlc291cmNl
KTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF91bnJlYWNoYWJsZV91
cmw6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1
cm4gdGhlIHVucmVhY2hhYmxlIFVSTCBvZiBAZGF0YV9zb3VyY2UuIFRoZSBAZGF0YV9zb3VyY2Ug
d2lsbCBoYXZlIGFuCisgKiB1bnJlYWNoYWJsZSBVUkwgaWYgaXQgd2FzIGNyZWF0ZWQgdXNpbmcg
I1dlYktpdFdlYkZyYW1lJ3MKKyAqIHdlYmtpdF93ZWJfZnJhbWVfbG9hZF9hbHRlcm5hdGVfaHRt
bF9zdHJpbmcgbWV0aG9kLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIHVucmVhY2hhYmxlIFVS
TCBvZiBAZGF0YV9zb3VyY2Ugb3IgJU5VTEwgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAqCisgKiBT
aW5jZSAxLjEuMTIKKyAqLworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfZGF0YV9z
b3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VybChXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291
cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VS
Q0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZh
dGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIGNvbnN0IEtVUkwmIHVucmVhY2hh
YmxlVVJMID0gcHJpdi0+bG9hZGVyLT51bnJlYWNoYWJsZVVSTCgpOworCisgICAgaWYgKHVucmVh
Y2hhYmxlVVJMLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwcml2LT51
bnJlYWNoYWJsZVVSTCA9IHVucmVhY2hhYmxlVVJMLnN0cmluZygpLnV0ZjgoKTsKKworICAgIHJl
dHVybiBwcml2LT51bnJlYWNoYWJsZVVSTC5kYXRhKCk7Cit9CkluZGV4OiBXZWJLaXQvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2ViZGF0YXNvdXJjZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVs
bAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaAkyMDA5LTA3LTE4IDE2OjM2OjI4LjQxNDc5
NTgwMyArMTAwMApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBK
YW4gTWljaGFlbCBDLiBBbG9uem8KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0gKKyNk
ZWZpbmUgV0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5j
bHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkZWZpbmVzLmg+
CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmZyYW1lLmg+CisjaW5jbHVkZSA8d2Via2l0L3dl
YmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRf
VFlQRV9XRUJfREFUQV9TT1VSQ0UgICAgICAgICAgICAod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9n
ZXRfdHlwZSgpKQorI2RlZmluZSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAg
ICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRB
X1NPVVJDRSwgV2ViS2l0V2ViRGF0YVNvdXJjZSkpCisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9T
T1VSQ0VfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCAg
V0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFLCBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MpKQor
I2RlZmluZSBXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NI
RUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSkpCisj
ZGVmaW5lIFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hF
Q0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFKSkKKyNk
ZWZpbmUgV0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNU
QU5DRV9HRVRfQ0xBU1MoKG9iaiksICBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktp
dFdlYkRhdGFTb3VyY2VDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZSBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTsKKworc3RydWN0IF9XZWJLaXRX
ZWJEYXRhU291cmNlIHsKKyAgICBHT2JqZWN0IHBhcmVudF9pbnN0YW5jZTsKKworICAgIC8qPCBw
cml2YXRlID4qLworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlICpwcml2OworfTsKKwor
c3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MgeworICAgIEdPYmplY3RDbGFzcyBwYXJl
bnRfY2xhc3M7CisKKyAgICAvKiBQYWRkaW5nIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAg
dm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQwKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVz
ZXJ2ZWQxKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQyKSAodm9pZCk7Cisg
ICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQzKSAodm9pZCk7Cit9OworCitXRUJLSVRfQVBJIEdU
eXBlCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90eXBlICh2b2lkKTsKKworV0VCS0lUX0FQ
SSBXZWJLaXRXZWJEYXRhU291cmNlICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3ICAgICAg
ICAgICAgICAgICAgICAoV2ViS2l0TmV0d29ya1JlcXVlc3QgKnJlcXVlc3QpOworCitXRUJLSVRf
QVBJIFdlYktpdFdlYkZyYW1lICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFt
ZSAgICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lU
X0FQSSBXZWJLaXROZXR3b3JrUmVxdWVzdCAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9p
bml0aWFsX3JlcXVlc3QgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisK
K1dFQktJVF9BUEkgV2ViS2l0TmV0d29ya1JlcXVlc3QgKgord2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfcmVxdWVzdCAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKwor
V0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF90ZXh0X2VuY29kaW5nX25hbWUgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJj
ZSk7CisKK1dFQktJVF9BUEkgZ2Jvb2xlYW4KK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9h
ZGluZyAgICAgICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKwor
V0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBHU3RyaW5nICoKK3dlYmtpdF93ZWJfZGF0YV9zb3Vy
Y2VfZ2V0X2RhdGEgICAgICAgICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291
cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRfd2ViX2RhdGFf
c291cmNlX2dldF9tYWluX3Jlc291cmNlICAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRh
X3NvdXJjZSk7CisKK1dFQktJVF9BUEkgR0FycmF5ICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
Z2V0X3N1YnJlc291cmNlcyAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNl
KTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9yZXNvdXJjZV9mb3JfdXJsICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3Nv
dXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgZ2NoYXIgICAgICAgICAgKnVybCk7CisKK1dFQktJVF9BUEkgdm9pZAord2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9hZGRfc3VicmVzb3VyY2UgICAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAq
ZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFdlYktpdFdlYlJlc291cmNlICAgICpzdWJyZXNvdXJjZSk7CisKK1dFQktJVF9BUEkgR19D
T05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdW5yZWFjaGFi
bGVfdXJsICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitHX0VORF9E
RUNMUworCisjZW5kaWYgLyogV0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9IICovCkluZGV4OiBXZWJL
aXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC5vcmlnL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcAkyMDA5LTA3LTE4
IDE2OjA0OjUyLjA1OTgwMTgwOSArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdHdlYmZyYW1lLmNwcAkyMDA5LTA3LTE4IDE2OjA1OjQzLjU3MDc2NTc3MyArMTAwMApAQCAt
ODA4LDcgKzgwOCw3IEBAIHVuc2lnbmVkIGludCB3ZWJraXRfd2ViX2ZyYW1lX251bWJlcl9vZl8K
IGdjaGFyKiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9yZXNwb25zZV9taW1lX3R5cGUoV2ViS2l0V2Vi
RnJhbWUqIGZyYW1lKQogewogICAgIEZyYW1lKiBjb3JlRnJhbWUgPSBjb3JlKGZyYW1lKTsKLSAg
ICBEb2N1bWVudExvYWRlciogZG9jTG9hZGVyID0gY29yZUZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1l
bnRMb2FkZXIoKTsKKyAgICBXZWJDb3JlOjpEb2N1bWVudExvYWRlciogZG9jTG9hZGVyID0gY29y
ZUZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKTsKICAgICBTdHJpbmcgbWltZVR5cGUg
PSBkb2NMb2FkZXItPnJlc3BvbnNlTUlNRVR5cGUoKTsKICAgICByZXR1cm4gZ19zdHJkdXAobWlt
ZVR5cGUudXRmOCgpLmRhdGEoKSk7CiB9Cg==
</data>
<flag name="review"
          id="17356"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33016</attachid>
            <date>2009-07-18 01:04:35 -0700</date>
            <delta_ts>2009-08-28 00:31:14 -0700</delta_ts>
            <desc>Updated frame data source API patch</desc>
            <filename>framedatasourceapi</filename>
            <type>text/plain</type>
            <size>12783</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvQ2hhbmdl
TG9nCTIwMDktMDctMTggMTg6MDA6MDEuNjkwNzkwNDYxICsxMDAwCisrKyBXZWJLaXQvQ2hhbmdl
TG9nCTIwMDktMDctMTggMTg6MDA6MzQuODE0NzY1NzczICsxMDAwCkBAIC03LDYgKzcsMTEgQEAK
IAogICAgICAgICBBZGQgV2ViS2l0V2ViRGF0YVNvdXJjZSBhbmQgRG9jdW1lbnRMb2FkZXJHdGsg
dG8gdGhlIGJ1aWxkIHNjcmlwdC4KIAorICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRh
U291cmNlIGZvciB0aGUgZ3RrIHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTI0NzU4CisKKyAgICAgICAgQWRkIFdlYktpdFdlYkRhdGFTb3VyY2Ug
dW5pdCB0ZXN0IHRvIHRoZSBidWlsZCBzY3JpcHQKKwogICAgICAgICAqIEdOVW1ha2VmaWxlLmFt
OgogCiAyMDA5LTA0LTA0ICBKYW4gTWljaGFlbCBBbG9uem8gIDxqbWFsb256b0B3ZWJraXQub3Jn
PgpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC5vcmlnL1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDctMTggMTg6MDA6MDEuNjk0NzgwMjgz
ICsxMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay9DaGFuZ2VMb2cJMjAwOS0wNy0xOCAxODowMDoz
NC44MjY3NjcxNTggKzEwMDAKQEAgLTUsNiArNSwyNyBAQAogICAgICAgICBbR3RrXSBJbXBsZW1l
bnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUgZ3RrIHBvcnQKICAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NzU4CiAKKyAgICAgICAgQWRkIGRhdGEgc291
cmNlIEFQSSBnZXR0ZXJzIHRvIFdlYktpdFdlYkZyYW1lLgorICAgICAgICBBbHNvIGFkZCBXZWJL
aXRXZWJEYXRhU291cmNlIHVuaXQgdGVzdC4KKworICAgICAgICAqIHRlc3RzL3Rlc3R3ZWJkYXRh
c291cmNlLmM6IEFkZGVkLgorICAgICAgICAod2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfc2V0dXAp
OgorICAgICAgICAod2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOgorICAgICAgICAo
dGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QpOgorICAgICAg
ICAodGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90ZXh0X2VuY29kaW5nX25hbWUpOgor
ICAgICAgICAodGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0KToKKyAgICAg
ICAgKHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9yZXNvdXJjZXMpOgorICAgICAgICAobWFp
bik6CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcDoKKyAgICAgICAgKiB3ZWJr
aXQvd2Via2l0d2ViZnJhbWUuaDoKKworMjAwOS0wNy0xNyAgSmFuIE1pY2hhZWwgQWxvbnpvICA8
am1hbG9uem9Ad2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUgZ3Rr
IHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0
NzU4CisKICAgICAgICAgU3ViY2xhc3MgRG9jdW1lbnRMb2FkZXIgZm9yIEd0ayBhbmQgaW1wbGVt
ZW50IGl0IHVuZGVyIHRoZSBXZWJLaXQKICAgICAgICAgbmFtZXNwYWNlLiBBZGQgV2ViS2l0V2Vi
RGF0YVNvdXJjZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNsb3NlbHkKICAgICAgICAgZm9sbG93cyB0
aGUgbWFjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0
ay90ZXN0cy90ZXN0d2ViZGF0YXNvdXJjZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcw
LTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvdGVz
dHMvdGVzdHdlYmRhdGFzb3VyY2UuYwkyMDA5LTA3LTE4IDE4OjAwOjM0LjgyNjc2NzE1OCArMTAw
MApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFl
bCBBbG9uem8KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVk
ZSA8d2Via2l0L3dlYmtpdC5oPgorCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OKDIsIDE2LCAwKSAm
JiBHVEtfQ0hFQ0tfVkVSU0lPTigyLCAxNCwgMCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdl
YktpdFdlYlZpZXcqIHdlYlZpZXc7CisgICAgV2ViS2l0V2ViRnJhbWUqIG1haW5GcmFtZTsKK30g
V2ViRGF0YVNvdXJjZUZpeHR1cmU7CisKK3N0YXRpYyB2b2lkIHdlYl9kYXRhX3NvdXJjZV9maXh0
dXJlX3NldHVwKFdlYkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGZp
eHR1cmUtPndlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsK
KyAgICBnX29iamVjdF9yZWZfc2luayhmaXh0dXJlLT53ZWJWaWV3KTsKKyAgICBmaXh0dXJlLT5t
YWluRnJhbWUgPSB3ZWJraXRfd2ViX3ZpZXdfZ2V0X21haW5fZnJhbWUoZml4dHVyZS0+d2ViVmll
dyk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYl9kYXRhX3NvdXJjZV9maXh0dXJlX3RlYXJkb3duKFdl
YkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGdfYXNzZXJ0KGZp
eHR1cmUtPm1haW5GcmFtZSAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydChmaXh0dXJlLT53ZWJWaWV3
ICE9IE5VTEwpOworICAgIHdlYmtpdF93ZWJfZnJhbWVfc3RvcF9sb2FkaW5nKGZpeHR1cmUtPm1h
aW5GcmFtZSk7CisgICAgZ19vYmplY3RfdW5yZWYoZml4dHVyZS0+d2ViVmlldyk7Cit9CisKK3N0
YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0
KFdlYkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQor
eworICAgIFdlYktpdFdlYkRhdGFTb3VyY2UqIGRhdGFTb3VyY2U7CisgICAgV2ViS2l0TmV0d29y
a1JlcXVlc3QqIGluaXRpYWxSZXF1ZXN0OworCisgICAgV2ViS2l0TmV0d29ya1JlcXVlc3QqIHJl
cXVlc3QgPSB3ZWJraXRfbmV0d29ya19yZXF1ZXN0X25ldygiaHR0cDovL3d3dy5nb29nbGUuY29t
Iik7CisgICAgd2Via2l0X3dlYl9mcmFtZV9sb2FkX3JlcXVlc3QoZml4dHVyZS0+bWFpbkZyYW1l
LCByZXF1ZXN0KTsKKyAgICBnX29iamVjdF91bnJlZihyZXF1ZXN0KTsKKworICAgIGRhdGFTb3Vy
Y2UgPSB3ZWJraXRfd2ViX2ZyYW1lX2dldF9wcm92aXNpb25hbF9kYXRhX3NvdXJjZShmaXh0dXJl
LT5tYWluRnJhbWUpOworICAgIGdfYXNzZXJ0KGRhdGFTb3VyY2UpOworICAgIGluaXRpYWxSZXF1
ZXN0ID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0KGRhdGFTb3Vy
Y2UpOworICAgIGdfYXNzZXJ0X2NtcHN0cih3ZWJraXRfbmV0d29ya19yZXF1ZXN0X2dldF91cmko
aW5pdGlhbFJlcXVlc3QpLCA9PSwgImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iKTsKKworfQorCitz
dGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRfZW5jb2Rpbmdf
bmFtZShXZWJEYXRhU291cmNlRml4dHVyZSogZml4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIg
ZGF0YSkKK3sKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhU291cmNlOworCisgICAgd2Vi
a2l0X3dlYl9mcmFtZV9sb2FkX3N0cmluZyhmaXh0dXJlLT5tYWluRnJhbWUsICI8aHRtbD48L2h0
bWw+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWwiLCAidXRm
OCIsICJhYm91dDpibGFuayIpOworICAgIGRhdGFTb3VyY2UgPSB3ZWJraXRfd2ViX2ZyYW1lX2dl
dF9kYXRhX3NvdXJjZShmaXh0dXJlLT5tYWluRnJhbWUpOworCisgICAgZ19hc3NlcnRfY21wc3Ry
KCJ1dGY4IiwgPT0sIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRfZW5jb2RpbmdfbmFt
ZShkYXRhU291cmNlKSk7CisKK30KKworc3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX2RhdGFf
c291cmNlX2dldF9yZXF1ZXN0KFdlYkRhdGFTb3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50
ZXIgZGF0YSkKK3sKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBkYXRhU291cmNlOworCisgICAg
d2Via2l0X3dlYl9mcmFtZV9sb2FkX3VyaShmaXh0dXJlLT5tYWluRnJhbWUsICJodHRwOi8vd3d3
Lmdvb2dsZS5jb20vIik7CisgICAgZGF0YVNvdXJjZSA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3By
b3Zpc2lvbmFsX2RhdGFfc291cmNlKGZpeHR1cmUtPm1haW5GcmFtZSk7CisKKyAgICBXZWJLaXRO
ZXR3b3JrUmVxdWVzdCogcmVxdWVzdCA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVl
c3QoZGF0YVNvdXJjZSk7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF9uZXR3b3JrX3JlcXVl
c3RfZ2V0X3VyaShyZXF1ZXN0KSw9PSwiaHR0cDovL3d3dy5nb29nbGUuY29tLyIpOworfQorCitz
dGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfcmVzb3VyY2VzKFdlYkRhdGFT
b3VyY2VGaXh0dXJlKiBmaXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZSogZGF0YVNvdXJjZTsKKworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJj
ZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3KCI8aW1nLz4iLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZS5odG1sIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAidXRmOCIsIE5VTEwpOworICAgIHdlYmtpdF93ZWJfZnJh
bWVfbG9hZF9zdHJpbmcoZml4dHVyZS0+bWFpbkZyYW1lLCAiPGh0bWw+PC9odG1sPiIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwgInV0ZjgiLCAiaHR0cDov
L2V4YW1wbGUuY29tIik7CisgICAgZGF0YVNvdXJjZSA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2Rh
dGFfc291cmNlKGZpeHR1cmUtPm1haW5GcmFtZSk7CisgICAgZ19hc3NlcnQoZGF0YVNvdXJjZSk7
CisgICAgZ19hc3NlcnQod2ViUmVzb3VyY2UpOworICAgIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
YWRkX3N1YnJlc291cmNlKGRhdGFTb3VyY2UsIHdlYlJlc291cmNlKTsKKyAgICBXZWJLaXRXZWJS
ZXNvdXJjZSogcmVzID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVzb3VyY2VfZm9yX3Vy
bChkYXRhU291cmNlLCAiaW1hZ2UuaHRtbCIpOworCisgICAgZ19hc3NlcnRfY21wc3RyKCJpbWFn
ZS5odG1sIiwgPT0sIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybChyZXMpKTsKK30KKworaW50
IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGdfdGhyZWFkX2luaXQoTlVMTCk7
CisgICAgZ3RrX3Rlc3RfaW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgICAgZ190ZXN0X2J1
Z19iYXNlKCJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy8iKTsKKyAgICBnX3Rlc3RfYWRkKCIvd2Vi
a2l0L3dlYmRhdGFzb3VyY2UvZ2V0X3RleHRfZW5jb2RpbmdfbmFtZSIsCisgICAgICAgICAgICAg
ICBXZWJEYXRhU291cmNlRml4dHVyZSwgMCwgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfc2V0dXAs
CisgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3RleHRfZW5j
b2RpbmdfbmFtZSwgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOworICAgIGdfdGVz
dF9hZGQoIi93ZWJraXQvd2ViZGF0YXNvdXJjZS9nZXRfaW5pdGlhbF9yZXF1ZXN0IiwKKyAgICAg
ICAgICAgICAgIFdlYkRhdGFTb3VyY2VGaXh0dXJlLCAwLCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVy
ZV9zZXR1cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRf
aW5pdGlhbF9yZXF1ZXN0LCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisgICAg
Z190ZXN0X2FkZCgiL3dlYmtpdC93ZWJkYXRhc291cmNlL2dldF9yZXF1ZXN0IiwKKyAgICAgICAg
ICAgICAgIFdlYkRhdGFTb3VyY2VGaXh0dXJlLCAwLCB3ZWJfZGF0YV9zb3VyY2VfZml4dHVyZV9z
ZXR1cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfcmVx
dWVzdCwgd2ViX2RhdGFfc291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOworICAgIGdfdGVzdF9hZGQo
Ii93ZWJraXQvd2ViZGF0YXNvdXJjZS9yZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgV2ViRGF0
YVNvdXJjZUZpeHR1cmUsIDAsIHdlYl9kYXRhX3NvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAg
ICAgICAgICAgdGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlX3Jlc291cmNlcywgd2ViX2RhdGFf
c291cmNlX2ZpeHR1cmVfdGVhcmRvd24pOworCisgICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9
CisKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgZ19jcml0
aWNhbCgiWW91IHdpbGwgbmVlZCBhdCBsZWFzdCBnbGliLTIuMTYuMCBhbmQgZ3RrLTIuMTQuMCB0
byBydW4gdGhlIHVuaXQgdGVzdHMuIERvaW5nIG5vdGhpbmcgbm93LiIpOworICAgIHJldHVybiAw
OworfQorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJm
cmFtZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJraXQvd2Vi
a2l0d2ViZnJhbWUuY3BwCTIwMDktMDctMTggMTg6MDA6MDEuNzEwNzYzNjY5ICsxMDAwCisrKyBX
ZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuY3BwCTIwMDktMDctMTggMTg6
MDA6MzQuODM0NzY2MzU5ICsxMDAwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiQW5pbWF0
aW9uQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkNTdHJpbmcuaCIKICNpbmNsdWRlICJEb2N1bWVu
dExvYWRlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyR3RrLmgiCiAjaW5jbHVkZSAiRnJh
bWVMb2FkZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEd0ay5oIgogI2luY2x1ZGUg
IkZyYW1lVHJlZS5oIgpAQCAtMTI4LDYgKzEyOSwxMSBAQCB2b2lkIHdlYmtpdF93ZWJfZnJhbWVf
Y29yZV9mcmFtZV9nb25lKFdlCiAgICAgZnJhbWUtPnByaXYtPmNvcmVGcmFtZSA9IDA7CiB9CiAK
K3N0YXRpYyBXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3Nv
dXJjZV9mcm9tX2NvcmVfbG9hZGVyKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBsb2FkZXIpCit7
CisgICAgcmV0dXJuIGxvYWRlciA/IHN0YXRpY19jYXN0PFdlYktpdDo6RG9jdW1lbnRMb2FkZXIq
Pihsb2FkZXIpLT5kYXRhU291cmNlKCkgOiBOVUxMOworfQorCiBzdGF0aWMgdm9pZCB3ZWJraXRf
d2ViX2ZyYW1lX2ZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJLaXRXZWJGcmFt
ZSogZnJhbWUgPSBXRUJLSVRfV0VCX0ZSQU1FKG9iamVjdCk7CkBAIC01OTgsNiArNjA0LDYwIEBA
IEpTR2xvYmFsQ29udGV4dFJlZiB3ZWJraXRfd2ViX2ZyYW1lX2dldF8KIH0KIAogLyoqCisgKiB3
ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZToKKyAqIEBmcmFtZTogYSAjV2ViS2l0V2Vi
RnJhbWUKKyAqCisgKiBSZXR1cm5zIHRoZSBjb21taXR0ZWQgZGF0YSBzb3VyY2UuCisgKgorICog
UmV0dXJuIHZhbHVlOiB0aGUgY29tbWl0dGVkICNXZWJLaXRXZWJEYXRhU291cmNlIG9yICVOVUxM
IGlmIHRoZQorICogcHJvdmlzaW9uYWwgZGF0YSBzb3VyY2UgaXMgbm90IGRvbmUgbG9hZGluZy4K
KyAqCisgKiBTaW5jZTogMS4xLjUKKyAqLworV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Via2l0X3dl
Yl9mcmFtZV9nZXRfZGF0YV9zb3VyY2UoV2ViS2l0V2ViRnJhbWUqIGZyYW1lKQoreworICAgIGdf
cmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfRlJBTUUoZnJhbWUpLCBOVUxMKTsKKwor
ICAgIEZyYW1lKiBjb3JlRnJhbWUgPSBjb3JlKGZyYW1lKTsKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlKiBkYXRhU291cmNlOworCisgICAgaWYgKGNvcmVGcmFtZSAmJiBjb3JlRnJhbWUtPmxvYWRl
cigpLT5mcmFtZUhhc0xvYWRlZCgpKQorICAgICAgICBkYXRhU291cmNlID0gd2Via2l0X3dlYl9m
cmFtZV9nZXRfZGF0YV9zb3VyY2VfZnJvbV9jb3JlX2xvYWRlcihjb3JlRnJhbWUtPmxvYWRlcigp
LT5kb2N1bWVudExvYWRlcigpKTsKKworICAgIGlmICghZGF0YVNvdXJjZSkKKyAgICAgICAgcmV0
dXJuIE5VTEw7CisKKyAgICByZXR1cm4gZGF0YVNvdXJjZTsKK30KKworLyoqCisgKiB3ZWJraXRf
d2ViX2ZyYW1lX2dldF9wcm92aXNpb25hbF9kYXRhX3NvdXJjZToKKyAqIEBmcmFtZTogYSAjV2Vi
S2l0V2ViRnJhbWUKKyAqCisgKiBZb3UgdXNlIHRoZSB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRfcmVx
dWVzdCBtZXRob2QgdG8gaW5pdGlhdGUgYSByZXF1ZXN0IHRoYXQKKyAqIGNyZWF0ZXMgYSBwcm92
aXNpb25hbCBkYXRhIHNvdXJjZS4gVGhlIHByb3Zpc2lvbmFsIGRhdGEgc291cmNlIHdpbGwKKyAq
IHRyYW5zaXRpb24gdG8gYSBjb21taXR0ZWQgZGF0YSBzb3VyY2Ugb25jZSBhbnkgZGF0YSBoYXMg
YmVlbiByZWNlaXZlZC4gVXNlCisgKiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZSB0
byBnZXQgdGhlIGNvbW1pdHRlZCBkYXRhIHNvdXJjZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRo
ZSBwcm92aXNpb25hbCAjV2ViS2l0V2ViRGF0YVNvdXJjZSBvciAlTlVMTCBpZiBhIGxvYWQKKyAq
IHJlcXVlc3QgaXMgbm90IGluIHByb2dyZXNzIG9yIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAqCisg
KiBTaW5jZTogMS4xLjUKKyAqLworV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Via2l0X3dlYl9mcmFt
ZV9nZXRfcHJvdmlzaW9uYWxfZGF0YV9zb3VyY2UoV2ViS2l0V2ViRnJhbWUqIGZyYW1lKQorewor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfRlJBTUUoZnJhbWUpLCBOVUxM
KTsKKworICAgIEZyYW1lKiBjb3JlRnJhbWUgPSBjb3JlKGZyYW1lKTsKKyAgICBXZWJLaXRXZWJE
YXRhU291cmNlKiBkYXRhU291cmNlID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2Vf
ZnJvbV9jb3JlX2xvYWRlcihjb3JlRnJhbWUtPmxvYWRlcigpLT5wcm92aXNpb25hbERvY3VtZW50
TG9hZGVyKCkpOworCisgICAgaWYgKCFkYXRhU291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsK
KworICAgIHJldHVybiBkYXRhU291cmNlOworfQorCisvKioKICAqIHdlYmtpdF93ZWJfZnJhbWVf
Z2V0X2NoaWxkcmVuOgogICogQGZyYW1lOiBhICNXZWJLaXRXZWJGcmFtZQogICoKSW5kZXg6IFdl
YktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC5vcmlnL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmgJMjAwOS0wNy0xOCAx
Nzo1ODoxMy41MTA3NjcyMjEgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJmcmFtZS5oCTIwMDktMDctMTggMTg6MDA6MzQuODM0NzY2MzU5ICsxMDAwCkBAIC0yOCw2
ICsyOCw3IEBACiAKICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZGVmaW5lcy5oPgogI2luY2x1ZGUg
PHdlYmtpdC93ZWJraXRuZXR3b3JrcmVxdWVzdC5oPgorI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJkYXRhc291cmNlLmg+CiAKIEdfQkVHSU5fREVDTFMKIApAQCAtMTUyLDYgKzE1MywxMiBAQCB3
ZWJraXRfd2ViX2ZyYW1lX3ByaW50ICAgICAgICAgICAgICAoV2ViCiBXRUJLSVRfQVBJIFdlYktp
dExvYWRTdGF0dXMKIHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2xvYWRfc3RhdHVzICAgIChXZWJLaXRX
ZWJGcmFtZSAgICAgICAqZnJhbWUpOwogCitXRUJLSVRfQVBJIFdlYktpdFdlYkRhdGFTb3VyY2Ug
Kgord2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3VyY2UgICAgKFdlYktpdFdlYkZyYW1lICAg
ICAgICpmcmFtZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0V2ViRGF0YVNvdXJjZSAqCit3ZWJraXRf
d2ViX2ZyYW1lX2dldF9wcm92aXNpb25hbF9kYXRhX3NvdXJjZSAoV2ViS2l0V2ViRnJhbWUgKmZy
YW1lKTsKKwogR19FTkRfREVDTFMKIAogI2VuZGlmCkluZGV4OiBXZWJLaXQvR05VbWFrZWZpbGUu
YW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvR05VbWFrZWZpbGUuYW0JMjAwOS0wNy0xOCAx
ODowMDowMS42OTA3OTA0NjEgKzEwMDAKKysrIFdlYktpdC9HTlVtYWtlZmlsZS5hbQkyMDA5LTA3
LTE4IDE4OjAwOjM0LjgzNDc2NjM1OSArMTAwMApAQCAtNTQxLDcgKzU0MSw4IEBAIFRFU1RfUFJP
R1MgKz0gUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3RodHQKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVz
dGRvd25sb2FkIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdGF0ayBcCiAJUHJvZ3JhbXMvdW5p
dHRlc3RzL3Rlc3R3ZWJzZXR0aW5ncyBcCi0JUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJyZXNv
dXJjZQorCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2VicmVzb3VyY2UgXAorCVByb2dyYW1zL3Vu
aXR0ZXN0cy90ZXN0d2ViZGF0YXNvdXJjZQogCiAjIEFkZCBhZGRpdGlvbmFsIHRlc3RzIGhlcmUK
IFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0aHR0cGJhY2tlbmRfU09VUkNFUyA9IFdlYktpdC9ndGsv
dGVzdHMvdGVzdGh0dHBiYWNrZW5kLmMKQEAgLTU5Myw2ICs1OTQsMTAgQEAgUHJvZ3JhbXNfdW5p
dHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9TT1VSQwogUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJy
ZXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19jZmxhZ3MpCiBQcm9ncmFtc191bml0dGVz
dHNfdGVzdHdlYnJlc291cmNlX0xEQUREID0gJCh3ZWJraXRfdGVzdHNfbGRhZGQpCiAKK1Byb2dy
YW1zX3VuaXR0ZXN0c190ZXN0d2ViZGF0YXNvdXJjZV9TT1VSQ0VTID0gV2ViS2l0L2d0ay90ZXN0
cy90ZXN0d2ViZGF0YXNvdXJjZS5jCitQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYmRhdGFzb3Vy
Y2VfQ0ZMQUdTID0gJCh3ZWJraXRfdGVzdHNfY2ZsYWdzKQorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rl
c3R3ZWJkYXRhc291cmNlX0xEQUREID0gJCh3ZWJraXRfdGVzdHNfbGRhZGQpCisKICMgQXV0b2dl
bmVyYXRlZCBzb3VyY2VzCiBCVUlMVF9TT1VSQ0VTIDo9IFwKIAkkKGphdmFzY3JpcHRjb3JlX2J1
aWx0X3NvdXJjZXMpIFwK
</data>
<flag name="review"
          id="17357"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34892</attachid>
            <date>2009-08-15 01:01:20 -0700</date>
            <delta_ts>2009-08-28 00:29:34 -0700</delta_ts>
            <desc>Updated WebResource patch</desc>
            <filename>res.patch</filename>
            <type>text/plain</type>
            <size>25283</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAxN2MwZGVmLi5iMjIyNzE3
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAK
KzIwMDktMDgtMTUgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1w
bGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCisgICAgICAgIEFkZCBXZWJL
aXRXZWJSZXNvdXJjZSB0byB0aGUgYnVpbGQgc2NyaXB0LgorCisgICAgICAgICogR05VbWFrZWZp
bGUuYW06CisKIDIwMDktMDgtMTQgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtp
dC5vcmc+CiAKICAgICAgICAgUnViYmVyLXN0YW1wZWQgYnkgR3VzdGF2byBOb3JvbmhhLgpkaWZm
IC0tZ2l0IGEvR05VbWFrZWZpbGUuYW0gYi9HTlVtYWtlZmlsZS5hbQppbmRleCBiNjMyMDVmLi4z
YzExODdmIDEwMDY0NAotLS0gYS9HTlVtYWtlZmlsZS5hbQorKysgYi9HTlVtYWtlZmlsZS5hbQpA
QCAtMzI2LDYgKzMyNiw3IEBAIHdlYmtpdGd0a19oX2FwaSArPSBcCiAJV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0d2ViaW5zcGVjdG9yLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYm5h
dmlnYXRpb25hY3Rpb24uaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicG9saWN5ZGVj
aXNpb24uaCBcCisJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaCBcCiAJV2Vi
S2l0L2d0ay93ZWJraXQvd2Via2l0d2Vic2V0dGluZ3MuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2Vid2luZG93ZmVhdHVyZXMuaCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vi
dmlldy5oCkBAIC0zNjUsNiArMzY2LDggQEAgd2Via2l0Z3RrX3NvdXJjZXMgKz0gXAogCVdlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYmluc3BlY3Rvci5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJwb2xpY3lkZWNpc2lvbi5jcHAgXAorCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJl
c291cmNlLmNwcCBcCisJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaCBcCiAJ
V2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vic2V0dGluZ3MuY3BwIFwKIAlXZWJLaXQvZ3RrL3dl
YmtpdC93ZWJraXR3ZWJ2aWV3LmNwcCBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2Vid2lu
ZG93ZmVhdHVyZXMuY3BwCkBAIC01MjcsNyArNTMwLDggQEAgVEVTVF9QUk9HUyArPSBQcm9ncmFt
cy91bml0dGVzdHMvdGVzdGh0dHBiYWNrZW5kIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdHdl
Ymhpc3RvcnlpdGVtIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdGRvd25sb2FkIFwKIAlQcm9n
cmFtcy91bml0dGVzdHMvdGVzdGF0ayBcCi0JUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJzZXR0
aW5ncworCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2Vic2V0dGluZ3MgXAorCVByb2dyYW1zL3Vu
aXR0ZXN0cy90ZXN0d2VicmVzb3VyY2UKIAogIyBBZGQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlCiBQ
cm9ncmFtc191bml0dGVzdHNfdGVzdGh0dHBiYWNrZW5kX1NPVVJDRVMgPSBXZWJLaXQvZ3RrL3Rl
c3RzL3Rlc3RodHRwYmFja2VuZC5jCkBAIC01NzUsNiArNTc5LDEwIEBAIFByb2dyYW1zX3VuaXR0
ZXN0c190ZXN0d2Vic2V0dGluZ3NfQ0ZMQUdTID0gJCh3ZWJraXRfdGVzdHNfY2ZsYWdzKQogUHJv
Z3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJzZXR0aW5nc19MREFERCA9ICQod2Via2l0X3Rlc3RzX2xk
YWRkKQogUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJzZXR0aW5nc19MREZMQUdTID0gJCh3ZWJr
aXRfdGVzdHNfbGRmbGFncykKIAorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9T
T1VSQ0VTID0gV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2VicmVzb3VyY2UuYworUHJvZ3JhbXNfdW5p
dHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19jZmxhZ3MpCitQ
cm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX0xEQUREID0gJCh3ZWJraXRfdGVzdHNf
bGRhZGQpCisKICMgQXV0b2dlbmVyYXRlZCBzb3VyY2VzCiBCVUlMVF9TT1VSQ0VTIDo9IFwKIAkk
KGphdmFzY3JpcHRjb3JlX2J1aWx0X3NvdXJjZXMpIFwKZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsv
Q2hhbmdlTG9nIGIvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKaW5kZXggNzAwZjA2MC4uZjAxMDBiNiAx
MDA2NDQKLS0tIGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L2d0ay9DaGFuZ2VM
b2cKQEAgLTEsMyArMSwyOCBAQAorMjAwOS0wOC0xNSAgSmFuIE1pY2hhZWwgQWxvbnpvICA8am1h
bG9uem9Ad2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUgZ3RrIHBv
cnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NzU4
CisKKyAgICAgICAgSW1wbGVtZW50IFdlYktpdFdlYlJlc291cmNlIGZvciB0aGUgcmVzb3VyY2Ut
cmVsYXRlZCBBUEkgZm9yCisgICAgICAgIFdlYktpdFdlYkRhdGFTb3VyY2UuCisKKyAgICAgICAg
KiB0ZXN0cy90ZXN0d2VicmVzb3VyY2UuYzogQWRkZWQuCisgICAgICAgICh3ZWJfcmVzb3VyY2Vf
Zml4dHVyZV9zZXR1cCk6CisgICAgICAgICh3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bik6
CisgICAgICAgICh0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybCk6CisgICAgICAgICh0
ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2RhdGEpOgorICAgICAgICAodGVzdF93ZWJraXRf
d2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGUpOgorICAgICAgICAodGVzdF93ZWJraXRfd2ViX3Jl
c291cmNlX2dldF90ZXh0X2VuY29kaW5nX25hbWUpOgorICAgICAgICAodGVzdF93ZWJraXRfd2Vi
X3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKToKKyAgICAgICAgKG1haW4pOgorICAgICAgICAqIHdl
YmtpdC93ZWJraXQuaDoKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0ZGVmaW5lcy5oOgorICAgICAg
ICAqIHdlYmtpdC93ZWJraXRwcml2YXRlLmg6CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYnJl
c291cmNlLmNwcDogQWRkZWQuCisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmg6
IEFkZGVkLgorCiAyMDA5LTA4LTE0ICBKaWFodWEgSHVhbmcgIDxqaHVhbmdqaWFodWFAZ21haWwu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEphbiBBbG9uem8uCmRpZmYgLS1naXQgYS9XZWJL
aXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJyZXNvdXJjZS5jIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2Vi
cmVzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRjODQ0Ci0t
LSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0d2VicmVzb3VyY2UuYwpAQCAt
MCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBBbG9u
em8KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8c3Ry
aW5nLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdC5oPgorCisjaWYgR0xJQl9DSEVDS19WRVJT
SU9OKDIsIDE2LCAwKSAmJiBHVEtfQ0hFQ0tfVkVSU0lPTigyLCAxNCwgMCkKKwordHlwZWRlZiBz
dHJ1Y3QgeworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZTsKKyAgICBXZWJLaXRX
ZWJWaWV3KiB3ZWJWaWV3OworfSBXZWJSZXNvdXJjZUZpeHR1cmU7CisKK3N0YXRpYyB2b2lkIHdl
Yl9yZXNvdXJjZV9maXh0dXJlX3NldHVwKFdlYlJlc291cmNlRml4dHVyZSogZml4dHVyZSwgZ2Nv
bnN0cG9pbnRlciBkYXRhKQoreworICAgIGZpeHR1cmUtPndlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJ
RVcod2Via2l0X3dlYl92aWV3X25ldygpKTsKKyAgICBnX29iamVjdF9yZWZfc2luayhmaXh0dXJl
LT53ZWJWaWV3KTsKKyAgICBjb25zdCBnY2hhciogd2ViRGF0YSA9ICI8aHRtbD48L2h0bWw+IjsK
KyAgICBmaXh0dXJlLT53ZWJSZXNvdXJjZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3KHdlYkRh
dGEsIHN0cmxlbih3ZWJEYXRhKSwgImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAidGV4dC9odG1sIiwg
InV0ZjgiLCAiRXhhbXBsZS5jb20iKTsKKyAgICBnX2Fzc2VydChmaXh0dXJlLT53ZWJSZXNvdXJj
ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKFdlYlJl
c291cmNlRml4dHVyZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGdfYXNz
ZXJ0KGZpeHR1cmUtPndlYlJlc291cmNlKTsKKyAgICBnX29iamVjdF91bnJlZihmaXh0dXJlLT53
ZWJSZXNvdXJjZSk7CisgICAgZ19vYmplY3RfdW5yZWYoZml4dHVyZS0+d2ViVmlldyk7Cit9CisK
K3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdXJsKFdlYlJlc291cmNl
Rml4dHVyZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICAgIGdjaGFyKiB1cmw7
CisgICAgZ19vYmplY3RfZ2V0KEdfT0JKRUNUKGZpeHR1cmUtPndlYlJlc291cmNlKSwgInVybCIs
ICZ1cmwsIE5VTEwpOworICAgIGdfYXNzZXJ0X2NtcHN0cih1cmwsID09LCAiaHR0cDovL2V4YW1w
bGUuY29tLyIpOworICAgIGdfYXNzZXJ0X2NtcHN0cih3ZWJraXRfd2ViX3Jlc291cmNlX2dldF91
cmwoZml4dHVyZS0+d2ViUmVzb3VyY2UpICw9PSwiaHR0cDovL2V4YW1wbGUuY29tLyIpOworICAg
IGdfZnJlZSh1cmwpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2Vf
Z2V0X2RhdGEoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVyIGRhdGEp
Cit7CisgICAgR1N0cmluZyogY2hhckRhdGEgPSB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRh
KGZpeHR1cmUtPndlYlJlc291cmNlKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoY2hhckRhdGEtPnN0
ciwgPT0sICI8aHRtbD48L2h0bWw+Iik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dl
Yl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKFdlYlJlc291cmNlRml4dHVyZSogZml4dHVyZSwgZ2Nv
bnN0cG9pbnRlciBkYXRhKQoreworICAgIGdjaGFyKiBtaW1lX3R5cGU7CisgICAgZ19vYmplY3Rf
Z2V0KEdfT0JKRUNUKGZpeHR1cmUtPndlYlJlc291cmNlKSwgIm1pbWUtdHlwZSIsICZtaW1lX3R5
cGUsIE5VTEwpOworICAgIGdfYXNzZXJ0X2NtcHN0cihtaW1lX3R5cGUsID09LCAidGV4dC9odG1s
Iik7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlw
ZShmaXh0dXJlLT53ZWJSZXNvdXJjZSksPT0sInRleHQvaHRtbCIpOworICAgIGdfZnJlZShtaW1l
X3R5cGUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2Vu
Y29kaW5nKFdlYlJlc291cmNlRml4dHVyZSogZml4dHVyZSwgZ2NvbnN0cG9pbnRlciBkYXRhKQor
eworICAgIGdjaGFyKiB0ZXh0X2VuY29kaW5nOworICAgIGdfb2JqZWN0X2dldChHX09CSkVDVChm
aXh0dXJlLT53ZWJSZXNvdXJjZSksICJ0ZXh0LWVuY29kaW5nLW5hbWUiLCAmdGV4dF9lbmNvZGlu
ZywgTlVMTCk7CisgICAgZ19hc3NlcnRfY21wc3RyKHRleHRfZW5jb2RpbmcsID09LCAidXRmOCIp
OworICAgIGdfYXNzZXJ0X2NtcHN0cih3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9lbmNvZGluZyhm
aXh0dXJlLT53ZWJSZXNvdXJjZSksPT0sInV0ZjgiKTsKKyAgICBnX2ZyZWUodGV4dF9lbmNvZGlu
Zyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVf
bmFtZShXZWJSZXNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sK
KyAgICBnY2hhciogZnJhbWVfbmFtZTsKKyAgICBnX29iamVjdF9nZXQoR19PQkpFQ1QoZml4dHVy
ZS0+d2ViUmVzb3VyY2UpLCAiZnJhbWUtbmFtZSIsICZmcmFtZV9uYW1lLCBOVUxMKTsKKyAgICBn
X2Fzc2VydF9jbXBzdHIoZnJhbWVfbmFtZSwgPT0sICJFeGFtcGxlLmNvbSIpOworICAgIGdfYXNz
ZXJ0X2NtcHN0cih3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lKGZpeHR1cmUtPndl
YlJlc291cmNlKSw9PSwiRXhhbXBsZS5jb20iKTsKKyAgICBnX2ZyZWUoZnJhbWVfbmFtZSk7Cit9
CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBnX3RocmVhZF9pbml0
KE5VTEwpOworICAgIGd0a190ZXN0X2luaXQoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICAgIGdf
dGVzdF9idWdfYmFzZSgiaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvIik7CisgICAgZ190ZXN0X2Fk
ZCgiL3dlYmtpdC93ZWJyZXNvdXJjZS9nZXRfdXJsIiwKKyAgICAgICAgICAgICAgIFdlYlJlc291
cmNlRml4dHVyZSwgMCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAg
ICB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VybCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVf
dGVhcmRvd24pOworICAgIGdfdGVzdF9hZGQoIi93ZWJraXQvd2VicmVzb3VyY2UvZ2V0X21pbWVf
dHlwZSIsCisgICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNvdXJj
ZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNl
X2dldF9taW1lX3R5cGUsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rl
c3RfYWRkKCIvd2Via2l0L3dlYnJlc291cmNlL2dldF90ZXh0X2VuY29kaW5nX25hbWUiLAorICAg
ICAgICAgICAgICAgV2ViUmVzb3VyY2VGaXh0dXJlLCAwLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9z
ZXR1cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2Rp
bmcsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rlc3RfYWRkKCIvd2Vi
a2l0L3dlYnJlc291cmNlL2dldF9mcmFtZV9uYW1lIiwKKyAgICAgICAgICAgICAgIFdlYlJlc291
cmNlRml4dHVyZSwgMCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAg
ICB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25hbWUsIHdlYl9yZXNvdXJjZV9m
aXh0dXJlX3RlYXJkb3duKTsKKyAgICBnX3Rlc3RfYWRkKCIvd2Via2l0L3dlYnJlc291cmNlL2dl
dF9kYXRhIiwKKyAgICAgICAgICAgICAgIFdlYlJlc291cmNlRml4dHVyZSwgMCwgd2ViX3Jlc291
cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfcmVzb3Vy
Y2VfZ2V0X2RhdGEsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAgICByZXR1cm4g
Z190ZXN0X3J1biAoKTsKK30KKworI2Vsc2UKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJn
dikKK3sKKyAgICBnX2NyaXRpY2FsKCJZb3Ugd2lsbCBuZWVkIGF0IGxlYXN0IGdsaWItMi4xNi4w
IGFuZCBndGstMi4xNC4wIHRvIHJ1biB0aGUgdW5pdCB0ZXN0cy4gRG9pbmcgbm90aGluZyBub3cu
Iik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay93
ZWJraXQvd2Via2l0LmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAppbmRleCBjMjIxNjVl
Li43YTliMjgxIDEwMDY0NAotLS0gYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAorKysgYi9X
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJoaXN0b3J5aXRlbS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJw
b2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJuYXZpZ2F0aW9uYWN0
aW9uLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmg+CiAjaW5jbHVkZSA8
d2Via2l0L3dlYmtpdGVudW10eXBlcy5oPgogCiAjZW5kaWYgLyogX19XRUJLSVRfSF9fICovCmRp
ZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmggYi9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXRkZWZpbmVzLmgKaW5kZXggYjBhYjVlOS4uNmY5ZGRkMCAxMDA2NDQKLS0t
IGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCisrKyBiL1dlYktpdC9ndGsvd2Vi
a2l0L3dlYmtpdGRlZmluZXMuaApAQCAtNzEsNiArNzEsOSBAQCB0eXBlZGVmIHN0cnVjdCBfV2Vi
S2l0V2ViVmlld0NsYXNzIFdlYktpdFdlYlZpZXdDbGFzczsKIHR5cGVkZWYgc3RydWN0IF9XZWJL
aXREb3dubG9hZCBXZWJLaXREb3dubG9hZDsKIHR5cGVkZWYgc3RydWN0IF9XZWJLaXREb3dubG9h
ZENsYXNzIFdlYktpdERvd25sb2FkQ2xhc3M7CiAKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJS
ZXNvdXJjZSBXZWJLaXRXZWJSZXNvdXJjZTsKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJSZXNv
dXJjZUNsYXNzIFdlYktpdFdlYlJlc291cmNlQ2xhc3M7CisKIEdfRU5EX0RFQ0xTCiAKICNlbmRp
ZgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0ZS5oIGIvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0cHJpdmF0ZS5oCmluZGV4IDBjM2ZiZDMuLmI5Y2Q3MjcgMTAwNjQ0
Ci0tLSBhL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaAorKysgYi9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXRwcml2YXRlLmgKQEAgLTM1LDEyICszNSwxNSBAQAogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJwb2xpY3lk
ZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+
CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmg+CiAjaW5jbHVkZSA8d2Via2l0
L3dlYmtpdHdlYnNldHRpbmdzLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYndpbmRvd2Zl
YXR1cmVzLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmJhY2tmb3J3YXJkbGlzdC5oPgog
I2luY2x1ZGUgPHdlYmtpdC93ZWJraXRuZXR3b3JrcmVxdWVzdC5oPgogCisjaW5jbHVkZSAiQXJj
aGl2ZVJlc291cmNlLmgiCiAjaW5jbHVkZSAiQmFja0ZvcndhcmRMaXN0LmgiCisjaW5jbHVkZSAi
Q1N0cmluZy5oIgogI2luY2x1ZGUgPGVuY2hhbnQuaD4KICNpbmNsdWRlICJIaXN0b3J5SXRlbS5o
IgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCkBAIC0xNTcsNiArMTYwLDIyIEBAIGV4dGVybiAiQyIg
ewogICAgIHdlYmtpdF93ZWJfaGlzdG9yeV9pdGVtX2dldF9jaGlsZHJlbihXZWJLaXRXZWJIaXN0
b3J5SXRlbSopOwogICAgIC8vIGVuZCBXZWJLaXRXZWJIaXN0b3J5SXRlbSBwcml2YXRlCiAKKyAg
ICAvLyBXZWJLaXRXZWJSZXNvdXJjZSBwcml2YXRlCisgICAgI2RlZmluZSBXRUJLSVRfV0VCX1JF
U09VUkNFX0dFVF9QUklWQVRFKG9iaikgICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZB
VEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSwgV2ViS2l0V2ViUmVzb3VyY2VQcml2
YXRlKSkKKyAgICBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlUHJpdmF0ZSB7CisgICAgICAgIFdl
YkNvcmU6OkFyY2hpdmVSZXNvdXJjZSogcmVzb3VyY2U7CisKKyAgICAgICAgZ2NoYXIqIHVybDsK
KyAgICAgICAgZ2NoYXIqIG1pbWVUeXBlOworICAgICAgICBnY2hhciogdGV4dEVuY29kaW5nOwor
ICAgICAgICBnY2hhciogZnJhbWVOYW1lOworCisgICAgICAgIEdTdHJpbmcqIGRhdGE7CisgICAg
fTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSoKKyAgICB3ZWJraXRfd2ViX3Jlc291cmNlX25ld193
aXRoX2NvcmVfcmVzb3VyY2UoUGFzc1JlZlB0cjxXZWJDb3JlOjpBcmNoaXZlUmVzb3VyY2U+KTsK
KyAgICAvLyBlbmQgV2ViS2l0V2ViUmVzb3VyY2UgcHJpdmF0ZQorCiAgICAgdm9pZAogICAgIHdl
YmtpdF93ZWJfaW5zcGVjdG9yX3NldF9pbnNwZWN0b3JfY2xpZW50KFdlYktpdFdlYkluc3BlY3Rv
ciosIFdlYkNvcmU6OlBhZ2UqKTsKIApkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay93ZWJraXQvd2Vi
a2l0d2VicmVzb3VyY2UuY3BwIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2Uu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODljODIKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5jcHAKQEAgLTAs
MCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQy4gQWxv
bnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIndlYmtpdHdlYnJlc291cmNlLmgi
CisjaW5jbHVkZSAid2Via2l0cHJpdmF0ZS5oIgorCisjaW5jbHVkZSAiQXJjaGl2ZVJlc291cmNl
LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgInd0
Zi9Bc3NlcnRpb25zLmgiCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9naTE4
bi1saWIuaD4KKworLyoqCisgKiBTRUNUSU9OOndlYmtpdHdlYnJlc291cmNlCisgKiBAc2hvcnRf
ZGVzY3JpcHRpb246IFJlcHJlc2VudHMgYSBkb3dubG9hZGVkIFVSTC4KKyAqIEBzZWVfYWxzbzog
I1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBBIHdlYiByZXNvdXJjZSBlbmNhcHN1bGF0ZXMg
dGhlIGRhdGEgb2YgdGhlIGRvd25sb2FkIGFzIHdlbGwgYXMgdGhlIFVSTCwKKyAqIE1JTUUgdHlw
ZSBhbmQgZnJhbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgKi8KKwordXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OworCitlbnVtIHsKKyAgICBQUk9QXzAs
CisKKyAgICBQUk9QX1VSTCwKKyAgICBQUk9QX01JTUVfVFlQRSwKKyAgICBQUk9QX1RFWFRfRU5D
T0RJTkdfTkFNRSwKKyAgICBQUk9QX0ZSQU1FX05BTUUKK307CisKK0dfREVGSU5FX1RZUEUoV2Vi
S2l0V2ViUmVzb3VyY2UsIHdlYmtpdF93ZWJfcmVzb3VyY2UsIEdfVFlQRV9PQkpFQ1QpOworCitz
dGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9wcm9wZXJ0eShHT2JqZWN0KiBvYmpl
Y3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSogdmFsdWUsIEdQYXJhbVNwZWMqIHBzcGVjKTsKKwor
c3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJjZV9kaXNwb3NlKEdPYmplY3QqIG9iamVjdCkK
K3sKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UgPSBXRUJLSVRfV0VCX1JFU09V
UkNFKG9iamVjdCk7CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVz
b3VyY2UtPnByaXY7CisKKyAgICBpZiAocHJpdi0+cmVzb3VyY2UpIHsKKyAgICAgICAgcHJpdi0+
cmVzb3VyY2UtPmRlcmVmKCk7CisgICAgICAgIHByaXYtPnJlc291cmNlID0gMDsKKyAgICB9CisK
KyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX3Jlc291cmNlX3BhcmVudF9jbGFzcyktPmRp
c3Bvc2Uob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJjZV9maW5h
bGl6ZShHT2JqZWN0KiBvYmplY3QpCit7CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291
cmNlID0gV0VCS0lUX1dFQl9SRVNPVVJDRShvYmplY3QpOworICAgIFdlYktpdFdlYlJlc291cmNl
UHJpdmF0ZSogcHJpdiA9IHdlYlJlc291cmNlLT5wcml2OworCisgICAgZ19mcmVlKHByaXYtPnVy
bCk7CisgICAgZ19mcmVlKHByaXYtPm1pbWVUeXBlKTsKKyAgICBnX2ZyZWUocHJpdi0+dGV4dEVu
Y29kaW5nKTsKKyAgICBnX2ZyZWUocHJpdi0+ZnJhbWVOYW1lKTsKKworICAgIGlmIChwcml2LT5k
YXRhKQorICAgICAgICBnX3N0cmluZ19mcmVlKHByaXYtPmRhdGEsIFRSVUUpOworCisgICAgR19P
QkpFQ1RfQ0xBU1Mod2Via2l0X3dlYl9yZXNvdXJjZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShv
YmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2NsYXNzX2luaXQo
V2ViS2l0V2ViUmVzb3VyY2VDbGFzcyoga2xhc3MpCit7CisgICAgR09iamVjdENsYXNzKiBnb2Jq
ZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3MpOworCisgICAgZ29iamVjdF9jbGFzcy0+
ZGlzcG9zZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfZGlzcG9zZTsKKyAgICBnb2JqZWN0X2NsYXNz
LT5maW5hbGl6ZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfZmluYWxpemU7CisgICAgZ29iamVjdF9j
bGFzcy0+Z2V0X3Byb3BlcnR5ID0gd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfcHJvcGVydHk7CisK
KyAgICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1VSTCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcoCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAidXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIF8oIlVSTCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XygiVGhlIHVybCBvZiB0aGUgcmVzb3VyY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJL
SVRfUEFSQU1fUkVBREFCTEUpKTsKKworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVy
dHkoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBS
T1BfTUlNRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJh
bV9zcGVjX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1l
LXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiTUlNRSBUeXBl
IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJUaGUgTUlNRSB0eXBl
IG9mIHRoZSByZXNvdXJjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
TlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9QQVJBTV9S
RUFEQUJMRSkpOworCisgICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0
X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9URVhUX0VO
Q09ESU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFt
X3NwZWNfc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQt
ZW5jb2RpbmctbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJU
ZXh0IEVuY29kaW5nIE5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IF8oIlRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgb2YgdGhlIHJlc291cmNlIiksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisKKyAgICBnX29iamVjdF9jbGFz
c19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBQUk9QX0ZSQU1FX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgImZyYW1lLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXygiRnJhbWUgTmFtZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXygiVGhlIGZyYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlIiksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisKKyAgICBnX3R5cGVfY2xhc3NfYWRkX3By
aXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9mKFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSkpOwor
fQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9wcm9wZXJ0eShHT2JqZWN0
KiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSogdmFsdWUsIEdQYXJhbVNwZWMqIHBzcGVj
KQoreworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSA9IFdFQktJVF9XRUJfUkVT
T1VSQ0Uob2JqZWN0KTsKKworICAgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9V
Ukw6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyh2YWx1ZSwgd2Via2l0X3dlYl9yZXNvdXJj
ZV9nZXRfdXJsKHdlYlJlc291cmNlKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9N
SU1FX1RZUEU6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyh2YWx1ZSwgd2Via2l0X3dlYl9y
ZXNvdXJjZV9nZXRfbWltZV90eXBlKHdlYlJlc291cmNlKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUFJPUF9URVhUX0VOQ09ESU5HX05BTUU6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmlu
Zyh2YWx1ZSwgd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2Rpbmcod2ViUmVzb3VyY2UpKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSQU1FX05BTUU6CisgICAgICAgIGdfdmFs
dWVfc2V0X3N0cmluZyh2YWx1ZSwgd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZSh3
ZWJSZXNvdXJjZSkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBHX09C
SkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9yZXNvdXJj
ZV9pbml0KFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICB3ZWJSZXNvdXJj
ZS0+cHJpdiA9IFdFQktJVF9XRUJfUkVTT1VSQ0VfR0VUX1BSSVZBVEUod2ViUmVzb3VyY2UpOwor
fQorCisvLyBpbnRlcm5hbCB1c2Ugb25seQorV2ViS2l0V2ViUmVzb3VyY2UqIHdlYmtpdF93ZWJf
cmVzb3VyY2VfbmV3X3dpdGhfY29yZV9yZXNvdXJjZShQYXNzUmVmUHRyPEFyY2hpdmVSZXNvdXJj
ZT4gcmVzb3VyY2UpCit7CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gV0VC
S0lUX1dFQl9SRVNPVVJDRShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFLCBO
VUxMKSk7CisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2Ut
PnByaXY7CisgICAgcHJpdi0+cmVzb3VyY2UgPSByZXNvdXJjZS5yZWxlYXNlUmVmKCk7CisKKyAg
ICByZXR1cm4gd2ViUmVzb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9u
ZXc6CisgKiBAZGF0YTogdGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSB0aGUgI1dlYktpdFdlYlJlc291
cmNlCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIEBkYXRhCisgKiBAdXJsOiB0aGUgdXJsIG9m
IHRoZSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqIEBtaW1lX3R5cGU6IHRoZSBNSU1FIHR5cGUgb2Yg
dGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICogQHRleHRfZW5jb2RpbmdfbmFtZTogdGhlIHRleHQg
ZW5jb2RpbmcgbmFtZSBvZiB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAZnJhbWVfbmFtZTog
dGhlIGZyYW1lIG5hbWUgb2YgdGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVybnMg
YSBuZXcgI1dlYktpdFdlYlJlc291cmNlLiBUaGUgQHRleHRfZW5jb2RpbmdfbmFtZSBjYW4gYmUg
JU5VTEwuIFRoZQorICogQGZyYW1lX25hbWUgYXJndW1lbnQgY2FuIGJlIHVzZWQgaWYgdGhlIHJl
c291cmNlIHJlcHJlc2VudHMgY29udGVudHMgb2YgYW4KKyAqIGVudGlyZSBIVE1MIGZyYW1lLCBv
dGhlcndpc2UgcGFzcyAlTlVMTC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgbmV3ICNXZWJLaXRX
ZWJSZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuMTMKKyAqLworV2ViS2l0V2ViUmVzb3VyY2Uq
IHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3KGNvbnN0IGdjaGFyKiBkYXRhLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgc2l6ZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciogdXJsLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyKiBtaW1lVHlwZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciog
dGV4dEVuY29kaW5nTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBnY2hhciogZnJhbWVOYW1lKQoreworICAgIEFTU0VSVChkYXRhKTsKKyAgICBB
U1NFUlQodXJsKTsKKyAgICBBU1NFUlQobWltZV90eXBlKTsKKworICAgIFJlZlB0cjxTaGFyZWRC
dWZmZXI+IGJ1ZmZlciA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKGRhdGEsIHNpemUpOworICAgIFdl
YktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3X3dp
dGhfY29yZV9yZXNvdXJjZShBcmNoaXZlUmVzb3VyY2U6OmNyZWF0ZShidWZmZXIsIEtVUkwoS1VS
TCgpLFN0cmluZzo6ZnJvbVVURjgodXJsKSksIFN0cmluZzo6ZnJvbVVURjgobWltZVR5cGUpLCBT
dHJpbmc6OmZyb21VVEY4KHRleHRFbmNvZGluZ05hbWUpLCBTdHJpbmc6OmZyb21VVEY4KGZyYW1l
TmFtZSkpKTsKKworICAgIHJldHVybiB3ZWJSZXNvdXJjZTsKK30KKworLyoqCisgKiB3ZWJraXRf
d2ViX3Jlc291cmNlX2dldF9kYXRhOgorICogQHdlYl9yZXNvdXJjZTogYSAjV2ViS2l0V2ViUmVz
b3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSBkYXRhIG9mIHRoZSBAd2ViUmVzb3VyY2UuCisgKgor
ICogUmV0dXJuIHZhbHVlOiBhICNHU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBkYXRh
IG9mIHRoZSBAd2ViUmVzb3VyY2UuCisgKiBUaGUgc3RyaW5nIGlzIG93bmVkIGJ5IFdlYktpdCBh
bmQgc2hvdWxkIG5vdCBiZSBmcmVlZCBvciBkZXN0cm95ZWQuCisgKgorICogU2luY2U6IDEuMS4x
MworICovCitHU3RyaW5nKiB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhKFdlYktpdFdlYlJl
c291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRf
SVNfV0VCX1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJSZXNv
dXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKworICAgIGlmICghcHJpdi0+
ZGF0YSkKKyAgICAgICAgcHJpdi0+ZGF0YSA9IGdfc3RyaW5nX25ld19sZW4ocHJpdi0+cmVzb3Vy
Y2UtPmRhdGEoKS0+ZGF0YSgpLCBwcml2LT5yZXNvdXJjZS0+ZGF0YSgpLT5zaXplKCkpOworCisg
ICAgcmV0dXJuIHByaXYtPmRhdGE7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9n
ZXRfdXJsOgorICogQHdlYl9yZXNvdXJjZTogYSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqCisgKiBS
ZXR1cm4gdmFsdWU6IHRoZSBVUkwgb2YgdGhlIHJlc291cmNlCisgKgorICogU2luY2U6IDEuMS4x
MworICovCitHX0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdXJs
KFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChXRUJLSVRfSVNfV0VCX1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBX
ZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBp
ZiAoIXByaXYtPnJlc291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghcHJp
di0+dXJsKQorICAgICAgICBwcml2LT51cmwgPSBnX3N0cmR1cChwcml2LT5yZXNvdXJjZS0+dXJs
KCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+dXJsOworfQor
CisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZToKKyAqIEB3ZWJfcmVz
b3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgTUlN
RSB0eXBlIG9mIHRoZSByZXNvdXJjZQorICoKKyAqIFNpbmNlIDEuMS4xMworICovCitHX0NPTlNU
X1JFVFVSTiBnY2hhciogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKFdlYktpdFdl
YlJlc291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJL
SVRfSVNfV0VCX1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJS
ZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBpZiAoIXByaXYt
PnJlc291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghcHJpdi0+bWltZVR5
cGUpCisgICAgICAgIHByaXYtPm1pbWVUeXBlID0gZ19zdHJkdXAocHJpdi0+cmVzb3VyY2UtPm1p
bWVUeXBlKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+bWltZVR5cGU7Cit9
CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2Rpbmc6CisgKiBAd2ViX3Jl
c291cmNlOiBhICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIGVu
Y29kaW5nIG5hbWUgb2YgdGhlIHJlc291cmNlCisgKgorICogU2luY2U6IDEuMS4xMworICovCitH
X0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2RpbmcoV2Vi
S2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWls
KFdFQktJVF9JU19XRUJfUkVTT1VSQ0Uod2ViUmVzb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktp
dFdlYlJlc291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYlJlc291cmNlLT5wcml2OworICAgIGlmICgh
cHJpdi0+cmVzb3VyY2UpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFwcml2LT50
ZXh0RW5jb2RpbmcpCisgICAgICAgIHByaXYtPnRleHRFbmNvZGluZyA9IGdfc3RyZHVwKHByaXYt
PnJlc291cmNlLT50ZXh0RW5jb2RpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHJldHVybiBw
cml2LT50ZXh0RW5jb2Rpbmc7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRf
ZnJhbWVfbmFtZToKKyAqIEB3ZWJfcmVzb3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgor
ICogUmV0dXJuIHZhbHVlOiB0aGUgZnJhbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgKgorICog
U2luY2U6IDEuMS4xMworICovCitHX0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dlYl9yZXNv
dXJjZV9nZXRfZnJhbWVfbmFtZShXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UpCit7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRSh3ZWJSZXNvdXJj
ZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVz
b3VyY2UtPnByaXY7CisgICAgaWYgKCFwcml2LT5yZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5V
TEw7CisKKyAgICBpZiAoIXByaXYtPmZyYW1lTmFtZSkKKyAgICAgICAgcHJpdi0+ZnJhbWVOYW1l
ID0gZ19zdHJkdXAocHJpdi0+cmVzb3VyY2UtPmZyYW1lTmFtZSgpLnV0ZjgoKS5kYXRhKCkpOwor
CisgICAgcmV0dXJuIHByaXYtPmZyYW1lTmFtZTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJy
ZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDcwZWYKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5oCkBA
IC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQy4g
QWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNpZm5kZWYgV0VCS0lUX1dFQl9SRVNPVVJDRV9ICisjZGVmaW5lIFdFQktJVF9XRUJf
UkVTT1VSQ0VfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+
CisKKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZGVmaW5lcy5oPgorCitHX0JFR0lOX0RFQ0xTCisK
KyNkZWZpbmUgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFICAgICAgICAgICAgKHdlYmtpdF93ZWJf
cmVzb3VyY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJDRShvYmopICAg
ICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBXRUJLSVRfVFlQRV9X
RUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNP
VVJDRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksICBX
RUJLSVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlQ2xhc3MpKQorI2RlZmlu
ZSBXRUJLSVRfSVNfV0VCX1JFU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RB
TkNFX1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSkpCisjZGVmaW5lIFdFQktJ
VF9JU19XRUJfUkVTT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgo
a2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9S
RVNPVVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiks
ICBXRUJLSVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlQ2xhc3MpKQorCit0
eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlIFdlYktpdFdlYlJlc291cmNl
UHJpdmF0ZTsKKworc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZSB7CisgICAgR09iamVjdCBwYXJl
bnRfaW5zdGFuY2U7CisKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICBXZWJLaXRXZWJSZXNvdXJj
ZVByaXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlQ2xhc3Mgewor
ICAgIEdPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgICAvKiBQYWRkaW5nIGZvciBmdXR1
cmUgZXhwYW5zaW9uICovCisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQwKSAodm9pZCk7Cisg
ICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQxKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRf
cmVzZXJ2ZWQyKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQzKSAodm9pZCk7
Cit9OworCitXRUJLSVRfQVBJIEdUeXBlCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF90eXBlICh2
b2lkKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRfd2ViX3Jlc291
cmNlX25ldyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdjaGFyICAgICAgICAqZGF0YSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAg
ICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IGdjaGFyICAgICAgICAqdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKm1pbWVfdHlwZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0ZXh0X2Vu
Y29kaW5nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGdjaGFyICAgICAgICAqZnJhbWVfbmFtZSk7CisKK1dFQktJVF9BUEkgR1N0cmluZyAq
Cit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhICAgICAgICAgICAgICAgKFdlYktpdFdlYlJl
c291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBnY2hh
ciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwgICAgICAgICAgICAgICAgKFdlYktpdFdl
YlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVSTiBn
Y2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGUgICAgICAgICAgKFdlYktp
dFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JFVFVS
TiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9lbmNvZGluZyAgICAgICAgICAgKFdl
YktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JF
VFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lICAgICAgICAg
KFdlYktpdFdlYlJlc291cmNlICAqd2ViX3Jlc291cmNlKTsKKworR19FTkRfREVDTFMKKworI2Vu
ZGlmIC8qIFdFQktJVF9XRUJfUkVTT1VSQ0VfSCAqLwo=
</data>
<flag name="review"
          id="19087"
          type_id="1"
          status="+"
          setter="xan.lopez"
    />
    <flag name="commit-queue"
          id="19305"
          type_id="3"
          status="-"
          setter="jmalonzo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34920</attachid>
            <date>2009-08-15 22:28:37 -0700</date>
            <delta_ts>2009-08-28 00:30:15 -0700</delta_ts>
            <desc>updated patch</desc>
            <filename>ds.patch</filename>
            <type>text/plain</type>
            <size>44019</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBiMjIyNzE3Li43YmEzOTYx
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC01LDYgKzUsMTcgQEAK
ICAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0
CiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAog
CisgICAgICAgIEFkZCBXZWJLaXRXZWJEYXRhU291cmNlIGFuZCBEb2N1bWVudExvYWRlckd0ayB0
byB0aGUgYnVpbGQgc2NyaXB0LgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisKKzIwMDkt
MDgtMTUgIEphbiBNaWNoYWVsIEFsb256byAgPGptYWxvbnpvQHdlYmtpdC5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0a10gSW1wbGVtZW50
IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAorCiAgICAgICAgIEFkZCBXZWJLaXRXZWJS
ZXNvdXJjZSB0byB0aGUgYnVpbGQgc2NyaXB0LgogCiAgICAgICAgICogR05VbWFrZWZpbGUuYW06
CmRpZmYgLS1naXQgYS9HTlVtYWtlZmlsZS5hbSBiL0dOVW1ha2VmaWxlLmFtCmluZGV4IDNjMTE4
N2YuLjcyZmFmYzQgMTAwNjQ0Ci0tLSBhL0dOVW1ha2VmaWxlLmFtCisrKyBiL0dOVW1ha2VmaWxl
LmFtCkBAIC0zMjEsNiArMzIxLDcgQEAgd2Via2l0Z3RrX2hfYXBpICs9IFwKIAlXZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXRzb3VwYXV0aGRpYWxvZy5oIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR2ZXJzaW9uLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmJhY2tmb3J3YXJkbGlz
dC5oIFwKKwlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmggXAogCVdlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtp
dHdlYmhpc3RvcnlpdGVtLmggXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmluc3BlY3Rv
ci5oIFwKQEAgLTM0Miw2ICszNDMsOCBAQCB3ZWJraXRndGtfc291cmNlcyArPSBcCiAJV2ViS2l0
L2d0ay9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRHdGsuaCBcCiAJV2ViS2l0L2d0ay9XZWJD
b3JlU3VwcG9ydC9Db250ZXh0TWVudUNsaWVudEd0ay5jcHAgXAogCVdlYktpdC9ndGsvV2ViQ29y
ZVN1cHBvcnQvQ29udGV4dE1lbnVDbGllbnRHdGsuaCBcCisJV2ViS2l0L2d0ay9XZWJDb3JlU3Vw
cG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAgXAorCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQv
RG9jdW1lbnRMb2FkZXJHdGsuaCBcCiAJV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xp
ZW50R3RrLmNwcCBcCiAJV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50R3RrLmgg
XAogCVdlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRWRpdG9yQ2xpZW50R3RrLmNwcCBcCkBAIC0z
NjEsNiArMzY0LDcgQEAgd2Via2l0Z3RrX3NvdXJjZXMgKz0gXAogCVdlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHNvdXBhdXRoZGlhbG9nLmMgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHZlcnNp
b24uY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJiYWNrZm9yd2FyZGxpc3QuY3Bw
IFwKKwlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmNwcCBcCiAJV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJoaXN0b3J5aXRlbS5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmluc3Bl
Y3Rvci5jcHAgXApkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cgYi9XZWJLaXQvZ3Rr
L0NoYW5nZUxvZwppbmRleCBmMDEwMGI2Li4wODBiYmE3IDEwMDY0NAotLS0gYS9XZWJLaXQvZ3Rr
L0NoYW5nZUxvZworKysgYi9XZWJLaXQvZ3RrL0NoYW5nZUxvZwpAQCAtNSw2ICs1LDczIEBACiAg
ICAgICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9ydAog
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgKIAor
ICAgICAgICBTdWJjbGFzcyBEb2N1bWVudExvYWRlciBmb3IgR3RrIGFuZCBpbXBsZW1lbnQgaXQg
dW5kZXIgdGhlIFdlYktpdAorICAgICAgICBuYW1lc3BhY2UuIEFkZCBXZWJLaXRXZWJEYXRhU291
cmNlIGltcGxlbWVudGF0aW9uIHRoYXQgY2xvc2VseQorICAgICAgICBmb2xsb3dzIHRoZSBtYWMg
aW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0Rv
Y3VtZW50TG9hZGVyR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9h
ZGVyOjpEb2N1bWVudExvYWRlcik6CisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpz
ZXREYXRhU291cmNlKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaERh
dGFTb3VyY2UpOgorICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6YXR0YWNoVG9GcmFt
ZSk6CisgICAgICAgIChXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpkZXRhY2hGcm9tRnJhbWUpOgor
ICAgICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6aW5jcmVhc2VMb2FkQ291bnQpOgorICAg
ICAgICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6ZGVjcmVhc2VMb2FkQ291bnQpOgorICAgICAg
ICAoV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6cmVmRGF0YVNvdXJjZSk6CisgICAgICAgIChXZWJL
aXQ6OkRvY3VtZW50TG9hZGVyOjp1bnJlZkRhdGFTb3VyY2UpOgorICAgICAgICAqIFdlYkNvcmVT
dXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpEb2N1
bWVudExvYWRlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6RG9jdW1lbnRMb2FkZXI6OmRh
dGFTb3VyY2UpOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50R3Rr
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmNyZWF0ZURvY3VtZW50
TG9hZGVyKToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmNvbW1pdHRlZExv
YWQpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6c2hvdWxkVXNlQ3JlZGVu
dGlhbFN0b3JhZ2UpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0
Y2hEaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UpOgorICAgICAgICAoV2ViS2l0OjpG
cmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRDYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5n
ZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxTZW5k
UmVxdWVzdCk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojphc3NpZ25JZGVu
dGlmaWVyVG9Jbml0aWFsUmVxdWVzdCk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xp
ZW50OjpkaXNwYXRjaERpZFJlY2VpdmVSZXNwb25zZSk6CisgICAgICAgIChXZWJLaXQ6OkZyYW1l
TG9hZGVyQ2xpZW50OjptYWtlUmVwcmVzZW50YXRpb24pOgorICAgICAgICAoV2ViS2l0OjpGcmFt
ZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKToKKyAgICAgICAgKFdl
YktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OnJldmVydFRvUHJvdmlzaW9uYWxTdGF0ZSk6CisgICAg
ICAgIChXZWJLaXQ6OkZyYW1lTG9hZGVyQ2xpZW50Ojp3aWxsQ2hhbmdlVGl0bGUpOgorICAgICAg
ICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlkQ2hhbmdlVGl0bGUpOgorICAgICAgICAo
V2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZmluaXNoZWRMb2FkaW5nKToKKyAgICAgICAgKFdl
YktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgp
OgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGaW5pc2hM
b2FkaW5nKToKKyAgICAgICAgKFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlk
RmFpbExvYWRpbmcpOgorICAgICAgICAoV2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0
Y2hEaWRMb2FkUmVzb3VyY2VGcm9tTWVtb3J5Q2FjaGUpOgorICAgICAgICAoV2ViS2l0OjpGcmFt
ZUxvYWRlckNsaWVudDo6c2V0TWFpbkRvY3VtZW50RXJyb3IpOgorICAgICAgICAqIHdlYmtpdC93
ZWJraXQuaDoKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0ZGVmaW5lcy5oOgorICAgICAgICAqIHdl
YmtpdC93ZWJraXRwcml2YXRlLmg6CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmRhdGFzb3Vy
Y2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9kaXNwb3NlKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5hbGl6ZSk6CisgICAgICAgIChf
V2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfY2xhc3Nf
aW5pdCk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtpdF93ZWJf
ZGF0YV9zb3VyY2VfaW5pdCk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6
OndlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfbG9hZGVyKToKKyAgICAgICAgKF9XZWJL
aXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXcpOgorICAg
ICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF93ZWJfZnJhbWUpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3
ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QpOgorICAgICAgICAoX1dl
YktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1
ZXN0KToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9nZXRfdGV4dF9lbmNvZGluZ19uYW1lKToKKyAgICAgICAgKF9XZWJLaXRXZWJE
YXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pc19sb2FkaW5nKToKKyAg
ICAgICAgKF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfZGF0YSk6CisgICAgICAgIChfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGU6OndlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfZ2V0X21haW5fcmVzb3VyY2UpOgorICAgICAgICAoX1dlYktpdFdl
YkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJj
ZXMpOgorICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX2dldF9yZXNvdXJjZV9mb3JfdXJsKToKKyAgICAgICAgKF9XZWJLaXRXZWJEYXRh
U291cmNlUHJpdmF0ZTo6d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9hZGRfc3VicmVzb3VyY2UpOgor
ICAgICAgICAoX1dlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlOjp3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF91bnJlYWNoYWJsZV91cmwpOgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJkYXRh
c291cmNlLmg6IEFkZGVkLgorCisyMDA5LTA4LTE1ICBKYW4gTWljaGFlbCBBbG9uem8gIDxqbWFs
b256b0B3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9y
dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgK
KwogICAgICAgICBJbXBsZW1lbnQgV2ViS2l0V2ViUmVzb3VyY2UgZm9yIHRoZSByZXNvdXJjZS1y
ZWxhdGVkIEFQSSBmb3IKICAgICAgICAgV2ViS2l0V2ViRGF0YVNvdXJjZS4KIApkaWZmIC0tZ2l0
IGEvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAgYi9XZWJL
aXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmYzZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0
L2d0ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAKQEAgLTAsMCArMSwxMjAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBKYW4gTWljaGFlbCBBbG9uem8KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVy
LCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICog
ICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIKKworI2lu
Y2x1ZGUgIndlYmtpdHdlYmRhdGFzb3VyY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitEb2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2FkZXIo
Y29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBTdWJzdGl0dXRlRGF0YSYgc3Vi
c3RpdHV0ZURhdGEpCisgICAgOiBXZWJDb3JlOjpEb2N1bWVudExvYWRlcihyZXF1ZXN0LCBzdWJz
dGl0dXRlRGF0YSkKKyAgICAsIG1faXNEYXRhU291cmNlUmVmZmVkKGZhbHNlKQorICAgICwgbV9k
YXRhU291cmNlKDApCit7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OnNldERhdGFTb3VyY2Uo
V2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YVNv
dXJjZSk7CisKKyAgICBtX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlOworICAgIHJlZkRhdGFTb3Vy
Y2UoKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6ZGV0YWNoRGF0YVNvdXJjZSgpCit7Cisg
ICAgdW5yZWZEYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmF0dGFjaFRv
RnJhbWUoKQoreworICAgIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyOjphdHRhY2hUb0ZyYW1lKCk7
CisKKyAgICByZWZEYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmRldGFj
aEZyb21GcmFtZSgpCit7CisgICAgV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaEZyb21G
cmFtZSgpOworCisgICAgQVNTRVJUKG1fbG9hZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkpOworCisg
ICAgaWYgKG1fbG9hZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkpCisgICAgICAgIHVucmVmRGF0YVNv
dXJjZSgpOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjppbmNyZWFzZUxvYWRDb3VudCh1bnNp
Z25lZCBsb25nIGlkZW50aWZpZXIpCit7CisgICAgQVNTRVJUKG1fZGF0YVNvdXJjZSk7CisKKyAg
ICBpZiAobV9sb2FkaW5nUmVzb3VyY2VzLmNvbnRhaW5zKGlkZW50aWZpZXIpKQorICAgICAgICBy
ZXR1cm47CisgICAgbV9sb2FkaW5nUmVzb3VyY2VzLmFkZChpZGVudGlmaWVyKTsKKyAgICByZWZE
YXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmRlY3JlYXNlTG9hZENvdW50
KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcikKK3sKKyAgICBIYXNoU2V0PHVuc2lnbmVkIGxvbmc+
OjppdGVyYXRvciBpdCA9IG1fbG9hZGluZ1Jlc291cmNlcy5maW5kKGlkZW50aWZpZXIpOworCisg
ICAgLy8gSXQgaXMgdmFsaWQgZm9yIGEgbG9hZCB0byBiZSBjYW5jZWxsZWQgYmVmb3JlIGl0J3Mg
c3RhcnRlZC4KKyAgICBpZiAoaXQgPT0gbV9sb2FkaW5nUmVzb3VyY2VzLmVuZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2xvYWRpbmdSZXNvdXJjZXMucmVtb3ZlKGl0KTsKKworICAgIEFT
U0VSVCghZnJhbWUoKSk7CisgICAgQVNTRVJUKG1fbG9hZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkp
OworCisgICAgaWYgKG1fbG9hZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkgJiYgIWZyYW1lKCkpCisg
ICAgICAgIHVucmVmRGF0YVNvdXJjZSgpOworfQorCisvLyBoZWxwZXIgbWV0aG9zIHRvIGF2b2lk
IHJlZiBjb3VudCBjaHVybgordm9pZCBEb2N1bWVudExvYWRlcjo6cmVmRGF0YVNvdXJjZSgpCit7
CisgICAgaWYgKCFtX2RhdGFTb3VyY2UgfHwgbV9pc0RhdGFTb3VyY2VSZWZmZWQpCisgICAgICAg
IHJldHVybjsKKyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IHRydWU7CisgICAgZ19vYmplY3Rf
cmVmKG1fZGF0YVNvdXJjZSk7Cit9Cit2b2lkIERvY3VtZW50TG9hZGVyOjp1bnJlZkRhdGFTb3Vy
Y2UoKQoreworICAgIGlmICghbV9pc0RhdGFTb3VyY2VSZWZmZWQpCisgICAgICAgIHJldHVybjsK
KyAgICBBU1NFUlQobV9kYXRhU291cmNlKTsKKyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IGZh
bHNlOworICAgIGdfb2JqZWN0X3VucmVmKG1fZGF0YVNvdXJjZSk7Cit9CisKK30gLy8gZW5kIG5h
bWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRG9j
dW1lbnRMb2FkZXJHdGsuaCBiL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRG9jdW1lbnRMb2Fk
ZXJHdGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWYxOTA1Ci0tLSAv
ZGV2L251bGwKKysrIGIvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0
ay5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBKYW4g
TWljaGFlbCBBbG9uem8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJ3ZWJr
aXRkZWZpbmVzLmgiCisjaW5jbHVkZSAid3RmL0hhc2hTZXQuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworICAgIGNsYXNzIFJlc291cmNlUmVxdWVzdDsKKyAgICBjbGFzcyBTdWJzdGl0dXRlRGF0
YTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIERvY3VtZW50TG9hZGVyIDogcHVi
bGljIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyPiBjcmVhdGUoY29uc3QgV2ViQ29yZTo6UmVzb3Vy
Y2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBXZWJDb3JlOjpTdWJzdGl0dXRlRGF0YSYgZGF0YSkK
KyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgRG9jdW1lbnRMb2FkZXIocmVxdWVz
dCwgZGF0YSkpOworICAgIH0KKworICAgIHZvaWQgc2V0RGF0YVNvdXJjZShXZWJLaXRXZWJEYXRh
U291cmNlKik7CisgICAgdm9pZCBkZXRhY2hEYXRhU291cmNlKCk7CisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZSogZGF0YVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YVNvdXJjZTsgfQorCisg
ICAgdm9pZCBpbmNyZWFzZUxvYWRDb3VudCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIpOworICAg
IHZvaWQgZGVjcmVhc2VMb2FkQ291bnQodW5zaWduZWQgbG9uZyBpZGVudGlmaWVyKTsKKworcHJp
dmF0ZToKKyAgICBEb2N1bWVudExvYWRlcihjb25zdCBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3Qm
LCBjb25zdCBXZWJDb3JlOjpTdWJzdGl0dXRlRGF0YSYpOworCisgICAgdmlydHVhbCB2b2lkIGF0
dGFjaFRvRnJhbWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoRnJvbUZyYW1lKCk7CisKKyAg
ICB2b2lkIHJlZkRhdGFTb3VyY2UoKTsKKyAgICB2b2lkIHVucmVmRGF0YVNvdXJjZSgpOworCisg
ICAgYm9vbCBtX2lzRGF0YVNvdXJjZVJlZmZlZDsKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBt
X2RhdGFTb3VyY2U7CisgICAgSGFzaFNldDx1bnNpZ25lZCBsb25nPiBtX2xvYWRpbmdSZXNvdXJj
ZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9XZWJLaXQv
Z3RrL1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50R3RrLmNwcCBiL1dlYktpdC9ndGsv
V2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRHdGsuY3BwCmluZGV4IDY4YzA0MzUuLjQ0
ZjZmMDIgMTAwNjQ0Ci0tLSBhL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJD
bGllbnRHdGsuY3BwCisrKyBiL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJD
bGllbnRHdGsuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJDb2xvci5oIgogI2lu
Y2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIK
ICNpbmNsdWRlICJGb3JtU3RhdGUuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgogI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgpAQCAtMTExLDcgKzExMiwxMyBAQCBzdGF0aWMgdm9pZCBsb2FkRG9u
ZShXZWJLaXRXZWJGcmFtZSogZnJhbWUsIGJvb2wgZGlkU3VjY2VlZCkKIAogV1RGOjpQYXNzUmVm
UHRyPFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyPiBGcmFtZUxvYWRlckNsaWVudDo6Y3JlYXRlRG9j
dW1lbnRMb2FkZXIoY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25z
dCBTdWJzdGl0dXRlRGF0YSYgc3Vic3RpdHV0ZURhdGEpCiB7Ci0gICAgcmV0dXJuIERvY3VtZW50
TG9hZGVyOjpjcmVhdGUocmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpOworICAgIFJlZlB0cjxXZWJL
aXQ6OkRvY3VtZW50TG9hZGVyPiBsb2FkZXIgPSBXZWJLaXQ6OkRvY3VtZW50TG9hZGVyOjpjcmVh
dGUocmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSog
d2ViRGF0YVNvdXJjZSA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfbG9hZGVyKGxv
YWRlci5nZXQoKSk7CisgICAgbG9hZGVyLT5zZXREYXRhU291cmNlKHdlYkRhdGFTb3VyY2UpOwor
ICAgIGdfb2JqZWN0X3VucmVmKHdlYkRhdGFTb3VyY2UpOworCisgICAgcmV0dXJuIGxvYWRlci5y
ZWxlYXNlKCk7CiB9CiAKIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2lsbFN1Ym1p
dEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiBwb2xpY3lGdW5jdGlvbiwgUGFzc1JlZlB0cjxGb3Jt
U3RhdGU+KQpAQCAtMTI0LDcgKzEzMSw3IEBAIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3Bh
dGNoV2lsbFN1Ym1pdEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiBwb2xpY3lGdW5jdGlvCiB9CiAK
IAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciog
bG9hZGVyLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQordm9pZCBGcmFtZUxvYWRlckNs
aWVudDo6Y29tbWl0dGVkTG9hZChXZWJDb3JlOjpEb2N1bWVudExvYWRlciogbG9hZGVyLCBjb25z
dCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQogewogICAgIGlmICghbV9wbHVnaW5WaWV3KSB7CiAg
ICAgICAgIEFTU0VSVChsb2FkZXItPmZyYW1lKCkpOwpAQCAtMTU4LDI4ICsxNjUsMjkgQEAgdm9p
ZCBGcmFtZUxvYWRlckNsaWVudDo6Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciogbG9hZGVy
LCBjb25zdCBjaGFyKiBkYXRhLAogfQogCiBib29sCi1GcmFtZUxvYWRlckNsaWVudDo6c2hvdWxk
VXNlQ3JlZGVudGlhbFN0b3JhZ2UoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVu
dGlmaWVyKQorRnJhbWVMb2FkZXJDbGllbnQ6OnNob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlKFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRlbnRpZmllcikKIHsKICAg
ICBub3RJbXBsZW1lbnRlZCgpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBGcmFtZUxv
YWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9j
dW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVudGlmaWVyLCBjb25zdCBBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZSYpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2Vp
dmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIHVuc2ln
bmVkIGxvbmcgIGlkZW50aWZpZXIsIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikKIHsK
ICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNw
YXRjaERpZENhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKERvY3VtZW50TG9hZGVyKiwgdW5z
aWduZWQgbG9uZyAgaWRlbnRpZmllciwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKQor
dm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRDYW5jZWxBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcgIGlkZW50aWZp
ZXIsIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikKIHsKICAgICBub3RJbXBsZW1lbnRl
ZCgpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaFdpbGxTZW5kUmVxdWVz
dChEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcsIFJlc291cmNlUmVxdWVzdCYsIGNvbnN0
IFJlc291cmNlUmVzcG9uc2UmKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hXaWxs
U2VuZFJlcXVlc3QoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgdW5zaWduZWQgbG9u
ZyBpZGVudGlmaWVyLCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFJlc291cmNlUmVz
cG9uc2UmIHJlZGlyZWN0UmVzcG9uc2UpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBp
ZiAocmVkaXJlY3RSZXNwb25zZS5pc051bGwoKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2ViS2l0
OjpEb2N1bWVudExvYWRlcio+KGxvYWRlciktPmluY3JlYXNlTG9hZENvdW50KGlkZW50aWZpZXIp
OwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojphc3NpZ25JZGVudGlmaWVyVG9Jbml0aWFs
UmVxdWVzdCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIERvY3VtZW50TG9hZGVyKiwgY29uc3Qg
UmVzb3VyY2VSZXF1ZXN0JikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmFzc2lnbklkZW50aWZp
ZXJUb0luaXRpYWxSZXF1ZXN0KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllciwgV2ViQ29yZTo6RG9j
dW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmKQogewogICAgIG5vdEltcGxlbWVu
dGVkKCk7CiB9CkBAIC0yMjEsNyArMjI5LDcgQEAgdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZnJh
bWVMb2FkZXJEZXN0cm95ZWQoKQogICAgIGRlbGV0ZSB0aGlzOwogfQogCi12b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50OjpkaXNwYXRjaERpZFJlY2VpdmVSZXNwb25zZShEb2N1bWVudExvYWRlciosIHVu
c2lnbmVkIGxvbmcsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQordm9pZCBGcmFt
ZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlUmVzcG9uc2UoV2ViQ29yZTo6RG9jdW1l
bnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25z
ZSkKIHsKICAgICBtX3Jlc3BvbnNlID0gcmVzcG9uc2U7CiB9CkBAIC01NDYsNyArNTU0LDcgQEAg
Ym9vbCBGcmFtZUxvYWRlckNsaWVudDo6c2hvdWxkR29Ub0hpc3RvcnlJdGVtKEhpc3RvcnlJdGVt
KiBpdGVtKSBjb25zdAogICAgIHJldHVybiBpdGVtICE9IDA7CiB9CiAKLXZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnQ6Om1ha2VSZXByZXNlbnRhdGlvbihEb2N1bWVudExvYWRlciopCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50OjptYWtlUmVwcmVzZW50YXRpb24oV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIq
KQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CkBAIC03MDAsMjIgKzcwOCwyMiBAQCB2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50OjpjYW5jZWxQb2xpY3lDaGVjaygpCiAgICAgICAgIHdlYmtpdF93
ZWJfcG9saWN5X2RlY2lzaW9uX2NhbmNlbChtX3BvbGljeURlY2lzaW9uKTsKIH0KIAotdm9pZCBG
cmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKERvY3VtZW50TG9h
ZGVyKikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkTG9hZE1haW5SZXNvdXJj
ZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0K
IAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6cmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKERvY3Vt
ZW50TG9hZGVyKikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OnJldmVydFRvUHJvdmlzaW9uYWxT
dGF0ZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsK
IH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6d2lsbENoYW5nZVRpdGxlKERvY3VtZW50TG9h
ZGVyKikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OndpbGxDaGFuZ2VUaXRsZShXZWJDb3JlOjpE
b2N1bWVudExvYWRlciopCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBGcmFt
ZUxvYWRlckNsaWVudDo6ZGlkQ2hhbmdlVGl0bGUoRG9jdW1lbnRMb2FkZXIgKmwpCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50OjpkaWRDaGFuZ2VUaXRsZShXZWJDb3JlOjpEb2N1bWVudExvYWRlciAq
bCkKIHsKICAgICBzZXRUaXRsZShsLT50aXRsZSgpLCBsLT51cmwoKSk7CiB9CkBAIC03NDQsNyAr
NzUyLDcgQEAgU3RyaW5nIEZyYW1lTG9hZGVyQ2xpZW50OjpnZW5lcmF0ZWRNSU1FVHlwZUZvclVS
TFNjaGVtZShjb25zdCBTdHJpbmcmKSBjb25zdAogICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAot
dm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZmluaXNoZWRMb2FkaW5nKERvY3VtZW50TG9hZGVyKiBk
b2N1bWVudExvYWRlcikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmZpbmlzaGVkTG9hZGluZyhX
ZWJDb3JlOjpEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIpCiB7CiAgICAgaWYgKCFtX3Bs
dWdpblZpZXcpCiAgICAgICAgIGNvbW1pdHRlZExvYWQoZG9jdW1lbnRMb2FkZXIsIDAsIDApOwpA
QCAtNzc0LDIwICs3ODIsMjEgQEAgdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6c2V0VGl0bGUoY29u
c3QgU3RyaW5nJiB0aXRsZSwgY29uc3QgS1VSTCYgdXJsKQogICAgIGZyYW1lRGF0YS0+dGl0bGUg
PSBnX3N0cmR1cCh0aXRsZS51dGY4KCkuZGF0YSgpKTsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNs
aWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlQ29udGVudExlbmd0aChEb2N1bWVudExvYWRlciosIHVu
c2lnbmVkIGxvbmcgaWRlbnRpZmllciwgaW50IGxlbmd0aFJlY2VpdmVkKQordm9pZCBGcmFtZUxv
YWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlQ29udGVudExlbmd0aChXZWJDb3JlOjpEb2N1
bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllciwgaW50IGxlbmd0aFJlY2VpdmVk
KQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6
OmRpc3BhdGNoRGlkRmluaXNoTG9hZGluZyhEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcg
aWRlbnRpZmllcikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkRmluaXNoTG9h
ZGluZyhXZWJDb3JlOjpEb2N1bWVudExvYWRlciogbG9hZGVyLCB1bnNpZ25lZCBsb25nIGlkZW50
aWZpZXIpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBzdGF0aWNfY2FzdDxXZWJLaXQ6
OkRvY3VtZW50TG9hZGVyKj4obG9hZGVyKS0+ZGVjcmVhc2VMb2FkQ291bnQoaWRlbnRpZmllcik7
CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkRmFpbExvYWRpbmcoRG9j
dW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNvbnN0IFJlc291cmNlRXJy
b3ImIGVycm9yKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRGYWlsTG9hZGlu
ZyhXZWJDb3JlOjpEb2N1bWVudExvYWRlciogbG9hZGVyLCB1bnNpZ25lZCBsb25nIGlkZW50aWZp
ZXIsIGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQogewogICAgIC8vIEZJWE1FOiB3aGVuIGRv
ZXMgdGhpcyBvY2N1ciBhbmQgd2hhdCBzaG91bGQgaGFwcGVuPwotICAgIG5vdEltcGxlbWVudGVk
KCk7CisKKyAgICBzdGF0aWNfY2FzdDxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyKj4obG9hZGVyKS0+
ZGVjcmVhc2VMb2FkQ291bnQoaWRlbnRpZmllcik7CiB9CiAKIHZvaWQgRnJhbWVMb2FkZXJDbGll
bnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNlQnlYTUxIdHRwUmVxdWVzdCh1bnNpZ25lZCBsb25n
LCBjb25zdCBTY3JpcHRTdHJpbmcmKQpAQCAtNzk1LDcgKzgwNCw3IEBAIHZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNlQnlYTUxIdHRwUmVxdWVzdCh1bnNpZ25l
ZCBsb25nLCBjCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotYm9vbCBGcmFtZUxvYWRlckNs
aWVudDo6ZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VGcm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRMb2Fk
ZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiwgaW50
IGxlbmd0aCkKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNl
RnJvbU1lbW9yeUNhY2hlKFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VS
ZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYsIGludCBsZW5ndGgpCiB7CiAgICAgbm90
SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC05NDMsNyArOTUyLDcgQEAgdm9p
ZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hVbmFibGVUb0ltcGxlbWVudFBvbGljeShjb25z
dCBSZXNvdXJjZUVycm9yJikKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1l
TG9hZGVyQ2xpZW50OjpzZXRNYWluRG9jdW1lbnRFcnJvcihEb2N1bWVudExvYWRlciosIGNvbnN0
IFJlc291cmNlRXJyb3ImIGVycm9yKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6c2V0TWFpbkRv
Y3VtZW50RXJyb3IoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZUVycm9y
JiBlcnJvcikKIHsKICAgICBpZiAobV9wbHVnaW5WaWV3KSB7CiAgICAgICAgIG1fcGx1Z2luVmll
dy0+ZGlkRmFpbChlcnJvcik7CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQu
aCBiL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdC5oCmluZGV4IDdhOWIyODEuLjhkZTc1ZTAgMTAw
NjQ0Ci0tLSBhL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdC5oCisrKyBiL1dlYktpdC9ndGsvd2Vi
a2l0L3dlYmtpdC5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRv
d25sb2FkLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CiAjaW5j
bHVkZSA8d2Via2l0L3dlYmtpdHNvdXBhdXRoZGlhbG9nLmg+CisjaW5jbHVkZSA8d2Via2l0L3dl
YmtpdHdlYmRhdGFzb3VyY2UuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViZnJhbWUuaD4K
ICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2Vic2V0dGluZ3MuaD4KICNpbmNsdWRlIDx3ZWJraXQv
d2Via2l0d2ViaW5zcGVjdG9yLmg+CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXRkZWZpbmVzLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRkZWZpbmVzLmgKaW5kZXggNmY5
ZGRkMC4uZWE5MDBhMCAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5l
cy5oCisrKyBiL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdGRlZmluZXMuaApAQCAtNzQsNiArNzQs
OSBAQCB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0RG93bmxvYWRDbGFzcyBXZWJLaXREb3dubG9hZENs
YXNzOwogdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlIFdlYktpdFdlYlJlc291cmNl
OwogdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlQ2xhc3MgV2ViS2l0V2ViUmVzb3Vy
Y2VDbGFzczsKIAordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYkRhdGFTb3VyY2UgV2ViS2l0V2Vi
RGF0YVNvdXJjZTsKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MgV2Vi
S2l0V2ViRGF0YVNvdXJjZUNsYXNzOworCiBHX0VORF9ERUNMUwogCiAjZW5kaWYKZGlmZiAtLWdp
dCBhL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaCBiL1dlYktpdC9ndGsvd2Via2l0
L3dlYmtpdHByaXZhdGUuaAppbmRleCBiOWNkNzI3Li40YWZmNDc3IDEwMDY0NAotLS0gYS9XZWJL
aXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgKKysrIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Vi
a2l0cHJpdmF0ZS5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRv
d25sb2FkLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CiAjaW5j
bHVkZSA8d2Via2l0L3dlYmtpdHdlYnZpZXcuaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2Vi
ZGF0YXNvdXJjZS5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1
ZGUgPHdlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93
ZWJraXR3ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+CkBAIC02Myw2ICs2NCw5IEBACiBjbGFzcyBEb3du
bG9hZENsaWVudDsKIAogbmFtZXNwYWNlIFdlYktpdCB7CisKKyAgICBjbGFzcyBEb2N1bWVudExv
YWRlcjsKKwogICAgIFdlYktpdFdlYlZpZXcqIGdldFZpZXdGcm9tRnJhbWUoV2ViS2l0V2ViRnJh
bWUqKTsKIAogICAgIFdlYkNvcmU6OkZyYW1lKiBjb3JlKFdlYktpdFdlYkZyYW1lKik7CkBAIC0y
NjksNiArMjczLDEwIEBAIGV4dGVybiAiQyIgewogCiAgICAgV0VCS0lUX0FQSSB2b2lkCiAgICAg
d2Via2l0X2FwcGxpY2F0aW9uX2NhY2hlX3NldF9tYXhpbXVtX3NpemUodW5zaWduZWQgbG9uZyBs
b25nIHNpemUpOworCisgICAgLy8gV2ViS2l0V2ViRGF0YVNvdXJjZSBwcml2YXRlCisgICAgV2Vi
S2l0V2ViRGF0YVNvdXJjZSoKKyAgICB3ZWJraXRfd2ViX2RhdGFfc291cmNlX25ld193aXRoX2xv
YWRlcihQYXNzUmVmUHRyPFdlYktpdDo6RG9jdW1lbnRMb2FkZXI+KTsKIH0KIAogI2VuZGlmCmRp
ZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmNwcCBiL1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmM5M2JhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmNwcApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWljaGFlbCBDLiBBbG9uem8KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIndlYmtpdHdlYmRhdGFzb3VyY2UuaCIKKworI2luY2x1ZGUgIkFyY2hp
dmVSZXNvdXJjZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyR3RrLmgiCisjaW5jbHVkZSAi
RnJhbWVMb2FkZXJDbGllbnRHdGsuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1
ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlJlc291
cmNlUmVxdWVzdC5oIgorI2luY2x1ZGUgInJ1bnRpbWUvSW5pdGlhbGl6ZVRocmVhZGluZy5oIgor
I2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgIlN1YnN0aXR1dGVEYXRhLmgiCisj
aW5jbHVkZSAid2Via2l0d2VicmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ3ZWJraXRwcml2YXRlLmgi
CisjaW5jbHVkZSAid3RmL0Fzc2VydGlvbnMuaCIKKworI2luY2x1ZGUgPGdsaWIuaD4KKworLyoq
CisgKiBTRUNUSU9OOndlYmtpdHdlYmRhdGFzb3VyY2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjog
RW5jYXBzdWxhdGVzIHRoZSBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbiBhICNXZWJLaXRXZWJG
cmFtZS4KKyAqIEBzZWVfYWxzbzogI1dlYktpdFdlYkZyYW1lCisgKgorICogQSBkYXRhIHNvdXJj
ZSBlbmNhcHN1bGF0ZXMgdGhlIGNvbnRlbnQgb2YgYSAjV2ViS2l0V2ViRnJhbWUuIEEKKyAqICNX
ZWJLaXRXZWJGcmFtZSBoYXMgYSBtYWluIHJlc291cmNlIGFuZCBzdWJyZXNvdXJjZXMgYW5kIHRo
ZSBkYXRhIHNvdXJjZQorICogcHJvdmlkZXMgbWV0aG9kcyB0byBhY2Nlc3MgdGhlc2UgcmVzb3Vy
Y2VzLiAjV2ViS2l0V2ViRGF0YVNvdXJjZSBvYmplY3RzCisgKiBoYXZlIGFuIGFzc29jaWF0ZWQg
aW5pdGlhbCByZXF1ZXN0LiBNYWtlIHN1cmUgdG8gY2hlY2sgaWYgdGhlIGRhdGEgc291cmNlCisg
KiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBpdHMg
ZGF0YS4KKyAqLworCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFjZSBX
ZWJLaXQ7CisKK3N0cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUgeworICAgIFdlYktp
dDo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlcjsKKworICAgIFdlYktpdE5ldHdvcmtSZXF1ZXN0KiBp
bml0aWFsUmVxdWVzdDsKKyAgICBXZWJLaXROZXR3b3JrUmVxdWVzdCogbmV0d29ya1JlcXVlc3Q7
CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIG1haW5SZXNvdXJjZTsKKyAgICBHTGlzdCogc3VicmVz
b3VyY2VzOworICAgIEdTdHJpbmcqIGRhdGE7CisKKyAgICBnY2hhciogdGV4dEVuY29kaW5nOwor
ICAgIGdjaGFyKiB1bnJlYWNoYWJsZVVSTDsKK307CisKKyNkZWZpbmUgV0VCS0lUX1dFQl9EQVRB
X1NPVVJDRV9HRVRfUFJJVkFURShvYmopICAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklW
QVRFKChvYmopLCBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktpdFdlYkRhdGFTb3Vy
Y2VQcml2YXRlKSkKKworR19ERUZJTkVfVFlQRShXZWJLaXRXZWJEYXRhU291cmNlLCB3ZWJraXRf
d2ViX2RhdGFfc291cmNlLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGljIHZvaWQgd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9kaXNwb3NlKEdPYmplY3QqIG9iamVjdCkKK3sKKyAgICBXZWJLaXRXZWJE
YXRhU291cmNlKiB3ZWJEYXRhU291cmNlID0gV0VCS0lUX1dFQl9EQVRBX1NPVVJDRShvYmplY3Qp
OworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+
cHJpdjsKKworICAgIEFTU0VSVChwcml2LT5sb2FkZXIpOworICAgIEFTU0VSVCghcHJpdi0+bG9h
ZGVyLT5pc0xvYWRpbmcoKSk7CisgICAgcHJpdi0+bG9hZGVyLT5kZXRhY2hEYXRhU291cmNlKCk7
CisgICAgcHJpdi0+bG9hZGVyLT5kZXJlZigpOworCisgICAgaWYgKHByaXYtPmluaXRpYWxSZXF1
ZXN0KSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPmluaXRpYWxSZXF1ZXN0KTsKKyAg
ICAgICAgcHJpdi0+aW5pdGlhbFJlcXVlc3QgPSBOVUxMOworICAgIH0KKworICAgIGlmIChwcml2
LT5uZXR3b3JrUmVxdWVzdCkgeworICAgICAgICBnX29iamVjdF91bnJlZihwcml2LT5uZXR3b3Jr
UmVxdWVzdCk7CisgICAgICAgIHByaXYtPm5ldHdvcmtSZXF1ZXN0ID0gTlVMTDsKKyAgICB9CisK
KyAgICBpZiAocHJpdi0+bWFpblJlc291cmNlKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmKHBy
aXYtPm1haW5SZXNvdXJjZSk7CisgICAgICAgIHByaXYtPm1haW5SZXNvdXJjZSA9IE5VTEw7Cisg
ICAgfQorCisgICAgaWYgKHByaXYtPmRhdGEpIHsKKyAgICAgICAgZ19zdHJpbmdfZnJlZShwcml2
LT5kYXRhLCBGQUxTRSk7CisgICAgICAgIHByaXYtPmRhdGEgPSBOVUxMOworICAgIH0KKworICAg
IHdoaWxlIChwcml2LT5zdWJyZXNvdXJjZXMpIHsKKyAgICAgICAgV2ViS2l0V2ViUmVzb3VyY2Uq
IHJlcyA9IFdFQktJVF9XRUJfUkVTT1VSQ0UocHJpdi0+c3VicmVzb3VyY2VzLT5kYXRhKTsKKyAg
ICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgIGdfb2JqZWN0X3VucmVmKHJlcyk7CisgICAgICAg
IHByaXYtPnN1YnJlc291cmNlcyA9IHByaXYtPnN1YnJlc291cmNlcy0+bmV4dDsKKyAgICB9CisK
KyAgICBpZiAocHJpdi0+c3VicmVzb3VyY2VzKSB7CisgICAgICAgIGdfbGlzdF9mcmVlKHByaXYt
PnN1YnJlc291cmNlcyk7CisgICAgICAgIHByaXYtPnN1YnJlc291cmNlcyA9IE5VTEw7CisgICAg
fQorCisgICAgR19PQkpFQ1RfQ0xBU1Mod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9wYXJlbnRfY2xh
c3MpLT5kaXNwb3NlKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfZGF0YV9z
b3VyY2VfZmluYWxpemUoR09iamVjdCogb2JqZWN0KQoreworICAgIFdlYktpdFdlYkRhdGFTb3Vy
Y2UqIGRhdGFTb3VyY2UgPSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iamVjdCk7CisgICAgV2Vi
S2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSBkYXRhU291cmNlLT5wcml2OworCisgICAg
Z19mcmVlKHByaXYtPnVucmVhY2hhYmxlVVJMKTsKKyAgICBnX2ZyZWUocHJpdi0+dGV4dEVuY29k
aW5nKTsKKworICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfcGFyZW50
X2NsYXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9jbGFzc19pbml0KFdlYktpdFdlYkRhdGFTb3VyY2VDbGFzcyoga2xhc3MpCit7
CisgICAgR09iamVjdENsYXNzKiBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3Mp
OworICAgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2Rp
c3Bvc2U7CisgICAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2ZpbmFsaXplOworCisgICAgd2Via2l0X2luaXQoKTsKKworICAgIGdfdHlwZV9jbGFzc19h
ZGRfcHJpdmF0ZShnb2JqZWN0X2NsYXNzLCBzaXplb2YoV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZh
dGUpKTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pbml0KFdlYktp
dFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgd2ViRGF0YVNvdXJjZS0+cHJp
diA9IFdFQktJVF9XRUJfREFUQV9TT1VSQ0VfR0VUX1BSSVZBVEUod2ViRGF0YVNvdXJjZSk7Cit9
CisKK1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhf
bG9hZGVyKFBhc3NSZWZQdHI8V2ViS2l0OjpEb2N1bWVudExvYWRlcj4gbG9hZGVyKQoreworICAg
IFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UgPSBXRUJLSVRfV0VCX0RBVEFfU09V
UkNFKGdfb2JqZWN0X25ldyhXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIE5VTEwpKTsKKyAg
ICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7
CisgICAgcHJpdi0+bG9hZGVyID0gbG9hZGVyLnJlbGVhc2VSZWYoKTsKKworICAgIHJldHVybiB3
ZWJEYXRhU291cmNlOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3Ogor
ICoKKyAqIENyZWF0ZXMgYSBuZXcgI1dlYktpdFdlYkRhdGFTb3VyY2UgaW5zdGFuY2UuIFRoZSBV
Ukwgb2YgdGhlCisgKiAjV2ViS2l0V2ViRGF0YVNvdXJjZSB3aWxsIGJlIHNldCB0byAiYWJvdXQ6
YmxhbmsiLgorICoKKyAqIFJldHVybjogYSBuZXcgI1dlYktpdFdlYkRhdGFTb3VyY2UuCisgKgor
ICogU2luY2U6IDEuMS4xMworICovCitXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX25ldygpCit7CisgICAgV2ViS2l0TmV0d29ya1JlcXVlc3QqIHJlcXVlc3QgPSB3
ZWJraXRfbmV0d29ya19yZXF1ZXN0X25ldygiYWJvdXQ6YmxhbmsiKTsKKyAgICBXZWJLaXRXZWJE
YXRhU291cmNlKiBkYXRhc291cmNlID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXdfd2l0aF9y
ZXF1ZXN0KHJlcXVlc3QpOworICAgIGdfb2JqZWN0X3VucmVmKHJlcXVlc3QpOworCisgICAgcmV0
dXJuIGRhdGFzb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXdf
d2l0aF9yZXF1ZXN0OgorICogQHJlcXVlc3Q6IHRoZSAjV2ViS2l0TmV0d29ya1JlcXVlc3QgdG8g
dXNlIHRvIGNyZWF0ZSB0aGlzIGRhdGEgc291cmNlCisgKgorICogQ3JlYXRlcyBhIG5ldyAjV2Vi
S2l0V2ViRGF0YVNvdXJjZSBmcm9tIGEgI1dlYktpdE5ldHdvcmtSZXF1ZXN0LiBOb3JtYWxseSwK
KyAqICNXZWJLaXRXZWJGcmFtZSBvYmplY3RzIGNyZWF0ZSB0aGVpciBkYXRhIHNvdXJjZXMgc28g
eW91IHdpbGwgYWxtb3N0IG5ldmVyCisgKiB3YW50IHRvIGludm9rZSB0aGlzIG1ldGhvZCBkaXJl
Y3RseS4KKyAqCisgKiBSZXR1cm5zOiBhIG5ldyAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAq
IFNpbmNlOiAxLjEuMTMKKyAqLworV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9uZXdfd2l0aF9yZXF1ZXN0KFdlYktpdE5ldHdvcmtSZXF1ZXN0KiByZXF1ZXN0KQor
eworICAgIEFTU0VSVChyZXF1ZXN0KTsKKworICAgIGNvbnN0IGdjaGFyKiB1cmkgPSB3ZWJraXRf
bmV0d29ya19yZXF1ZXN0X2dldF91cmkocmVxdWVzdCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlKiBkYXRhc291cmNlOworICAgIGRhdGFzb3VyY2UgPSB3ZWJraXRfd2ViX2RhdGFfc291cmNl
X25ld193aXRoX2xvYWRlcigKKyAgICAgICAgV2ViS2l0OjpEb2N1bWVudExvYWRlcjo6Y3JlYXRl
KFJlc291cmNlUmVxdWVzdChLVVJMKEtVUkwoKSwgU3RyaW5nOjpmcm9tVVRGOCh1cmkpKSksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRlRGF0YSgpKSk7
CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IGRhdGFzb3VyY2UtPnBy
aXY7CisgICAgcHJpdi0+aW5pdGlhbFJlcXVlc3QgPSByZXF1ZXN0OworCisgICAgcmV0dXJuIGRh
dGFzb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfd2ViX2Zy
YW1lCisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1
cm5zIHRoZSAjV2ViS2l0V2ViRnJhbWUgdGhhdCByZXByZXNlbnRzIHRoaXMgZGF0YSBzb3VyY2UK
KyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSAjV2ViS2l0V2ViRnJhbWUgdGhhdCByZXByZXNlbnRz
IHRoZSBAZGF0YV9zb3VyY2UuIFRoZQorICogI1dlYktpdFdlYkZyYW1lIGlzIG93bmVkIGJ5IFdl
YktpdCBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlZCBvciBkZXN0cm95ZWQuCisgKgorICogU2luY2U6
IDEuMS4xMworICovCitXZWJLaXRXZWJGcmFtZSogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRf
d2ViX2ZyYW1lKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19y
ZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNl
KSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRh
dGFTb3VyY2UtPnByaXY7CisgICAgRnJhbWVMb2FkZXIqIGZyYW1lTG9hZGVyID0gcHJpdi0+bG9h
ZGVyLT5mcmFtZUxvYWRlcigpOworCisgICAgQVNTRVJUKGZyYW1lTG9hZGVyKTsKKworICAgIFdl
YktpdDo6RnJhbWVMb2FkZXJDbGllbnQqIGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8
V2ViS2l0OjpGcmFtZUxvYWRlckNsaWVudCo+KGZyYW1lTG9hZGVyLT5jbGllbnQoKSk7CisgICAg
cmV0dXJuIGZyYW1lTG9hZGVyQ2xpZW50LT53ZWJGcmFtZSgpOworfQorCisvKioKKyAqIHdlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2luaXRpYWxfcmVxdWVzdDoKKyAqIEBkYXRhX3NvdXJjZTog
YSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhl
IG9yaWdpbmFsIHJlcXVlc3QgdGhhdCB3YXMgdXNlZCB0byBsb2FkIHRoZSB3ZWIKKyAqIGNvbnRl
bnQKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBvcmlnaW5hbCAjV2ViS2l0TmV0d29ya1JlcXVl
c3QKKyAqCisgKiBTaW5jZTogMS4xLjEzCisgKi8KK1dlYktpdE5ldHdvcmtSZXF1ZXN0KiB3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2dldF9pbml0aWFsX3JlcXVlc3QoV2ViS2l0V2ViRGF0YVNvdXJj
ZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNf
V0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRh
dGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBSZXNvdXJj
ZVJlcXVlc3QgcmVxdWVzdCA9IHByaXYtPmxvYWRlci0+b3JpZ2luYWxSZXF1ZXN0KCk7CisKKyAg
ICBpZiAoIXByaXYtPmluaXRpYWxSZXF1ZXN0KQorICAgICAgICBwcml2LT5pbml0aWFsUmVxdWVz
dCA9IHdlYmtpdF9uZXR3b3JrX3JlcXVlc3RfbmV3KHJlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRm
OCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+aW5pdGlhbFJlcXVlc3Q7Cit9CisKKy8q
KgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfbmV0d29ya19yZXF1ZXN0OgorICogQGRh
dGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKgorICogUmV0dXJucyBhICNXZWJL
aXROZXR3b3JrUmVxdWVzdCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzICNXZWJLaXRXZWJE
YXRhU291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgI1dlYktpdE5ldHdvcmtSZXF1ZXN0
IHRoYXQgY3JlYXRlZCB0aGUgQGRhdGFfc291cmNlCisgKgorICogU2luY2UgMS4xLjEyCisgKi8K
K1dlYktpdE5ldHdvcmtSZXF1ZXN0KiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0
KFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7
CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2Ut
PnByaXY7CisgICAgRnJhbWVMb2FkZXIqIGZyYW1lTG9hZGVyID0gcHJpdi0+bG9hZGVyLT5mcmFt
ZUxvYWRlcigpOworICAgIGlmICghZnJhbWVMb2FkZXIgfHwgIWZyYW1lTG9hZGVyLT5mcmFtZUhh
c0xvYWRlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJlc291cmNlUmVxdWVzdCBy
ZXF1ZXN0ID0gcHJpdi0+bG9hZGVyLT5yZXF1ZXN0KCk7CisKKyAgICAgaWYgKCFwcml2LT5uZXR3
b3JrUmVxdWVzdCkKKyAgICAgICAgIHByaXYtPm5ldHdvcmtSZXF1ZXN0ID0gd2Via2l0X25ldHdv
cmtfcmVxdWVzdF9uZXdfd2l0aF9jb3JlX3JlcXVlc3QocmVxdWVzdCk7CisKKyAgICByZXR1cm4g
cHJpdi0+bmV0d29ya1JlcXVlc3Q7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfZW5jb2Rpbmc6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UK
KyAqCisgKiBSZXR1cm5zIHRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgYXMgc2V0IGluIHRoZSAjV2Vi
S2l0V2ViVmlldywgb3IgaWYgbm90LCB0aGUKKyAqIHRleHQgZW5jb2Rpbmcgb2YgdGhlIHJlc3Bv
bnNlLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIGVuY29kaW5nIG5hbWUgb2YgdGhlICNXZWJL
aXRXZWJWaWV3IG9yIG9mIHRoZSByZXNwb25zZQorICoKKyAqIFNpbmNlOiAxLjEuMTMKKyAqLwor
R19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2VuY29kaW5n
KFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7
CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2Ut
PnByaXY7CisgICAgU3RyaW5nIHRleHRFbmNvZGluZ05hbWUgPSBwcml2LT5sb2FkZXItPm92ZXJy
aWRlRW5jb2RpbmcoKTsKKworICAgIGlmICghdGV4dEVuY29kaW5nTmFtZSkKKyAgICAgICAgICAg
IHRleHRFbmNvZGluZ05hbWUgPSBwcml2LT5sb2FkZXItPnJlc3BvbnNlKCkudGV4dEVuY29kaW5n
TmFtZSgpOworCisgICAgQ1N0cmluZyBlbmNvZGluZyA9IHRleHRFbmNvZGluZ05hbWUudXRmOCgp
OworICAgIGlmICghcHJpdi0+dGV4dEVuY29kaW5nIHx8IHByaXYtPnRleHRFbmNvZGluZyAhPSBl
bmNvZGluZy5kYXRhKCkpCisgICAgICAgIHByaXYtPnRleHRFbmNvZGluZyA9IGdfc3RyZHVwKGVu
Y29kaW5nLmRhdGEoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+dGV4dEVuY29kaW5nOworfQorCisv
KioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZzoKKyAqIEBkYXRhX3NvdXJj
ZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIERldGVybWluZXMgd2hldGhlciB0aGUg
ZGF0YSBzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGludCBpdHMgY29udGVudC4KKyAq
CisgKiBSZXR1cm4gdmFsdWU6ICVUUlVFIGlmIHRoZSBAZGF0YV9zb3VyY2UgaXMgc3RpbGwgbG9h
ZGluZywgJUZBTFNFIG90aGVyd2lzZQorICoKKyAqIFNpbmNlOiAxLjEuMTMKKyAqLworZ2Jvb2xl
YW4gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9pc19sb2FkaW5nKFdlYktpdFdlYkRhdGFTb3VyY2Uq
IHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dF
Ql9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRh
U291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisKKyAgICByZXR1cm4g
cHJpdi0+bG9hZGVyLT5pc0xvYWRpbmdJbkFQSVNlbnNlKCk7Cit9CisKKy8qKgorICogd2Via2l0
X3dlYl9kYXRhX3NvdXJjZV9nZXRfZGF0YToKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2Vi
RGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMgdGhlIHJhdyBkYXRhIHRoYXQgcmVwcmVzZW50cyB0
aGUgdGhlIGZyYW1lJ3MgY29udGVudC5UaGUgZGF0YSB3aWxsCisgKiBiZSBpbmNvbXBsZXRlIHVu
dGlsIHRoZSBkYXRhIGhhcyBmaW5pc2hlZCBsb2FkaW5nLiBSZXR1cm5zICVOVUxMIGlmIHRoZSB3
ZWIKKyAqIGZyYW1lIGhhc24ndCBsb2FkZWQgYW55IGRhdGEuIFVzZSB3ZWJraXRfd2ViX2RhdGFf
c291cmNlX2lzX2xvYWRpbmcgdG8gdGVzdAorICogaWYgZGF0YSBzb3VyY2UgaXMgaW4gdGhlIHBy
b2Nlc3Mgb2YgbG9hZGluZy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgI0dTdHJpbmcgd2hpY2gg
Y29udGFpbnMgdGhlIHJhdyBkYXRhIHRoYXQgcmVwcmVzZW50cyB0aGUgQGRhdGFfc291cmNlIG9y
ICVOVUxMIGlmIHRoZQorICogQGRhdGFfc291cmNlIGhhc24ndCBsb2FkZWQgYW55IGRhdGEuCisg
KgorICogU2luY2U6IDEuMS4xMworICovCitHX0NPTlNUX1JFVFVSTiBHU3RyaW5nKiB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF9kYXRhKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3Vy
Y2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJD
RSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0
ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVy
PiBtYWluUmVzb3VyY2VEYXRhID0gcHJpdi0+bG9hZGVyLT5tYWluUmVzb3VyY2VEYXRhKCk7CisK
KyAgICBpZiAoIW1haW5SZXNvdXJjZURhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAg
aWYgKCFwcml2LT5kYXRhKQorICAgICAgICBwcml2LT5kYXRhID0gZ19zdHJpbmdfbmV3X2xlbiht
YWluUmVzb3VyY2VEYXRhLT5kYXRhKCksIG1haW5SZXNvdXJjZURhdGEtPnNpemUoKSk7CisKKyAg
ICByZXR1cm4gcHJpdi0+ZGF0YTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF9tYWluX3Jlc291cmNlOgorICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291
cmNlCisgKgorICogUmV0dXJucyB0aGUgbWFpbiByZXNvdXJjZSBvZiB0aGUgQGRhdGFfc291cmNl
CisgKgorICogUmV0dXJuIHZhbHVlOiBhIG5ldyAjV2ViS2l0V2ViUmVzb3VyY2UgcmVwcmVzZW50
aW5nIHRoZSBtYWluIHJlc291cmNlIG9mCisgKiB0aGUgQGRhdGFfc291cmNlLgorICoKKyAqIFNp
bmNlOiAxLjEuMTIKKyAqLworV2ViS2l0V2ViUmVzb3VyY2UqIHdlYmtpdF93ZWJfZGF0YV9zb3Vy
Y2VfZ2V0X21haW5fcmVzb3VyY2UoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkK
K3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdl
YkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBw
cml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKworICAgIFJlZlB0cjxBcmNoaXZlUmVzb3VyY2U+
IGNvcmVSZXNvdXJjZSA9IHByaXYtPmxvYWRlci0+bWFpblJlc291cmNlKCk7CisKKyAgICBBU1NF
UlQoY29yZVJlc291cmNlKTsKKworICAgIGlmICghcHJpdi0+bWFpblJlc291cmNlKQorICAgICAg
ICBwcml2LT5tYWluUmVzb3VyY2UgPSB3ZWJraXRfd2ViX3Jlc291cmNlX25ld193aXRoX2NvcmVf
cmVzb3VyY2UoY29yZVJlc291cmNlLnJlbGVhc2UoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+bWFp
blJlc291cmNlOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJl
c291cmNlczoKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAq
IFJldHJpZXZlcyB0aGUgc3VicmVzb3VyY2VzIG9mIHRoaXMgQGRhdGFzb3VyY2UuCisgKgorICog
UmV0dXJuIHZhbHVlOiBhICNHTGlzdCBvZiAjV2ViS2l0V2ViUmVzb3VyY2UuIFRoZSAjR0xpc3Qg
aWYgb3duZWQgYnkgV2ViS2l0CisgKiBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlZCBvciBkZXN0cm95
ZWQuCisgKgorICogU2luY2U6IDEuMS4xMworICovCitHTGlzdCogd2Via2l0X3dlYl9kYXRhX3Nv
dXJjZV9nZXRfc3VicmVzb3VyY2VzKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2Up
Cit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3
ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSog
cHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisKKyAgICBWZWN0b3I8UGFzc1JlZlB0cjxBcmNo
aXZlUmVzb3VyY2U+ID4gY29yZVN1YnJlc291cmNlczsKKyAgICBwcml2LT5sb2FkZXItPmdldFN1
YnJlc291cmNlcyhjb3JlU3VicmVzb3VyY2VzKTsKKworICAgIC8vIEEgcmVzb3VyY2UgbWF5IGhh
dmUgYWRkZWQgc28gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgc2l6ZXMgYXJlIG5vdCBlcXVhbC4K
KyAgICBpZiAoIXByaXYtPnN1YnJlc291cmNlcyB8fCBjb3JlU3VicmVzb3VyY2VzLnNpemUoKSAh
PSBnX2xpc3RfbGVuZ3RoKHByaXYtPnN1YnJlc291cmNlcykpIHsKKyAgICAgICAgaWYgKHByaXYt
PnN1YnJlc291cmNlcykgeworICAgICAgICAgICAgLy8gSWYgc2l6ZXMgYXJlIG5vdCBlcXVhbCwg
cmVmcmVzaCBvdXIgaW50ZXJuYWwgY29weSBidXQgZnJlZSB0aGUgcmVzb3VyY2VzIGZpcnN0Lgor
ICAgICAgICAgICAgZm9yICggOyBwcml2LT5zdWJyZXNvdXJjZXM7IHByaXYtPnN1YnJlc291cmNl
cyA9ICBwcml2LT5zdWJyZXNvdXJjZXMtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBnX29iamVj
dF91bnJlZihwcml2LT5zdWJyZXNvdXJjZXMtPmRhdGEpOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgZ19saXN0X2ZyZWUocHJpdi0+c3VicmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHByaXYt
PnN1YnJlc291cmNlcyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgY29yZVN1YnJlc291cmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAg
V2ViS2l0V2ViUmVzb3VyY2UqIHJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9uZXdfd2l0
aF9jb3JlX3Jlc291cmNlKGNvcmVTdWJyZXNvdXJjZXMuYXQoaSkpOworICAgICAgICAgICAgQVNT
RVJUKHJlc291cmNlKTsKKyAgICAgICAgICAgIHByaXYtPnN1YnJlc291cmNlcyA9IGdfbGlzdF9w
cmVwZW5kKHByaXYtPnN1YnJlc291cmNlcywgcmVzb3VyY2UpOworICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIHByaXYtPnN1YnJlc291cmNlczsKK30KKworc3RhdGljIGd1c2hvcnQgd2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9maW5kX3Jlc291cmNlX2Z1bmMoZ2NvbnN0cG9pbnRlciBkYXRh
LCBnY29uc3Rwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVy
bnMgMCBpZiByZXNvdXJjZSBpcyBmb3VuZC4KKyAgICByZXR1cm4gIWdfc3RyX2VxdWFsKHdlYmtp
dF93ZWJfcmVzb3VyY2VfZ2V0X3VybChXRUJLSVRfV0VCX1JFU09VUkNFKGRhdGEpKSwgKGdjaGFy
Kil1c2VyX2RhdGEpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3Jl
c291cmNlX2Zvcl91cmw6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UK
KyAqIEB1cmw6IHRoZSB1cmwgb2YgYSByZXNvdXJjZQorICoKKyAqIFJldHVybnMgdGhlICNXZWJL
aXRXZWJSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSTAorICoKKyAqIFJldHVybiB2YWx1ZTogdGhl
ICNXZWJLaXRXZWJSZXNvdXJjZSBmb3IgQHVybCBvciAlTlVMTCBpZiB0aGVyZSBpcyBubworICog
I1dlYktpdFdlYlJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQHVybC4KKyAqCisgKiBTaW5j
ZTogMS4xLjEzCisgKi8KK1dlYktpdFdlYlJlc291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNl
X2dldF9zdWJyZXNvdXJjZV9mb3JfdXJsKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3Vy
Y2UsIGNvbnN0IGdjaGFyKiB1cmwpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lU
X0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICAvLyBNYWtl
IHN1cmUgd2UgaGF2ZSB0aGUgc3VicmVzb3VyY2VzIGludGVybmFsbHkuCisgICAgR0xpc3QqIHN1
YnJlc291cmNlcyA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291cmNlcyh3ZWJE
YXRhU291cmNlKTsKKworICAgIEdMaXN0KiBlbGVtZW50ID0gZ19saXN0X2ZpbmRfY3VzdG9tKHN1
YnJlc291cmNlcywgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChHQ29tcGFyZUZ1bmMpd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9maW5kX3Jlc291cmNlX2Z1bmMp
OworICAgIHJldHVybiBXRUJLSVRfV0VCX1JFU09VUkNFKGVsZW1lbnQtPmRhdGEpOworfQorCisv
KioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291cmNlOgorICogQGRhdGFf
c291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKiBAc3VicmVzb3VyY2U6IGEgI1dlYktp
dFdlYlJlc291cmNlCisgKgorICogQWRkcyBAc3VicmVzb3VyY2UgdG8gdGhlIGxpc3Qgb2Ygc3Vi
cmVzb3VyY2VzIG9mIEBkYXRhX3NvdXJjZQorICoKKyAqIFNpbmNlIDEuMS4xMworICovCit2b2lk
IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJlc291cmNlKFdlYktpdFdlYkRhdGFTb3Vy
Y2UqIHdlYkRhdGFTb3VyY2UsIFdlYktpdFdlYlJlc291cmNlKiBzdWJyZXNvdXJjZSkKK3sKKyAg
ICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJj
ZSkpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9SRVNPVVJDRShzdWJyZXNv
dXJjZSkpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRh
U291cmNlLT5wcml2OworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSogcmVzb3VyY2VQcml2
ID0gV0VCS0lUX1dFQl9SRVNPVVJDRV9HRVRfUFJJVkFURShzdWJyZXNvdXJjZSk7CisKKyAgICBw
cml2LT5sb2FkZXItPmFkZEFyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVByaXYtPnJlc291cmNlKTsK
K30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF91bnJlYWNoYWJsZV91cmw6
CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBSZXR1cm4g
dGhlIHVucmVhY2hhYmxlIFVSTCBvZiBAZGF0YV9zb3VyY2UuIFRoZSBAZGF0YV9zb3VyY2Ugd2ls
bCBoYXZlIGFuCisgKiB1bnJlYWNoYWJsZSBVUkwgaWYgaXQgd2FzIGNyZWF0ZWQgdXNpbmcgI1dl
YktpdFdlYkZyYW1lJ3MKKyAqIHdlYmtpdF93ZWJfZnJhbWVfbG9hZF9hbHRlcm5hdGVfaHRtbF9z
dHJpbmcgbWV0aG9kLgorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIHVucmVhY2hhYmxlIFVSTCBv
ZiBAZGF0YV9zb3VyY2Ugb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8gdW5yZWFjaGFibGUgVVJMLgor
ICoKKyAqIFNpbmNlIDEuMS4xMworICovCitHX0NPTlNUX1JFVFVSTiBnY2hhciogd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9nZXRfdW5yZWFjaGFibGVfdXJsKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdl
YkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9E
QVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisgICAgY29uc3QgS1VSTCYg
dW5yZWFjaGFibGVVUkwgPSBwcml2LT5sb2FkZXItPnVucmVhY2hhYmxlVVJMKCk7CisKKyAgICBp
ZiAodW5yZWFjaGFibGVVUkwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAg
IGlmICghcHJpdi0+dW5yZWFjaGFibGVVUkwpCisgICAgICAgIHByaXYtPnVucmVhY2hhYmxlVVJM
ID0gZ19zdHJkdXAodW5yZWFjaGFibGVVUkwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAg
ICByZXR1cm4gcHJpdi0+dW5yZWFjaGFibGVVUkw7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmggYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3
ZWJkYXRhc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYzI4
NQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3Vy
Y2UuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYW4gTWlj
aGFlbCBDLiBBbG9uem8KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKi8KKworI2lmbmRlZiBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0gKKyNkZWZpbmUg
V0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8
Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkZWZpbmVzLmg+CisjaW5j
bHVkZSA8d2Via2l0L3dlYmtpdHdlYmZyYW1lLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5l
dHdvcmtyZXF1ZXN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRfVFlQRV9X
RUJfREFUQV9TT1VSQ0UgICAgICAgICAgICAod2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdHlw
ZSgpKQorI2RlZmluZSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAgICAoR19U
WVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJD
RSwgV2ViS2l0V2ViRGF0YVNvdXJjZSkpCisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9TT1VSQ0Vf
Q0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCAgV0VCS0lU
X1RZUEVfV0VCX0RBVEFfU09VUkNFLCBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MpKQorI2RlZmlu
ZSBXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lO
U1RBTkNFX1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSkpCisjZGVmaW5l
IFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xB
U1NfVFlQRSgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFKSkKKyNkZWZpbmUg
V0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9H
RVRfQ0xBU1MoKG9iaiksICBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktpdFdlYkRh
dGFTb3VyY2VDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlUHJp
dmF0ZSBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZTsKKworc3RydWN0IF9XZWJLaXRXZWJEYXRh
U291cmNlIHsKKyAgICBHT2JqZWN0IHBhcmVudF9pbnN0YW5jZTsKKworICAgIC8qPCBwcml2YXRl
ID4qLworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlICpwcml2OworfTsKKworc3RydWN0
IF9XZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MgeworICAgIEdPYmplY3RDbGFzcyBwYXJlbnRfY2xh
c3M7CisKKyAgICAvKiBQYWRkaW5nIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgdm9pZCAo
Kl93ZWJraXRfcmVzZXJ2ZWQwKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQx
KSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQyKSAodm9pZCk7CisgICAgdm9p
ZCAoKl93ZWJraXRfcmVzZXJ2ZWQzKSAodm9pZCk7Cit9OworCitXRUJLSVRfQVBJIEdUeXBlCit3
ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF90eXBlICh2b2lkKTsKKworV0VCS0lUX0FQSSBXZWJL
aXRXZWJEYXRhU291cmNlICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfbmV3ICAgICAgICAgICAg
ICAgICAgICAodm9pZCk7CisKK1dFQktJVF9BUEkgV2ViS2l0V2ViRGF0YVNvdXJjZSAqCit3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX25ld193aXRoX3JlcXVlc3QgICAgICAgKFdlYktpdE5ldHdvcmtS
ZXF1ZXN0ICpyZXF1ZXN0KTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJGcmFtZSAqCit3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2dldF93ZWJfZnJhbWUgICAgICAgICAgKFdlYktpdFdlYkRhdGFTb3Vy
Y2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0TmV0d29ya1JlcXVlc3QgKgor
d2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0ICAgIChXZWJLaXRXZWJE
YXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJLSVRfQVBJIFdlYktpdE5ldHdvcmtSZXF1
ZXN0ICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3QgICAgICAgICAgICAoV2Vi
S2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JF
VFVSTiBnY2hhciAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9lbmNvZGluZyAgICAgICAg
ICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgZ2Jv
b2xlYW4KK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZyAgICAgICAgICAgICAoV2Vi
S2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBHX0NPTlNUX1JF
VFVSTiBHU3RyaW5nICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2RhdGEgICAgICAgICAg
ICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBX
ZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9tYWluX3Jlc291
cmNlICAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSk7CisKK1dFQktJVF9B
UEkgR0xpc3QgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfc3VicmVzb3VyY2VzICAgICAg
IChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJLSVRfQVBJIFdlYktp
dFdlYlJlc291cmNlICoKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291cmNlX2Zv
cl91cmwgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3NvdXJjZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICp1
cmwpOworCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfYWRkX3N1YnJl
c291cmNlICAgICAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291cmNlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJLaXRXZWJSZXNvdXJj
ZSAgICAqc3VicmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoK
K3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VybCAgICAoV2ViS2l0V2Vi
RGF0YVNvdXJjZSAgKmRhdGFfc291cmNlKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIFdF
QktJVF9XRUJfREFUQV9TT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2ViZnJhbWUuY3BwIGIvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUuY3Bw
CmluZGV4IDdlMmNlNDUuLmQ1ZmI2YTggMTAwNjQ0Ci0tLSBhL1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdHdlYmZyYW1lLmNwcAorKysgYi9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5j
cHAKQEAgLTgxNiw3ICs4MTYsNyBAQCB1bnNpZ25lZCBpbnQgd2Via2l0X3dlYl9mcmFtZV9udW1i
ZXJfb2ZfYWN0aXZlX2FuaW1hdGlvbnMoV2ViS2l0V2ViRnJhbWUqIGZyYW1lKQogZ2NoYXIqIHdl
YmtpdF93ZWJfZnJhbWVfZ2V0X3Jlc3BvbnNlX21pbWVfdHlwZShXZWJLaXRXZWJGcmFtZSogZnJh
bWUpCiB7CiAgICAgRnJhbWUqIGNvcmVGcmFtZSA9IGNvcmUoZnJhbWUpOwotICAgIERvY3VtZW50
TG9hZGVyKiBkb2NMb2FkZXIgPSBjb3JlRnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigp
OworICAgIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBkb2NMb2FkZXIgPSBjb3JlRnJhbWUtPmxv
YWRlcigpLT5kb2N1bWVudExvYWRlcigpOwogICAgIFN0cmluZyBtaW1lVHlwZSA9IGRvY0xvYWRl
ci0+cmVzcG9uc2VNSU1FVHlwZSgpOwogICAgIHJldHVybiBnX3N0cmR1cChtaW1lVHlwZS51dGY4
KCkuZGF0YSgpKTsKIH0K
</data>
<flag name="review"
          id="19102"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38720</attachid>
            <date>2009-08-28 00:29:34 -0700</date>
            <delta_ts>2009-08-28 06:36:19 -0700</delta_ts>
            <desc>Update web resource patch</desc>
            <filename>webresource</filename>
            <type>text/plain</type>
            <size>26096</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9H
TlVtYWtlZmlsZS5hbQkyMDA5LTA4LTI4IDExOjA2OjA4LjIyNjE4ODY0MSArMTAwMAorKysgV2Vi
S2l0L0dOVW1ha2VmaWxlLmFtCTIwMDktMDgtMjggMTc6MTc6NTMuNjk4MjIxNDA2ICsxMDAwCkBA
IC0zMjUsNiArMzI1LDcgQEAgd2Via2l0Z3RrX2hfYXBpICs9IFwKIAkkKHNyY2RpcikvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9yLmggXAogCSQoc3JjZGlyKS9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJuYXZpZ2F0aW9uYWN0aW9uLmggXAogCSQoc3JjZGlyKS9XZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oIFwKKwkkKHNyY2RpcikvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0d2VicmVzb3VyY2UuaCBcCiAJJChzcmNkaXIpL1dlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYnNldHRpbmdzLmggXAogCSQoc3JjZGlyKS9XZWJLaXQvZ3RrL3dlYmtp
dC93ZWJraXR3ZWJ3aW5kb3dmZWF0dXJlcy5oIFwKIAkkKHNyY2RpcikvV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0d2Vidmlldy5oIFwKQEAgLTM2NSw2ICszNjYsNyBAQCB3ZWJraXRndGtfc291cmNl
cyArPSBcCiAJV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9yLmNwcCBcCiAJV2Vi
S2l0L2d0ay93ZWJraXQvd2Via2l0d2VibmF2aWdhdGlvbmFjdGlvbi5jcHAgXAogCVdlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHdlYnBvbGljeWRlY2lzaW9uLmNwcCBcCisJV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0d2VicmVzb3VyY2UuY3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJz
ZXR0aW5ncy5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnZpZXcuY3BwIFwKIAlX
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJ3aW5kb3dmZWF0dXJlcy5jcHAgXApAQCAtNTI1LDcg
KzUyNyw4IEBAIFRFU1RfUFJPR1MgKz0gUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3RodHQKIAlQcm9n
cmFtcy91bml0dGVzdHMvdGVzdHdlYmhpc3RvcnlpdGVtIFwKIAlQcm9ncmFtcy91bml0dGVzdHMv
dGVzdGRvd25sb2FkIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdGF0ayBcCi0JUHJvZ3JhbXMv
dW5pdHRlc3RzL3Rlc3R3ZWJzZXR0aW5ncworCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2Vic2V0
dGluZ3MgXAorCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0d2VicmVzb3VyY2UKIAogIyBBZGQgYWRk
aXRpb25hbCB0ZXN0cyBoZXJlCiBQcm9ncmFtc191bml0dGVzdHNfdGVzdGh0dHBiYWNrZW5kX1NP
VVJDRVMgPSBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RodHRwYmFja2VuZC5jCkBAIC01NzMsNiArNTc2
LDEwIEBAIFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2Vic2V0dGluZ3NfQ0ZMQUcKIFByb2dyYW1z
X3VuaXR0ZXN0c190ZXN0d2Vic2V0dGluZ3NfTERBREQgPSAkKHdlYmtpdF90ZXN0c19sZGFkZCkK
IFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2Vic2V0dGluZ3NfTERGTEFHUyA9ICQod2Via2l0X3Rl
c3RzX2xkZmxhZ3MpCiAKK1Byb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2VicmVzb3VyY2VfU09VUkNF
UyA9IFdlYktpdC9ndGsvdGVzdHMvdGVzdHdlYnJlc291cmNlLmMKK1Byb2dyYW1zX3VuaXR0ZXN0
c190ZXN0d2VicmVzb3VyY2VfQ0ZMQUdTID0gJCh3ZWJraXRfdGVzdHNfY2ZsYWdzKQorUHJvZ3Jh
bXNfdW5pdHRlc3RzX3Rlc3R3ZWJyZXNvdXJjZV9MREFERCA9ICQod2Via2l0X3Rlc3RzX2xkYWRk
KQorCiAjIEF1dG9nZW5lcmF0ZWQgc291cmNlcwogQlVJTFRfU09VUkNFUyA6PSBcCiAJJChqYXZh
c2NyaXB0Y29yZV9idWlsdF9zb3VyY2VzKSBcCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay90ZXN0
cy90ZXN0d2VicmVzb3VyY2UuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwJMTk3MC0wMS0wMSAw
MDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3
ZWJyZXNvdXJjZS5jCTIwMDktMDgtMjggMTY6MzI6MTYuMzgyMTg4MjA5ICsxMDAwCkBAIC0wLDAg
KzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEphbiBNaWNoYWVsIEFsb256bwor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdHJpbmcu
aD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0Lmg+CisKKyNpZiBHTElCX0NIRUNLX1ZFUlNJT04o
MiwgMTYsIDApICYmIEdUS19DSEVDS19WRVJTSU9OKDIsIDE0LCAwKQorCit0eXBlZGVmIHN0cnVj
dCB7CisgICAgV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlOworICAgIFdlYktpdFdlYlZp
ZXcqIHdlYlZpZXc7Cit9IFdlYlJlc291cmNlRml4dHVyZTsKKworc3RhdGljIHZvaWQgd2ViX3Jl
c291cmNlX2ZpeHR1cmVfc2V0dXAoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rw
b2ludGVyIGRhdGEpCit7CisgICAgZml4dHVyZS0+d2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyh3
ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIGdfb2JqZWN0X3JlZl9zaW5rKGZpeHR1cmUtPndl
YlZpZXcpOworICAgIGNvbnN0IGdjaGFyKiB3ZWJEYXRhID0gIjxodG1sPjwvaHRtbD4iOworICAg
IGZpeHR1cmUtPndlYlJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9uZXcod2ViRGF0YSwg
c3RybGVuKHdlYkRhdGEpLCAiaHR0cDovL2V4YW1wbGUuY29tLyIsICJ0ZXh0L2h0bWwiLCAidXRm
OCIsICJFeGFtcGxlLmNvbSIpOworICAgIGdfYXNzZXJ0KGZpeHR1cmUtPndlYlJlc291cmNlKTsK
K30KKworc3RhdGljIHZvaWQgd2ViX3Jlc291cmNlX2ZpeHR1cmVfdGVhcmRvd24oV2ViUmVzb3Vy
Y2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgZ19hc3NlcnQo
Zml4dHVyZS0+d2ViUmVzb3VyY2UpOworICAgIGdfb2JqZWN0X3VucmVmKGZpeHR1cmUtPndlYlJl
c291cmNlKTsKKyAgICBnX29iamVjdF91bnJlZihmaXh0dXJlLT53ZWJWaWV3KTsKK30KKworc3Rh
dGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF91cmwoV2ViUmVzb3VyY2VGaXh0
dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgZ2NoYXIqIHVybDsKKyAg
ICBnX29iamVjdF9nZXQoR19PQkpFQ1QoZml4dHVyZS0+d2ViUmVzb3VyY2UpLCAidXJpIiwgJnVy
bCwgTlVMTCk7CisgICAgZ19hc3NlcnRfY21wc3RyKHVybCwgPT0sICJodHRwOi8vZXhhbXBsZS5j
b20vIik7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VyaShm
aXh0dXJlLT53ZWJSZXNvdXJjZSkgLD09LCJodHRwOi8vZXhhbXBsZS5jb20vIik7CisgICAgZ19m
cmVlKHVybCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRf
ZGF0YShXZWJSZXNvdXJjZUZpeHR1cmUqIGZpeHR1cmUsIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sK
KyAgICBHU3RyaW5nKiBjaGFyRGF0YSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2RhdGEoZml4
dHVyZS0+d2ViUmVzb3VyY2UpOworICAgIGdfYXNzZXJ0X2NtcHN0cihjaGFyRGF0YS0+c3RyLCA9
PSwgIjxodG1sPjwvaHRtbD4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX3Jl
c291cmNlX2dldF9taW1lX3R5cGUoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rw
b2ludGVyIGRhdGEpCit7CisgICAgZ2NoYXIqIG1pbWVfdHlwZTsKKyAgICBnX29iamVjdF9nZXQo
R19PQkpFQ1QoZml4dHVyZS0+d2ViUmVzb3VyY2UpLCAibWltZS10eXBlIiwgJm1pbWVfdHlwZSwg
TlVMTCk7CisgICAgZ19hc3NlcnRfY21wc3RyKG1pbWVfdHlwZSwgPT0sICJ0ZXh0L2h0bWwiKTsK
KyAgICBnX2Fzc2VydF9jbXBzdHIod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKGZp
eHR1cmUtPndlYlJlc291cmNlKSw9PSwidGV4dC9odG1sIik7CisgICAgZ19mcmVlKG1pbWVfdHlw
ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2Rp
bmcoV2ViUmVzb3VyY2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7Cisg
ICAgZ2NoYXIqIHRleHRfZW5jb2Rpbmc7CisgICAgZ19vYmplY3RfZ2V0KEdfT0JKRUNUKGZpeHR1
cmUtPndlYlJlc291cmNlKSwgImVuY29kaW5nIiwgJnRleHRfZW5jb2RpbmcsIE5VTEwpOworICAg
IGdfYXNzZXJ0X2NtcHN0cih0ZXh0X2VuY29kaW5nLCA9PSwgInV0ZjgiKTsKKyAgICBnX2Fzc2Vy
dF9jbXBzdHIod2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZW5jb2RpbmcoZml4dHVyZS0+d2ViUmVz
b3VyY2UpLD09LCJ1dGY4Iik7CisgICAgZ19mcmVlKHRleHRfZW5jb2RpbmcpOworfQorCitzdGF0
aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25hbWUoV2ViUmVzb3Vy
Y2VGaXh0dXJlKiBmaXh0dXJlLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgICAgZ2NoYXIqIGZy
YW1lX25hbWU7CisgICAgZ19vYmplY3RfZ2V0KEdfT0JKRUNUKGZpeHR1cmUtPndlYlJlc291cmNl
KSwgImZyYW1lLW5hbWUiLCAmZnJhbWVfbmFtZSwgTlVMTCk7CisgICAgZ19hc3NlcnRfY21wc3Ry
KGZyYW1lX25hbWUsID09LCAiRXhhbXBsZS5jb20iKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIod2Vi
a2l0X3dlYl9yZXNvdXJjZV9nZXRfZnJhbWVfbmFtZShmaXh0dXJlLT53ZWJSZXNvdXJjZSksPT0s
IkV4YW1wbGUuY29tIik7CisgICAgZ19mcmVlKGZyYW1lX25hbWUpOworfQorCitpbnQgbWFpbihp
bnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgZ190aHJlYWRfaW5pdChOVUxMKTsKKyAgICBn
dGtfdGVzdF9pbml0KCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgICBnX3Rlc3RfYnVnX2Jhc2Uo
Imh0dHBzOi8vYnVncy53ZWJraXQub3JnLyIpOworICAgIGdfdGVzdF9hZGQoIi93ZWJraXQvd2Vi
cmVzb3VyY2UvZ2V0X3VybCIsCisgICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAs
IHdlYl9yZXNvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRf
d2ViX3Jlc291cmNlX2dldF91cmwsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3RlYXJkb3duKTsKKyAg
ICBnX3Rlc3RfYWRkKCIvd2Via2l0L3dlYnJlc291cmNlL2dldF9taW1lX3R5cGUiLAorICAgICAg
ICAgICAgICAgV2ViUmVzb3VyY2VGaXh0dXJlLCAwLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV9zZXR1
cCwKKyAgICAgICAgICAgICAgIHRlc3Rfd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBl
LCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtp
dC93ZWJyZXNvdXJjZS9nZXRfdGV4dF9lbmNvZGluZ19uYW1lIiwKKyAgICAgICAgICAgICAgIFdl
YlJlc291cmNlRml4dHVyZSwgMCwgd2ViX3Jlc291cmNlX2ZpeHR1cmVfc2V0dXAsCisgICAgICAg
ICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2VuY29kaW5nLCB3ZWJfcmVzb3Vy
Y2VfZml4dHVyZV90ZWFyZG93bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJyZXNvdXJj
ZS9nZXRfZnJhbWVfbmFtZSIsCisgICAgICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAs
IHdlYl9yZXNvdXJjZV9maXh0dXJlX3NldHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRf
d2ViX3Jlc291cmNlX2dldF9mcmFtZV9uYW1lLCB3ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93
bik7CisgICAgZ190ZXN0X2FkZCgiL3dlYmtpdC93ZWJyZXNvdXJjZS9nZXRfZGF0YSIsCisgICAg
ICAgICAgICAgICBXZWJSZXNvdXJjZUZpeHR1cmUsIDAsIHdlYl9yZXNvdXJjZV9maXh0dXJlX3Nl
dHVwLAorICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX3Jlc291cmNlX2dldF9kYXRhLCB3
ZWJfcmVzb3VyY2VfZml4dHVyZV90ZWFyZG93bik7CisgICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7
Cit9CisKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgZ19j
cml0aWNhbCgiWW91IHdpbGwgbmVlZCBhdCBsZWFzdCBnbGliLTIuMTYuMCBhbmQgZ3RrLTIuMTQu
MCB0byBydW4gdGhlIHVuaXQgdGVzdHMuIERvaW5nIG5vdGhpbmcgbm93LiIpOworICAgIHJldHVy
biAwOworfQorCisjZW5kaWYKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAky
MDA5LTA4LTI4IDExOjA2OjA4LjI5ODE4ODY0OSArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsv
d2Via2l0L3dlYmtpdC5oCTIwMDktMDgtMjggMTc6MTc6NTMuNjcwMTk1OTE3ICsxMDAwCkBAIC0z
NSw2ICszNSw3IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmhpc3RvcnlpdGVtLmg+CiAj
aW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnBvbGljeWRlY2lzaW9uLmg+CiAjaW5jbHVkZSA8d2Vi
a2l0L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uaD4KKyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0
d2VicmVzb3VyY2UuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZW51bXR5cGVzLmg+CiAKICNl
bmRpZiAvKiBfX1dFQktJVF9IX18gKi8KSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93
ZWJraXRkZWZpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0ZGVmaW5lcy5oCTIwMDktMDgtMjggMTE6MDY6MDguMzQyMTg4MjM5ICsxMDAwCisr
KyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCTIwMDktMDgtMjggMTc6
MTc6NTMuNjc0MjIzMjQ1ICsxMDAwCkBAIC03MSw2ICs3MSw5IEBAIHR5cGVkZWYgc3RydWN0IF9X
ZWJLaXRXZWJWaWV3Q2xhc3MgV2ViS2kKIHR5cGVkZWYgc3RydWN0IF9XZWJLaXREb3dubG9hZCBX
ZWJLaXREb3dubG9hZDsKIHR5cGVkZWYgc3RydWN0IF9XZWJLaXREb3dubG9hZENsYXNzIFdlYktp
dERvd25sb2FkQ2xhc3M7CiAKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZSBXZWJL
aXRXZWJSZXNvdXJjZTsKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZUNsYXNzIFdl
YktpdFdlYlJlc291cmNlQ2xhc3M7CisKIEdfRU5EX0RFQ0xTCiAKICNlbmRpZgpJbmRleDogV2Vi
S2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgJMjAwOS0wOC0yOCAxMTow
NjowOC4zODYxODc5NjggKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRw
cml2YXRlLmgJMjAwOS0wOC0yOCAxNzoxNzo1My42NTgyMjIyNTggKzEwMDAKQEAgLTM1LDEyICsz
NSwxNSBAQAogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJmcmFtZS5oPgogI2luY2x1ZGUgPHdl
YmtpdC93ZWJraXR3ZWJwb2xpY3lkZWNpc2lvbi5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJuYXZpZ2F0aW9uYWN0aW9uLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnJlc291cmNl
Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnNldHRpbmdzLmg+CiAjaW5jbHVkZSA8d2Vi
a2l0L3dlYmtpdHdlYndpbmRvd2ZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdl
YmJhY2tmb3J3YXJkbGlzdC5oPgogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRuZXR3b3JrcmVxdWVz
dC5oPgogCisjaW5jbHVkZSAiQXJjaGl2ZVJlc291cmNlLmgiCiAjaW5jbHVkZSAiQmFja0Zvcndh
cmRMaXN0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgogI2luY2x1ZGUgPGVuY2hhbnQuaD4KICNp
bmNsdWRlICJIaXN0b3J5SXRlbS5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCkBAIC0xNTksNiAr
MTYyLDIyIEBAIGV4dGVybiAiQyIgewogICAgIHdlYmtpdF93ZWJfaGlzdG9yeV9pdGVtX2dldF9j
aGlsZHJlbihXZWJLaXRXZWJIaXN0b3J5SXRlbSopOwogICAgIC8vIGVuZCBXZWJLaXRXZWJIaXN0
b3J5SXRlbSBwcml2YXRlCiAKKyAgICAvLyBXZWJLaXRXZWJSZXNvdXJjZSBwcml2YXRlCisgICAg
I2RlZmluZSBXRUJLSVRfV0VCX1JFU09VUkNFX0dFVF9QUklWQVRFKG9iaikgICAgICAgIChHX1RZ
UEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSwg
V2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlKSkKKyAgICBzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNl
UHJpdmF0ZSB7CisgICAgICAgIFdlYkNvcmU6OkFyY2hpdmVSZXNvdXJjZSogcmVzb3VyY2U7CisK
KyAgICAgICAgZ2NoYXIqIHVyaTsKKyAgICAgICAgZ2NoYXIqIG1pbWVUeXBlOworICAgICAgICBn
Y2hhciogdGV4dEVuY29kaW5nOworICAgICAgICBnY2hhciogZnJhbWVOYW1lOworCisgICAgICAg
IEdTdHJpbmcqIGRhdGE7CisgICAgfTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSoKKyAgICB3ZWJr
aXRfd2ViX3Jlc291cmNlX25ld193aXRoX2NvcmVfcmVzb3VyY2UoUGFzc1JlZlB0cjxXZWJDb3Jl
OjpBcmNoaXZlUmVzb3VyY2U+KTsKKyAgICAvLyBlbmQgV2ViS2l0V2ViUmVzb3VyY2UgcHJpdmF0
ZQorCiAgICAgdm9pZAogICAgIHdlYmtpdF93ZWJfaW5zcGVjdG9yX3NldF9pbnNwZWN0b3JfY2xp
ZW50KFdlYktpdFdlYkluc3BlY3RvciosIFdlYkNvcmU6OlBhZ2UqKTsKIApJbmRleDogV2ViS2l0
L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYnJlc291cmNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAv
ZGV2L251bGwJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIFdlYktpdC9X
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJyZXNvdXJjZS5jcHAJMjAwOS0wOC0yOCAxMTozNDoy
Ny41MDYyMzQ5ODggKzEwMDAKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgSmFuIE1pY2hhZWwgQy4gQWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1
ZGUgIndlYmtpdHdlYnJlc291cmNlLmgiCisjaW5jbHVkZSAid2Via2l0cHJpdmF0ZS5oIgorCisj
aW5jbHVkZSAiQXJjaGl2ZVJlc291cmNlLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1
ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJl
ZEJ1ZmZlci5oIgorI2luY2x1ZGUgInd0Zi9Bc3NlcnRpb25zLmgiCisKKyNpbmNsdWRlIDxnbGli
Lmg+CisjaW5jbHVkZSA8Z2xpYi9naTE4bi1saWIuaD4KKworLyoqCisgKiBTRUNUSU9OOndlYmtp
dHdlYnJlc291cmNlCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IFJlcHJlc2VudHMgYSBkb3dubG9h
ZGVkIFVSSS4KKyAqIEBzZWVfYWxzbzogI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBBIHdl
YiByZXNvdXJjZSBlbmNhcHN1bGF0ZXMgdGhlIGRhdGEgb2YgdGhlIGRvd25sb2FkIGFzIHdlbGwg
YXMgdGhlIFVSSSwKKyAqIE1JTUUgdHlwZSBhbmQgZnJhbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2Uu
CisgKi8KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgV2ViS2l0
OworCitlbnVtIHsKKyAgICBQUk9QXzAsCisKKyAgICBQUk9QX1VSSSwKKyAgICBQUk9QX01JTUVf
VFlQRSwKKyAgICBQUk9QX0VOQ09ESU5HLAorICAgIFBST1BfRlJBTUVfTkFNRQorfTsKKworR19E
RUZJTkVfVFlQRShXZWJLaXRXZWJSZXNvdXJjZSwgd2Via2l0X3dlYl9yZXNvdXJjZSwgR19UWVBF
X09CSkVDVCk7CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3Byb3BlcnR5
KEdPYmplY3QqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3Bl
YyogcHNwZWMpOworCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNlX2Rpc3Bvc2UoR09i
amVjdCogb2JqZWN0KQoreworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNvdXJjZSA9IFdF
QktJVF9XRUJfUkVTT1VSQ0Uob2JqZWN0KTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUq
IHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKworICAgIGlmIChwcml2LT5yZXNvdXJjZSkgewor
ICAgICAgICBwcml2LT5yZXNvdXJjZS0+ZGVyZWYoKTsKKyAgICAgICAgcHJpdi0+cmVzb3VyY2Ug
PSAwOworICAgIH0KKworICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfcmVzb3VyY2VfcGFy
ZW50X2NsYXNzKS0+ZGlzcG9zZShvYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2Vi
X3Jlc291cmNlX2ZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKK3sKKyAgICBXZWJLaXRXZWJSZXNv
dXJjZSogd2ViUmVzb3VyY2UgPSBXRUJLSVRfV0VCX1JFU09VUkNFKG9iamVjdCk7CisgICAgV2Vi
S2l0V2ViUmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisKKyAgICBn
X2ZyZWUocHJpdi0+dXJpKTsKKyAgICBnX2ZyZWUocHJpdi0+bWltZVR5cGUpOworICAgIGdfZnJl
ZShwcml2LT50ZXh0RW5jb2RpbmcpOworICAgIGdfZnJlZShwcml2LT5mcmFtZU5hbWUpOworCisg
ICAgaWYgKHByaXYtPmRhdGEpCisgICAgICAgIGdfc3RyaW5nX2ZyZWUocHJpdi0+ZGF0YSwgVFJV
RSk7CisKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX3Jlc291cmNlX3BhcmVudF9jbGFz
cyktPmZpbmFsaXplKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfcmVzb3Vy
Y2VfY2xhc3NfaW5pdChXZWJLaXRXZWJSZXNvdXJjZUNsYXNzKiBrbGFzcykKK3sKKyAgICBHT2Jq
ZWN0Q2xhc3MqIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7CisKKyAgICBn
b2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9kaXNwb3NlOworICAg
IGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3dlYl9yZXNvdXJjZV9maW5hbGl6ZTsK
KyAgICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB3ZWJraXRfd2ViX3Jlc291cmNlX2dl
dF9wcm9wZXJ0eTsKKworICAgIC8qKgorICAgICAqIFdlYktpdFdlYlJlc291cmNlOnVyaToKKyAg
ICAgKgorICAgICAqIFRoZSBVUkkgb2YgdGhlIHdlYiByZXNvdXJjZQorICAgICAqCisgICAgICog
U2luY2UgMS4xLjE0CisgICAgICovCisgICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0
eShnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJP
UF9VUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNf
c3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyaSIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJVUkkiKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIF8oIlRoZSB1cmkgb2YgdGhlIHJlc291cmNlIiksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisgICAgLyoqCisgICAg
ICogV2ViS2l0V2ViUmVzb3VyY2U6bWltZS10eXBlOgorICAgICAqCisgICAgICogVGhlIE1JTUUg
dHlwZSBvZiB0aGUgd2ViIHJlc291cmNlLgorICAgICAqCisgICAgICogU2luY2UgMS4xLjE0Cisg
ICAgICovCisgICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0X2NsYXNz
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9NSU1FX1RZUEUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nKAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWUtdHlwZSIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJNSU1FIFR5cGUiKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIF8oIlRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlc291cmNl
IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisgICAg
LyoqCisgICAgICogV2ViS2l0V2ViUmVzb3VyY2U6ZW5jb2Rpbmc6CisgICAgICoKKyAgICAgKiBU
aGUgZW5jb2RpbmcgbmFtZSB0byB3aGljaCB0aGUgd2ViIHJlc291cmNlIHdhcyBlbmNvZGVkIGlu
LgorICAgICAqCisgICAgICogU2luY2UgMS4xLjE0CisgICAgICovCisgICAgZ19vYmplY3RfY2xh
c3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgUFJPUF9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZW5jb2RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXygiRW5jb2RpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8o
IlRoZSB0ZXh0IGVuY29kaW5nIG5hbWUgb2YgdGhlIHJlc291cmNlIiksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisKKyAgICAvKioKKyAgICAgKiBXZWJL
aXRXZWJSZXNvdXJjZTpmcmFtZS1uYW1lOgorICAgICAqCisgICAgICogVGhlIGZyYW1lIG5hbWUg
Zm9yIHRoZSB3ZWIgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBTaW5jZSAxLjEuMTQKKyAgICAg
Ki8KKyAgICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX0ZSQU1FX05BTUUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nKAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lLW5hbWUiLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiRnJhbWUgTmFtZSIpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXygiVGhlIGZyYW1lIG5hbWUgb2YgdGhlIHJlc291cmNl
IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURBQkxFKSk7CisKKyAg
ICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9mKFdlYktpdFdl
YlJlc291cmNlUHJpdmF0ZSkpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRfd2ViX3Jlc291cmNl
X2dldF9wcm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSogdmFs
dWUsIEdQYXJhbVNwZWMqIHBzcGVjKQoreworICAgIFdlYktpdFdlYlJlc291cmNlKiB3ZWJSZXNv
dXJjZSA9IFdFQktJVF9XRUJfUkVTT1VSQ0Uob2JqZWN0KTsKKworICAgIHN3aXRjaCAocHJvcF9p
ZCkgeworICAgIGNhc2UgUFJPUF9VUkk6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyh2YWx1
ZSwgd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfdXJpKHdlYlJlc291cmNlKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUFJPUF9NSU1FX1RZUEU6CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmlu
Zyh2YWx1ZSwgd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfbWltZV90eXBlKHdlYlJlc291cmNlKSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FTkNPRElORzoKKyAgICAgICAgZ192YWx1
ZV9zZXRfc3RyaW5nKHZhbHVlLCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9lbmNvZGluZyh3ZWJS
ZXNvdXJjZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRlJBTUVfTkFNRToKKyAg
ICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nKHZhbHVlLCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9m
cmFtZV9uYW1lKHdlYlJlc291cmNlKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3QsIHByb3BfaWQs
IHBzcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3ZWJraXRf
d2ViX3Jlc291cmNlX2luaXQoV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlKQoreworICAg
IHdlYlJlc291cmNlLT5wcml2ID0gV0VCS0lUX1dFQl9SRVNPVVJDRV9HRVRfUFJJVkFURSh3ZWJS
ZXNvdXJjZSk7Cit9CisKKy8vIGludGVybmFsIHVzZSBvbmx5CitXZWJLaXRXZWJSZXNvdXJjZSog
d2Via2l0X3dlYl9yZXNvdXJjZV9uZXdfd2l0aF9jb3JlX3Jlc291cmNlKFBhc3NSZWZQdHI8QXJj
aGl2ZVJlc291cmNlPiByZXNvdXJjZSkKK3sKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogd2ViUmVz
b3VyY2UgPSBXRUJLSVRfV0VCX1JFU09VUkNFKGdfb2JqZWN0X25ldyhXRUJLSVRfVFlQRV9XRUJf
UkVTT1VSQ0UsIE5VTEwpKTsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZVByaXZhdGUqIHByaXYgPSB3
ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBwcml2LT5yZXNvdXJjZSA9IHJlc291cmNlLnJlbGVhc2VS
ZWYoKTsKKworICAgIHJldHVybiB3ZWJSZXNvdXJjZTsKK30KKworLyoqCisgKiB3ZWJraXRfd2Vi
X3Jlc291cmNlX25ldzoKKyAqIEBkYXRhOiB0aGUgZGF0YSB0byBpbml0aWFsaXplIHRoZSAjV2Vi
S2l0V2ViUmVzb3VyY2UKKyAqIEBsZW5ndGg6IHRoZSBsZW5ndGggb2YgQGRhdGEKKyAqIEB1cmk6
IHRoZSB1cmkgb2YgdGhlICNXZWJLaXRXZWJSZXNvdXJjZQorICogQG1pbWVfdHlwZTogdGhlIE1J
TUUgdHlwZSBvZiB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKiBAdGV4dF9lbmNvZGluZ19uYW1l
OiB0aGUgdGV4dCBlbmNvZGluZyBuYW1lIG9mIHRoZSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqIEBm
cmFtZV9uYW1lOiB0aGUgZnJhbWUgbmFtZSBvZiB0aGUgI1dlYktpdFdlYlJlc291cmNlCisgKgor
ICogUmV0dXJucyBhIG5ldyAjV2ViS2l0V2ViUmVzb3VyY2UuIFRoZSBAdGV4dF9lbmNvZGluZ19u
YW1lIGNhbiBiZSAlTlVMTC4gVGhlCisgKiBAZnJhbWVfbmFtZSBhcmd1bWVudCBjYW4gYmUgdXNl
ZCBpZiB0aGUgcmVzb3VyY2UgcmVwcmVzZW50cyBjb250ZW50cyBvZiBhbgorICogZW50aXJlIEhU
TUwgZnJhbWUsIG90aGVyd2lzZSBwYXNzICVOVUxMLgorICoKKyAqIFJldHVybiB2YWx1ZTogYSBu
ZXcgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogU2luY2U6IDEuMS4xNAorICovCitXZWJLaXRX
ZWJSZXNvdXJjZSogd2Via2l0X3dlYl9yZXNvdXJjZV9uZXcoY29uc3QgZ2NoYXIqIGRhdGEsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzaXplIHNpemUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIqIHVy
aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hh
ciogbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgZ2NoYXIqIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IGdjaGFyKiBmcmFtZU5hbWUpCit7CisgICAgQVNTRVJUKGRhdGEpOwor
ICAgIEFTU0VSVCh1cmkpOworICAgIEFTU0VSVChtaW1lX3R5cGUpOworCisgICAgaWYgKHNpemUg
PCAwKQorICAgICAgICBzaXplID0gc3RybGVuKGRhdGEpOworCisgICAgUmVmUHRyPFNoYXJlZEJ1
ZmZlcj4gYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YSwgc2l6ZSk7CisgICAgV2Vi
S2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlID0gd2Via2l0X3dlYl9yZXNvdXJjZV9uZXdfd2l0
aF9jb3JlX3Jlc291cmNlKEFyY2hpdmVSZXNvdXJjZTo6Y3JlYXRlKGJ1ZmZlciwgS1VSTChLVVJM
KCksIFN0cmluZzo6ZnJvbVVURjgodXJpKSksIFN0cmluZzo6ZnJvbVVURjgobWltZVR5cGUpLCBT
dHJpbmc6OmZyb21VVEY4KGVuY29kaW5nKSwgU3RyaW5nOjpmcm9tVVRGOChmcmFtZU5hbWUpKSk7
CisKKyAgICByZXR1cm4gd2ViUmVzb3VyY2U7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9yZXNv
dXJjZV9nZXRfZGF0YToKKyAqIEB3ZWJfcmVzb3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisg
KgorICogUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgQHdlYlJlc291cmNlLgorICoKKyAqIFJldHVy
biB2YWx1ZTogYSAjR1N0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YSBvZiB0aGUg
QHdlYlJlc291cmNlLgorICogVGhlIHN0cmluZyBpcyBvd25lZCBieSBXZWJLaXQgYW5kIHNob3Vs
ZCBub3QgYmUgZnJlZWQgb3IgZGVzdHJveWVkLgorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLwor
R1N0cmluZyogd2Via2l0X3dlYl9yZXNvdXJjZV9nZXRfZGF0YShXZWJLaXRXZWJSZXNvdXJjZSog
d2ViUmVzb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9S
RVNPVVJDRSh3ZWJSZXNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQcml2
YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisKKyAgICBpZiAoIXByaXYtPmRhdGEpCisg
ICAgICAgIHByaXYtPmRhdGEgPSBnX3N0cmluZ19uZXdfbGVuKHByaXYtPnJlc291cmNlLT5kYXRh
KCktPmRhdGEoKSwgcHJpdi0+cmVzb3VyY2UtPmRhdGEoKS0+c2l6ZSgpKTsKKworICAgIHJldHVy
biBwcml2LT5kYXRhOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VyaToK
KyAqIEB3ZWJfcmVzb3VyY2U6IGEgI1dlYktpdFdlYlJlc291cmNlCisgKgorICogUmV0dXJuIHZh
bHVlOiB0aGUgVVJJIG9mIHRoZSByZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLwor
R19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X3VyaShXZWJLaXRX
ZWJSZXNvdXJjZSogd2ViUmVzb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VC
S0lUX0lTX1dFQl9SRVNPVVJDRSh3ZWJSZXNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2Vi
UmVzb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisgICAgaWYgKCFwcml2
LT5yZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIXByaXYtPnVyaSkK
KyAgICAgICAgcHJpdi0+dXJpID0gZ19zdHJkdXAocHJpdi0+cmVzb3VyY2UtPnVybCgpLnN0cmlu
ZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIHByaXYtPnVyaTsKK30KKworLyoqCisg
KiB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGU6CisgKiBAd2ViX3Jlc291cmNlOiBh
ICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlIE1JTUUgdHlwZSBv
ZiB0aGUgcmVzb3VyY2UKKyAqCisgKiBTaW5jZSAxLjEuMTQKKyAqLworR19DT05TVF9SRVRVUk4g
Z2NoYXIqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZShXZWJLaXRXZWJSZXNvdXJj
ZSogd2ViUmVzb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dF
Ql9SRVNPVVJDRSh3ZWJSZXNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViUmVzb3VyY2VQ
cml2YXRlKiBwcml2ID0gd2ViUmVzb3VyY2UtPnByaXY7CisgICAgaWYgKCFwcml2LT5yZXNvdXJj
ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIXByaXYtPm1pbWVUeXBlKQorICAg
ICAgICBwcml2LT5taW1lVHlwZSA9IGdfc3RyZHVwKHByaXYtPnJlc291cmNlLT5taW1lVHlwZSgp
LnV0ZjgoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIHByaXYtPm1pbWVUeXBlOworfQorCisvKioK
KyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2VuY29kaW5nOgorICogQHdlYl9yZXNvdXJjZTog
YSAjV2ViS2l0V2ViUmVzb3VyY2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBlbmNvZGluZyBu
YW1lIG9mIHRoZSByZXNvdXJjZQorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLworR19DT05TVF9S
RVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2VuY29kaW5nKFdlYktpdFdlYlJl
c291cmNlKiB3ZWJSZXNvdXJjZSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRf
SVNfV0VCX1JFU09VUkNFKHdlYlJlc291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJSZXNv
dXJjZVByaXZhdGUqIHByaXYgPSB3ZWJSZXNvdXJjZS0+cHJpdjsKKyAgICBpZiAoIXByaXYtPnJl
c291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghcHJpdi0+dGV4dEVuY29k
aW5nKQorICAgICAgICBwcml2LT50ZXh0RW5jb2RpbmcgPSBnX3N0cmR1cChwcml2LT5yZXNvdXJj
ZS0+dGV4dEVuY29kaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gcHJpdi0+dGV4
dEVuY29kaW5nOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25h
bWU6CisgKiBAd2ViX3Jlc291cmNlOiBhICNXZWJLaXRXZWJSZXNvdXJjZQorICoKKyAqIFJldHVy
biB2YWx1ZTogdGhlIGZyYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICoKKyAqIFNpbmNlOiAx
LjEuMTQKKyAqLworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0
X2ZyYW1lX25hbWUoV2ViS2l0V2ViUmVzb3VyY2UqIHdlYlJlc291cmNlKQoreworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfUkVTT1VSQ0Uod2ViUmVzb3VyY2UpLCBOVUxM
KTsKKworICAgIFdlYktpdFdlYlJlc291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYlJlc291cmNlLT5w
cml2OworICAgIGlmICghcHJpdi0+cmVzb3VyY2UpCisgICAgICAgIHJldHVybiBOVUxMOworCisg
ICAgaWYgKCFwcml2LT5mcmFtZU5hbWUpCisgICAgICAgIHByaXYtPmZyYW1lTmFtZSA9IGdfc3Ry
ZHVwKHByaXYtPnJlc291cmNlLT5mcmFtZU5hbWUoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHJl
dHVybiBwcml2LT5mcmFtZU5hbWU7Cit9CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2VicmVzb3VyY2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwJMTk3MC0wMS0wMSAw
MDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJr
aXR3ZWJyZXNvdXJjZS5oCTIwMDktMDgtMjggMTE6Mjk6MzQuNTY2MjM1MTQyICsxMDAwCkBAIC0w
LDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQy4gQWxv
bnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpZm5kZWYgV0VCS0lUX1dFQl9SRVNPVVJDRV9ICisjZGVmaW5lIFdFQktJVF9XRUJfUkVT
T1VSQ0VfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisK
KyNpbmNsdWRlIDx3ZWJraXQvd2Via2l0ZGVmaW5lcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNk
ZWZpbmUgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFICAgICAgICAgICAgKHdlYmtpdF93ZWJfcmVz
b3VyY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJDRShvYmopICAgICAg
ICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBXRUJLSVRfVFlQRV9XRUJf
UkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNPVVJD
RV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksICBXRUJL
SVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlQ2xhc3MpKQorI2RlZmluZSBX
RUJLSVRfSVNfV0VCX1JFU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNF
X1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX1dFQl9SRVNPVVJDRSkpCisjZGVmaW5lIFdFQktJVF9J
U19XRUJfUkVTT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xh
c3MpLCAgV0VCS0lUX1RZUEVfV0VCX1JFU09VUkNFKSkKKyNkZWZpbmUgV0VCS0lUX1dFQl9SRVNP
VVJDRV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiksICBX
RUJLSVRfVFlQRV9XRUJfUkVTT1VSQ0UsIFdlYktpdFdlYlJlc291cmNlQ2xhc3MpKQorCit0eXBl
ZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VQcml2YXRlIFdlYktpdFdlYlJlc291cmNlUHJp
dmF0ZTsKKworc3RydWN0IF9XZWJLaXRXZWJSZXNvdXJjZSB7CisgICAgR09iamVjdCBwYXJlbnRf
aW5zdGFuY2U7CisKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICBXZWJLaXRXZWJSZXNvdXJjZVBy
aXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX1dlYktpdFdlYlJlc291cmNlQ2xhc3MgeworICAg
IEdPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgICAvKiBQYWRkaW5nIGZvciBmdXR1cmUg
ZXhwYW5zaW9uICovCisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQwKSAodm9pZCk7CisgICAg
dm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQxKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVz
ZXJ2ZWQyKSAodm9pZCk7CisgICAgdm9pZCAoKl93ZWJraXRfcmVzZXJ2ZWQzKSAodm9pZCk7Cit9
OworCitXRUJLSVRfQVBJIEdUeXBlCit3ZWJraXRfd2ViX3Jlc291cmNlX2dldF90eXBlICh2b2lk
KTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJraXRfd2ViX3Jlc291cmNl
X25ldyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdjaGFyICAgICAgICAqZGF0YSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzaXplICAgICAgICAgICAg
IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IGdjaGFyICAgICAgICAqdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKm1pbWVfdHlwZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICplbmNvZGluZywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIg
ICAgICAgICpmcmFtZV9uYW1lKTsKKworV0VCS0lUX0FQSSBHU3RyaW5nICoKK3dlYmtpdF93ZWJf
cmVzb3VyY2VfZ2V0X2RhdGEgICAgICAgICAgICAgICAoV2ViS2l0V2ViUmVzb3VyY2UgICp3ZWJf
cmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dlYmtpdF93
ZWJfcmVzb3VyY2VfZ2V0X3VyaSAgICAgICAgICAgICAgICAoV2ViS2l0V2ViUmVzb3VyY2UgICp3
ZWJfcmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dlYmtp
dF93ZWJfcmVzb3VyY2VfZ2V0X21pbWVfdHlwZSAgICAgICAgICAoV2ViS2l0V2ViUmVzb3VyY2Ug
ICp3ZWJfcmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dl
YmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2VuY29kaW5nICAgICAgICAgICAoV2ViS2l0V2ViUmVzb3Vy
Y2UgICp3ZWJfcmVzb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoK
K3dlYmtpdF93ZWJfcmVzb3VyY2VfZ2V0X2ZyYW1lX25hbWUgICAgICAgICAoV2ViS2l0V2ViUmVz
b3VyY2UgICp3ZWJfcmVzb3VyY2UpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogV0VCS0lU
X1dFQl9SRVNPVVJDRV9IICovCkluZGV4OiBXZWJLaXQvQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC5vcmlnL0NoYW5nZUxvZwkyMDA5LTA4LTI4IDE3OjIwOjI3LjM3NDE4ODUzNCArMTAw
MAorKysgV2ViS2l0L0NoYW5nZUxvZwkyMDA5LTA4LTI4IDE3OjIxOjA3LjgxNDE4ODc4NiArMTAw
MApAQCAtMSwzICsxLDE0IEBACisyMDA5LTA4LTI4ICBKYW4gTWljaGFlbCBBbG9uem8gIDxqbWFs
b256b0B3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9y
dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgK
KworICAgICAgICBBZGQgV2ViS2l0V2ViUmVzb3VyY2UgdG8gdGhlIGJ1aWxkIHNjcmlwdC4KKwor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorCiAyMDA5LTA4LTI3ICBQcmlpdCBMYWVzICA8cGxh
ZXNAcGxhZXMub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFhhbiBMb3Blei4KSW5kZXg6IFdl
YktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJL
aXQvZ3RrL0NoYW5nZUxvZwkyMDA5LTA4LTI4IDE3OjIwOjM3LjgyMjE4MzgwMyArMTAwMAorKysg
V2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDgtMjggMTc6MjE6NDAuMDQyMjM3MTE0
ICsxMDAwCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMDgtMjggIEphbiBNaWNoYWVsIEFsb256byAg
PGptYWxvbnpvQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0
ayBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NDc1OAorCisgICAgICAgIEltcGxlbWVudCBXZWJLaXRXZWJSZXNvdXJjZSBmb3IgdGhlIHJlc291
cmNlLXJlbGF0ZWQgQVBJIGZvcgorICAgICAgICBXZWJLaXRXZWJEYXRhU291cmNlLgorCisgICAg
ICAgICogdGVzdHMvdGVzdHdlYnJlc291cmNlLmM6IEFkZGVkLgorICAgICAgICAqIHdlYmtpdC93
ZWJraXR3ZWJyZXNvdXJjZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJy
ZXNvdXJjZS5oOiBBZGRlZC4KKwogMjAwOS0wOC0yNiAgWGFuIExvcGV6ICA8eGxvcGV6QGlnYWxp
YS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR3VzdGF2byBOb3JvbmhhLgo=
</data>
<flag name="review"
          id="19717"
          type_id="1"
          status="+"
          setter="gustavo"
    />
    <flag name="commit-queue"
          id="19727"
          type_id="3"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38721</attachid>
            <date>2009-08-28 00:30:15 -0700</date>
            <delta_ts>2009-08-31 06:48:26 -0700</delta_ts>
            <desc>updated patch</desc>
            <filename>dsmain</filename>
            <type>text/plain</type>
            <size>38684</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9H
TlVtYWtlZmlsZS5hbQkyMDA5LTA4LTI4IDE3OjE3OjUzLjY5ODIyMTQwNiArMTAwMAorKysgV2Vi
S2l0L0dOVW1ha2VmaWxlLmFtCTIwMDktMDgtMjggMTc6MjI6MzYuMDk1MTg4NjI1ICsxMDAwCkBA
IC0zMjAsNiArMzIwLDcgQEAgd2Via2l0Z3RrX2hfYXBpICs9IFwKIAkkKHNyY2RpcikvV2ViS2l0
L2d0ay93ZWJraXQvd2Via2l0bmV0d29ya3JlcXVlc3QuaCBcCiAJJChzcmNkaXIpL1dlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHNvdXBhdXRoZGlhbG9nLmggXAogCSQoc3JjZGlyKS9XZWJLaXQvZ3Rr
L3dlYmtpdC93ZWJraXR3ZWJiYWNrZm9yd2FyZGxpc3QuaCBcCisJJChzcmNkaXIpL1dlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaCBcCiAJJChzcmNkaXIpL1dlYktpdC9ndGsv
d2Via2l0L3dlYmtpdHdlYmZyYW1lLmggXAogCSQoc3JjZGlyKS9XZWJLaXQvZ3RrL3dlYmtpdC93
ZWJraXR3ZWJoaXN0b3J5aXRlbS5oIFwKIAkkKHNyY2RpcikvV2ViS2l0L2d0ay93ZWJraXQvd2Vi
a2l0d2ViaW5zcGVjdG9yLmggXApAQCAtMzQyLDYgKzM0Myw4IEBAIHdlYmtpdGd0a19zb3VyY2Vz
ICs9IFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudEd0ay5oIFwKIAlX
ZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0NvbnRleHRNZW51Q2xpZW50R3RrLmNwcCBcCiAJV2Vi
S2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9Db250ZXh0TWVudUNsaWVudEd0ay5oIFwKKwlXZWJLaXQv
Z3RrL1dlYkNvcmVTdXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmNwcCBcCisJV2ViS2l0L2d0ay9X
ZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5oIFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVT
dXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwIFwKIAlXZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0Ry
YWdDbGllbnRHdGsuaCBcCiAJV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9FZGl0b3JDbGllbnRH
dGsuY3BwIFwKQEAgLTM2MSw2ICszNjQsNyBAQCB3ZWJraXRndGtfc291cmNlcyArPSBcCiAJV2Vi
S2l0L2d0ay93ZWJraXQvd2Via2l0c291cGF1dGhkaWFsb2cuYyBcCiAJV2ViS2l0L2d0ay93ZWJr
aXQvd2Via2l0dmVyc2lvbi5jcHAgXAogCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmJhY2tm
b3J3YXJkbGlzdC5jcHAgXAorCVdlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2Uu
Y3BwIFwKIAlXZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAgXAogCVdlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHdlYmhpc3RvcnlpdGVtLmNwcCBcCiAJV2ViS2l0L2d0ay93ZWJraXQv
d2Via2l0d2ViaW5zcGVjdG9yLmNwcCBcCkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3Jl
U3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCTE5
NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay9X
ZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5jcHAJMjAwOS0wOC0yOCAxNzoyMjozNi4w
OTUxODg2MjUgKzEwMDAKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA5ICBKYW4gTWljaGFlbCBBbG9uem8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0
aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5h
bWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAg
ICAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIKKworI2luY2x1ZGUgIndlYmtpdHdlYmRhdGFzb3VyY2Uu
aCIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitE
b2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2FkZXIoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1
ZXN0LCBjb25zdCBTdWJzdGl0dXRlRGF0YSYgc3Vic3RpdHV0ZURhdGEpCisgICAgOiBXZWJDb3Jl
OjpEb2N1bWVudExvYWRlcihyZXF1ZXN0LCBzdWJzdGl0dXRlRGF0YSkKKyAgICAsIG1faXNEYXRh
U291cmNlUmVmZmVkKGZhbHNlKQorICAgICwgbV9kYXRhU291cmNlKDApCit7Cit9CisKK3ZvaWQg
RG9jdW1lbnRMb2FkZXI6OnNldERhdGFTb3VyY2UoV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNv
dXJjZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YVNvdXJjZSk7CisKKyAgICBtX2RhdGFTb3VyY2Ug
PSBkYXRhU291cmNlOworICAgIHJlZkRhdGFTb3VyY2UoKTsKK30KKwordm9pZCBEb2N1bWVudExv
YWRlcjo6ZGV0YWNoRGF0YVNvdXJjZSgpCit7CisgICAgdW5yZWZEYXRhU291cmNlKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmF0dGFjaFRvRnJhbWUoKQoreworICAgIFdlYkNvcmU6OkRv
Y3VtZW50TG9hZGVyOjphdHRhY2hUb0ZyYW1lKCk7CisKKyAgICByZWZEYXRhU291cmNlKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnRMb2FkZXI6OmRldGFjaEZyb21GcmFtZSgpCit7CisgICAgV2ViQ29y
ZTo6RG9jdW1lbnRMb2FkZXI6OmRldGFjaEZyb21GcmFtZSgpOworCisgICAgQVNTRVJUKG1fbG9h
ZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkpOworCisgICAgaWYgKG1fbG9hZGluZ1Jlc291cmNlcy5p
c0VtcHR5KCkpCisgICAgICAgIHVucmVmRGF0YVNvdXJjZSgpOworfQorCit2b2lkIERvY3VtZW50
TG9hZGVyOjppbmNyZWFzZUxvYWRDb3VudCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIpCit7Cisg
ICAgQVNTRVJUKG1fZGF0YVNvdXJjZSk7CisKKyAgICBpZiAobV9sb2FkaW5nUmVzb3VyY2VzLmNv
bnRhaW5zKGlkZW50aWZpZXIpKQorICAgICAgICByZXR1cm47CisgICAgbV9sb2FkaW5nUmVzb3Vy
Y2VzLmFkZChpZGVudGlmaWVyKTsKKyAgICByZWZEYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgRG9j
dW1lbnRMb2FkZXI6OmRlY3JlYXNlTG9hZENvdW50KHVuc2lnbmVkIGxvbmcgaWRlbnRpZmllcikK
K3sKKyAgICBIYXNoU2V0PHVuc2lnbmVkIGxvbmc+OjppdGVyYXRvciBpdCA9IG1fbG9hZGluZ1Jl
c291cmNlcy5maW5kKGlkZW50aWZpZXIpOworCisgICAgLy8gSXQgaXMgdmFsaWQgZm9yIGEgbG9h
ZCB0byBiZSBjYW5jZWxsZWQgYmVmb3JlIGl0J3Mgc3RhcnRlZC4KKyAgICBpZiAoaXQgPT0gbV9s
b2FkaW5nUmVzb3VyY2VzLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xvYWRpbmdS
ZXNvdXJjZXMucmVtb3ZlKGl0KTsKKworICAgIEFTU0VSVCghZnJhbWUoKSk7CisgICAgQVNTRVJU
KG1fbG9hZGluZ1Jlc291cmNlcy5pc0VtcHR5KCkpOworCisgICAgaWYgKG1fbG9hZGluZ1Jlc291
cmNlcy5pc0VtcHR5KCkgJiYgIWZyYW1lKCkpCisgICAgICAgIHVucmVmRGF0YVNvdXJjZSgpOwor
fQorCisvLyBoZWxwZXIgbWV0aG9zIHRvIGF2b2lkIHJlZiBjb3VudCBjaHVybgordm9pZCBEb2N1
bWVudExvYWRlcjo6cmVmRGF0YVNvdXJjZSgpCit7CisgICAgaWYgKCFtX2RhdGFTb3VyY2UgfHwg
bV9pc0RhdGFTb3VyY2VSZWZmZWQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2lzRGF0YVNvdXJj
ZVJlZmZlZCA9IHRydWU7CisgICAgZ19vYmplY3RfcmVmKG1fZGF0YVNvdXJjZSk7Cit9Cit2b2lk
IERvY3VtZW50TG9hZGVyOjp1bnJlZkRhdGFTb3VyY2UoKQoreworICAgIGlmICghbV9pc0RhdGFT
b3VyY2VSZWZmZWQpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQobV9kYXRhU291cmNlKTsK
KyAgICBtX2lzRGF0YVNvdXJjZVJlZmZlZCA9IGZhbHNlOworICAgIGdfb2JqZWN0X3VucmVmKG1f
ZGF0YVNvdXJjZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktp
dC9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RvY3VtZW50TG9hZGVyR3RrLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gL2Rldi9udWxsCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBX
ZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9Eb2N1bWVudExvYWRlckd0ay5oCTIwMDkt
MDgtMjggMTc6MjI6MzYuMDk5MTg4Nzg0ICsxMDAwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA5ICBKYW4gTWljaGFlbCBBbG9uem8KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiRG9jdW1l
bnRMb2FkZXIuaCIKKyNpbmNsdWRlICJ3ZWJraXRkZWZpbmVzLmgiCisjaW5jbHVkZSAid3RmL0hh
c2hTZXQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIFJlc291cmNlUmVxdWVz
dDsKKyAgICBjbGFzcyBTdWJzdGl0dXRlRGF0YTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisK
K2NsYXNzIERvY3VtZW50TG9hZGVyIDogcHVibGljIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyPiBj
cmVhdGUoY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBXZWJD
b3JlOjpTdWJzdGl0dXRlRGF0YSYgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgRG9jdW1lbnRMb2FkZXIocmVxdWVzdCwgZGF0YSkpOworICAgIH0KKworICAgIHZvaWQg
c2V0RGF0YVNvdXJjZShXZWJLaXRXZWJEYXRhU291cmNlKik7CisgICAgdm9pZCBkZXRhY2hEYXRh
U291cmNlKCk7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZSgpIGNvbnN0IHsg
cmV0dXJuIG1fZGF0YVNvdXJjZTsgfQorCisgICAgdm9pZCBpbmNyZWFzZUxvYWRDb3VudCh1bnNp
Z25lZCBsb25nIGlkZW50aWZpZXIpOworICAgIHZvaWQgZGVjcmVhc2VMb2FkQ291bnQodW5zaWdu
ZWQgbG9uZyBpZGVudGlmaWVyKTsKKworcHJpdmF0ZToKKyAgICBEb2N1bWVudExvYWRlcihjb25z
dCBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBXZWJDb3JlOjpTdWJzdGl0dXRlRGF0
YSYpOworCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvRnJhbWUoKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGV0YWNoRnJvbUZyYW1lKCk7CisKKyAgICB2b2lkIHJlZkRhdGFTb3VyY2UoKTsKKyAgICB2
b2lkIHVucmVmRGF0YVNvdXJjZSgpOworCisgICAgYm9vbCBtX2lzRGF0YVNvdXJjZVJlZmZlZDsK
KyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiBtX2RhdGFTb3VyY2U7CisgICAgSGFzaFNldDx1bnNp
Z25lZCBsb25nPiBtX2xvYWRpbmdSZXNvdXJjZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ug
V2ViS2l0CkluZGV4OiBXZWJLaXQvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay9XZWJD
b3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEd0ay5jcHAJMjAwOS0wOC0yOCAxNzoxNzo1My42
OTAxOTgxNzkgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0ZyYW1l
TG9hZGVyQ2xpZW50R3RrLmNwcAkyMDA5LTA4LTI4IDE3OjIyOjM2LjEwMzI0MDM0NyArMTAwMApA
QCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSAiQ29sb3IuaCIKICNpbmNsdWRlICJEb2N1bWVu
dExvYWRlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyR3RrLmgiCiAjaW5jbHVkZSAiRm9y
bVN0YXRlLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcu
aCIKQEAgLTExMSw3ICsxMTIsMTMgQEAgc3RhdGljIHZvaWQgbG9hZERvbmUoV2ViS2l0V2ViRnJh
bWUqIGZyYQogCiBXVEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6RG9jdW1lbnRMb2FkZXI+IEZyYW1l
TG9hZGVyQ2xpZW50OjpjcmVhdGVEb2N1bWVudExvYWRlcihjb25zdCBXZWJDb3JlOjpSZXNvdXJj
ZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFN1YnN0aXR1dGVEYXRhJiBzdWJzdGl0dXRlRGF0YSkK
IHsKLSAgICByZXR1cm4gRG9jdW1lbnRMb2FkZXI6OmNyZWF0ZShyZXF1ZXN0LCBzdWJzdGl0dXRl
RGF0YSk7CisgICAgUmVmUHRyPFdlYktpdDo6RG9jdW1lbnRMb2FkZXI+IGxvYWRlciA9IFdlYktp
dDo6RG9jdW1lbnRMb2FkZXI6OmNyZWF0ZShyZXF1ZXN0LCBzdWJzdGl0dXRlRGF0YSk7CisKKyAg
ICBXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlID0gd2Via2l0X3dlYl9kYXRhX3Nv
dXJjZV9uZXdfd2l0aF9sb2FkZXIobG9hZGVyLmdldCgpKTsKKyAgICBsb2FkZXItPnNldERhdGFT
b3VyY2Uod2ViRGF0YVNvdXJjZSk7CisgICAgZ19vYmplY3RfdW5yZWYod2ViRGF0YVNvdXJjZSk7
CisKKyAgICByZXR1cm4gbG9hZGVyLnJlbGVhc2UoKTsKIH0KIAogdm9pZCBGcmFtZUxvYWRlckNs
aWVudDo6ZGlzcGF0Y2hXaWxsU3VibWl0Rm9ybShGcmFtZVBvbGljeUZ1bmN0aW9uIHBvbGljeUZ1
bmN0aW9uLCBQYXNzUmVmUHRyPEZvcm1TdGF0ZT4pCkBAIC0xMjQsNyArMTMxLDcgQEAgdm9pZCBG
cmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hXaWxsU3VibQogfQogCiAKLXZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnQ6OmNvbW1pdHRlZExvYWQoRG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hh
ciogZGF0YSwgaW50IGxlbmd0aCkKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmNvbW1pdHRlZExv
YWQoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hhciogZGF0YSwgaW50
IGxlbmd0aCkKIHsKICAgICBpZiAoIW1fcGx1Z2luVmlldykgewogICAgICAgICBBU1NFUlQobG9h
ZGVyLT5mcmFtZSgpKTsKQEAgLTE1OCwyOCArMTY1LDI5IEBAIHZvaWQgRnJhbWVMb2FkZXJDbGll
bnQ6OmNvbW1pdHRlZExvYWQoRG8KIH0KIAogYm9vbAotRnJhbWVMb2FkZXJDbGllbnQ6OnNob3Vs
ZFVzZUNyZWRlbnRpYWxTdG9yYWdlKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRl
bnRpZmllcikKK0ZyYW1lTG9hZGVyQ2xpZW50OjpzaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZShX
ZWJDb3JlOjpEb2N1bWVudExvYWRlciosIHVuc2lnbmVkIGxvbmcgIGlkZW50aWZpZXIpCiB7CiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRnJhbWVM
b2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKERv
Y3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyAgaWRlbnRpZmllciwgY29uc3QgQXV0aGVudGlj
YXRpb25DaGFsbGVuZ2UmKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRSZWNl
aXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNp
Z25lZCBsb25nICBpZGVudGlmaWVyLCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCiB7
CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlz
cGF0Y2hEaWRDYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIHVu
c2lnbmVkIGxvbmcgIGlkZW50aWZpZXIsIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikK
K3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkQ2FuY2VsQXV0aGVudGljYXRpb25D
aGFsbGVuZ2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nICBpZGVudGlm
aWVyLCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCiB7CiAgICAgbm90SW1wbGVtZW50
ZWQoKTsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hXaWxsU2VuZFJlcXVl
c3QoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nLCBSZXNvdXJjZVJlcXVlc3QmLCBjb25z
dCBSZXNvdXJjZVJlc3BvbnNlJikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoV2ls
bFNlbmRSZXF1ZXN0KFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBsb2FkZXIsIHVuc2lnbmVkIGxv
bmcgaWRlbnRpZmllciwgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBSZXNvdXJjZVJl
c3BvbnNlJiByZWRpcmVjdFJlc3BvbnNlKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAg
aWYgKHJlZGlyZWN0UmVzcG9uc2UuaXNOdWxsKCkpCisgICAgICAgIHN0YXRpY19jYXN0PFdlYktp
dDo6RG9jdW1lbnRMb2FkZXIqPihsb2FkZXIpLT5pbmNyZWFzZUxvYWRDb3VudChpZGVudGlmaWVy
KTsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6YXNzaWduSWRlbnRpZmllclRvSW5pdGlh
bFJlcXVlc3QodW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBEb2N1bWVudExvYWRlciosIGNvbnN0
IFJlc291cmNlUmVxdWVzdCYpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojphc3NpZ25JZGVudGlm
aWVyVG9Jbml0aWFsUmVxdWVzdCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIFdlYkNvcmU6OkRv
Y3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikKIHsKICAgICBub3RJbXBsZW1l
bnRlZCgpOwogfQpAQCAtMjIxLDcgKzIyOSw3IEBAIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmZy
YW1lTG9hZGVyRGVzdHIKICAgICBkZWxldGUgdGhpczsKIH0KIAotdm9pZCBGcmFtZUxvYWRlckNs
aWVudDo6ZGlzcGF0Y2hEaWRSZWNlaXZlUmVzcG9uc2UoRG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25l
ZCBsb25nLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSkKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZVJlc3BvbnNlKFdlYkNvcmU6OkRvY3VtZW50TG9h
ZGVyKiwgdW5zaWduZWQgbG9uZywgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UpCiB7
CiAgICAgbV9yZXNwb25zZSA9IHJlc3BvbnNlOwogfQpAQCAtNTQ2LDcgKzU1NCw3IEBAIGJvb2wg
RnJhbWVMb2FkZXJDbGllbnQ6OnNob3VsZEdvVG9IaXN0b3IKICAgICByZXR1cm4gaXRlbSAhPSAw
OwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjptYWtlUmVwcmVzZW50YXRpb24oRG9jdW1l
bnRMb2FkZXIqKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6bWFrZVJlcHJlc2VudGF0aW9uKFdl
YkNvcmU6OkRvY3VtZW50TG9hZGVyKikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQpAQCAt
NzAwLDIyICs3MDgsMjIgQEAgdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6Y2FuY2VsUG9saWN5Q2hl
YwogICAgICAgICB3ZWJraXRfd2ViX3BvbGljeV9kZWNpc2lvbl9jYW5jZWwobV9wb2xpY3lEZWNp
c2lvbik7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkTG9hZE1haW5S
ZXNvdXJjZShEb2N1bWVudExvYWRlciopCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRj
aERpZExvYWRNYWluUmVzb3VyY2UoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqKQogewogICAgIG5v
dEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OnJldmVydFRvUHJv
dmlzaW9uYWxTdGF0ZShEb2N1bWVudExvYWRlciopCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojpy
ZXZlcnRUb1Byb3Zpc2lvbmFsU3RhdGUoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqKQogewogICAg
IG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OndpbGxDaGFu
Z2VUaXRsZShEb2N1bWVudExvYWRlciopCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Ojp3aWxsQ2hh
bmdlVGl0bGUoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqKQogewogICAgIG5vdEltcGxlbWVudGVk
KCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpZENoYW5nZVRpdGxlKERvY3VtZW50
TG9hZGVyICpsKQordm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlkQ2hhbmdlVGl0bGUoV2ViQ29y
ZTo6RG9jdW1lbnRMb2FkZXIgKmwpCiB7CiAgICAgc2V0VGl0bGUobC0+dGl0bGUoKSwgbC0+dXJs
KCkpOwogfQpAQCAtNzQ0LDcgKzc1Miw3IEBAIFN0cmluZyBGcmFtZUxvYWRlckNsaWVudDo6Z2Vu
ZXJhdGVkTUlNRVQKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJD
bGllbnQ6OmZpbmlzaGVkTG9hZGluZyhEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIpCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpmaW5pc2hlZExvYWRpbmcoV2ViQ29yZTo6RG9jdW1lbnRM
b2FkZXIqIGRvY3VtZW50TG9hZGVyKQogewogICAgIGlmICghbV9wbHVnaW5WaWV3KQogICAgICAg
ICBjb21taXR0ZWRMb2FkKGRvY3VtZW50TG9hZGVyLCAwLCAwKTsKQEAgLTc3NCwyMCArNzgyLDIx
IEBAIHZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OnNldFRpdGxlKGNvbnN0IFMKICAgICBmcmFtZURh
dGEtPnRpdGxlID0gZ19zdHJkdXAodGl0bGUudXRmOCgpLmRhdGEoKSk7CiB9CiAKLXZvaWQgRnJh
bWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoRG9jdW1lbnRM
b2FkZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGludCBsZW5ndGhSZWNlaXZlZCkKK3Zv
aWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoV2Vi
Q29yZTo6RG9jdW1lbnRMb2FkZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGludCBsZW5n
dGhSZWNlaXZlZCkKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi12b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZpbmlzaExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqLCB1bnNp
Z25lZCBsb25nIGlkZW50aWZpZXIpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERp
ZEZpbmlzaExvYWRpbmcoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgdW5zaWduZWQg
bG9uZyBpZGVudGlmaWVyKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgc3RhdGljX2Nh
c3Q8V2ViS2l0OjpEb2N1bWVudExvYWRlcio+KGxvYWRlciktPmRlY3JlYXNlTG9hZENvdW50KGlk
ZW50aWZpZXIpOwogfQogCi12b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZEZhaWxM
b2FkaW5nKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBjb25zdCBS
ZXNvdXJjZUVycm9yJiBlcnJvcikKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnQ6OmRpc3BhdGNoRGlk
RmFpbExvYWRpbmcoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlciwgdW5zaWduZWQgbG9u
ZyBpZGVudGlmaWVyLCBjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikKIHsKICAgICAvLyBGSVhN
RTogd2hlbiBkb2VzIHRoaXMgb2NjdXIgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbj8KLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworCisgICAgc3RhdGljX2Nhc3Q8V2ViS2l0OjpEb2N1bWVudExvYWRlcio+
KGxvYWRlciktPmRlY3JlYXNlTG9hZENvdW50KGlkZW50aWZpZXIpOwogfQogCiB2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRSZXNvdXJjZUJ5WE1MSHR0cFJlcXVlc3QodW5z
aWduZWQgbG9uZywgY29uc3QgU2NyaXB0U3RyaW5nJikKQEAgLTc5NSw3ICs4MDQsNyBAQCB2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50OjpkaXNwYXRjaERpZExvYWRSCiAgICAgbm90SW1wbGVtZW50ZWQo
KTsKIH0KIAotYm9vbCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VG
cm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiwgaW50IGxlbmd0aCkKK2Jvb2wgRnJhbWVMb2FkZXJDbGll
bnQ6OmRpc3BhdGNoRGlkTG9hZFJlc291cmNlRnJvbU1lbW9yeUNhY2hlKFdlYkNvcmU6OkRvY3Vt
ZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25z
ZSYsIGludCBsZW5ndGgpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gZmFs
c2U7CkBAIC05NDMsNyArOTUyLDcgQEAgdm9pZCBGcmFtZUxvYWRlckNsaWVudDo6ZGlzcGF0Y2hV
bmFibGVUbwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgRnJhbWVMb2FkZXJDbGll
bnQ6OnNldE1haW5Eb2N1bWVudEVycm9yKERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VF
cnJvciYgZXJyb3IpCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50OjpzZXRNYWluRG9jdW1lbnRFcnJv
cihXZWJDb3JlOjpEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQog
ewogICAgIGlmIChtX3BsdWdpblZpZXcpIHsKICAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRGYWls
KGVycm9yKTsKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXQuaAkyMDA5LTA4LTI4
IDE3OjE3OjUzLjY3MDE5NTkxNyArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdC5oCTIwMDktMDgtMjggMTc6MjI6MzYuMTAzMjQwMzQ3ICsxMDAwCkBAIC0yNiw2ICsyNiw3
IEBACiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdGRvd25sb2FkLmg+CiAjaW5jbHVkZSA8d2Via2l0
L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHNvdXBhdXRo
ZGlhbG9nLmg+CisjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaD4KICNpbmNs
dWRlIDx3ZWJraXQvd2Via2l0d2ViZnJhbWUuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2Vi
c2V0dGluZ3MuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2ViaW5zcGVjdG9yLmg+CkluZGV4
OiBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0ZGVmaW5lcy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC5vcmlnL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdGRlZmluZXMuaAkyMDA5LTA4LTI4
IDE3OjE3OjUzLjY3NDIyMzI0NSArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdGRlZmluZXMuaAkyMDA5LTA4LTI4IDE3OjIyOjM2LjEwMzI0MDM0NyArMTAwMApAQCAtNzQs
NiArNzQsOSBAQCB0eXBlZGVmIHN0cnVjdCBfV2ViS2l0RG93bmxvYWRDbGFzcyBXZWJLCiB0eXBl
ZGVmIHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2UgV2ViS2l0V2ViUmVzb3VyY2U7CiB0eXBlZGVm
IHN0cnVjdCBfV2ViS2l0V2ViUmVzb3VyY2VDbGFzcyBXZWJLaXRXZWJSZXNvdXJjZUNsYXNzOwog
Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJjZSBXZWJLaXRXZWJEYXRhU291cmNl
OwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdFdlYkRhdGFTb3VyY2VDbGFzcyBXZWJLaXRXZWJEYXRh
U291cmNlQ2xhc3M7CisKIEdfRU5EX0RFQ0xTCiAKICNlbmRpZgpJbmRleDogV2ViS2l0L1dlYktp
dC9ndGsvd2Via2l0L3dlYmtpdHByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9X
ZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgJMjAwOS0wOC0yOCAxNzoxNzo1My42NTgy
MjIyNTggKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRwcml2YXRlLmgJ
MjAwOS0wOC0yOCAxNzoyMjozNi4xMDMyNDAzNDcgKzEwMDAKQEAgLTMyLDYgKzMyLDcgQEAKICNp
bmNsdWRlIDx3ZWJraXQvd2Via2l0ZG93bmxvYWQuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0
bmV0d29ya3JlcXVlc3QuaD4KICNpbmNsdWRlIDx3ZWJraXQvd2Via2l0d2Vidmlldy5oPgorI2lu
Y2x1ZGUgPHdlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dl
YmtpdHdlYmZyYW1lLmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYnBvbGljeWRlY2lzaW9u
Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdHdlYm5hdmlnYXRpb25hY3Rpb24uaD4KQEAgLTYz
LDYgKzY0LDkgQEAKIGNsYXNzIERvd25sb2FkQ2xpZW50OwogCiBuYW1lc3BhY2UgV2ViS2l0IHsK
KworICAgIGNsYXNzIERvY3VtZW50TG9hZGVyOworCiAgICAgV2ViS2l0V2ViVmlldyogZ2V0Vmll
d0Zyb21GcmFtZShXZWJLaXRXZWJGcmFtZSopOwogCiAgICAgV2ViQ29yZTo6RnJhbWUqIGNvcmUo
V2ViS2l0V2ViRnJhbWUqKTsKQEAgLTI4MCw2ICsyODQsMTAgQEAgZXh0ZXJuICJDIiB7CiAgICAg
CiAgICAgV0VCS0lUX0FQSSB2b2lkCiAgICAgd2Via2l0X3Jlc2V0X29yaWdpbl9hY2Nlc3Nfd2hp
dGVfbGlzdHMoKTsKKworICAgIC8vIFdlYktpdFdlYkRhdGFTb3VyY2UgcHJpdmF0ZQorICAgIFdl
YktpdFdlYkRhdGFTb3VyY2UqCisgICAgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9uZXdfd2l0aF9s
b2FkZXIoUGFzc1JlZlB0cjxXZWJLaXQ6OkRvY3VtZW50TG9hZGVyPik7CiB9CiAKICNlbmRpZgpJ
bmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAw
MAorKysgV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuY3BwCTIw
MDktMDgtMjggMTc6MjI6MzYuMTA3MjM0MDExICsxMDAwCkBAIC0wLDAgKzEsNDMyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEphbiBNaWNoYWVsIEMuIEFsb256bworICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAid2Via2l0d2ViZGF0YXNvdXJjZS5oIgorCisjaW5jbHVkZSAiQXJj
aGl2ZVJlc291cmNlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIKKyNpbmNsdWRl
ICJGcmFtZUxvYWRlckNsaWVudEd0ay5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5j
bHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiUmVz
b3VyY2VSZXF1ZXN0LmgiCisjaW5jbHVkZSAicnVudGltZS9Jbml0aWFsaXplVGhyZWFkaW5nLmgi
CisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiU3Vic3RpdHV0ZURhdGEuaCIK
KyNpbmNsdWRlICJ3ZWJraXR3ZWJyZXNvdXJjZS5oIgorI2luY2x1ZGUgIndlYmtpdHByaXZhdGUu
aCIKKyNpbmNsdWRlICJ3dGYvQXNzZXJ0aW9ucy5oIgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisv
KioKKyAqIFNFQ1RJT046d2Via2l0d2ViZGF0YXNvdXJjZQorICogQHNob3J0X2Rlc2NyaXB0aW9u
OiBFbmNhcHN1bGF0ZXMgdGhlIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIGluIGEgI1dlYktpdFdl
YkZyYW1lLgorICogQHNlZV9hbHNvOiAjV2ViS2l0V2ViRnJhbWUKKyAqCisgKiBBIGRhdGEgc291
cmNlIGVuY2Fwc3VsYXRlcyB0aGUgY29udGVudCBvZiBhICNXZWJLaXRXZWJGcmFtZS4gQQorICog
I1dlYktpdFdlYkZyYW1lIGhhcyBhIG1haW4gcmVzb3VyY2UgYW5kIHN1YnJlc291cmNlcyBhbmQg
dGhlIGRhdGEgc291cmNlCisgKiBwcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcyB0aGVzZSByZXNv
dXJjZXMuICNXZWJLaXRXZWJEYXRhU291cmNlIG9iamVjdHMKKyAqIGhhdmUgYW4gYXNzb2NpYXRl
ZCBpbml0aWFsIHJlcXVlc3QuIE1ha2Ugc3VyZSB0byBjaGVjayBpZiB0aGUgZGF0YSBzb3VyY2UK
KyAqIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGxvYWRlZCBiZWZvcmUgYWNjZXNzaW5nIGl0
cyBkYXRhLgorICovCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNl
IFdlYktpdDsKKworc3RydWN0IF9XZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSB7CisgICAgV2Vi
S2l0OjpEb2N1bWVudExvYWRlciogbG9hZGVyOworCisgICAgV2ViS2l0TmV0d29ya1JlcXVlc3Qq
IGluaXRpYWxSZXF1ZXN0OworICAgIFdlYktpdE5ldHdvcmtSZXF1ZXN0KiBuZXR3b3JrUmVxdWVz
dDsKKyAgICBXZWJLaXRXZWJSZXNvdXJjZSogbWFpbnJlc291cmNlOworICAgIFdlYktpdFdlYlJl
c291cmNlKiBzdWJyZXNvdXJjZTsKKworICAgIEdTdHJpbmcqIGRhdGE7CisKKyAgICBnY2hhciog
dGV4dEVuY29kaW5nOworICAgIGdjaGFyKiB1bnJlYWNoYWJsZVVSTDsKK307CisKKyNkZWZpbmUg
V0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9HRVRfUFJJVkFURShvYmopICAgICAgICAoR19UWVBFX0lO
U1RBTkNFX0dFVF9QUklWQVRFKChvYmopLCBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdl
YktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKSkKKworR19ERUZJTkVfVFlQRShXZWJLaXRXZWJEYXRh
U291cmNlLCB3ZWJraXRfd2ViX2RhdGFfc291cmNlLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGlj
IHZvaWQgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9kaXNwb3NlKEdPYmplY3QqIG9iamVjdCkKK3sK
KyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlID0gV0VCS0lUX1dFQl9EQVRB
X1NPVVJDRShvYmplY3QpOworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0g
d2ViRGF0YVNvdXJjZS0+cHJpdjsKKworICAgIEFTU0VSVChwcml2LT5sb2FkZXIpOworICAgIEFT
U0VSVCghcHJpdi0+bG9hZGVyLT5pc0xvYWRpbmcoKSk7CisgICAgcHJpdi0+bG9hZGVyLT5kZXRh
Y2hEYXRhU291cmNlKCk7CisgICAgcHJpdi0+bG9hZGVyLT5kZXJlZigpOworCisgICAgaWYgKHBy
aXYtPmluaXRpYWxSZXF1ZXN0KSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPmluaXRp
YWxSZXF1ZXN0KTsKKyAgICAgICAgcHJpdi0+aW5pdGlhbFJlcXVlc3QgPSBOVUxMOworICAgIH0K
KworICAgIGlmIChwcml2LT5uZXR3b3JrUmVxdWVzdCkgeworICAgICAgICBnX29iamVjdF91bnJl
Zihwcml2LT5uZXR3b3JrUmVxdWVzdCk7CisgICAgICAgIHByaXYtPm5ldHdvcmtSZXF1ZXN0ID0g
TlVMTDsKKyAgICB9CisKKyAgICBpZiAocHJpdi0+bWFpbnJlc291cmNlKSB7CisgICAgICAgIGdf
b2JqZWN0X3VucmVmKHByaXYtPm1haW5yZXNvdXJjZSk7CisgICAgICAgIHByaXYtPm1haW5yZXNv
dXJjZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHByaXYtPnN1YnJlc291cmNlKSB7CisgICAg
ICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPnN1YnJlc291cmNlKTsKKyAgICAgICAgcHJpdi0+c3Vi
cmVzb3VyY2UgPSBOVUxMOworICAgIH0KKworICAgIGlmIChwcml2LT5kYXRhKSB7CisgICAgICAg
IGdfc3RyaW5nX2ZyZWUocHJpdi0+ZGF0YSwgVFJVRSk7CisgICAgICAgIHByaXYtPmRhdGEgPSBO
VUxMOworICAgIH0KKworICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
cGFyZW50X2NsYXNzKS0+ZGlzcG9zZShvYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRf
d2ViX2RhdGFfc291cmNlX2ZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKK3sKKyAgICBXZWJLaXRX
ZWJEYXRhU291cmNlKiBkYXRhU291cmNlID0gV0VCS0lUX1dFQl9EQVRBX1NPVVJDRShvYmplY3Qp
OworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0gZGF0YVNvdXJjZS0+cHJp
djsKKworICAgIGdfZnJlZShwcml2LT51bnJlYWNoYWJsZVVSTCk7CisgICAgZ19mcmVlKHByaXYt
PnRleHRFbmNvZGluZyk7CisKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfd2ViX2RhdGFfc291
cmNlX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIHdl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfY2xhc3NfaW5pdChXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3Mq
IGtsYXNzKQoreworICAgIEdPYmplY3RDbGFzcyogZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NM
QVNTKGtsYXNzKTsKKyAgICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gd2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9kaXNwb3NlOworICAgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3dl
Yl9kYXRhX3NvdXJjZV9maW5hbGl6ZTsKKworICAgIHdlYmtpdF9pbml0KCk7CisKKyAgICBnX3R5
cGVfY2xhc3NfYWRkX3ByaXZhdGUoZ29iamVjdF9jbGFzcywgc2l6ZW9mKFdlYktpdFdlYkRhdGFT
b3VyY2VQcml2YXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
aW5pdChXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIHdlYkRhdGFT
b3VyY2UtPnByaXYgPSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0dFVF9QUklWQVRFKHdlYkRhdGFT
b3VyY2UpOworfQorCitXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2RhdGFfc291cmNl
X25ld193aXRoX2xvYWRlcihQYXNzUmVmUHRyPFdlYktpdDo6RG9jdW1lbnRMb2FkZXI+IGxvYWRl
cikKK3sKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlID0gV0VCS0lUX1dF
Ql9EQVRBX1NPVVJDRShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFLCBO
VUxMKSk7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291
cmNlLT5wcml2OworICAgIHByaXYtPmxvYWRlciA9IGxvYWRlci5yZWxlYXNlUmVmKCk7CisKKyAg
ICByZXR1cm4gd2ViRGF0YVNvdXJjZTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291
cmNlX25ldzoKKyAqCisgKiBDcmVhdGVzIGEgbmV3ICNXZWJLaXRXZWJEYXRhU291cmNlIGluc3Rh
bmNlLiBUaGUgVVJMIG9mIHRoZQorICogI1dlYktpdFdlYkRhdGFTb3VyY2Ugd2lsbCBiZSBzZXQg
dG8gImFib3V0OmJsYW5rIi4KKyAqCisgKiBSZXR1cm46IGEgbmV3ICNXZWJLaXRXZWJEYXRhU291
cmNlLgorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLworV2ViS2l0V2ViRGF0YVNvdXJjZSogd2Vi
a2l0X3dlYl9kYXRhX3NvdXJjZV9uZXcoKQoreworICAgIFdlYktpdE5ldHdvcmtSZXF1ZXN0KiBy
ZXF1ZXN0ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXcoImFib3V0OmJsYW5rIik7CisgICAg
V2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YXNvdXJjZSA9IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
bmV3X3dpdGhfcmVxdWVzdChyZXF1ZXN0KTsKKyAgICBnX29iamVjdF91bnJlZihyZXF1ZXN0KTsK
KworICAgIHJldHVybiBkYXRhc291cmNlOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9z
b3VyY2VfbmV3X3dpdGhfcmVxdWVzdDoKKyAqIEByZXF1ZXN0OiB0aGUgI1dlYktpdE5ldHdvcmtS
ZXF1ZXN0IHRvIHVzZSB0byBjcmVhdGUgdGhpcyBkYXRhIHNvdXJjZQorICoKKyAqIENyZWF0ZXMg
YSBuZXcgI1dlYktpdFdlYkRhdGFTb3VyY2UgZnJvbSBhICNXZWJLaXROZXR3b3JrUmVxdWVzdC4g
Tm9ybWFsbHksCisgKiAjV2ViS2l0V2ViRnJhbWUgb2JqZWN0cyBjcmVhdGUgdGhlaXIgZGF0YSBz
b3VyY2VzIHNvIHlvdSB3aWxsIGFsbW9zdCBuZXZlcgorICogd2FudCB0byBpbnZva2UgdGhpcyBt
ZXRob2QgZGlyZWN0bHkuCisgKgorICogUmV0dXJuczogYSBuZXcgI1dlYktpdFdlYkRhdGFTb3Vy
Y2UKKyAqCisgKiBTaW5jZTogMS4xLjE0CisgKi8KK1dlYktpdFdlYkRhdGFTb3VyY2UqIHdlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfbmV3X3dpdGhfcmVxdWVzdChXZWJLaXROZXR3b3JrUmVxdWVzdCog
cmVxdWVzdCkKK3sKKyAgICBBU1NFUlQocmVxdWVzdCk7CisKKyAgICBjb25zdCBnY2hhciogdXJp
ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9nZXRfdXJpKHJlcXVlc3QpOworCisgICAgV2ViS2l0
V2ViRGF0YVNvdXJjZSogZGF0YXNvdXJjZTsKKyAgICBkYXRhc291cmNlID0gd2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9uZXdfd2l0aF9sb2FkZXIoCisgICAgICAgIFdlYktpdDo6RG9jdW1lbnRMb2Fk
ZXI6OmNyZWF0ZShSZXNvdXJjZVJlcXVlc3QoS1VSTChLVVJMKCksIFN0cmluZzo6ZnJvbVVURjgo
dXJpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RpdHV0
ZURhdGEoKSkpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSBkYXRh
c291cmNlLT5wcml2OworICAgIHByaXYtPmluaXRpYWxSZXF1ZXN0ID0gcmVxdWVzdDsKKworICAg
IHJldHVybiBkYXRhc291cmNlOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2Vf
Z2V0X3dlYl9mcmFtZQorICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisg
KgorICogUmV0dXJucyB0aGUgI1dlYktpdFdlYkZyYW1lIHRoYXQgcmVwcmVzZW50cyB0aGlzIGRh
dGEgc291cmNlCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgI1dlYktpdFdlYkZyYW1lIHRoYXQg
cmVwcmVzZW50cyB0aGUgQGRhdGFfc291cmNlLiBUaGUKKyAqICNXZWJLaXRXZWJGcmFtZSBpcyBv
d25lZCBieSBXZWJLaXQgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQgb3IgZGVzdHJveWVkLgorICog
VGhpcyB3aWxsIHJldHVybiAlTlVMTCBvZiB0aGUgQGRhdGFfc291cmNlIGlzIG5vdCBhdHRhY2hl
ZCB0byBhIGZyYW1lLgorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLworV2ViS2l0V2ViRnJhbWUq
IHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3dlYl9mcmFtZShXZWJLaXRXZWJEYXRhU291cmNl
KiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19X
RUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSksIE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRhU291cmNlLT5wcml2OworICAgIEZyYW1lTG9h
ZGVyKiBmcmFtZUxvYWRlciA9IHByaXYtPmxvYWRlci0+ZnJhbWVMb2FkZXIoKTsKKworICAgIGlm
ICghZnJhbWVMb2FkZXIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFdlYktpdDo6RnJhbWVMb2FkZXJDbGllbnQqPihmcmFtZUxvYWRlci0+Y2xpZW50KCkp
LT53ZWJGcmFtZSgpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2lu
aXRpYWxfcmVxdWVzdDoKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQor
ICoKKyAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3QgdGhhdCB3
YXMgdXNlZCB0byBsb2FkIHRoZSB3ZWIKKyAqIGNvbnRlbnQKKyAqCisgKiBSZXR1cm4gdmFsdWU6
IHRoZSBvcmlnaW5hbCAjV2ViS2l0TmV0d29ya1JlcXVlc3QKKyAqCisgKiBTaW5jZTogMS4xLjE0
CisgKi8KK1dlYktpdE5ldHdvcmtSZXF1ZXN0KiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9p
bml0aWFsX3JlcXVlc3QoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFT
b3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0g
d2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdCA9IHByaXYt
PmxvYWRlci0+b3JpZ2luYWxSZXF1ZXN0KCk7CisKKyAgICBpZiAocHJpdi0+aW5pdGlhbFJlcXVl
c3QpCisgICAgICAgIGdfb2JqZWN0X3VucmVmKHByaXYtPmluaXRpYWxSZXF1ZXN0KTsKKworICAg
IHByaXYtPmluaXRpYWxSZXF1ZXN0ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXdfd2l0aF9j
b3JlX3JlcXVlc3QocmVxdWVzdCk7CisgICAgcmV0dXJuIHByaXYtPmluaXRpYWxSZXF1ZXN0Owor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X25ldHdvcmtfcmVxdWVzdDoK
KyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMg
YSAjV2ViS2l0TmV0d29ya1JlcXVlc3QgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyAjV2Vi
S2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybiB2YWx1ZTogdGhlICNXZWJLaXROZXR3b3Jr
UmVxdWVzdCB0aGF0IGNyZWF0ZWQgdGhlIEBkYXRhX3NvdXJjZSBvcgorICogJU5VTEwgaWYgdGhl
IEBkYXRhX3NvdXJjZSBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIGZyYW1lIG9yIHRoZSBmcmFtZSBo
YXNuJ3QgYmVlbiBsb2FkZWQuCisgKgorICogU2luY2UgMS4xLjE0CisgKi8KK1dlYktpdE5ldHdv
cmtSZXF1ZXN0KiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXF1ZXN0KFdlYktpdFdlYkRh
dGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VC
S0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJL
aXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisgICAg
RnJhbWVMb2FkZXIqIGZyYW1lTG9hZGVyID0gcHJpdi0+bG9hZGVyLT5mcmFtZUxvYWRlcigpOwor
ICAgIGlmICghZnJhbWVMb2FkZXIgfHwgIWZyYW1lTG9hZGVyLT5mcmFtZUhhc0xvYWRlZCgpKQor
ICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJlc291cmNlUmVxdWVzdCByZXF1ZXN0ID0gcHJp
di0+bG9hZGVyLT5yZXF1ZXN0KCk7CisKKyAgICAgaWYgKHByaXYtPm5ldHdvcmtSZXF1ZXN0KQor
ICAgICAgICAgZ19vYmplY3RfdW5yZWYocHJpdi0+bmV0d29ya1JlcXVlc3QpOworCisgICAgIHBy
aXYtPm5ldHdvcmtSZXF1ZXN0ID0gd2Via2l0X25ldHdvcmtfcmVxdWVzdF9uZXdfd2l0aF9jb3Jl
X3JlcXVlc3QocmVxdWVzdCk7CisgICAgIHJldHVybiBwcml2LT5uZXR3b3JrUmVxdWVzdDsKK30K
KworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9lbmNvZGluZzoKKyAqIEBkYXRh
X3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybnMgdGhlIHRleHQg
ZW5jb2RpbmcgbmFtZSBhcyBzZXQgaW4gdGhlICNXZWJLaXRXZWJWaWV3LCBvciBpZiBub3QsIHRo
ZQorICogdGV4dCBlbmNvZGluZyBvZiB0aGUgcmVzcG9uc2UuCisgKgorICogUmV0dXJuIHZhbHVl
OiB0aGUgZW5jb2RpbmcgbmFtZSBvZiB0aGUgI1dlYktpdFdlYlZpZXcgb3Igb2YgdGhlIHJlc3Bv
bnNlLgorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLworR19DT05TVF9SRVRVUk4gZ2NoYXIqIHdl
YmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2VuY29kaW5nKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdl
YkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9E
QVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291
cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisgICAgU3RyaW5nIHRleHRF
bmNvZGluZ05hbWUgPSBwcml2LT5sb2FkZXItPm92ZXJyaWRlRW5jb2RpbmcoKTsKKworICAgIGlm
ICghdGV4dEVuY29kaW5nTmFtZSkKKyAgICAgICAgdGV4dEVuY29kaW5nTmFtZSA9IHByaXYtPmxv
YWRlci0+cmVzcG9uc2UoKS50ZXh0RW5jb2RpbmdOYW1lKCk7CisKKyAgICBDU3RyaW5nIGVuY29k
aW5nID0gdGV4dEVuY29kaW5nTmFtZS51dGY4KCk7CisgICAgZ19mcmVlKHByaXYtPnRleHRFbmNv
ZGluZyk7CisgICAgcHJpdi0+dGV4dEVuY29kaW5nID0gZ19zdHJkdXAoZW5jb2RpbmcuZGF0YSgp
KTsKKyAgICByZXR1cm4gcHJpdi0+dGV4dEVuY29kaW5nOworfQorCisvKioKKyAqIHdlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGluZzoKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2Vi
RGF0YVNvdXJjZQorICoKKyAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YSBzb3VyY2UgaXMg
aW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyBpdHMgY29udGVudC4KKyAqCisgKiBSZXR1cm4gdmFs
dWU6ICVUUlVFIGlmIHRoZSBAZGF0YV9zb3VyY2UgaXMgc3RpbGwgbG9hZGluZywgJUZBTFNFIG90
aGVyd2lzZQorICoKKyAqIFNpbmNlOiAxLjEuMTQKKyAqLworZ2Jvb2xlYW4gd2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9pc19sb2FkaW5nKFdlYktpdFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2Up
Cit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3
ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAgICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSog
cHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7CisKKyAgICByZXR1cm4gcHJpdi0+bG9hZGVyLT5p
c0xvYWRpbmdJbkFQSVNlbnNlKCk7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfZGF0YToKKyAqIEBkYXRhX3NvdXJjZTogYSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoK
KyAqIFJldHVybnMgdGhlIHJhdyBkYXRhIHRoYXQgcmVwcmVzZW50cyB0aGUgdGhlIGZyYW1lJ3Mg
Y29udGVudC5UaGUgZGF0YSB3aWxsCisgKiBiZSBpbmNvbXBsZXRlIHVudGlsIHRoZSBkYXRhIGhh
cyBmaW5pc2hlZCBsb2FkaW5nLiBSZXR1cm5zICVOVUxMIGlmIHRoZSB3ZWIKKyAqIGZyYW1lIGhh
c24ndCBsb2FkZWQgYW55IGRhdGEuIFVzZSB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2lzX2xvYWRp
bmcgdG8gdGVzdAorICogaWYgZGF0YSBzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGlu
Zy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGEgI0dTdHJpbmcgd2hpY2ggY29udGFpbnMgdGhlIHJh
dyBkYXRhIHRoYXQgcmVwcmVzZW50cyB0aGUgQGRhdGFfc291cmNlIG9yICVOVUxMIGlmIHRoZQor
ICogQGRhdGFfc291cmNlIGhhc24ndCBsb2FkZWQgYW55IGRhdGEuCisgKgorICogU2luY2U6IDEu
MS4xNAorICovCitHU3RyaW5nKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9kYXRhKFdlYktp
dFdlYkRhdGFTb3VyY2UqIHdlYkRhdGFTb3VyY2UpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2Zh
aWwoV0VCS0lUX0lTX1dFQl9EQVRBX1NPVVJDRSh3ZWJEYXRhU291cmNlKSwgTlVMTCk7CisKKyAg
ICBXZWJLaXRXZWJEYXRhU291cmNlUHJpdmF0ZSogcHJpdiA9IHdlYkRhdGFTb3VyY2UtPnByaXY7
CisKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtYWluUmVzb3VyY2VEYXRhID0gcHJpdi0+bG9h
ZGVyLT5tYWluUmVzb3VyY2VEYXRhKCk7CisKKyAgICBpZiAoIW1haW5SZXNvdXJjZURhdGEpCisg
ICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHByaXYtPmRhdGEpIHsKKyAgICAgICAgZ19z
dHJpbmdfZnJlZShwcml2LT5kYXRhLCBUUlVFKTsKKyAgICAgICAgcHJpdi0+ZGF0YSA9IE5VTEw7
CisgICAgfQorCisgICAgcHJpdi0+ZGF0YSA9IGdfc3RyaW5nX25ld19sZW4obWFpblJlc291cmNl
RGF0YS0+ZGF0YSgpLCBtYWluUmVzb3VyY2VEYXRhLT5zaXplKCkpOworICAgIHJldHVybiBwcml2
LT5kYXRhOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X21haW5fcmVz
b3VyY2U6CisgKiBAZGF0YV9zb3VyY2U6IGEgI1dlYktpdFdlYkRhdGFTb3VyY2UKKyAqCisgKiBS
ZXR1cm5zIHRoZSBtYWluIHJlc291cmNlIG9mIHRoZSBAZGF0YV9zb3VyY2UKKyAqCisgKiBSZXR1
cm4gdmFsdWU6IGEgbmV3ICNXZWJLaXRXZWJSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIG1haW4g
cmVzb3VyY2Ugb2YKKyAqIHRoZSBAZGF0YV9zb3VyY2UuCisgKgorICogU2luY2U6IDEuMS4xMgor
ICovCitXZWJLaXRXZWJSZXNvdXJjZSogd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfbWFpbl9y
ZXNvdXJjZShXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJEYXRhU291cmNlKQoreworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfREFUQV9TT1VSQ0Uod2ViRGF0YVNvdXJjZSks
IE5VTEwpOworCisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUqIHByaXYgPSB3ZWJEYXRh
U291cmNlLT5wcml2OworCisgICAgUmVmUHRyPEFyY2hpdmVSZXNvdXJjZT4gY29yZVJlc291cmNl
ID0gcHJpdi0+bG9hZGVyLT5tYWluUmVzb3VyY2UoKTsKKworICAgIEFTU0VSVChjb3JlUmVzb3Vy
Y2UpOworCisgICAgaWYgKHByaXYtPm1haW5yZXNvdXJjZSkKKyAgICAgICAgZ19vYmplY3RfdW5y
ZWYocHJpdi0+bWFpbnJlc291cmNlKTsKKworICAgIHByaXYtPm1haW5yZXNvdXJjZSA9IHdlYmtp
dF93ZWJfcmVzb3VyY2VfbmV3X3dpdGhfY29yZV9yZXNvdXJjZShjb3JlUmVzb3VyY2UucmVsZWFz
ZSgpKTsKKyAgICByZXR1cm4gcHJpdi0+bWFpbnJlc291cmNlOworfQorCisvKioKKyAqIHdlYmtp
dF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VyaToKKyAqIEBkYXRhX3NvdXJjZTog
YSAjV2ViS2l0V2ViRGF0YVNvdXJjZQorICoKKyAqIFJldHVybiB0aGUgdW5yZWFjaGFibGUgVVJJ
IG9mIEBkYXRhX3NvdXJjZS4gVGhlIEBkYXRhX3NvdXJjZSB3aWxsIGhhdmUgYW4KKyAqIHVucmVh
Y2hhYmxlIFVSTCBpZiBpdCB3YXMgY3JlYXRlZCB1c2luZyAjV2ViS2l0V2ViRnJhbWUncworICog
d2Via2l0X3dlYl9mcmFtZV9sb2FkX2FsdGVybmF0ZV9odG1sX3N0cmluZyBtZXRob2QuCisgKgor
ICogUmV0dXJuIHZhbHVlOiB0aGUgdW5yZWFjaGFibGUgVVJMIG9mIEBkYXRhX3NvdXJjZSBvciAl
TlVMTCBpZiB0aGVyZSBpcyBubyB1bnJlYWNoYWJsZSBVUkwuCisgKgorICogU2luY2UgMS4xLjE0
CisgKi8KK0dfQ09OU1RfUkVUVVJOIGdjaGFyKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF91
bnJlYWNoYWJsZV91cmkoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSkKK3sKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX0RBVEFfU09VUkNFKHdlYkRhdGFT
b3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRhdGFTb3VyY2VQcml2YXRlKiBwcml2ID0g
d2ViRGF0YVNvdXJjZS0+cHJpdjsKKyAgICBjb25zdCBLVVJMJiB1bnJlYWNoYWJsZVVSTCA9IHBy
aXYtPmxvYWRlci0+dW5yZWFjaGFibGVVUkwoKTsKKworICAgIGlmICh1bnJlYWNoYWJsZVVSTC5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZ19mcmVlKHByaXYtPnVucmVh
Y2hhYmxlVVJMKTsKKyAgICBwcml2LT51bnJlYWNoYWJsZVVSTCA9IGdfc3RyZHVwKHVucmVhY2hh
YmxlVVJMLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIHJldHVybiBwcml2LT51bnJlYWNo
YWJsZVVSTDsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9yZXNvdXJj
ZV9mb3JfdXJpOgorICogQGRhdGFfc291cmNlOiBhICNXZWJLaXRXZWJEYXRhU291cmNlCisgKiBA
dXJpOiB0aGUgdXJsIG9mIGEgcmVzb3VyY2UKKyAqCisgKiBSZXR1cm5zIHRoZSAjV2ViS2l0V2Vi
UmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBVUkkuCisgKgorICogUmV0dXJuIHZhbHVlOiB0aGUgI1dl
YktpdFdlYlJlc291cmNlIGZvciBAdXJpIG9yICVOVUxMIGlmIHRoZXJlIGlzIG5vCisgKiAjV2Vi
S2l0V2ViUmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBAdXJsLgorICoKKyAqIFNpbmNlOiAx
LjEuMTQKKyAqLworV2ViS2l0V2ViUmVzb3VyY2UqIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0
X3N1YnJlc291cmNlX2Zvcl91cmkoV2ViS2l0V2ViRGF0YVNvdXJjZSogd2ViRGF0YVNvdXJjZSwg
Y29uc3QgZ2NoYXIqIHVyaSkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNf
V0VCX0RBVEFfU09VUkNFKHdlYkRhdGFTb3VyY2UpLCBOVUxMKTsKKworICAgIFdlYktpdFdlYkRh
dGFTb3VyY2VQcml2YXRlKiBwcml2ID0gd2ViRGF0YVNvdXJjZS0+cHJpdjsKKworICAgIFJlZlB0
cjxBcmNoaXZlUmVzb3VyY2U+IHN1YnJlc291cmNlID0gcHJpdi0+bG9hZGVyLT5zdWJyZXNvdXJj
ZShLVVJMKEtVUkwoKSwgU3RyaW5nOjpmcm9tVVRGOCh1cmkpKSk7CisgICAgaWYgKHByaXYtPnN1
YnJlc291cmNlKQorICAgICAgICBnX29iamVjdF91bnJlZihwcml2LT5zdWJyZXNvdXJjZSk7CisK
KyAgICBwcml2LT5zdWJyZXNvdXJjZSA9IHdlYmtpdF93ZWJfcmVzb3VyY2VfbmV3X3dpdGhfY29y
ZV9yZXNvdXJjZShzdWJyZXNvdXJjZS5yZWxlYXNlKCkpOworICAgIHJldHVybiBwcml2LT5zdWJy
ZXNvdXJjZTsKK30KSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJkYXRh
c291cmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAw
MDAwMDAwICswMDAwCisrKyBXZWJLaXQvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZGF0YXNv
dXJjZS5oCTIwMDktMDgtMjggMTc6MjI6MzYuMTA3MjM0MDExICsxMDAwCkBAIC0wLDAgKzEsOTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQy4gQWxvbnpvCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5k
ZWYgV0VCS0lUX1dFQl9EQVRBX1NPVVJDRV9ICisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9TT1VS
Q0VfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNp
bmNsdWRlIDx3ZWJraXQvd2Via2l0ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdlYmtpdC93ZWJraXR3
ZWJmcmFtZS5oPgorI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRuZXR3b3JrcmVxdWVzdC5oPgorCitH
X0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgV0VCS0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFICAgICAg
ICAgICAgKHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgV0VCS0lU
X1dFQl9EQVRBX1NPVVJDRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9D
QVNUKChvYmopLCBXRUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UsIFdlYktpdFdlYkRhdGFTb3Vy
Y2UpKQorI2RlZmluZSBXRUJLSVRfV0VCX0RBVEFfU09VUkNFX0NMQVNTKGtsYXNzKSAgICAoR19U
WVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgIFdFQktJVF9UWVBFX1dFQl9EQVRBX1NPVVJD
RSwgV2ViS2l0V2ViRGF0YVNvdXJjZUNsYXNzKSkKKyNkZWZpbmUgV0VCS0lUX0lTX1dFQl9EQVRB
X1NPVVJDRShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBX
RUJLSVRfVFlQRV9XRUJfREFUQV9TT1VSQ0UpKQorI2RlZmluZSBXRUJLSVRfSVNfV0VCX0RBVEFf
U09VUkNFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgIFdF
QktJVF9UWVBFX1dFQl9EQVRBX1NPVVJDRSkpCisjZGVmaW5lIFdFQktJVF9XRUJfREFUQV9TT1VS
Q0VfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopLCAgV0VC
S0lUX1RZUEVfV0VCX0RBVEFfU09VUkNFLCBXZWJLaXRXZWJEYXRhU291cmNlQ2xhc3MpKQorCit0
eXBlZGVmIHN0cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJjZVByaXZhdGUgV2ViS2l0V2ViRGF0YVNv
dXJjZVByaXZhdGU7CisKK3N0cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJjZSB7CisgICAgR09iamVj
dCBwYXJlbnRfaW5zdGFuY2U7CisKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICBXZWJLaXRXZWJE
YXRhU291cmNlUHJpdmF0ZSAqcHJpdjsKK307CisKK3N0cnVjdCBfV2ViS2l0V2ViRGF0YVNvdXJj
ZUNsYXNzIHsKKyAgICBHT2JqZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworCisgICAgLyogUGFkZGlu
ZyBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIHZvaWQgKCpfd2Via2l0X3Jlc2VydmVkMCkg
KHZvaWQpOworICAgIHZvaWQgKCpfd2Via2l0X3Jlc2VydmVkMSkgKHZvaWQpOworICAgIHZvaWQg
KCpfd2Via2l0X3Jlc2VydmVkMikgKHZvaWQpOworICAgIHZvaWQgKCpfd2Via2l0X3Jlc2VydmVk
MykgKHZvaWQpOworfTsKKworV0VCS0lUX0FQSSBHVHlwZQord2Via2l0X3dlYl9kYXRhX3NvdXJj
ZV9nZXRfdHlwZSAodm9pZCk7CisKK1dFQktJVF9BUEkgV2ViS2l0V2ViRGF0YVNvdXJjZSAqCit3
ZWJraXRfd2ViX2RhdGFfc291cmNlX25ldyAgICAgICAgICAgICAgICAgICAgKHZvaWQpOworCitX
RUJLSVRfQVBJIFdlYktpdFdlYkRhdGFTb3VyY2UgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9u
ZXdfd2l0aF9yZXF1ZXN0ICAgICAgIChXZWJLaXROZXR3b3JrUmVxdWVzdCAqcmVxdWVzdCk7CisK
K1dFQktJVF9BUEkgV2ViS2l0V2ViRnJhbWUgKgord2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRf
d2ViX2ZyYW1lICAgICAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0YV9zb3VyY2UpOwor
CitXRUJLSVRfQVBJIFdlYktpdE5ldHdvcmtSZXF1ZXN0ICoKK3dlYmtpdF93ZWJfZGF0YV9zb3Vy
Y2VfZ2V0X2luaXRpYWxfcmVxdWVzdCAgICAoV2ViS2l0V2ViRGF0YVNvdXJjZSAgKmRhdGFfc291
cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXROZXR3b3JrUmVxdWVzdCAqCit3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX2dldF9yZXF1ZXN0ICAgICAgICAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpk
YXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgR19DT05TVF9SRVRVUk4gZ2NoYXIgKgord2Via2l0
X3dlYl9kYXRhX3NvdXJjZV9nZXRfZW5jb2RpbmcgICAgICAgICAgIChXZWJLaXRXZWJEYXRhU291
cmNlICAqZGF0YV9zb3VyY2UpOworCitXRUJLSVRfQVBJIGdib29sZWFuCit3ZWJraXRfd2ViX2Rh
dGFfc291cmNlX2lzX2xvYWRpbmcgICAgICAgICAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpk
YXRhX3NvdXJjZSk7CisKK1dFQktJVF9BUEkgR1N0cmluZyAqCit3ZWJraXRfd2ViX2RhdGFfc291
cmNlX2dldF9kYXRhICAgICAgICAgICAgICAgKFdlYktpdFdlYkRhdGFTb3VyY2UgICpkYXRhX3Nv
dXJjZSk7CisKK1dFQktJVF9BUEkgV2ViS2l0V2ViUmVzb3VyY2UgKgord2Via2l0X3dlYl9kYXRh
X3NvdXJjZV9nZXRfbWFpbl9yZXNvdXJjZSAgICAgIChXZWJLaXRXZWJEYXRhU291cmNlICAqZGF0
YV9zb3VyY2UpOworCitXRUJLSVRfQVBJIEdfQ09OU1RfUkVUVVJOIGdjaGFyICoKK3dlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfZ2V0X3VucmVhY2hhYmxlX3VyaSAgICAoV2ViS2l0V2ViRGF0YVNvdXJj
ZSAgKmRhdGFfc291cmNlKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJSZXNvdXJjZSAqCit3ZWJr
aXRfd2ViX2RhdGFfc291cmNlX2dldF9zdWJyZXNvdXJjZV9mb3JfdXJpIChXZWJLaXRXZWJEYXRh
U291cmNlICAqZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqdXJpKTsKKworR19FTkRfREVDTFMK
KworI2VuZGlmIC8qIFdFQktJVF9XRUJfREFUQV9TT1VSQ0VfSCAqLwpJbmRleDogV2ViS2l0L1dl
YktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQu
b3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAJMjAwOS0wOC0yOCAxNzox
Nzo1My42NTQxODgzNjYgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3
ZWJmcmFtZS5jcHAJMjAwOS0wOC0yOCAxNzoyMjozNi4xMDcyMzQwMTEgKzEwMDAKQEAgLTgxNiw3
ICs4MTYsNyBAQCB1bnNpZ25lZCBpbnQgd2Via2l0X3dlYl9mcmFtZV9udW1iZXJfb2ZfCiBnY2hh
ciogd2Via2l0X3dlYl9mcmFtZV9nZXRfcmVzcG9uc2VfbWltZV90eXBlKFdlYktpdFdlYkZyYW1l
KiBmcmFtZSkKIHsKICAgICBGcmFtZSogY29yZUZyYW1lID0gY29yZShmcmFtZSk7Ci0gICAgRG9j
dW1lbnRMb2FkZXIqIGRvY0xvYWRlciA9IGNvcmVGcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9h
ZGVyKCk7CisgICAgV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGRvY0xvYWRlciA9IGNvcmVGcmFt
ZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CiAgICAgU3RyaW5nIG1pbWVUeXBlID0gZG9j
TG9hZGVyLT5yZXNwb25zZU1JTUVUeXBlKCk7CiAgICAgcmV0dXJuIGdfc3RyZHVwKG1pbWVUeXBl
LnV0ZjgoKS5kYXRhKCkpOwogfQpJbmRleDogV2ViS2l0L0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQub3JpZy9DaGFuZ2VMb2cJMjAwOS0wOC0yOCAxNzoyMzowOS42ODYxOTkxOTkgKzEw
MDAKKysrIFdlYktpdC9DaGFuZ2VMb2cJMjAwOS0wOC0yOCAxNzoyNDozOS41NDYxODg1MzcgKzEw
MDAKQEAgLTUsNiArNSwxNyBAQAogICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291
cmNlIGZvciB0aGUgZ3RrIHBvcnQKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI0NzU4CiAKKyAgICAgICAgQWRkIFdlYktpdFdlYkRhdGFTb3VyY2UgYW5k
IERvY3VtZW50TG9hZGVyR3RrIHRvIHRoZSBidWlsZCBzY3JpcHQuCisKKyAgICAgICAgKiBHTlVt
YWtlZmlsZS5hbToKKworMjAwOS0wOC0yOCAgSmFuIE1pY2hhZWwgQWxvbnpvICA8am1hbG9uem9A
d2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUgZ3RrIHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NzU4CisKICAg
ICAgICAgQWRkIFdlYktpdFdlYlJlc291cmNlIHRvIHRoZSBidWlsZCBzY3JpcHQuCiAKICAgICAg
ICAgKiBHTlVtYWtlZmlsZS5hbToKSW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL0NoYW5nZUxvZwkyMDA5LTA4LTI4
IDE3OjIzOjA5LjcwNjIwMTM5MyArMTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9n
CTIwMDktMDgtMjggMTc6MjY6MDQuNDI3MTg4Njk0ICsxMDAwCkBAIC01LDYgKzUsMjIgQEAKICAg
ICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CiAg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAogCisg
ICAgICAgIFN1YmNsYXNzIERvY3VtZW50TG9hZGVyIGZvciBHdGsgYW5kIGltcGxlbWVudCBpdCB1
bmRlciB0aGUgV2ViS2l0CisgICAgICAgIG5hbWVzcGFjZS4gQWRkIFdlYktpdFdlYkRhdGFTb3Vy
Y2UgaW1wbGVtZW50YXRpb24gdGhhdCBjbG9zZWx5CisgICAgICAgIGZvbGxvd3MgdGhlIG1hYyBp
bXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvRG9j
dW1lbnRMb2FkZXJHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9Eb2N1
bWVudExvYWRlckd0ay5oOiBBZGRlZC4KKyAgICAgICAgKiB3ZWJraXQvd2Via2l0d2ViZGF0YXNv
dXJjZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHdlYmtpdC93ZWJraXR3ZWJkYXRhc291cmNlLmg6
IEFkZGVkLgorCisyMDA5LTA4LTI4ICBKYW4gTWljaGFlbCBBbG9uem8gIDxqbWFsb256b0B3ZWJr
aXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtHdGtdIEltcGxlbWVudCBhIFdlYkRhdGFTb3VyY2UgZm9yIHRoZSBndGsgcG9ydAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NTgKKwogICAgICAg
ICBJbXBsZW1lbnQgV2ViS2l0V2ViUmVzb3VyY2UgZm9yIHRoZSByZXNvdXJjZS1yZWxhdGVkIEFQ
SSBmb3IKICAgICAgICAgV2ViS2l0V2ViRGF0YVNvdXJjZS4KIAo=
</data>
<flag name="review"
          id="19718"
          type_id="1"
          status="+"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38722</attachid>
            <date>2009-08-28 00:31:14 -0700</date>
            <delta_ts>2009-08-31 07:09:24 -0700</delta_ts>
            <desc>Updated patch with working tests</desc>
            <filename>frameds</filename>
            <type>text/plain</type>
            <size>12999</size>
            <attacher name="Jan Alonzo">jmalonzo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQub3JpZy9H
TlVtYWtlZmlsZS5hbQkyMDA5LTA4LTI4IDE3OjIyOjM2LjA5NTE4ODYyNSArMTAwMAorKysgV2Vi
S2l0L0dOVW1ha2VmaWxlLmFtCTIwMDktMDgtMjggMTc6MjY6MzMuODkwMjM5MDMyICsxMDAwCkBA
IC01MzIsNyArNTMyLDggQEAgVEVTVF9QUk9HUyArPSBQcm9ncmFtcy91bml0dGVzdHMvdGVzdGh0
dAogCVByb2dyYW1zL3VuaXR0ZXN0cy90ZXN0ZG93bmxvYWQgXAogCVByb2dyYW1zL3VuaXR0ZXN0
cy90ZXN0YXRrIFwKIAlQcm9ncmFtcy91bml0dGVzdHMvdGVzdHdlYnNldHRpbmdzIFwKLQlQcm9n
cmFtcy91bml0dGVzdHMvdGVzdHdlYnJlc291cmNlCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3
ZWJyZXNvdXJjZSBcCisJUHJvZ3JhbXMvdW5pdHRlc3RzL3Rlc3R3ZWJkYXRhc291cmNlCiAKICMg
QWRkIGFkZGl0aW9uYWwgdGVzdHMgaGVyZQogUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3RodHRwYmFj
a2VuZF9TT1VSQ0VTID0gV2ViS2l0L2d0ay90ZXN0cy90ZXN0aHR0cGJhY2tlbmQuYwpAQCAtNTg0
LDYgKzU4NSwxMCBAQCBQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX1NPVVJDCiBQ
cm9ncmFtc191bml0dGVzdHNfdGVzdHdlYnJlc291cmNlX0NGTEFHUyA9ICQod2Via2l0X3Rlc3Rz
X2NmbGFncykKIFByb2dyYW1zX3VuaXR0ZXN0c190ZXN0d2VicmVzb3VyY2VfTERBREQgPSAkKHdl
YmtpdF90ZXN0c19sZGFkZCkKIAorUHJvZ3JhbXNfdW5pdHRlc3RzX3Rlc3R3ZWJkYXRhc291cmNl
X1NPVVJDRVMgPSBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3R3ZWJkYXRhc291cmNlLmMKK1Byb2dyYW1z
X3VuaXR0ZXN0c190ZXN0d2ViZGF0YXNvdXJjZV9DRkxBR1MgPSAkKHdlYmtpdF90ZXN0c19jZmxh
Z3MpCitQcm9ncmFtc191bml0dGVzdHNfdGVzdHdlYmRhdGFzb3VyY2VfTERBREQgPSAkKHdlYmtp
dF90ZXN0c19sZGFkZCkKKwogIyBBdXRvZ2VuZXJhdGVkIHNvdXJjZXMKIEJVSUxUX1NPVVJDRVMg
Oj0gXAogCSQoamF2YXNjcmlwdGNvcmVfYnVpbHRfc291cmNlcykgXApJbmRleDogV2ViS2l0L1dl
YktpdC9ndGsvdGVzdHMvdGVzdHdlYmRhdGFzb3VyY2UuYwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251
bGwJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIFdlYktpdC9XZWJLaXQv
Z3RrL3Rlc3RzL3Rlc3R3ZWJkYXRhc291cmNlLmMJMjAwOS0wOC0yOCAxNzoyNjozMy44OTAyMzkw
MzIgKzEwMDAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFu
IE1pY2hhZWwgQWxvbnpvCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgor
I2luY2x1ZGUgPHdlYmtpdC93ZWJraXQuaD4KKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAx
NiwgMCkgJiYgR1RLX0NIRUNLX1ZFUlNJT04oMiwgMTQsIDApCisKK3N0YXRpYyBjb25zdCBnc2hv
cnQgZGVmYXVsdFRpbWVvdXQgPSAxMDsKK2d1aW50IHdhaXRUaW1lcjsKK2dib29sZWFuIHNob3Vs
ZFdhaXQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3Owor
ICAgIFdlYktpdFdlYkZyYW1lKiBtYWluRnJhbWU7Cit9IFdlYkRhdGFTb3VyY2VGaXh0dXJlOwor
CitzdGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2luaXRpYWxfcmVx
dWVzdCgpCit7CisgICAgV2ViS2l0V2ViVmlldyogdmlldzsKKyAgICBXZWJLaXRXZWJGcmFtZSog
ZnJhbWU7CisgICAgV2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YVNvdXJjZTsKKyAgICBXZWJLaXRO
ZXR3b3JrUmVxdWVzdCogaW5pdGlhbFJlcXVlc3Q7CisKKyAgICB2aWV3ID0gV0VCS0lUX1dFQl9W
SUVXKHdlYmtpdF93ZWJfdmlld19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3Npbmsodmlldyk7
CisgICAgZnJhbWUgPSB3ZWJraXRfd2ViX3ZpZXdfZ2V0X21haW5fZnJhbWUodmlldyk7CisKKyAg
ICBXZWJLaXROZXR3b3JrUmVxdWVzdCogcmVxdWVzdCA9IHdlYmtpdF9uZXR3b3JrX3JlcXVlc3Rf
bmV3KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKKyAgICB3ZWJraXRfd2ViX2ZyYW1lX2xvYWRf
cmVxdWVzdChmcmFtZSwgcmVxdWVzdCk7CisgICAgZ19vYmplY3RfdW5yZWYocmVxdWVzdCk7CisK
KyAgICBkYXRhU291cmNlID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfcHJvdmlzaW9uYWxfZGF0YV9z
b3VyY2UoZnJhbWUpOworICAgIGdfYXNzZXJ0KGRhdGFTb3VyY2UpOworICAgIGluaXRpYWxSZXF1
ZXN0ID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfaW5pdGlhbF9yZXF1ZXN0KGRhdGFTb3Vy
Y2UpOworICAgIGdfYXNzZXJ0X2NtcHN0cih3ZWJraXRfbmV0d29ya19yZXF1ZXN0X2dldF91cmko
aW5pdGlhbFJlcXVlc3QpLCA9PSwgImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iKTsKKworICAgIGdf
b2JqZWN0X3VucmVmKHZpZXcpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2ZpbmlzaGVkX3VucmVh
Y2hhYmxlX2NiKFdlYktpdFdlYlZpZXcqIHZpZXcsIFdlYktpdFdlYkZyYW1lKiBmcmFtZSwgR01h
aW5Mb29wKiBsb29wKQoreworICAgIGlmICh3YWl0VGltZXIpIHsKKyAgICAgICAgZ19zb3VyY2Vf
cmVtb3ZlKHdhaXRUaW1lcik7CisgICAgICAgIHdhaXRUaW1lciA9IDA7CisgICAgfQorCisgICAg
V2ViS2l0V2ViRGF0YVNvdXJjZSogZGF0YXNvdXJjZTsKKyAgICBmcmFtZSA9IHdlYmtpdF93ZWJf
dmlld19nZXRfbWFpbl9mcmFtZSh2aWV3KTsKKyAgICBkYXRhc291cmNlID0gd2Via2l0X3dlYl9m
cmFtZV9nZXRfZGF0YV9zb3VyY2UoZnJhbWUpOworCisgICAgZ19hc3NlcnRfY21wc3RyKCJodHRw
Oi8vbG9jYWxob3N0L2RvaXJlYWxseWV4aXN0Lmh0bWwiLCA9PSwKKyAgICAgICAgICAgICAgICAg
ICAgd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9nZXRfdW5yZWFjaGFibGVfdXJpKGRhdGFzb3VyY2Up
KTsKKworICAgIGlmIChnX21haW5fbG9vcF9pc19ydW5uaW5nKGxvb3ApKQorICAgICAgICBnX21h
aW5fbG9vcF9xdWl0KGxvb3ApOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2ZpbmlzaGVkX2NiKFdl
YktpdFdlYlZpZXcqIHZpZXcsIFdlYktpdFdlYkZyYW1lKiBmcmFtZSwgR01haW5Mb29wKiBsb29w
KQoreworICAgIGlmICh3YWl0VGltZXIpIHsKKyAgICAgICAgZ19zb3VyY2VfcmVtb3ZlKHdhaXRU
aW1lcik7CisgICAgICAgIHdhaXRUaW1lciA9IDA7CisgICAgfQorCisgICAgV2ViS2l0V2ViRGF0
YVNvdXJjZSogZGF0YVNvdXJjZTsKKyAgICBmcmFtZSA9IHdlYmtpdF93ZWJfdmlld19nZXRfbWFp
bl9mcmFtZSh2aWV3KTsKKyAgICBkYXRhU291cmNlID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0
YV9zb3VyY2UoZnJhbWUpOworCisgICAgLyogVGVzdCBnZXRfcmVxdWVzdCAqLworICAgIGdfdGVz
dF9tZXNzYWdlKCJUZXN0aW5nIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3JlcXVlc3QiKTsK
KyAgICBXZWJLaXROZXR3b3JrUmVxdWVzdCogcmVxdWVzdCA9IHdlYmtpdF93ZWJfZGF0YV9zb3Vy
Y2VfZ2V0X3JlcXVlc3QoZGF0YVNvdXJjZSk7CisgICAgZ19hc3NlcnRfY21wc3RyKHdlYmtpdF9u
ZXR3b3JrX3JlcXVlc3RfZ2V0X3VyaShyZXF1ZXN0KSwgPT0sICJodHRwOi8vd2Via2l0Lm9yZy8i
KTsKKworICAgIC8qIFRlc3QgZ2V0X21haW5fcmVzb3VyY2UgKi8KKyAgICBnX3Rlc3RfbWVzc2Fn
ZSgiVGVzdGluZyB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9tYWluX3Jlc291cmNlIik7Cisg
ICAgV2ViS2l0V2ViUmVzb3VyY2UqIHJlc291cmNlID0gd2Via2l0X3dlYl9kYXRhX3NvdXJjZV9n
ZXRfbWFpbl9yZXNvdXJjZShkYXRhU291cmNlKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoInRleHQv
aHRtbCIsID09LCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGUocmVzb3VyY2UpKTsK
KyAgICBnX2Fzc2VydF9jbXBzdHIoImh0dHA6Ly93ZWJraXQub3JnLyIsID09LCB3ZWJraXRfd2Vi
X3Jlc291cmNlX2dldF91cmkocmVzb3VyY2UpKTsKKworICAgIC8qIFRlc3QgZ2V0X2RhdGEuIFdl
IGp1c3QgdGVzdCBpZiBkYXRhIGhhcyBjZXJ0YWluIHNpemUgZm9yIHRoZSBtZWFuIHRpbWUgKi8K
KyAgICBnX3Rlc3RfbWVzc2FnZSgiVGVzdGluZyB3ZWJraXRfd2ViX2RhdGFfc291cmNlX2dldF9k
YXRhIGhhcyBjZXJ0YWluIHNpemUiKTsKKyAgICBHU3RyaW5nKiBkYXRhID0gd2Via2l0X3dlYl9k
YXRhX3NvdXJjZV9nZXRfZGF0YShkYXRhU291cmNlKTsKKyAgICBnX2Fzc2VydChkYXRhLT5sZW4g
PiAxMDApOworCisgICAgLyogVGVzdCBnZXRfc3VicmVzb3VyY2VfZm9yX3VyaSAqLworICAgIGdf
dGVzdF9tZXNzYWdlKCJUZXN0aW5nIHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291
cmNlX3VyaSIpOworICAgIFdlYktpdFdlYlJlc291cmNlKiBzdWJyZXNvdXJjZSA9IHdlYmtpdF93
ZWJfZGF0YV9zb3VyY2VfZ2V0X3N1YnJlc291cmNlX2Zvcl91cmkoZGF0YVNvdXJjZSwgImh0dHA6
Ly93ZWJraXQub3JnL2ltYWdlcy9kb3dubG9hZC5wbmciKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIo
ImltYWdlL3BuZyIsID09LCB3ZWJraXRfd2ViX3Jlc291cmNlX2dldF9taW1lX3R5cGUoc3VicmVz
b3VyY2UpKTsKKyAgICBHU3RyaW5nKiBzdWJyZXNvdXJjZURhdGEgPSB3ZWJraXRfd2ViX3Jlc291
cmNlX2dldF9kYXRhKHN1YnJlc291cmNlKTsKKyAgICBnX2Fzc2VydChzdWJyZXNvdXJjZURhdGEt
PmxlbiA+IDEwMCk7CisKKyAgICAvKiBGSVhNRTogQWRkIHRlc3QgZm9yIGdldF9lbmNvZGluZyAq
LworCisgICAgaWYgKGdfbWFpbl9sb29wX2lzX3J1bm5pbmcobG9vcCkpCisgICAgICAgIGdfbWFp
bl9sb29wX3F1aXQobG9vcCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfY29tbWl0dGVkX2NiKFdl
YktpdFdlYlZpZXcqIHZpZXcsIFdlYktpdFdlYkZyYW1lKiBmcmFtZSkKK3sKKyAgICBXZWJLaXRX
ZWJEYXRhU291cmNlKiBkYXRhU291cmNlID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfZGF0YV9zb3Vy
Y2UoZnJhbWUpOworICAgIGdfYXNzZXJ0KHdlYmtpdF93ZWJfZGF0YV9zb3VyY2VfaXNfbG9hZGlu
ZyhkYXRhU291cmNlKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiB3YWl0X3RpbWVyX2ZpcmVkKEdN
YWluTG9vcCogbG9vcCkKK3sKKyAgICB3YWl0VGltZXIgPSAwOworICAgIGlmIChnX21haW5fbG9v
cF9pc19ydW5uaW5nKGxvb3ApKQorICAgICAgICBnX21haW5fbG9vcF9xdWl0KGxvb3ApOworCisg
ICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9z
b3VyY2UoKQoreworICAgIFdlYktpdFdlYlZpZXcqIHZpZXc7CisgICAgR01haW5Mb29wKiBsb29w
OworCisgICAgdmlldyA9IFdFQktJVF9XRUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOwor
ICAgIGdfb2JqZWN0X3JlZl9zaW5rKHZpZXcpOworICAgIGxvb3AgPSBnX21haW5fbG9vcF9uZXco
TlVMTCwgVFJVRSk7CisgICAgZ19zaWduYWxfY29ubmVjdCh2aWV3LCAibG9hZC1jb21taXR0ZWQi
LCBHX0NBTExCQUNLKGxvYWRfY29tbWl0dGVkX2NiKSwgbG9vcCk7CisgICAgZ19zaWduYWxfY29u
bmVjdCh2aWV3LCAibG9hZC1maW5pc2hlZCIsIEdfQ0FMTEJBQ0sobG9hZF9maW5pc2hlZF9jYiks
IGxvb3ApOworICAgIHdlYmtpdF93ZWJfdmlld19sb2FkX3VyaSh2aWV3LCAiaHR0cDovL3dlYmtp
dC5vcmciKTsKKworICAgIGlmICghd2FpdFRpbWVyKQorICAgICAgICB3YWl0VGltZXIgPSBnX3Rp
bWVvdXRfYWRkX3NlY29uZHMoZGVmYXVsdFRpbWVvdXQsIChHU291cmNlRnVuYyl3YWl0X3RpbWVy
X2ZpcmVkLCBsb29wKTsKKworICAgIGdfbWFpbl9sb29wX3J1bihsb29wKTsKKyAgICBnX29iamVj
dF91bnJlZih2aWV3KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF93ZWJraXRfd2ViX2RhdGFfc291
cmNlX3VucmVhY2hhYmxlX3VyaSgpCit7CisgICAgV2ViS2l0V2ViVmlldyogdmlldzsKKyAgICBH
TWFpbkxvb3AqIGxvb3A7CisKKyAgICB2aWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJf
dmlld19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3Npbmsodmlldyk7CisgICAgbG9vcCA9IGdf
bWFpbl9sb29wX25ldyhOVUxMLCBUUlVFKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHZpZXcsICJs
b2FkLWZpbmlzaGVkIiwgR19DQUxMQkFDSyhsb2FkX2ZpbmlzaGVkX3VucmVhY2hhYmxlX2NiKSwg
bG9vcCk7CisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRfdXJpKHZpZXcsICJodHRwOi8vbG9jYWxo
b3N0L2RvaXJlYWxseWV4aXN0Lmh0bWwiKTsKKworICAgIGlmICghd2FpdFRpbWVyKQorICAgICAg
ICB3YWl0VGltZXIgPSBnX3RpbWVvdXRfYWRkX3NlY29uZHMoZGVmYXVsdFRpbWVvdXQsIChHU291
cmNlRnVuYyl3YWl0X3RpbWVyX2ZpcmVkLCBsb29wKTsKKworICAgIGdfbWFpbl9sb29wX3J1bihs
b29wKTsKKyAgICBnX29iamVjdF91bnJlZih2aWV3KTsKK30KKworaW50IG1haW4oaW50IGFyZ2Ms
IGNoYXIqKiBhcmd2KQoreworICAgIGdfdGhyZWFkX2luaXQoTlVMTCk7CisgICAgZ3RrX3Rlc3Rf
aW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgICAgZ190ZXN0X2J1Z19iYXNlKCJodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy8iKTsKKyAgICBnX3Rlc3RfYnVnKCIyNDc1OCIpOworICAgIGdfdGVz
dF9hZGRfZnVuYygiL3dlYmtpdC93ZWJkYXRhc291cmNlL2dldF9pbml0aWFsX3JlcXVlc3QiLAor
ICAgICAgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfZ2V0X2luaXRp
YWxfcmVxdWVzdCk7CisgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Via2l0L3dlYmRhdGFzb3VyY2Uv
YXBpIiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF93ZWJraXRfd2ViX2RhdGFfc291cmNlKTsK
KyAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvd2ViZGF0YXNvdXJjZS91bnJlYWNoYWJsZV91
cmkiLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3dlYmtpdF93ZWJfZGF0YV9zb3VyY2VfdW5y
ZWFjaGFibGVfdXJpKTsKKyAgICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KKworI2Vsc2UKK2lu
dCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBnX2NyaXRpY2FsKCJZb3Ugd2ls
bCBuZWVkIGF0IGxlYXN0IGdsaWItMi4xNi4wIGFuZCBndGstMi4xNC4wIHRvIHJ1biB0aGUgdW5p
dCB0ZXN0cy4gRG9pbmcgbm90aGluZyBub3cuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRp
ZgpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQub3JpZy9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5j
cHAJMjAwOS0wOC0yOCAxNzoyMjozNi4xMDcyMzQwMTEgKzEwMDAKKysrIFdlYktpdC9XZWJLaXQv
Z3RrL3dlYmtpdC93ZWJraXR3ZWJmcmFtZS5jcHAJMjAwOS0wOC0yOCAxNzoyNjozMy44OTQxODgy
NzcgKzEwMDAKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAj
aW5jbHVkZSAiQ1N0cmluZy5oIgogI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRMb2FkZXJHdGsuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgogI2luY2x1
ZGUgIkZyYW1lTG9hZGVyQ2xpZW50R3RrLmgiCiAjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCkBAIC0x
MzMsNiArMTM0LDExIEBAIHZvaWQgd2Via2l0X3dlYl9mcmFtZV9jb3JlX2ZyYW1lX2dvbmUoV2UK
ICAgICBmcmFtZS0+cHJpdi0+Y29yZUZyYW1lID0gMDsKIH0KIAorc3RhdGljIFdlYktpdFdlYkRh
dGFTb3VyY2UqIHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2RhdGFfc291cmNlX2Zyb21fY29yZV9sb2Fk
ZXIoV2ViQ29yZTo6RG9jdW1lbnRMb2FkZXIqIGxvYWRlcikKK3sKKyAgICByZXR1cm4gbG9hZGVy
ID8gc3RhdGljX2Nhc3Q8V2ViS2l0OjpEb2N1bWVudExvYWRlcio+KGxvYWRlciktPmRhdGFTb3Vy
Y2UoKSA6IE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIHdlYmtpdF93ZWJfZnJhbWVfZmluYWxpemUo
R09iamVjdCogb2JqZWN0KQogewogICAgIFdlYktpdFdlYkZyYW1lKiBmcmFtZSA9IFdFQktJVF9X
RUJfRlJBTUUob2JqZWN0KTsKQEAgLTYwMyw2ICs2MDksNDYgQEAgSlNHbG9iYWxDb250ZXh0UmVm
IHdlYmtpdF93ZWJfZnJhbWVfZ2V0XwogfQogCiAvKioKKyAqIHdlYmtpdF93ZWJfZnJhbWVfZ2V0
X2RhdGFfc291cmNlOgorICogQGZyYW1lOiBhICNXZWJLaXRXZWJGcmFtZQorICoKKyAqIFJldHVy
bnMgdGhlIGNvbW1pdHRlZCBkYXRhIHNvdXJjZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IHRoZSBj
b21taXR0ZWQgI1dlYktpdFdlYkRhdGFTb3VyY2UuCisgKgorICogU2luY2U6IDEuMS4xNAorICov
CitXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZShX
ZWJLaXRXZWJGcmFtZSogZnJhbWUpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lU
X0lTX1dFQl9GUkFNRShmcmFtZSksIE5VTEwpOworCisgICAgRnJhbWUqIGNvcmVGcmFtZSA9IGNv
cmUoZnJhbWUpOworICAgIHJldHVybiB3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZV9m
cm9tX2NvcmVfbG9hZGVyKGNvcmVGcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCkpOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3Byb3Zpc2lvbmFsX2RhdGFfc291cmNl
OgorICogQGZyYW1lOiBhICNXZWJLaXRXZWJGcmFtZQorICoKKyAqIFlvdSB1c2UgdGhlIHdlYmtp
dF93ZWJfZnJhbWVfbG9hZF9yZXF1ZXN0IG1ldGhvZCB0byBpbml0aWF0ZSBhIHJlcXVlc3QgdGhh
dAorICogY3JlYXRlcyBhIHByb3Zpc2lvbmFsIGRhdGEgc291cmNlLiBUaGUgcHJvdmlzaW9uYWwg
ZGF0YSBzb3VyY2Ugd2lsbAorICogdHJhbnNpdGlvbiB0byBhIGNvbW1pdHRlZCBkYXRhIHNvdXJj
ZSBvbmNlIGFueSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLiBVc2UKKyAqIHdlYmtpdF93ZWJfZnJh
bWVfZ2V0X2RhdGFfc291cmNlIHRvIGdldCB0aGUgY29tbWl0dGVkIGRhdGEgc291cmNlLgorICoK
KyAqIFJldHVybiB2YWx1ZTogdGhlIHByb3Zpc2lvbmFsICNXZWJLaXRXZWJEYXRhU291cmNlIG9y
ICVOVUxMIGlmIGEgbG9hZAorICogcmVxdWVzdCBpcyBub3QgaW4gcHJvZ3Jlc3MuCisgKgorICog
U2luY2U6IDEuMS4xNAorICovCitXZWJLaXRXZWJEYXRhU291cmNlKiB3ZWJraXRfd2ViX2ZyYW1l
X2dldF9wcm92aXNpb25hbF9kYXRhX3NvdXJjZShXZWJLaXRXZWJGcmFtZSogZnJhbWUpCit7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9GUkFNRShmcmFtZSksIE5VTEwp
OworCisgICAgRnJhbWUqIGNvcmVGcmFtZSA9IGNvcmUoZnJhbWUpOworICAgIHJldHVybiB3ZWJr
aXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZV9mcm9tX2NvcmVfbG9hZGVyKGNvcmVGcmFtZS0+
bG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKSk7Cit9CisKKy8qKgogICogd2Vi
a2l0X3dlYl9mcmFtZV9nZXRfY2hpbGRyZW46CiAgKiBAZnJhbWU6IGEgI1dlYktpdFdlYkZyYW1l
CiAgKgpJbmRleDogV2ViS2l0L1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0d2ViZnJhbWUu
aAkyMDA5LTA4LTI4IDE3OjE3OjUxLjk0NzI0MjA5NyArMTAwMAorKysgV2ViS2l0L1dlYktpdC9n
dGsvd2Via2l0L3dlYmtpdHdlYmZyYW1lLmgJMjAwOS0wOC0yOCAxNzoyNjozMy44OTQxODgyNzcg
KzEwMDAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPHdlYmtpdC93ZWJraXRkZWZpbmVz
Lmg+CiAjaW5jbHVkZSA8d2Via2l0L3dlYmtpdG5ldHdvcmtyZXF1ZXN0Lmg+CisjaW5jbHVkZSA8
d2Via2l0L3dlYmtpdHdlYmRhdGFzb3VyY2UuaD4KIAogR19CRUdJTl9ERUNMUwogCkBAIC0xNTIs
NiArMTUzLDEyIEBAIHdlYmtpdF93ZWJfZnJhbWVfcHJpbnQgICAgICAgICAgICAgIChXZWIKIFdF
QktJVF9BUEkgV2ViS2l0TG9hZFN0YXR1cwogd2Via2l0X3dlYl9mcmFtZV9nZXRfbG9hZF9zdGF0
dXMgICAgKFdlYktpdFdlYkZyYW1lICAgICAgICpmcmFtZSk7CiAKK1dFQktJVF9BUEkgV2ViS2l0
V2ViRGF0YVNvdXJjZSAqCit3ZWJraXRfd2ViX2ZyYW1lX2dldF9kYXRhX3NvdXJjZSAgICAoV2Vi
S2l0V2ViRnJhbWUgICAgICAgKmZyYW1lKTsKKworV0VCS0lUX0FQSSBXZWJLaXRXZWJEYXRhU291
cmNlICoKK3dlYmtpdF93ZWJfZnJhbWVfZ2V0X3Byb3Zpc2lvbmFsX2RhdGFfc291cmNlIChXZWJL
aXRXZWJGcmFtZSAqZnJhbWUpOworCiBHX0VORF9ERUNMUwogCiAjZW5kaWYKSW5kZXg6IFdlYktp
dC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lm9yaWcvQ2hhbmdlTG9nCTIwMDktMDgt
MjggMTc6MjY6NDUuMTE5MjI0Nzc1ICsxMDAwCisrKyBXZWJLaXQvQ2hhbmdlTG9nCTIwMDktMDgt
MjggMTc6Mjg6MTkuOTU0MjMxMDMwICsxMDAwCkBAIC01LDYgKzUsMTcgQEAKICAgICAgICAgW0d0
a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJjZSBmb3IgdGhlIGd0ayBwb3J0CiAgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDc1OAogCisgICAgICAgIEFk
ZCBXZWJLaXRXZWJEYXRhU291cmNlIHVuaXQgdGVzdCB0byB0aGUgYnVpbGQgc2NyaXB0CisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKworMjAwOS0wOC0yOCAgSmFuIE1pY2hhZWwgQWxvbnpv
ICA8am1hbG9uem9Ad2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUg
Z3RrIHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI0NzU4CisKICAgICAgICAgQWRkIFdlYktpdFdlYkRhdGFTb3VyY2UgYW5kIERvY3VtZW50TG9h
ZGVyR3RrIHRvIHRoZSBidWlsZCBzY3JpcHQuCiAKICAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToK
SW5kZXg6IFdlYktpdC9XZWJLaXQvZ3RrL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQu
b3JpZy9XZWJLaXQvZ3RrL0NoYW5nZUxvZwkyMDA5LTA4LTI4IDE3OjI2OjQ1LjE2NzIyMTAyOSAr
MTAwMAorKysgV2ViS2l0L1dlYktpdC9ndGsvQ2hhbmdlTG9nCTIwMDktMDgtMjggMTc6Mjg6MDMu
NTU1MTg2ODE0ICsxMDAwCkBAIC0yLDYgKzIsMjAgQEAKIAogICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KIAorICAgICAgICAgW0d0a10gSW1wbGVtZW50IGEgV2ViRGF0YVNvdXJj
ZSBmb3IgdGhlIGd0ayBwb3J0CisgICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjQ3NTgKKworICAgICAgICBBZGQgZGF0YSBzb3VyY2UgQVBJIGdldHRlcnMg
dG8gV2ViS2l0V2ViRnJhbWUuCisgICAgICAgIEFsc28gYWRkIFdlYktpdFdlYkRhdGFTb3VyY2Ug
dW5pdCB0ZXN0LgorCisgICAgICAgICogdGVzdHMvdGVzdHdlYmRhdGFzb3VyY2UuYzogQWRkZWQu
CisgICAgICAgICogd2Via2l0L3dlYmtpdHdlYmZyYW1lLmNwcDoKKyAgICAgICAgKiB3ZWJraXQv
d2Via2l0d2ViZnJhbWUuaDoKKworMjAwOS0wOC0yOCAgSmFuIE1pY2hhZWwgQWxvbnpvICA8am1h
bG9uem9Ad2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KwogICAgICAgICBbR3RrXSBJbXBsZW1lbnQgYSBXZWJEYXRhU291cmNlIGZvciB0aGUgZ3RrIHBv
cnQKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NzU4
CiAK
</data>
<flag name="review"
          id="19719"
          type_id="1"
          status="+"
          setter="xan.lopez"
    />
    <flag name="commit-queue"
          id="19805"
          type_id="3"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
      

    </bug>

</bugzilla>