<?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>89873</bug_id>
          
          <creation_ts>2012-06-25 06:05:01 -0700</creation_ts>
          <short_desc>[WK2][GTK] Implement new API to save a web page using MHTML</short_desc>
          <delta_ts>2012-08-10 02:51:54 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>89872</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mario Sanchez Prada">mario</reporter>
          <assigned_to name="Mario Sanchez Prada">mario</assigned_to>
          <cc>andersca</cc>
    
    <cc>cgarcia</cc>
    
    <cc>gustavo</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>mrobinson</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>656512</commentid>
    <comment_count>0</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-25 06:05:01 -0700</bug_when>
    <thetext>It would be great if we could ask a WebKitWebView to save the current web page, and its associated external resources, into a self-contained file we browse later (maybe offline) or send to someone else, for instance.

In this regard, we could initially use the MHTML format[1] (already supported  in WebKit since some time ago [2][3]), but it could probably be good if we did not tied ourselves up into it and left the door open to some other possibilities that might be interesting as well (e.g. embedding external resources as &apos;data URIs&apos;[4]).

Last, it would be interesting both to have a way to easily save the page into disk (a save_to_file() function) but also a way to receive the serialized page in some other way, so the end application can decide what to do with it.

After talking to Carlos, we think a proposal like this one could make sense:

    typedef enum {
        WEBKIT_SAVE_MODE_MHTML // The only supported &apos;Save Mode&apos; at the moment
    } WebKitWebViewSaveMode;


    WEBKIT_API void
    webkit_web_view_save                               (WebKitWebView             *web_view,
                                                        WebKitWebViewSaveMode      save_mode,
                                                        GCancellable              *cancellable,
                                                        GAsyncReadyCallback        callback,
                                                        gpointer                   user_data);

    WEBKIT_API GInputStream*
    webkit_web_view_save_finish                        (WebKitWebView             *web_view,
                                                        GAsyncResult              *result,
                                                        GError                   **error);

    WEBKIT_API void
    webkit_web_view_save_to_file                       (WebKitWebView             *web_view,
                                                        const gchar               *filepath,
                                                        WebKitWebViewSaveMode      save_mode,
                                                        GCancellable              *cancellable,
                                                        GAsyncReadyCallback        callback,
                                                        gpointer                   user_data);

    WEBKIT_API gboolean
    webkit_web_view_save_to_file_finish                (WebKitWebView             *web_view,
                                                        GAsyncResult              *result,
                                                        GError                   **error)


I will send a mail to webkit-gtk ML and will start attaching patches soon.

[1] http://en.wikipedia.org/wiki/MHTML
[2] https://bugs.webkit.org/show_bug.cgi?id=7168
[3] https://bugs.webkit.org/show_bug.cgi?id=7169
[4] http://en.wikipedia.org/wiki/Data_URI_scheme</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>656527</commentid>
    <comment_count>1</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-25 06:56:51 -0700</bug_when>
    <thetext>Depending on bug 89872, since we need a (currently missing) C API to implement this feature</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>656531</commentid>
    <comment_count>2</comment_count>
      <attachid>149284</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-25 07:01:40 -0700</bug_when>
    <thetext>Created attachment 149284
Patch proposal + Unit test + Documentation

Here comes the (first) patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>656532</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-06-25 07:04:05 -0700</bug_when>
    <thetext>Thanks for the patch. If this patch contains new public API please make sure it follows the guidelines for new WebKit2 GTK+ API. See http://trac.webkit.org/wiki/WebKitGTK/AddingNewWebKit2API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>656538</commentid>
    <comment_count>4</comment_count>
      <attachid>149284</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-06-25 07:09:26 -0700</bug_when>
    <thetext>Comment on attachment 149284
Patch proposal + Unit test + Documentation

Attachment 149284 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/13098099</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>657355</commentid>
    <comment_count>5</comment_count>
      <attachid>149284</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-06-26 00:41:07 -0700</bug_when>
    <thetext>Comment on attachment 149284
Patch proposal + Unit test + Documentation

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

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2184
&gt; +static void webViewFileSavedCallback(GObject *object, GAsyncResult *result, gpointer data)

The * are placed wrongly here. Also, I would call this something like replaceContentsCallback to make it clear this is the callback of g_file_replace_contents_async()

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2190
&gt; +    if (!g_file_replace_contents_finish(file, result, NULL, &amp;error)) {

Use 0 instead of NULL

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2192
&gt; +        return;

Don&apos;t return here, or the operation will never complete.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2198
&gt; +static void webViewMHTMLDataGotCallback(WKDataRef wkData, WKErrorRef, void* context)

getContentsAsMHTMLDataCallback?

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2208
&gt; +        /* We need to retain the data until the asyncronous process
&gt; +           initiated by the user has finished completely. */

Use C++ style comments

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2211
&gt; +        /* If we are saving to a file we need to write the data on disk before finishing. */

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2215
&gt; +            GFile* file = g_file_new_for_path(data-&gt;filePath.get());

Use GRefPtr for the file, since you are leaking it. g_file_replace_contents_async() will take a reference of the file, so you can just adopt the ref here.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2217
&gt; +            g_file_replace_contents_async(file, reinterpret_cast&lt;const gchar*&gt;(WKDataGetBytes(data-&gt;wkData.get())), WKDataGetSize(data-&gt;wkData.get()), NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION,
&gt; +                                          data-&gt;cancellable.get(), webViewFileSavedCallback, g_object_ref(result.get()));

Use 0 instead of NULL.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2241
&gt; +void webkit_web_view_save(WebKitWebView *webView, WebKitWebViewSaveMode saveMode, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)

WebKitWebView *webView -&gt; WebKitWebView* webView

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2247
&gt; +    /* We only support MHTML at the moment */
&gt; +    if (saveMode != WEBKIT_SAVE_MODE_MHTML)
&gt; +        return;

Use g_return_if_fail for this check.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2256
&gt; +    WKPageGetContentsAsMHTMLData(wkPage, false, result, webViewMHTMLDataGotCallback);

Just curiosity, why not using binary mode?

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2288
&gt; +    GInputStream* dataStream = 0;
&gt; +    ViewSaveAsyncData* data = static_cast&lt;ViewSaveAsyncData*&gt;(g_simple_async_result_get_op_res_gpointer(simple));
&gt; +    if (data) {
&gt; +        gsize length = WKDataGetSize(data-&gt;wkData.get());
&gt; +        dataStream = g_memory_input_stream_new_from_data(g_memdup(WKDataGetBytes(data-&gt;wkData.get()), length), length, g_free);
&gt; +    }
&gt; +
&gt; +    return dataStream;

We are saying that the function returns NULL in case of error, but here it can return NULL for a valid empty page. If data is NULL, we could just return an empty memory stream

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2294
&gt; + * @path: a string containing a relative or absolute path for the file where the current web page should be saved to. The string must be encoded in the glib filename encoding.

I&apos;m wondering whether we should receive a GFile instead, and use it directly in g_file_replace_contents

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2316
&gt; +    /* We only support MHTML at the moment */
&gt; +    if (saveMode != WEBKIT_SAVE_MODE_MHTML)
&gt; +        return;

Use g_return_if_fail() for this check

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h:130
&gt; +typedef enum {
&gt; +    WEBKIT_SAVE_MODE_MHTML
&gt; +} WebKitWebViewSaveMode;

Maybe WebKitSaveMode? or WebKitWebSaveMode and WEBKIT_WEB_SAVE_MODE_MHTML?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:867
&gt; +static void webViewSavedToFileCallback(GObject *object, GAsyncResult *res, WebViewTest* test)

GObject *object -&gt; GObject* object
GAsyncResult *res -&gt; GAsyncResult* result

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:873
&gt; +    g_main_loop_quit(test-&gt;m_mainLoop);

We have test-&gt;quitMainLoop() now.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:879
&gt; +    GInputStream* inputStream = webkit_web_view_save_finish(test-&gt;m_webView, res, &amp;error);

Use GRefPtr and adopt the ref to not leak it.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:884
&gt; +    GFile* file = g_file_new_for_path(kSaveDestinationFilePath);

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:885
&gt; +    GInputStream* savedFileInputStream = G_INPUT_STREAM(g_file_read(file, NULL, &amp;error));

Ditto. And use 0 instead of NULL

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:894
&gt; +    GOwnPtr&lt;gchar&gt; buffer1(g_new0(gchar, 512));
&gt; +    GOwnPtr&lt;gchar&gt; buffer2(g_new0(gchar, 512));

Why not stack allocated buffers? 512 is small enough to use the stack, I&apos;d say.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:898
&gt; +    while (readBytes = g_input_stream_read(inputStream, buffer1.outPtr(), 512, NULL, &amp;error)) {

Use 0 instead of NULL

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:901
&gt; +        totalBytesFromFile += g_input_stream_read(savedFileInputStream, buffer2.outPtr(), 512, NULL, &amp;error);

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:913
&gt; +    // Check that the same minimum amount of bytes are received.
&gt; +    g_assert_cmpint(totalBytesFromStream, ==, totalBytesFromFile);
&gt; +    g_assert_cmpint(totalBytesFromStream, &gt;=, 2048);
&gt; +
&gt; +    g_input_stream_close(inputStream, NULL, NULL);
&gt; +    g_input_stream_close(savedFileInputStream, NULL, NULL);

Since you are not going to compare the contents, I think this could be a lot simpler if you just get the size of the file without reading it and only read from the input stream

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:937
&gt; +    test-&gt;waitUntilMainLoopFinishes();
&gt; +}

You should unlink and free the kSaveDestinationFilePath, or g_rmdir(kTempDirectory); will fail</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>657463</commentid>
    <comment_count>6</comment_count>
      <attachid>149501</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-26 03:09:41 -0700</bug_when>
    <thetext>Created attachment 149501
Patch Proposal + Unit Tests + Documentation

Attaching new patch addressing these issues. See comments below...

(In reply to comment #5)
&gt; (From update of attachment 149284 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=149284&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2184
&gt; &gt; +static void webViewFileSavedCallback(GObject *object, GAsyncResult *result, gpointer data)
&gt; 
&gt; The * are placed wrongly here. Also, I would call this something like replaceContentsCallback to make it clear this is the callback of g_file_replace_contents_async()

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2190
&gt; &gt; +    if (!g_file_replace_contents_finish(file, result, NULL, &amp;error)) {
&gt; 
&gt; Use 0 instead of NULL

Fixed.
 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2192
&gt; &gt; +        return;
&gt; 
&gt; Don&apos;t return here, or the operation will never complete.

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2198
&gt; &gt; +static void webViewMHTMLDataGotCallback(WKDataRef wkData, WKErrorRef, void* context)
&gt; 
&gt; getContentsAsMHTMLDataCallback?

Fixed.
 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2208
&gt; &gt; +        /* We need to retain the data until the asyncronous process
&gt; &gt; +           initiated by the user has finished completely. */
&gt; 
&gt; Use C++ style comments

Fixed.
 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2211
&gt; &gt; +        /* If we are saving to a file we need to write the data on disk before finishing. */
&gt; 
&gt; Ditto.

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2215
&gt; &gt; +            GFile* file = g_file_new_for_path(data-&gt;filePath.get());
&gt; 
&gt; Use GRefPtr for the file, since you are leaking it. g_file_replace_contents_async() will take a reference of the file, so you can just adopt the ref here.
&gt; 

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2217
&gt; &gt; +            g_file_replace_contents_async(file, reinterpret_cast&lt;const gchar*&gt;(WKDataGetBytes(data-&gt;wkData.get())), WKDataGetSize(data-&gt;wkData.get()), NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION,
&gt; &gt; +                                          data-&gt;cancellable.get(), webViewFileSavedCallback, g_object_ref(result.get()));
&gt; 
&gt; Use 0 instead of NULL.
&gt; 

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2241
&gt; &gt; +void webkit_web_view_save(WebKitWebView *webView, WebKitWebViewSaveMode saveMode, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
&gt; 
&gt; WebKitWebView *webView -&gt; WebKitWebView* webView
&gt; 

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2247
&gt; &gt; +    /* We only support MHTML at the moment */
&gt; &gt; +    if (saveMode != WEBKIT_SAVE_MODE_MHTML)
&gt; &gt; +        return;
&gt; 
&gt; Use g_return_if_fail for this check.
&gt; 

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2256
&gt; &gt; +    WKPageGetContentsAsMHTMLData(wkPage, false, result, webViewMHTMLDataGotCallback);
&gt; 
&gt; Just curiosity, why not using binary mode?
&gt; 

It will work either way in WebKit based browers, both for writing a valid .mht file and for being able to read it later on with a MHTML capable browser. However, considering the .mht is a file with content type text/html, I think it&apos;s better not to use binary encoding for the resources, so you can easily inspect it with a text editor (as the content type seems to suggest you should be able to do it).

Also, as per the following comment in Source/WebKit/public/WebPageSerializer.h, it seems binary encoding could be unsupported in some other browsers:

    [...]
    // Serializes the WebView contents to a MHTML representation.
    WEBKIT_EXPORT static WebCString serializeToMHTML(WebView*);

    // Similar to serializeToMHTML but uses binary encoding for the MHTML parts.
    // This results in a smaller MHTML file but it might not be supported by other browsers.
    WEBKIT_EXPORT static WebCString serializeToMHTMLUsingBinaryEncoding(WebView*);
    [...]

So, my vote goes for using printable characters for the .mht file.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2288
&gt; &gt; +    GInputStream* dataStream = 0;
&gt; &gt; +    ViewSaveAsyncData* data = static_cast&lt;ViewSaveAsyncData*&gt;(g_simple_async_result_get_op_res_gpointer(simple));
&gt; &gt; +    if (data) {
&gt; &gt; +        gsize length = WKDataGetSize(data-&gt;wkData.get());
&gt; &gt; +        dataStream = g_memory_input_stream_new_from_data(g_memdup(WKDataGetBytes(data-&gt;wkData.get()), length), length, g_free);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return dataStream;
&gt; 
&gt; We are saying that the function returns NULL in case of error, but here it can return NULL for a valid empty page. If data is NULL, we could just return an empty memory stream
&gt; 

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2294
&gt; &gt; + * @path: a string containing a relative or absolute path for the file where the current web page should be saved to. The string must be encoded in the glib filename encoding.
&gt; 
&gt; I&apos;m wondering whether we should receive a GFile instead, and use it directly in g_file_replace_contents
&gt;  

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2316
&gt; &gt; +    /* We only support MHTML at the moment */
&gt; &gt; +    if (saveMode != WEBKIT_SAVE_MODE_MHTML)
&gt; &gt; +        return;
&gt; 
&gt; Use g_return_if_fail() for this check
&gt;  

Fixed.
 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h:130
&gt; &gt; +typedef enum {
&gt; &gt; +    WEBKIT_SAVE_MODE_MHTML
&gt; &gt; +} WebKitWebViewSaveMode;
&gt; 
&gt; Maybe WebKitSaveMode? or WebKitWebSaveMode and WEBKIT_WEB_SAVE_MODE_MHTML?
&gt;   

Fixed. I used WebKitSaveMode.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:867
&gt; &gt; +static void webViewSavedToFileCallback(GObject *object, GAsyncResult *res, WebViewTest* test)
&gt; 
&gt; GObject *object -&gt; GObject* object
&gt; GAsyncResult *res -&gt; GAsyncResult* result
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:873
&gt; &gt; +    g_main_loop_quit(test-&gt;m_mainLoop);
&gt; 
&gt; We have test-&gt;quitMainLoop() now.
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:879
&gt; &gt; +    GInputStream* inputStream = webkit_web_view_save_finish(test-&gt;m_webView, res, &amp;error);
&gt; 
&gt; Use GRefPtr and adopt the ref to not leak it.
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:884
&gt; &gt; +    GFile* file = g_file_new_for_path(kSaveDestinationFilePath);
&gt; 
&gt; Ditto.
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:885
&gt; &gt; +    GInputStream* savedFileInputStream = G_INPUT_STREAM(g_file_read(file, NULL, &amp;error));
&gt; 
&gt; Ditto. And use 0 instead of NULL
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:894
&gt; &gt; +    GOwnPtr&lt;gchar&gt; buffer1(g_new0(gchar, 512));
&gt; &gt; +    GOwnPtr&lt;gchar&gt; buffer2(g_new0(gchar, 512));
&gt; 
&gt; Why not stack allocated buffers? 512 is small enough to use the stack, I&apos;d say.
&gt; 

When I first started writing this unit test I considered bigger sizes for that buffer and so that&apos;s why I ended up using the heap here. But I agree that 512 bytes is not that big, specially considering this is just an unit test, and code is simpler.  

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:898
&gt; &gt; +    while (readBytes = g_input_stream_read(inputStream, buffer1.outPtr(), 512, NULL, &amp;error)) {
&gt; 
&gt; Use 0 instead of NULL
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:901
&gt; &gt; +        totalBytesFromFile += g_input_stream_read(savedFileInputStream, buffer2.outPtr(), 512, NULL, &amp;error);
&gt; 
&gt; Ditto.
&gt;   

Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:913
&gt; &gt; +    // Check that the same minimum amount of bytes are received.
&gt; &gt; +    g_assert_cmpint(totalBytesFromStream, ==, totalBytesFromFile);
&gt; &gt; +    g_assert_cmpint(totalBytesFromStream, &gt;=, 2048);
&gt; &gt; +
&gt; &gt; +    g_input_stream_close(inputStream, NULL, NULL);
&gt; &gt; +    g_input_stream_close(savedFileInputStream, NULL, NULL);
&gt; 
&gt; Since you are not going to compare the contents, I think this could be a lot simpler if you just get the size of the file without reading it and only read from the input stream
&gt; 

Ok. I changed this test following your suggestions.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:937
&gt; &gt; +    test-&gt;waitUntilMainLoopFinishes();
&gt; &gt; +}
&gt; 
&gt; You should unlink and free the kSaveDestinationFilePath, or g_rmdir(kTempDirectory); will fail

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>657474</commentid>
    <comment_count>7</comment_count>
      <attachid>149501</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-06-26 03:17:43 -0700</bug_when>
    <thetext>Comment on attachment 149501
Patch Proposal + Unit Tests + Documentation

Attachment 149501 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/13094437</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>657689</commentid>
    <comment_count>8</comment_count>
      <attachid>149551</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-26 10:14:07 -0700</bug_when>
    <thetext>Created attachment 149551
Patch Proposal + Unit Tests + Documentation

There was a wrong line in the previous patch, so attaching a new patch with the following difference:

  -            ASSERT(G_IS_FILE(data-&gt;file));
  +            ASSERT(G_IS_FILE(data-&gt;file.get()));</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>657694</commentid>
    <comment_count>9</comment_count>
      <attachid>149551</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2012-06-26 10:20:03 -0700</bug_when>
    <thetext>Comment on attachment 149551
Patch Proposal + Unit Tests + Documentation

Attachment 149551 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/13098490</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>658513</commentid>
    <comment_count>10</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-27 03:39:44 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 149551 [details])
&gt; Attachment 149551 [details] did not pass gtk-ews (gtk):
&gt; Output: http://queues.webkit.org/results/13098490

This is normal: it depends on the patch for bug 89872 for those missing symbols to be found</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690013</commentid>
    <comment_count>11</comment_count>
      <attachid>157139</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-08-08 00:23:08 -0700</bug_when>
    <thetext>Created attachment 157139
Patch Proposal + Unit Tests + Documentation

Attaching a newly rebase version of this patch (so it passes in EWS) now that bug 89872 has been fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>690075</commentid>
    <comment_count>12</comment_count>
      <attachid>157139</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-08-08 02:18:02 -0700</bug_when>
    <thetext>Comment on attachment 157139
Patch Proposal + Unit Tests + Documentation

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

Patch looks good, r- only because of the unit tests

&gt; Source/WebKit2/ChangeLog:8
&gt; +        Implemented new asynchronous API in WebKitWebView.

This sounds too generic, please explain better what this patch is about.

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2458
&gt; + * specified in #WebKitSaveMode.

specified in @save_mode, no?

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2508
&gt; +    ViewSaveAsyncData* data = static_cast&lt;ViewSaveAsyncData*&gt;(g_simple_async_result_get_op_res_gpointer(simple));
&gt; +    if (data) {
&gt; +        gsize length = WKDataGetSize(data-&gt;wkData.get());
&gt; +        g_memory_input_stream_add_data(G_MEMORY_INPUT_STREAM(dataStream), g_memdup(WKDataGetBytes(data-&gt;wkData.get()), length), length, g_free);
&gt; +    }

data can&apos;t be null here, you should probably check that length is not 0 before adding data to the stream. 

ViewSaveAsyncData* data = static_cast&lt;ViewSaveAsyncData*&gt;(g_simple_async_result_get_op_res_gpointer(simple));
gsize length = WKDataGetSize(data-&gt;wkData.get());
if (length)
    g_memory_input_stream_add_data(G_MEMORY_INPUT_STREAM(dataStream), g_memdup(WKDataGetBytes(data-&gt;wkData.get()), length), length, g_free);

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2524
&gt; + * specified in #WebKitSaveMode and writing it to @file.

specified in @save_mode, no?

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2557
&gt; + * Returns: %TRUE if the web page was successfully saved on disk or %FALSE otherwise.

I would said save saved to file, and avoid the word &quot;disk&quot;

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h:124
&gt; + * @WEBKIT_SAVE_MODE_MHTML: Save the current page using the MHTML
&gt; + * format.

This could be a single line

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h:127
&gt; + * Enum values to specify the different ways in which a #WebKitWebView
&gt; + * will be saved the current web page into a self-contained file.

&quot;can save its current web page into a self-contained file&quot; maybe

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h:341
&gt; +WEBKIT_API GInputStream*

GInputStream* -&gt; GInputStream *

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:953
&gt; +static void webViewSavedToFileCallback(GObject *object, GAsyncResult *res, WebViewTest* test)

GObject *object -&gt; GObject* object
GAsyncResult *res -&gt; GAsyncResult *result

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:988
&gt; +    // Check that the a minimum amount of bytes are received in the stream.
&gt; +    g_assert_cmpint(totalBytesFromStream, &gt;=, 2048);

Why 2048?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:992
&gt; +    // Check that the file exists and that it contains at least the same amount of bytes.
&gt; +    GRefPtr&lt;GFileInfo&gt; fileInfo = adoptGRef(g_file_query_info(file.get(), G_FILE_ATTRIBUTE_STANDARD_SIZE, static_cast&lt;GFileQueryInfoFlags&gt;(0), 0, 0));
&gt; +    g_assert_cmpint(g_file_info_get_size(fileInfo.get()), &gt;=, 2048);

It&apos;s a bit weird that you are checking the file exists in the save callback instead of the save_to_file one.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:999
&gt; +static void testWebViewSave(UIClientTest* test, gconstpointer)

Why is this a UIClientTest?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:1018
&gt; +    kSaveDestinationFilePath = g_build_filename(kTempDirectory, &quot;testWebViewSaveResult.mht&quot;, NULL);
&gt; +    GRefPtr&lt;GFile&gt; file = adoptGRef(g_file_new_for_path(kSaveDestinationFilePath));
&gt; +    webkit_web_view_save_to_file(test-&gt;m_webView, file.get(), WEBKIT_SAVE_MODE_MHTML, 0, reinterpret_cast&lt;GAsyncReadyCallback&gt;(webViewSavedToFileCallback), test);
&gt; +    test-&gt;waitUntilMainLoopFinishes();
&gt; +
&gt; +    webkit_web_view_save(test-&gt;m_webView, WEBKIT_SAVE_MODE_MHTML, 0, reinterpret_cast&lt;GAsyncReadyCallback&gt;(webViewSavedCallback), test);
&gt; +    test-&gt;waitUntilMainLoopFinishes();

I would add a new class deriving from WebViewTest withj helper methods:

GInputStream* save();
GFile* saveToFile();

and here in the test function you can check the results, and compare them or whatever.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:1050
&gt; +    g_rmdir(kTempDirectory);

Here you should free kTempDirectory and kSaveDestinationFilePath I think</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>691385</commentid>
    <comment_count>13</comment_count>
      <attachid>157435</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-08-09 05:05:52 -0700</bug_when>
    <thetext>Created attachment 157435
Patch Proposal + Unit Tests + Documentation

Attaching new version of the patch addressing issues pointed out by Carlos.

Notice that, as per the creation of a new class SaveWebViewText : WebViewTest, the global variables for the name of the temporary file and directory are not needed anymore, since those now belong to that new class (and so will be created and freed in the normal lifecycle for that test).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>691415</commentid>
    <comment_count>14</comment_count>
      <attachid>157435</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2012-08-09 05:23:28 -0700</bug_when>
    <thetext>Comment on attachment 157435
Patch Proposal + Unit Tests + Documentation

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

&gt; Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp:2458
&gt; + * specified in #WebKitSaveMode.

specified in @save_mode, no?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:956
&gt; +    SaveWebViewTest()
&gt; +    {
&gt; +        m_tempDirectory.set(g_dir_make_tmp(&quot;WebKit2SaveViewTest-XXXXXX&quot;, 0));

C++ initializer syntax:

SaveWebViewTest()
    : m_tempDirectory(g_dir_make_tmp(&quot;WebKit2SaveViewTest-XXXXXX&quot;, 0))

or isn&apos;t that possible with GOwnPtr?

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:962
&gt; +        g_file_delete(m_file.get(), 0, 0);

Don&apos;t assume saveAndWaitForFile() has been called, even thought it&apos;s the case now, this class might be used in the future for other tests.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:964
&gt; +        g_input_stream_close(m_inputStream.get(), 0, 0);

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp:1037
&gt; +    // Check that the file exists and that it contains at least the same amount of bytes.

the same amount of bytes than the stream?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>692399</commentid>
    <comment_count>15</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-08-10 02:51:54 -0700</bug_when>
    <thetext>Committed r125267: &lt;http://trac.webkit.org/changeset/125267&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>149284</attachid>
            <date>2012-06-25 07:01:40 -0700</date>
            <delta_ts>2012-06-26 03:09:41 -0700</delta_ts>
            <desc>Patch proposal + Unit test + Documentation</desc>
            <filename>0002-2012-06-25-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>20067</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA2MTVkZDI2NWFmNTRjN2E2YzY2NmMyOGJmYmE5NTEyN2UxYWE3MmUxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDI1IEp1biAyMDEyIDE1OjA5OjExICswMjAwClN1YmplY3Q6IFtQQVRD
SCAyLzJdIDIwMTItMDYtMjUgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgoKICAgICAgICBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIg
cGFnZSB1c2luZyBNSFRNTAogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD04OTg3MwoKICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCiAgICAg
ICAgSW1wbGVtZW50ZWQgbmV3IGFzeW5jaHJvbm91cyBBUEkgaW4gV2ViS2l0V2ViVmlldy4KCiAg
ICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcDoKICAgICAgICAoVmll
d1NhdmVBc3luY0RhdGEpOgogICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgogICAg
ICAgICh3ZWJWaWV3TUhUTUxEYXRhR290Q2FsbGJhY2spOgogICAgICAgICh3ZWJraXRfd2ViX3Zp
ZXdfc2F2ZSk6CiAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CiAgICAgICAg
KHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpOgogICAgICAgICh3ZWJraXRfd2ViX3ZpZXdf
c2F2ZV90b19maWxlX2ZpbmlzaCk6CiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRX
ZWJWaWV3Lmg6CgogICAgICAgIEFkZGVkIG5ldyB1bml0IHRlc3QuCgogICAgICAgICogVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwOgogICAgICAgICh3ZWJWaWV3
U2F2ZWRUb0ZpbGVDYWxsYmFjayk6CiAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxiYWNrKToKICAg
ICAgICAodGVzdFdlYlZpZXdTYXZlKToKICAgICAgICAoYmVmb3JlQWxsKToKICAgICAgICAoYWZ0
ZXJBbGwpOgoKICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBuZXcgc3lt
Ym9scy4KCiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlv
bnMudHh0OgotLS0KIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAzMiArKysrCiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3LmNwcCB8ICAxNzYgKysrKysrKysrKysrKysrKysrKysKIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaCAgIHwgICAzNyArKysrCiAuLi4vVUlQ
cm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dCB8ICAgIDUgKwogLi4u
L1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcCAgfCAgIDgxICsr
KysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAzMzEgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwppbmRl
eCBjNDRiYjliLi5hZjU4NDBiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cK
KysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMzcgQEAKIDIwMTItMDYt
MjUgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgogCisgICAgICAg
IFtXSzJdW0dUS10gSW1wbGVtZW50IG5ldyBBUEkgdG8gc2F2ZSBhIHdlYiBwYWdlIHVzaW5nIE1I
VE1MCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04OTg3
MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxl
bWVudGVkIG5ldyBhc3luY2hyb25vdXMgQVBJIGluIFdlYktpdFdlYlZpZXcuCisKKyAgICAgICAg
KiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcDoKKyAgICAgICAgKFZpZXdTYXZl
QXN5bmNEYXRhKToKKyAgICAgICAgKHdlYlZpZXdGaWxlU2F2ZWRDYWxsYmFjayk6CisgICAgICAg
ICh3ZWJWaWV3TUhUTUxEYXRhR290Q2FsbGJhY2spOgorICAgICAgICAod2Via2l0X3dlYl92aWV3
X3NhdmUpOgorICAgICAgICAod2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoKToKKyAgICAgICAg
KHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpOgorICAgICAgICAod2Via2l0X3dlYl92aWV3
X3NhdmVfdG9fZmlsZV9maW5pc2gpOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL1dlYktp
dFdlYlZpZXcuaDoKKworICAgICAgICBBZGRlZCBuZXcgdW5pdCB0ZXN0LgorCisgICAgICAgICog
VUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwOgorICAgICAgICAo
d2ViVmlld1NhdmVkVG9GaWxlQ2FsbGJhY2spOgorICAgICAgICAod2ViVmlld1NhdmVkQ2FsbGJh
Y2spOgorICAgICAgICAodGVzdFdlYlZpZXdTYXZlKToKKyAgICAgICAgKGJlZm9yZUFsbCk6Cisg
ICAgICAgIChhZnRlckFsbCk6CisKKyAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz
IHdpdGggbmV3IHN5bWJvbHMuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dl
YmtpdDJndGstc2VjdGlvbnMudHh0OgorCisyMDEyLTA2LTI1ICBNYXJpbyBTYW5jaGV6IFByYWRh
ICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKwogICAgICAgICBbV0syXSBBZGQgbmV3IEMgQVBJIHRv
IGdlbmVyYXRlIE1IVE1MIGRhdGEgZnJvbSB0aGUgVUkgcHJvY2VzcwogICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODk4NzIKIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHAgYi9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcAppbmRleCAxYTVmYzAx
Li5hNjU4ZmExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9X
ZWJLaXRXZWJWaWV3LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9X
ZWJLaXRXZWJWaWV3LmNwcApAQCAtMjE3MywzICsyMTczLDE3OSBAQCBnYm9vbGVhbiB3ZWJraXRf
d2ViX3ZpZXdfY2FuX3Nob3dfbWltZV90eXBlKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0
IGNoYXIqCiAgICAgV2ViUGFnZVByb3h5KiBwYWdlID0gd2Via2l0V2ViVmlld0Jhc2VHZXRQYWdl
KFdFQktJVF9XRUJfVklFV19CQVNFKHdlYlZpZXcpKTsKICAgICByZXR1cm4gcGFnZS0+Y2FuU2hv
d01JTUVUeXBlKFN0cmluZzo6ZnJvbVVURjgobWltZVR5cGUpKTsKIH0KKworc3RydWN0IFZpZXdT
YXZlQXN5bmNEYXRhIHsKKyAgICBXS1JldGFpblB0cjxXS0RhdGFSZWY+IHdrRGF0YTsKKyAgICBH
T3duUHRyPGdjaGFyPiBmaWxlUGF0aDsKKyAgICBHUmVmUHRyPEdDYW5jZWxsYWJsZT4gY2FuY2Vs
bGFibGU7Cit9OworV0VCS0lUX0RFRklORV9BU1lOQ19EQVRBX1NUUlVDVChWaWV3U2F2ZUFzeW5j
RGF0YSkKKworc3RhdGljIHZvaWQgd2ViVmlld0ZpbGVTYXZlZENhbGxiYWNrKEdPYmplY3QgKm9i
amVjdCwgR0FzeW5jUmVzdWx0ICpyZXN1bHQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgR0ZpbGUq
IGZpbGUgPSBHX0ZJTEUob2JqZWN0KTsKKyAgICBHUmVmUHRyPEdTaW1wbGVBc3luY1Jlc3VsdD4g
c2F2ZWRUb0ZpbGVSZXN1bHQgPSBhZG9wdEdSZWYoR19TSU1QTEVfQVNZTkNfUkVTVUxUKGRhdGEp
KTsKKworICAgIEdFcnJvciogZXJyb3IgPSAwOworICAgIGlmICghZ19maWxlX3JlcGxhY2VfY29u
dGVudHNfZmluaXNoKGZpbGUsIHJlc3VsdCwgTlVMTCwgJmVycm9yKSkgeworICAgICAgICBnX3Np
bXBsZV9hc3luY19yZXN1bHRfdGFrZV9lcnJvcihzYXZlZFRvRmlsZVJlc3VsdC5nZXQoKSwgZXJy
b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0
X2NvbXBsZXRlKHNhdmVkVG9GaWxlUmVzdWx0LmdldCgpKTsKK30KKworc3RhdGljIHZvaWQgd2Vi
Vmlld01IVE1MRGF0YUdvdENhbGxiYWNrKFdLRGF0YVJlZiB3a0RhdGEsIFdLRXJyb3JSZWYsIHZv
aWQqIGNvbnRleHQpCit7CisgICAgR1JlZlB0cjxHU2ltcGxlQXN5bmNSZXN1bHQ+IHJlc3VsdCA9
IGFkb3B0R1JlZihHX1NJTVBMRV9BU1lOQ19SRVNVTFQoY29udGV4dCkpOworICAgIFZpZXdTYXZl
QXN5bmNEYXRhKiBkYXRhID0gc3RhdGljX2Nhc3Q8Vmlld1NhdmVBc3luY0RhdGEqPihnX3NpbXBs
ZV9hc3luY19yZXN1bHRfZ2V0X29wX3Jlc19ncG9pbnRlcihyZXN1bHQuZ2V0KCkpKTsKKyAgICBH
RXJyb3IqIGVycm9yID0gMDsKKworICAgIGlmIChnX2NhbmNlbGxhYmxlX3NldF9lcnJvcl9pZl9j
YW5jZWxsZWQoZGF0YS0+Y2FuY2VsbGFibGUuZ2V0KCksICZlcnJvcikpCisgICAgICAgIGdfc2lt
cGxlX2FzeW5jX3Jlc3VsdF90YWtlX2Vycm9yKHJlc3VsdC5nZXQoKSwgZXJyb3IpOworICAgIGVs
c2UgeworICAgICAgICAvKiBXZSBuZWVkIHRvIHJldGFpbiB0aGUgZGF0YSB1bnRpbCB0aGUgYXN5
bmNyb25vdXMgcHJvY2VzcworICAgICAgICAgICBpbml0aWF0ZWQgYnkgdGhlIHVzZXIgaGFzIGZp
bmlzaGVkIGNvbXBsZXRlbHkuICovCisgICAgICAgIGRhdGEtPndrRGF0YSA9IHdrRGF0YTsKKwor
ICAgICAgICAvKiBJZiB3ZSBhcmUgc2F2aW5nIHRvIGEgZmlsZSB3ZSBuZWVkIHRvIHdyaXRlIHRo
ZSBkYXRhIG9uIGRpc2sgYmVmb3JlIGZpbmlzaGluZy4gKi8KKyAgICAgICAgaWYgKGdfc2ltcGxl
X2FzeW5jX3Jlc3VsdF9nZXRfc291cmNlX3RhZyhyZXN1bHQuZ2V0KCkpID09IHdlYmtpdF93ZWJf
dmlld19zYXZlX3RvX2ZpbGUpIHsKKyAgICAgICAgICAgIEFTU0VSVChkYXRhLT5maWxlUGF0aCk7
CisKKyAgICAgICAgICAgIEdGaWxlKiBmaWxlID0gZ19maWxlX25ld19mb3JfcGF0aChkYXRhLT5m
aWxlUGF0aC5nZXQoKSk7CisgICAgICAgICAgICBnX2ZpbGVfcmVwbGFjZV9jb250ZW50c19hc3lu
YyhmaWxlLCByZWludGVycHJldF9jYXN0PGNvbnN0IGdjaGFyKj4oV0tEYXRhR2V0Qnl0ZXMoZGF0
YS0+d2tEYXRhLmdldCgpKSksIFdLRGF0YUdldFNpemUoZGF0YS0+d2tEYXRhLmdldCgpKSwgTlVM
TCwgRkFMU0UsIEdfRklMRV9DUkVBVEVfUkVQTEFDRV9ERVNUSU5BVElPTiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNhbmNlbGxhYmxlLmdldCgpLCB3
ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2ssIGdfb2JqZWN0X3JlZihyZXN1bHQuZ2V0KCkpKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdfc2ltcGxlX2FzeW5j
X3Jlc3VsdF9jb21wbGV0ZShyZXN1bHQuZ2V0KCkpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJf
dmlld19zYXZlOgorICogQHdlYl92aWV3OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAc2F2ZV9tb2Rl
OiB0aGUgI1dlYktpdFdlYlZpZXdTYXZlTW9kZSBzcGVjaWZ5aW5nIGhvdyB0aGUgd2ViIHBhZ2Ug
c2hvdWxkIGJlIHNhdmVkLgorICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IGEgI0dDYW5j
ZWxsYWJsZSBvciAlTlVMTCB0byBpZ25vcmUKKyAqIEBjYWxsYmFjazogKHNjb3BlIGFzeW5jKTog
YSAjR0FzeW5jUmVhZHlDYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgc2F0aXNm
aWVkCisgKiBAdXNlcl9kYXRhOiAoY2xvc3VyZSk6IHRoZSBkYXRhIHRvIHBhc3MgdG8gY2FsbGJh
Y2sgZnVuY3Rpb24KKyAqCisgKiBBc3luY2hyb25vdXNseSBzYXZlIHRoZSBjdXJyZW50IHdlYiBw
YWdlIGFzc29jaWF0ZWQgdG8gdGhlCisgKiAjV2ViS2l0V2ViVmlldyBpbnRvIGEgc2VsZi1jb250
YWluZWQgZm9ybWF0IHVzaW5nIHRoZSBtb2RlCisgKiBzcGVjaWZpZWQgaW4gI1dlYktpdFdlYlZp
ZXdTYXZlTW9kZS4KKyAqCisgKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxs
YmFjayB3aWxsIGJlIGNhbGxlZC4gWW91IGNhbgorICogdGhlbiBjYWxsIHdlYmtpdF93ZWJfdmll
d19zYXZlX2ZpbmlzaCgpIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZQorICogb3BlcmF0aW9uLgor
ICovCit2b2lkIHdlYmtpdF93ZWJfdmlld19zYXZlKFdlYktpdFdlYlZpZXcgKndlYlZpZXcsIFdl
YktpdFdlYlZpZXdTYXZlTW9kZSBzYXZlTW9kZSwgR0NhbmNlbGxhYmxlKiBjYW5jZWxsYWJsZSwg
R0FzeW5jUmVhZHlDYWxsYmFjayBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlckRhdGEpCit7CisgICAg
Z19yZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldykpOworCisgICAgLyog
V2Ugb25seSBzdXBwb3J0IE1IVE1MIGF0IHRoZSBtb21lbnQgKi8KKyAgICBpZiAoc2F2ZU1vZGUg
IT0gV0VCS0lUX1NBVkVfTU9ERV9NSFRNTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR1NpbXBs
ZUFzeW5jUmVzdWx0KiByZXN1bHQgPSBnX3NpbXBsZV9hc3luY19yZXN1bHRfbmV3KEdfT0JKRUNU
KHdlYlZpZXcpLCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3BvaW50
ZXI+KHdlYmtpdF93ZWJfdmlld19zYXZlKSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRhdGEg
PSBjcmVhdGVWaWV3U2F2ZUFzeW5jRGF0YSgpOworICAgIGRhdGEtPmNhbmNlbGxhYmxlID0gY2Fu
Y2VsbGFibGU7CisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3NldF9vcF9yZXNfZ3BvaW50ZXIo
cmVzdWx0LCBkYXRhLCByZWludGVycHJldF9jYXN0PEdEZXN0cm95Tm90aWZ5PihkZXN0cm95Vmll
d1NhdmVBc3luY0RhdGEpKTsKKworICAgIFdLUGFnZVJlZiB3a1BhZ2UgPSB0b0FQSSh3ZWJraXRX
ZWJWaWV3QmFzZUdldFBhZ2UoV0VCS0lUX1dFQl9WSUVXX0JBU0Uod2ViVmlldykpKTsKKyAgICBX
S1BhZ2VHZXRDb250ZW50c0FzTUhUTUxEYXRhKHdrUGFnZSwgZmFsc2UsIHJlc3VsdCwgd2ViVmll
d01IVE1MRGF0YUdvdENhbGxiYWNrKTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX3ZpZXdfc2F2
ZV9maW5pc2g6CisgKiBAd2ViX3ZpZXc6IGEgI1dlYktpdFdlYlZpZXcKKyAqIEByZXN1bHQ6IGEg
I0dBc3luY1Jlc3VsdAorICogQGVycm9yOiByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICVO
VUxMIHRvIGlnbm9yZQorICoKKyAqIEZpbmlzaCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHN0
YXJ0ZWQgd2l0aCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSgpLgorICoKKyAqIFJldHVybnM6ICh0cmFu
c2ZlciBmdWxsKTogYSAjR0lucHV0U3RyZWFtIHdpdGggdGhlIHJlc3VsdCBvZiBzYXZpbmcKKyAq
ICAgIHRoZSBjdXJyZW50IHdlYiBwYWdlIG9yICVOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8K
K0dJbnB1dFN0cmVhbSogd2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoKFdlYktpdFdlYlZpZXcq
IHdlYlZpZXcsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBHRXJyb3IqKiBlcnJvcikKK3sKKyAgICBn
X3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldyksIDApOworICAg
IGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZTkNfUkVTVUxUKHJlc3VsdCksIDApOworCisg
ICAgR1NpbXBsZUFzeW5jUmVzdWx0KiBzaW1wbGUgPSBHX1NJTVBMRV9BU1lOQ19SRVNVTFQocmVz
dWx0KTsKKyAgICBnX3dhcm5faWZfZmFpbChnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0X3NvdXJj
ZV90YWcoc2ltcGxlKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSk7CisKKyAgICBpZiAoZ19zaW1w
bGVfYXN5bmNfcmVzdWx0X3Byb3BhZ2F0ZV9lcnJvcihzaW1wbGUsIGVycm9yKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBHSW5wdXRTdHJlYW0qIGRhdGFTdHJlYW0gPSAwOworICAgIFZpZXdT
YXZlQXN5bmNEYXRhKiBkYXRhID0gc3RhdGljX2Nhc3Q8Vmlld1NhdmVBc3luY0RhdGEqPihnX3Np
bXBsZV9hc3luY19yZXN1bHRfZ2V0X29wX3Jlc19ncG9pbnRlcihzaW1wbGUpKTsKKyAgICBpZiAo
ZGF0YSkgeworICAgICAgICBnc2l6ZSBsZW5ndGggPSBXS0RhdGFHZXRTaXplKGRhdGEtPndrRGF0
YS5nZXQoKSk7CisgICAgICAgIGRhdGFTdHJlYW0gPSBnX21lbW9yeV9pbnB1dF9zdHJlYW1fbmV3
X2Zyb21fZGF0YShnX21lbWR1cChXS0RhdGFHZXRCeXRlcyhkYXRhLT53a0RhdGEuZ2V0KCkpLCBs
ZW5ndGgpLCBsZW5ndGgsIGdfZnJlZSk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGFTdHJlYW07
Cit9CisKKy8qKgorICogd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZToKKyAqIEB3ZWJfdmll
dzogYSAjV2ViS2l0V2ViVmlldworICogQHBhdGg6IGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWxh
dGl2ZSBvciBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgZmlsZSB3aGVyZSB0aGUgY3VycmVudCB3ZWIg
cGFnZSBzaG91bGQgYmUgc2F2ZWQgdG8uIFRoZSBzdHJpbmcgbXVzdCBiZSBlbmNvZGVkIGluIHRo
ZSBnbGliIGZpbGVuYW1lIGVuY29kaW5nLgorICogQHNhdmVfbW9kZTogdGhlICNXZWJLaXRXZWJW
aWV3U2F2ZU1vZGUgc3BlY2lmeWluZyBob3cgdGhlIHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZC4K
KyAqIEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBhICNHQ2FuY2VsbGFibGUgb3IgJU5VTEwg
dG8gaWdub3JlCisgKiBAY2FsbGJhY2s6IChzY29wZSBhc3luYyk6IGEgI0dBc3luY1JlYWR5Q2Fs
bGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZAorICogQHVzZXJfZGF0
YTogKGNsb3N1cmUpOiB0aGUgZGF0YSB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgor
ICogQXN5bmNocm9ub3VzbHkgc2F2ZSB0aGUgY3VycmVudCB3ZWIgcGFnZSBhc3NvY2lhdGVkIHRv
IHRoZQorICogI1dlYktpdFdlYlZpZXcgaW50byBhIHNlbGYtY29udGFpbmVkIGZvcm1hdCB1c2lu
ZyB0aGUgbW9kZQorICogc3BlY2lmaWVkIGluICNXZWJLaXRXZWJWaWV3U2F2ZU1vZGUgYW5kIHdy
aXRpbmcgaXQgdG8gZGlzayBhdCB0aGUKKyAqIGxvY2F0aW9uIHNwZWNpZmllZCBieSBAcGF0aC4K
KyAqCisgKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxsYmFjayB3aWxsIGJl
IGNhbGxlZC4gWW91IGNhbgorICogdGhlbiBjYWxsIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2Zp
bGVfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlCisgKiBvcGVyYXRpb24uCisgKi8K
K3ZvaWQgd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZShXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3
LCBjb25zdCBnY2hhciogcGF0aCwgV2ViS2l0V2ViVmlld1NhdmVNb2RlIHNhdmVNb2RlLCBHQ2Fu
Y2VsbGFibGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9p
bnRlciB1c2VyRGF0YSkKK3sKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklF
Vyh3ZWJWaWV3KSk7CisgICAgZ19yZXR1cm5faWZfZmFpbChwYXRoKTsKKworICAgIC8qIFdlIG9u
bHkgc3VwcG9ydCBNSFRNTCBhdCB0aGUgbW9tZW50ICovCisgICAgaWYgKHNhdmVNb2RlICE9IFdF
QktJVF9TQVZFX01PREVfTUhUTUwpCisgICAgICAgIHJldHVybjsKKworICAgIEdTaW1wbGVBc3lu
Y1Jlc3VsdCogcmVzdWx0ID0gZ19zaW1wbGVfYXN5bmNfcmVzdWx0X25ldyhHX09CSkVDVCh3ZWJW
aWV3KSwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGdwb2ludGVyPih3
ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRh
dGEgPSBjcmVhdGVWaWV3U2F2ZUFzeW5jRGF0YSgpOworICAgIGRhdGEtPmZpbGVQYXRoLnNldChn
X3N0cmR1cChwYXRoKSk7CisgICAgZGF0YS0+Y2FuY2VsbGFibGUgPSBjYW5jZWxsYWJsZTsKKyAg
ICBnX3NpbXBsZV9hc3luY19yZXN1bHRfc2V0X29wX3Jlc19ncG9pbnRlcihyZXN1bHQsIGRhdGEs
IHJlaW50ZXJwcmV0X2Nhc3Q8R0Rlc3Ryb3lOb3RpZnk+KGRlc3Ryb3lWaWV3U2F2ZUFzeW5jRGF0
YSkpOworCisgICAgV0tQYWdlUmVmIHdrUGFnZSA9IHRvQVBJKHdlYmtpdFdlYlZpZXdCYXNlR2V0
UGFnZShXRUJLSVRfV0VCX1ZJRVdfQkFTRSh3ZWJWaWV3KSkpOworICAgIFdLUGFnZUdldENvbnRl
bnRzQXNNSFRNTERhdGEod2tQYWdlLCBmYWxzZSwgcmVzdWx0LCB3ZWJWaWV3TUhUTUxEYXRhR290
Q2FsbGJhY2spOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmlu
aXNoOgorICogQHdlYl92aWV3OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAcmVzdWx0OiBhICNHQXN5
bmNSZXN1bHQKKyAqIEBlcnJvcjogcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBvciAlTlVMTCB0
byBpZ25vcmUKKyAqCisgKiBGaW5pc2ggYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBzdGFydGVk
IHdpdGggd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSgpLgorICoKKyAqIFJldHVybnM6ICVU
UlVFIGlmIHRoZSB3ZWIgcGFnZSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkIG9uIGRpc2sgb3IgJUZB
TFNFIG90aGVyd2lzZS4KKyAqLworZ2Jvb2xlYW4gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmls
ZV9maW5pc2goV2ViS2l0V2ViVmlldyogd2ViVmlldywgR0FzeW5jUmVzdWx0KiByZXN1bHQsIEdF
cnJvcioqIGVycm9yKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJf
VklFVyh3ZWJWaWV3KSwgRkFMU0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZ
TkNfUkVTVUxUKHJlc3VsdCksIEZBTFNFKTsKKworICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogc2lt
cGxlID0gR19TSU1QTEVfQVNZTkNfUkVTVUxUKHJlc3VsdCk7CisgICAgZ193YXJuX2lmX2ZhaWwo
Z19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9zb3VyY2VfdGFnKHNpbXBsZSkgPT0gd2Via2l0X3dl
Yl92aWV3X3NhdmVfdG9fZmlsZSk7CisKKyAgICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3By
b3BhZ2F0ZV9lcnJvcihzaW1wbGUsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisg
ICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL2d0ay9XZWJLaXRXZWJWaWV3LmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay9XZWJLaXRXZWJWaWV3LmgKaW5kZXggZTlhZDVkNi4uMDQ5NjNiYyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5oCisrKyBiL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaApAQCAtMTE3LDYgKzEx
NywxOCBAQCB0eXBlZGVmIGVudW0gewogICAgIFdFQktJVF9MT0FEX0ZJTklTSEVECiB9IFdlYktp
dExvYWRFdmVudDsKIAorLyoqCisgKiBXZWJLaXRXZWJWaWV3U2F2ZU1vZGU6CisgKiBAV0VCS0lU
X1NBVkVfTU9ERV9NSFRNTDogU2F2ZSB0aGUgY3VycmVudCBwYWdlIHVzaW5nIHRoZSBNSFRNTAor
ICogZm9ybWF0LgorICoKKyAqIEVudW0gdmFsdWVzIHRvIHNwZWNpZnkgdGhlIGRpZmZlcmVudCB3
YXlzIGluIHdoaWNoIGEgI1dlYktpdFdlYlZpZXcKKyAqIHdpbGwgYmUgc2F2ZWQgdGhlIGN1cnJl
bnQgd2ViIHBhZ2UgaW50byBhIHNlbGYtY29udGFpbmVkIGZpbGUuCisgKi8KK3R5cGVkZWYgZW51
bSB7CisgICAgV0VCS0lUX1NBVkVfTU9ERV9NSFRNTAorfSBXZWJLaXRXZWJWaWV3U2F2ZU1vZGU7
CisKIHN0cnVjdCBfV2ViS2l0V2ViVmlldyB7CiAgICAgV2ViS2l0V2ViVmlld0Jhc2UgcGFyZW50
OwogCkBAIC0zMTEsNiArMzIzLDMxIEBAIFdFQktJVF9BUEkgZ2Jvb2xlYW4KIHdlYmtpdF93ZWJf
dmlld19jYW5fc2hvd19taW1lX3R5cGUgICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAg
ICAgICAgICAgICp3ZWJfdmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAgICAgICptaW1lX3R5cGUpOwog
CitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF93ZWJfdmlld19zYXZlICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJLaXRXZWJW
aWV3U2F2ZU1vZGUgICAgICBzYXZlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgR0NhbmNlbGxhYmxlICAgICAgICAgICAgICAqY2FuY2Vs
bGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgICAgICAgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgICAgICAgICAgICAg
ICAgICAgdXNlcl9kYXRhKTsKKworV0VCS0lUX0FQSSBHSW5wdXRTdHJlYW0qCit3ZWJraXRfd2Vi
X3ZpZXdfc2F2ZV9maW5pc2ggICAgICAgICAgICAgICAgICAgICAgICAoV2ViS2l0V2ViVmlldyAg
ICAgICAgICAgICAqd2ViX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgR0FzeW5jUmVzdWx0ICAgICAgICAgICAgICAqcmVzdWx0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAg
ICAgICAgICAgICAgICAgICAqKmVycm9yKTsKKworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfd2Vi
X3ZpZXdfc2F2ZV90b19maWxlICAgICAgICAgICAgICAgICAgICAgICAoV2ViS2l0V2ViVmlldyAg
ICAgICAgICAgICAqd2ViX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJLaXRXZWJW
aWV3U2F2ZU1vZGUgICAgICBzYXZlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgR0NhbmNlbGxhYmxlICAgICAgICAgICAgICAqY2FuY2Vs
bGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgICAgICAgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgICAgICAgICAgICAg
ICAgICAgdXNlcl9kYXRhKTsKKworV0VCS0lUX0FQSSBnYm9vbGVhbgord2Via2l0X3dlYl92aWV3
X3NhdmVfdG9fZmlsZV9maW5pc2ggICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAg
ICAgICAgKndlYl92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdBc3luY1Jlc3VsdCAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAg
ICAgICAgICAgICAgKiplcnJvcik7CisKIEdfRU5EX0RFQ0xTCiAKICNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rp
b25zLnR4dCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0
ay1zZWN0aW9ucy50eHQKaW5kZXggMzJjOWQ5Zi4uOTYyMzY1ZSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dAor
KysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2Vj
dGlvbnMudHh0CkBAIC01Nyw2ICs1Nyw3IEBAIHdlYmtpdF93ZWJfY29udGV4dF9nZXRfdHlwZQog
V2ViS2l0V2ViVmlldwogV2ViS2l0TG9hZEV2ZW50CiBXZWJLaXRQb2xpY3lEZWNpc2lvblR5cGUK
K1dlYktpdFdlYlZpZXdTYXZlTW9kZQogCiA8U1VCU0VDVElPTiBFZGl0aW5nIENvbW1hbmRzPgog
V0VCS0lUX0VESVRJTkdfQ09NTUFORF9DVVQKQEAgLTEwMCw2ICsxMDEsMTAgQEAgd2Via2l0X3dl
Yl92aWV3X2dldF9qYXZhc2NyaXB0X2dsb2JhbF9jb250ZXh0CiB3ZWJraXRfd2ViX3ZpZXdfcnVu
X2phdmFzY3JpcHQKIHdlYmtpdF93ZWJfdmlld19ydW5famF2YXNjcmlwdF9maW5pc2gKIHdlYmtp
dF93ZWJfdmlld19jYW5fc2hvd19taW1lX3R5cGUKK3dlYmtpdF93ZWJfdmlld19zYXZlCit3ZWJr
aXRfd2ViX3ZpZXdfc2F2ZV9maW5pc2gKK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUKK3dl
YmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoCiAKIDxTVUJTRUNUSU9OIFdlYktpdEph
dmFzY3JpcHRSZXN1bHQ+CiBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmll
dy5jcHAKaW5kZXggYzc0MGMwZC4uYmM5MjlkNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwCisrKyBiL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcApA
QCAtMjEsMTAgKzIxLDE0IEBACiAjaW5jbHVkZSAiV2ViVmlld1Rlc3QuaCIKICNpbmNsdWRlIDxK
YXZhU2NyaXB0Q29yZS9KU1N0cmluZ1JlZi5oPgogI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pT
VmFsdWVSZWYuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgogI2luY2x1ZGUgPHd0Zi9IYXNo
U2V0Lmg+CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L1N0cmluZ0hhc2guaD4KIAorc3RhdGljIGNoYXIqIGtUZW1wRGlyZWN0b3J5Oworc3RhdGlj
IGNoYXIqIGtTYXZlRGVzdGluYXRpb25GaWxlUGF0aDsKKwogc3RhdGljIHZvaWQgdGVzdFdlYlZp
ZXdEZWZhdWx0Q29udGV4dChXZWJWaWV3VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKIHsKICAg
ICBnX2Fzc2VydCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2NvbnRleHQodGVzdC0+bV93ZWJWaWV3KSA9
PSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2RlZmF1bHQoKSk7CkBAIC04NjAsOCArODY0LDgzIEBA
IHN0YXRpYyB2b2lkIHRlc3RXZWJWaWV3Q2FuU2hvd01JTUVUeXBlKFdlYlZpZXdUZXN0KiB0ZXN0
LCBnY29uc3Rwb2ludGVyKQogICAgIGdfYXNzZXJ0KCF3ZWJraXRfd2ViX3ZpZXdfY2FuX3Nob3df
bWltZV90eXBlKHRlc3QtPm1fd2ViVmlldywgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKTsK
IH0KIAorc3RhdGljIHZvaWQgd2ViVmlld1NhdmVkVG9GaWxlQ2FsbGJhY2soR09iamVjdCAqb2Jq
ZWN0LCBHQXN5bmNSZXN1bHQgKnJlcywgV2ViVmlld1Rlc3QqIHRlc3QpCit7CisgICAgR0Vycm9y
KiBlcnJvciA9IDA7CisgICAgZ19hc3NlcnQod2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZV9m
aW5pc2godGVzdC0+bV93ZWJWaWV3LCByZXMsICZlcnJvcikpOworICAgIGdfYXNzZXJ0KCFlcnJv
cik7CisKKyAgICBnX21haW5fbG9vcF9xdWl0KHRlc3QtPm1fbWFpbkxvb3ApOworfQorCitzdGF0
aWMgdm9pZCB3ZWJWaWV3U2F2ZWRDYWxsYmFjayhHT2JqZWN0ICpvYmplY3QsIEdBc3luY1Jlc3Vs
dCAqcmVzLCBXZWJWaWV3VGVzdCogdGVzdCkKK3sKKyAgICBHRXJyb3IqIGVycm9yID0gMDsKKyAg
ICBHSW5wdXRTdHJlYW0qIGlucHV0U3RyZWFtID0gd2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNo
KHRlc3QtPm1fd2ViVmlldywgcmVzLCAmZXJyb3IpOworICAgIGdfYXNzZXJ0KGlucHV0U3RyZWFt
KTsKKyAgICBnX2Fzc2VydCghZXJyb3IpOworCisgICAgLy8gTm93IGNvbXBhcmUgeW91IGdldCBl
eGFjdGx5IHRoZSBzYW1lIHJlc3VsdCB0aGFuIHdoZW4gc2F2aW5nIHRvIGEgZmlsZS4KKyAgICBH
RmlsZSogZmlsZSA9IGdfZmlsZV9uZXdfZm9yX3BhdGgoa1NhdmVEZXN0aW5hdGlvbkZpbGVQYXRo
KTsKKyAgICBHSW5wdXRTdHJlYW0qIHNhdmVkRmlsZUlucHV0U3RyZWFtID0gR19JTlBVVF9TVFJF
QU0oZ19maWxlX3JlYWQoZmlsZSwgTlVMTCwgJmVycm9yKSk7CisgICAgZ19hc3NlcnQoIWVycm9y
KTsKKworICAgIC8vIFdlIHNob3VsZCByZWFkIGV4YWN0bHkgdGhlIHNhbWUgYW1vdW50IG9mIGJ5
dGVzIGNvbWluZyBmcm9tIHRoZQorICAgIC8vIEdJbnB1dFN0cmVhbSBhbmQgdGhlIGZpbGUuIFdl
IGRvbid0IGNvbXBhcmUgdGhlIHN0cmluZ3MgcmVhZAorICAgIC8vIHNpbmNlIHRoZSAnRGF0ZScg
ZmllbGQgYW5kIHRoZSBib3VuZGFyaWVzIHdpbGwgYmUgZGlmZmVyZW50IG9uCisgICAgLy8gZWFj
aCBjYXNlLiBBbHNvLCBNSFRNTCBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgdGVzdGVkIGJ5IExheW91
dAorICAgIC8vIHRlc3RzLCBzbyBjaGVja2luZyB0aGUgYW1vdW50IG9mIGJ5dGVzIHJlY2VpdmVk
IGlzIGVub3VnaC4KKyAgICBHT3duUHRyPGdjaGFyPiBidWZmZXIxKGdfbmV3MChnY2hhciwgNTEy
KSk7CisgICAgR093blB0cjxnY2hhcj4gYnVmZmVyMihnX25ldzAoZ2NoYXIsIDUxMikpOworICAg
IGdzc2l6ZSByZWFkQnl0ZXMgPSAwOworICAgIGdzc2l6ZSB0b3RhbEJ5dGVzRnJvbVN0cmVhbSA9
IDA7CisgICAgZ3NzaXplIHRvdGFsQnl0ZXNGcm9tRmlsZSA9IDA7CisgICAgd2hpbGUgKHJlYWRC
eXRlcyA9IGdfaW5wdXRfc3RyZWFtX3JlYWQoaW5wdXRTdHJlYW0sIGJ1ZmZlcjEub3V0UHRyKCks
IDUxMiwgTlVMTCwgJmVycm9yKSkgeworICAgICAgICBnX2Fzc2VydCghZXJyb3IpOworICAgICAg
ICB0b3RhbEJ5dGVzRnJvbVN0cmVhbSArPSByZWFkQnl0ZXM7CisgICAgICAgIHRvdGFsQnl0ZXNG
cm9tRmlsZSArPSBnX2lucHV0X3N0cmVhbV9yZWFkKHNhdmVkRmlsZUlucHV0U3RyZWFtLCBidWZm
ZXIyLm91dFB0cigpLCA1MTIsIE5VTEwsICZlcnJvcik7CisgICAgICAgIGdfYXNzZXJ0KCFlcnJv
cik7CisgICAgfQorICAgIC8vIENoZWNrIHRoYXQgdGhlcmUncyBub3RoaW5nIGVsc2UgdG8gYmUg
cmVhZCBpbiB0aGUgZmlsZSBlaXRoZXIuCisgICAgZ19hc3NlcnQoIWdfaW5wdXRfc3RyZWFtX3Jl
YWQoc2F2ZWRGaWxlSW5wdXRTdHJlYW0sIGJ1ZmZlcjIub3V0UHRyKCksIDUxMiwgTlVMTCwgJmVy
cm9yKSk7CisgICAgZ19hc3NlcnQoIWVycm9yKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHNh
bWUgbWluaW11bSBhbW91bnQgb2YgYnl0ZXMgYXJlIHJlY2VpdmVkLgorICAgIGdfYXNzZXJ0X2Nt
cGludCh0b3RhbEJ5dGVzRnJvbVN0cmVhbSwgPT0sIHRvdGFsQnl0ZXNGcm9tRmlsZSk7CisgICAg
Z19hc3NlcnRfY21waW50KHRvdGFsQnl0ZXNGcm9tU3RyZWFtLCA+PSwgMjA0OCk7CisKKyAgICBn
X2lucHV0X3N0cmVhbV9jbG9zZShpbnB1dFN0cmVhbSwgTlVMTCwgTlVMTCk7CisgICAgZ19pbnB1
dF9zdHJlYW1fY2xvc2Uoc2F2ZWRGaWxlSW5wdXRTdHJlYW0sIE5VTEwsIE5VTEwpOworCisgICAg
Z19tYWluX2xvb3BfcXVpdCh0ZXN0LT5tX21haW5Mb29wKTsKK30KKworc3RhdGljIHZvaWQgdGVz
dFdlYlZpZXdTYXZlKFVJQ2xpZW50VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICB0
ZXN0LT5sb2FkSHRtbCgiPGh0bWw+IgorICAgICAgICAgICAgICAgICAgICI8Ym9keT4iCisgICAg
ICAgICAgICAgICAgICAgIiAgPHA+QSBwYXJhZ3JhcGggd2l0aCBwbGFpbiB0ZXh0PC9wPiIKKyAg
ICAgICAgICAgICAgICAgICAiICA8cD4iCisgICAgICAgICAgICAgICAgICAgIiAgICBBIHJlZCBi
b3g6IDxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVV
Z0FBQUFJQUFBQUNDQUlBQUFEOTFKcHpBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIz
UkpUVVVIM0FZV0RUTVZ3blNabndBQUFCMXBWRmgwUTI5dGJXVnVkQUFBQUFBQVEzSmxZWFJsWkNC
M2FYUm9JRWRKVFZCa0xtVUhBQUFBRmtsRVFWUUkxMlA4ejhEQXdNREF4TURBd01EQUFBQU5IUUVE
SyttbXlBQUFBQUJKUlU1RXJrSmdnZz09Jz48L2JyPiIKKyAgICAgICAgICAgICAgICAgICAiICAg
IEEgYmx1ZSBib3g6IDxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29B
QUFBTlNVaEVVZ0FBQUFJQUFBQUNDQUlBQUFEOTFKcHpBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFt
cHdZQUFBQUIzUkpUVVVIM0FZV0RUTXZCSGhBTFFBQUFCMXBWRmgwUTI5dGJXVnVkQUFBQUFBQVEz
SmxZWFJsWkNCM2FYUm9JRWRKVFZCa0xtVUhBQUFBRmtsRVFWUUkxMk5rNFBuUHdNREF4TURBd01E
QUFBQUxyd0VQUElzMXBnQUFBQUJKUlU1RXJrSmdnZz09Jz4iCisgICAgICAgICAgICAgICAgICAg
IiAgPC9wPiIKKyAgICAgICAgICAgICAgICAgICAiPC9ib2R5PiIKKyAgICAgICAgICAgICAgICAg
ICAiPC9odG1sPiIsIDApOworICAgIHRlc3QtPndhaXRVbnRpbExvYWRGaW5pc2hlZCgpOworCisg
ICAga1NhdmVEZXN0aW5hdGlvbkZpbGVQYXRoID0gZ19idWlsZF9maWxlbmFtZShrVGVtcERpcmVj
dG9yeSwgInRlc3RXZWJWaWV3U2F2ZVJlc3VsdC5taHQiLCBOVUxMKTsKKyAgICB3ZWJraXRfd2Vi
X3ZpZXdfc2F2ZV90b19maWxlKHRlc3QtPm1fd2ViVmlldywga1NhdmVEZXN0aW5hdGlvbkZpbGVQ
YXRoLCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVycHJldF9jYXN0PEdBc3luY1Jl
YWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKSwgdGVzdCk7CisgICAgdGVz
dC0+d2FpdFVudGlsTWFpbkxvb3BGaW5pc2hlcygpOworCisgICAgd2Via2l0X3dlYl92aWV3X3Nh
dmUodGVzdC0+bV93ZWJWaWV3LCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVycHJl
dF9jYXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZENhbGxiYWNrKSwgdGVzdCk7
CisgICAgdGVzdC0+d2FpdFVudGlsTWFpbkxvb3BGaW5pc2hlcygpOworfQorCiB2b2lkIGJlZm9y
ZUFsbCgpCiB7CisgICAga1RlbXBEaXJlY3RvcnkgPSBnX2Rpcl9tYWtlX3RtcCgiV2ViS2l0MlRl
c3RzLVhYWFhYWCIsIDApOworICAgIGdfYXNzZXJ0KGtUZW1wRGlyZWN0b3J5KTsKKwogICAgIFdl
YlZpZXdUZXN0OjphZGQoIldlYktpdFdlYlZpZXciLCAiZGVmYXVsdC1jb250ZXh0IiwgdGVzdFdl
YlZpZXdEZWZhdWx0Q29udGV4dCk7CiAgICAgV2ViVmlld1Rlc3Q6OmFkZCgiV2ViS2l0V2ViVmll
dyIsICJjdXN0b20tY2hhcnNldCIsIHRlc3RXZWJWaWV3Q3VzdG9tQ2hhcnNldCk7CiAgICAgV2Vi
Vmlld1Rlc3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJzZXR0aW5ncyIsIHRlc3RXZWJWaWV3U2V0
dGluZ3MpOwpAQCAtODc4LDggKzk1NywxMCBAQCB2b2lkIGJlZm9yZUFsbCgpCiAgICAgRmlsZUNo
b29zZXJUZXN0OjphZGQoIldlYktpdFdlYlZpZXciLCAiZmlsZS1jaG9vc2VyLXJlcXVlc3QiLCB0
ZXN0V2ViVmlld0ZpbGVDaG9vc2VyUmVxdWVzdCk7CiAgICAgRnVsbFNjcmVlbkNsaWVudFRlc3Q6
OmFkZCgiV2ViS2l0V2ViVmlldyIsICJmdWxsc2NyZWVuIiwgdGVzdFdlYlZpZXdGdWxsU2NyZWVu
KTsKICAgICBXZWJWaWV3VGVzdDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgImNhbi1zaG93LW1pbWUt
dHlwZSIsIHRlc3RXZWJWaWV3Q2FuU2hvd01JTUVUeXBlKTsKKyAgICBVSUNsaWVudFRlc3Q6OmFk
ZCgiV2ViS2l0V2ViVmlldyIsICJzYXZlIiwgdGVzdFdlYlZpZXdTYXZlKTsKIH0KIAogdm9pZCBh
ZnRlckFsbCgpCiB7CisgICAgZ19ybWRpcihrVGVtcERpcmVjdG9yeSk7CiB9Ci0tIAoxLjcuMTAu
MgoK
</data>
<flag name="review"
          id="157262"
          type_id="1"
          status="-"
          setter="cgarcia"
    />
    <flag name="commit-queue"
          id="157264"
          type_id="3"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>149501</attachid>
            <date>2012-06-26 03:09:41 -0700</date>
            <delta_ts>2012-06-26 10:14:07 -0700</delta_ts>
            <desc>Patch Proposal + Unit Tests + Documentation</desc>
            <filename>0002-2012-06-25-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>19768</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAzMTkzZjA2ZTc4MTg4YzAxMjk4ZjY4YTQyNTAxMTJlYzEwNjFkZmIxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDI1IEp1biAyMDEyIDE1OjA5OjExICswMjAwClN1YmplY3Q6IFtQQVRD
SCAyLzJdIDIwMTItMDYtMjUgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgoKICAgICAgICBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIg
cGFnZSB1c2luZyBNSFRNTAogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD04OTg3MwoKICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCiAgICAg
ICAgSW1wbGVtZW50ZWQgbmV3IGFzeW5jaHJvbm91cyBBUEkgaW4gV2ViS2l0V2ViVmlldy4KCiAg
ICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcDoKICAgICAgICAoVmll
d1NhdmVBc3luY0RhdGEpOgogICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgogICAg
ICAgICh3ZWJWaWV3TUhUTUxEYXRhR290Q2FsbGJhY2spOgogICAgICAgICh3ZWJraXRfd2ViX3Zp
ZXdfc2F2ZSk6CiAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CiAgICAgICAg
KHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpOgogICAgICAgICh3ZWJraXRfd2ViX3ZpZXdf
c2F2ZV90b19maWxlX2ZpbmlzaCk6CiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRX
ZWJWaWV3Lmg6CgogICAgICAgIEFkZGVkIG5ldyB1bml0IHRlc3QuCgogICAgICAgICogVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwOgogICAgICAgICh3ZWJWaWV3
U2F2ZWRUb0ZpbGVDYWxsYmFjayk6CiAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxiYWNrKToKICAg
ICAgICAodGVzdFdlYlZpZXdTYXZlKToKICAgICAgICAoYmVmb3JlQWxsKToKICAgICAgICAoYWZ0
ZXJBbGwpOgoKICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBuZXcgc3lt
Ym9scy4KCiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlv
bnMudHh0OgotLS0KIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAzMiArKysrCiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3LmNwcCB8ICAxNjkgKysrKysrKysrKysrKysrKysrKysKIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaCAgIHwgICAzNyArKysrKwogLi4uL1VJ
UHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQgfCAgICA1ICsKIC4u
Li9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAgIHwgICA3OSAr
KysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMzIyIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5k
ZXggNDdiMTFlNy4uZTYxY2FjNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9n
CisrKyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM3IEBACiAyMDEyLTA2
LTI1ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KIAorICAgICAg
ICBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIgcGFnZSB1c2luZyBN
SFRNTAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODk4
NzMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBs
ZW1lbnRlZCBuZXcgYXN5bmNocm9ub3VzIEFQSSBpbiBXZWJLaXRXZWJWaWV3LgorCisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHA6CisgICAgICAgIChWaWV3U2F2
ZUFzeW5jRGF0YSk6CisgICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgorICAgICAg
ICAod2ViVmlld01IVE1MRGF0YUdvdENhbGxiYWNrKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmll
d19zYXZlKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CisgICAgICAg
ICh3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmll
d19zYXZlX3RvX2ZpbGVfZmluaXNoKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3Lmg6CisKKyAgICAgICAgQWRkZWQgbmV3IHVuaXQgdGVzdC4KKworICAgICAgICAq
IFVJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcDoKKyAgICAgICAg
KHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKToKKyAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxi
YWNrKToKKyAgICAgICAgKHRlc3RXZWJWaWV3U2F2ZSk6CisgICAgICAgIChiZWZvcmVBbGwpOgor
ICAgICAgICAoYWZ0ZXJBbGwpOgorCisgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl
cyB3aXRoIG5ldyBzeW1ib2xzLgorCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93
ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dDoKKworMjAxMi0wNi0yNSAgTWFyaW8gU2FuY2hleiBQcmFk
YSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CisKICAgICAgICAgW1dLMl0gQWRkIG5ldyBDIEFQSSB0
byBnZW5lcmF0ZSBNSFRNTCBkYXRhIGZyb20gdGhlIFVJIHByb2Nlc3MKICAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg5ODcyCiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3BwIGIvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHAKaW5kZXggOTRhOTRj
YS4uYTJhNmY5NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsv
V2ViS2l0V2ViVmlldy5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsv
V2ViS2l0V2ViVmlldy5jcHAKQEAgLTIyNTgsMyArMjI1OCwxNzIgQEAgZ2Jvb2xlYW4gd2Via2l0
X3dlYl92aWV3X2Nhbl9zaG93X21pbWVfdHlwZShXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBjb25z
dCBjaGFyKgogICAgIFdlYlBhZ2VQcm94eSogcGFnZSA9IHdlYmtpdFdlYlZpZXdCYXNlR2V0UGFn
ZShXRUJLSVRfV0VCX1ZJRVdfQkFTRSh3ZWJWaWV3KSk7CiAgICAgcmV0dXJuIHBhZ2UtPmNhblNo
b3dNSU1FVHlwZShTdHJpbmc6OmZyb21VVEY4KG1pbWVUeXBlKSk7CiB9CisKK3N0cnVjdCBWaWV3
U2F2ZUFzeW5jRGF0YSB7CisgICAgV0tSZXRhaW5QdHI8V0tEYXRhUmVmPiB3a0RhdGE7CisgICAg
R1JlZlB0cjxHRmlsZT4gZmlsZTsKKyAgICBHUmVmUHRyPEdDYW5jZWxsYWJsZT4gY2FuY2VsbGFi
bGU7Cit9OworV0VCS0lUX0RFRklORV9BU1lOQ19EQVRBX1NUUlVDVChWaWV3U2F2ZUFzeW5jRGF0
YSkKKworc3RhdGljIHZvaWQgZmlsZVJlcGxhY2VDb250ZW50c0NhbGxiYWNrKEdPYmplY3QqIG9i
amVjdCwgR0FzeW5jUmVzdWx0KiByZXN1bHQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgR0ZpbGUq
IGZpbGUgPSBHX0ZJTEUob2JqZWN0KTsKKyAgICBHUmVmUHRyPEdTaW1wbGVBc3luY1Jlc3VsdD4g
c2F2ZWRUb0ZpbGVSZXN1bHQgPSBhZG9wdEdSZWYoR19TSU1QTEVfQVNZTkNfUkVTVUxUKGRhdGEp
KTsKKworICAgIEdFcnJvciogZXJyb3IgPSAwOworICAgIGlmICghZ19maWxlX3JlcGxhY2VfY29u
dGVudHNfZmluaXNoKGZpbGUsIHJlc3VsdCwgMCwgJmVycm9yKSkKKyAgICAgICAgZ19zaW1wbGVf
YXN5bmNfcmVzdWx0X3Rha2VfZXJyb3Ioc2F2ZWRUb0ZpbGVSZXN1bHQuZ2V0KCksIGVycm9yKTsK
KworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9jb21wbGV0ZShzYXZlZFRvRmlsZVJlc3VsdC5n
ZXQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbnRlbnRzQXNNSFRNTERhdGFDYWxsYmFjayhX
S0RhdGFSZWYgd2tEYXRhLCBXS0Vycm9yUmVmLCB2b2lkKiBjb250ZXh0KQoreworICAgIEdSZWZQ
dHI8R1NpbXBsZUFzeW5jUmVzdWx0PiByZXN1bHQgPSBhZG9wdEdSZWYoR19TSU1QTEVfQVNZTkNf
UkVTVUxUKGNvbnRleHQpKTsKKyAgICBWaWV3U2F2ZUFzeW5jRGF0YSogZGF0YSA9IHN0YXRpY19j
YXN0PFZpZXdTYXZlQXN5bmNEYXRhKj4oZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9vcF9yZXNf
Z3BvaW50ZXIocmVzdWx0LmdldCgpKSk7CisgICAgR0Vycm9yKiBlcnJvciA9IDA7CisKKyAgICBp
ZiAoZ19jYW5jZWxsYWJsZV9zZXRfZXJyb3JfaWZfY2FuY2VsbGVkKGRhdGEtPmNhbmNlbGxhYmxl
LmdldCgpLCAmZXJyb3IpKQorICAgICAgICBnX3NpbXBsZV9hc3luY19yZXN1bHRfdGFrZV9lcnJv
cihyZXN1bHQuZ2V0KCksIGVycm9yKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0
byByZXRhaW4gdGhlIGRhdGEgdW50aWwgdGhlIGFzeW5jcm9ub3VzIHByb2Nlc3MKKyAgICAgICAg
Ly8gaW5pdGlhdGVkIGJ5IHRoZSB1c2VyIGhhcyBmaW5pc2hlZCBjb21wbGV0ZWx5LgorICAgICAg
ICBkYXRhLT53a0RhdGEgPSB3a0RhdGE7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIHNhdmluZyB0
byBhIGZpbGUgd2UgbmVlZCB0byB3cml0ZSB0aGUgZGF0YSBvbiBkaXNrIGJlZm9yZSBmaW5pc2hp
bmcuCisgICAgICAgIGlmIChnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0X3NvdXJjZV90YWcocmVz
dWx0LmdldCgpKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKSB7CisgICAgICAgICAg
ICBBU1NFUlQoR19JU19GSUxFKGRhdGEtPmZpbGUpKTsKKyAgICAgICAgICAgIGdfZmlsZV9yZXBs
YWNlX2NvbnRlbnRzX2FzeW5jKGRhdGEtPmZpbGUuZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgZ2NoYXIqPihXS0RhdGFHZXRCeXRlcyhkYXRhLT53a0RhdGEuZ2V0KCkpKSwgV0tEYXRhR2V0
U2l6ZShkYXRhLT53a0RhdGEuZ2V0KCkpLCAwLCBGQUxTRSwgR19GSUxFX0NSRUFURV9SRVBMQUNF
X0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YS0+Y2FuY2VsbGFibGUuZ2V0KCksIGZpbGVSZXBsYWNlQ29udGVudHNDYWxsYmFjaywgZ19v
YmplY3RfcmVmKHJlc3VsdC5nZXQoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgfQorCisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2NvbXBsZXRlKHJlc3VsdC5nZXQo
KSk7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl92aWV3X3NhdmU6CisgKiBAd2ViX3ZpZXc6IGEg
I1dlYktpdFdlYlZpZXcKKyAqIEBzYXZlX21vZGU6IHRoZSAjV2ViS2l0U2F2ZU1vZGUgc3BlY2lm
eWluZyBob3cgdGhlIHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZC4KKyAqIEBjYW5jZWxsYWJsZTog
KGFsbG93LW5vbmUpOiBhICNHQ2FuY2VsbGFibGUgb3IgJU5VTEwgdG8gaWdub3JlCisgKiBAY2Fs
bGJhY2s6IChzY29wZSBhc3luYyk6IGEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8gY2FsbCB3aGVu
IHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZAorICogQHVzZXJfZGF0YTogKGNsb3N1cmUpOiB0aGUg
ZGF0YSB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogQXN5bmNocm9ub3VzbHkg
c2F2ZSB0aGUgY3VycmVudCB3ZWIgcGFnZSBhc3NvY2lhdGVkIHRvIHRoZQorICogI1dlYktpdFdl
YlZpZXcgaW50byBhIHNlbGYtY29udGFpbmVkIGZvcm1hdCB1c2luZyB0aGUgbW9kZQorICogc3Bl
Y2lmaWVkIGluICNXZWJLaXRTYXZlTW9kZS4KKyAqCisgKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMg
ZmluaXNoZWQsIEBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4gWW91IGNhbgorICogdGhlbiBjYWxs
IHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCgpIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZQor
ICogb3BlcmF0aW9uLgorICovCit2b2lkIHdlYmtpdF93ZWJfdmlld19zYXZlKFdlYktpdFdlYlZp
ZXcqIHdlYlZpZXcsIFdlYktpdFNhdmVNb2RlIHNhdmVNb2RlLCBHQ2FuY2VsbGFibGUqIGNhbmNl
bGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1c2VyRGF0YSkK
K3sKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3ZWJWaWV3KSk7CisK
KyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgTUhUTUwgYXQgdGhlIG1vbWVudC4KKyAgICBnX3JldHVy
bl9pZl9mYWlsKHNhdmVNb2RlID09IFdFQktJVF9TQVZFX01PREVfTUhUTUwpOworCisgICAgR1Np
bXBsZUFzeW5jUmVzdWx0KiByZXN1bHQgPSBnX3NpbXBsZV9hc3luY19yZXN1bHRfbmV3KEdfT0JK
RUNUKHdlYlZpZXcpLCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3Bv
aW50ZXI+KHdlYmtpdF93ZWJfdmlld19zYXZlKSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRh
dGEgPSBjcmVhdGVWaWV3U2F2ZUFzeW5jRGF0YSgpOworICAgIGRhdGEtPmNhbmNlbGxhYmxlID0g
Y2FuY2VsbGFibGU7CisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3NldF9vcF9yZXNfZ3BvaW50
ZXIocmVzdWx0LCBkYXRhLCByZWludGVycHJldF9jYXN0PEdEZXN0cm95Tm90aWZ5PihkZXN0cm95
Vmlld1NhdmVBc3luY0RhdGEpKTsKKworICAgIFdLUGFnZVJlZiB3a1BhZ2UgPSB0b0FQSSh3ZWJr
aXRXZWJWaWV3QmFzZUdldFBhZ2UoV0VCS0lUX1dFQl9WSUVXX0JBU0Uod2ViVmlldykpKTsKKyAg
ICBXS1BhZ2VHZXRDb250ZW50c0FzTUhUTUxEYXRhKHdrUGFnZSwgZmFsc2UsIHJlc3VsdCwgZ2V0
Q29udGVudHNBc01IVE1MRGF0YUNhbGxiYWNrKTsKK30KKworLyoqCisgKiB3ZWJraXRfd2ViX3Zp
ZXdfc2F2ZV9maW5pc2g6CisgKiBAd2ViX3ZpZXc6IGEgI1dlYktpdFdlYlZpZXcKKyAqIEByZXN1
bHQ6IGEgI0dBc3luY1Jlc3VsdAorICogQGVycm9yOiByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9y
IG9yICVOVUxMIHRvIGlnbm9yZQorICoKKyAqIEZpbmlzaCBhbiBhc3luY2hyb25vdXMgb3BlcmF0
aW9uIHN0YXJ0ZWQgd2l0aCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSgpLgorICoKKyAqIFJldHVybnM6
ICh0cmFuc2ZlciBmdWxsKTogYSAjR0lucHV0U3RyZWFtIHdpdGggdGhlIHJlc3VsdCBvZiBzYXZp
bmcKKyAqICAgIHRoZSBjdXJyZW50IHdlYiBwYWdlIG9yICVOVUxMIGluIGNhc2Ugb2YgZXJyb3Iu
CisgKi8KK0dJbnB1dFN0cmVhbSogd2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoKFdlYktpdFdl
YlZpZXcqIHdlYlZpZXcsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBHRXJyb3IqKiBlcnJvcikKK3sK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldyksIDAp
OworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZTkNfUkVTVUxUKHJlc3VsdCksIDAp
OworCisgICAgR1NpbXBsZUFzeW5jUmVzdWx0KiBzaW1wbGUgPSBHX1NJTVBMRV9BU1lOQ19SRVNV
TFQocmVzdWx0KTsKKyAgICBnX3dhcm5faWZfZmFpbChnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0
X3NvdXJjZV90YWcoc2ltcGxlKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSk7CisKKyAgICBpZiAo
Z19zaW1wbGVfYXN5bmNfcmVzdWx0X3Byb3BhZ2F0ZV9lcnJvcihzaW1wbGUsIGVycm9yKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBHSW5wdXRTdHJlYW0qIGRhdGFTdHJlYW0gPSBnX21lbW9y
eV9pbnB1dF9zdHJlYW1fbmV3KCk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRhdGEgPSBzdGF0
aWNfY2FzdDxWaWV3U2F2ZUFzeW5jRGF0YSo+KGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9nZXRfb3Bf
cmVzX2dwb2ludGVyKHNpbXBsZSkpOworICAgIGlmIChkYXRhKSB7CisgICAgICAgIGdzaXplIGxl
bmd0aCA9IFdLRGF0YUdldFNpemUoZGF0YS0+d2tEYXRhLmdldCgpKTsKKyAgICAgICAgZ19tZW1v
cnlfaW5wdXRfc3RyZWFtX2FkZF9kYXRhKEdfTUVNT1JZX0lOUFVUX1NUUkVBTShkYXRhU3RyZWFt
KSwgZ19tZW1kdXAoV0tEYXRhR2V0Qnl0ZXMoZGF0YS0+d2tEYXRhLmdldCgpKSwgbGVuZ3RoKSwg
bGVuZ3RoLCBnX2ZyZWUpOworICAgIH0KKworICAgIHJldHVybiBkYXRhU3RyZWFtOworfQorCisv
KioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGU6CisgKiBAd2ViX3ZpZXc6IGEgI1dl
YktpdFdlYlZpZXcKKyAqIEBmaWxlOiB0aGUgI0dGaWxlIHdoZXJlIHRoZSBjdXJyZW50IHdlYiBw
YWdlIHNob3VsZCBiZSBzYXZlZCB0by4KKyAqIEBzYXZlX21vZGU6IHRoZSAjV2ViS2l0U2F2ZU1v
ZGUgc3BlY2lmeWluZyBob3cgdGhlIHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZC4KKyAqIEBjYW5j
ZWxsYWJsZTogKGFsbG93LW5vbmUpOiBhICNHQ2FuY2VsbGFibGUgb3IgJU5VTEwgdG8gaWdub3Jl
CisgKiBAY2FsbGJhY2s6IChzY29wZSBhc3luYyk6IGEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8g
Y2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZAorICogQHVzZXJfZGF0YTogKGNsb3N1
cmUpOiB0aGUgZGF0YSB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogQXN5bmNo
cm9ub3VzbHkgc2F2ZSB0aGUgY3VycmVudCB3ZWIgcGFnZSBhc3NvY2lhdGVkIHRvIHRoZQorICog
I1dlYktpdFdlYlZpZXcgaW50byBhIHNlbGYtY29udGFpbmVkIGZvcm1hdCB1c2luZyB0aGUgbW9k
ZQorICogc3BlY2lmaWVkIGluICNXZWJLaXRTYXZlTW9kZSBhbmQgd3JpdGluZyBpdCB0byBAZmls
ZS4KKyAqCisgKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxsYmFjayB3aWxs
IGJlIGNhbGxlZC4gWW91IGNhbgorICogdGhlbiBjYWxsIHdlYmtpdF93ZWJfdmlld19zYXZlX3Rv
X2ZpbGVfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlCisgKiBvcGVyYXRpb24uCisg
Ki8KK3ZvaWQgd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZShXZWJLaXRXZWJWaWV3KiB3ZWJW
aWV3LCBHRmlsZSogZmlsZSwgV2ViS2l0U2F2ZU1vZGUgc2F2ZU1vZGUsIEdDYW5jZWxsYWJsZSog
Y2FuY2VsbGFibGUsIEdBc3luY1JlYWR5Q2FsbGJhY2sgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJE
YXRhKQoreworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcp
KTsKKyAgICBnX3JldHVybl9pZl9mYWlsKEdfSVNfRklMRShmaWxlKSk7CisKKyAgICAvLyBXZSBv
bmx5IHN1cHBvcnQgTUhUTUwgYXQgdGhlIG1vbWVudC4KKyAgICBnX3JldHVybl9pZl9mYWlsKHNh
dmVNb2RlID09IFdFQktJVF9TQVZFX01PREVfTUhUTUwpOworCisgICAgR1NpbXBsZUFzeW5jUmVz
dWx0KiByZXN1bHQgPSBnX3NpbXBsZV9hc3luY19yZXN1bHRfbmV3KEdfT0JKRUNUKHdlYlZpZXcp
LCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3BvaW50ZXI+KHdlYmtp
dF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpKTsKKyAgICBWaWV3U2F2ZUFzeW5jRGF0YSogZGF0YSA9
IGNyZWF0ZVZpZXdTYXZlQXN5bmNEYXRhKCk7CisgICAgZGF0YS0+ZmlsZSA9IGZpbGU7CisgICAg
ZGF0YS0+Y2FuY2VsbGFibGUgPSBjYW5jZWxsYWJsZTsKKyAgICBnX3NpbXBsZV9hc3luY19yZXN1
bHRfc2V0X29wX3Jlc19ncG9pbnRlcihyZXN1bHQsIGRhdGEsIHJlaW50ZXJwcmV0X2Nhc3Q8R0Rl
c3Ryb3lOb3RpZnk+KGRlc3Ryb3lWaWV3U2F2ZUFzeW5jRGF0YSkpOworCisgICAgV0tQYWdlUmVm
IHdrUGFnZSA9IHRvQVBJKHdlYmtpdFdlYlZpZXdCYXNlR2V0UGFnZShXRUJLSVRfV0VCX1ZJRVdf
QkFTRSh3ZWJWaWV3KSkpOworICAgIFdLUGFnZUdldENvbnRlbnRzQXNNSFRNTERhdGEod2tQYWdl
LCBmYWxzZSwgcmVzdWx0LCBnZXRDb250ZW50c0FzTUhUTUxEYXRhQ2FsbGJhY2spOworfQorCisv
KioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoOgorICogQHdlYl92aWV3
OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAcmVzdWx0OiBhICNHQXN5bmNSZXN1bHQKKyAqIEBlcnJv
cjogcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBvciAlTlVMTCB0byBpZ25vcmUKKyAqCisgKiBG
aW5pc2ggYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBzdGFydGVkIHdpdGggd2Via2l0X3dlYl92
aWV3X3NhdmVfdG9fZmlsZSgpLgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSB3ZWIgcGFn
ZSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkIG9uIGRpc2sgb3IgJUZBTFNFIG90aGVyd2lzZS4KKyAq
LworZ2Jvb2xlYW4gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZV9maW5pc2goV2ViS2l0V2Vi
Vmlldyogd2ViVmlldywgR0FzeW5jUmVzdWx0KiByZXN1bHQsIEdFcnJvcioqIGVycm9yKQorewor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3ZWJWaWV3KSwgRkFM
U0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZTkNfUkVTVUxUKHJlc3VsdCks
IEZBTFNFKTsKKworICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogc2ltcGxlID0gR19TSU1QTEVfQVNZ
TkNfUkVTVUxUKHJlc3VsdCk7CisgICAgZ193YXJuX2lmX2ZhaWwoZ19zaW1wbGVfYXN5bmNfcmVz
dWx0X2dldF9zb3VyY2VfdGFnKHNpbXBsZSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmls
ZSk7CisKKyAgICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3Byb3BhZ2F0ZV9lcnJvcihzaW1w
bGUsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJW
aWV3LmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmgK
aW5kZXggOTMyOGZhMS4uOGJkYWM0NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaApAQCAtMTE3LDYgKzExNywxOCBAQCB0eXBlZGVmIGVu
dW0gewogICAgIFdFQktJVF9MT0FEX0ZJTklTSEVECiB9IFdlYktpdExvYWRFdmVudDsKIAorLyoq
CisgKiBXZWJLaXRTYXZlTW9kZToKKyAqIEBXRUJLSVRfU0FWRV9NT0RFX01IVE1MOiBTYXZlIHRo
ZSBjdXJyZW50IHBhZ2UgdXNpbmcgdGhlIE1IVE1MCisgKiBmb3JtYXQuCisgKgorICogRW51bSB2
YWx1ZXMgdG8gc3BlY2lmeSB0aGUgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggYSAjV2ViS2l0V2Vi
VmlldworICogd2lsbCBiZSBzYXZlZCB0aGUgY3VycmVudCB3ZWIgcGFnZSBpbnRvIGEgc2VsZi1j
b250YWluZWQgZmlsZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBXRUJLSVRfU0FWRV9NT0RF
X01IVE1MCit9IFdlYktpdFNhdmVNb2RlOworCiBzdHJ1Y3QgX1dlYktpdFdlYlZpZXcgewogICAg
IFdlYktpdFdlYlZpZXdCYXNlIHBhcmVudDsKIApAQCAtMzE1LDYgKzMyNywzMSBAQCBXRUJLSVRf
QVBJIGdib29sZWFuCiB3ZWJraXRfd2ViX3ZpZXdfY2FuX3Nob3dfbWltZV90eXBlICAgICAgICAg
ICAgICAgICAoV2ViS2l0V2ViVmlldyAgICAgICAgICAgICAqd2ViX3ZpZXcsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAg
ICAgICAgICAgICAqbWltZV90eXBlKTsKIAorV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfd2ViX3Zp
ZXdfc2F2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViS2l0V2ViVmlldyAgICAg
ICAgICAgICAqd2ViX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgV2ViS2l0U2F2ZU1vZGUgICAgICAgICAgICAgc2F2ZV9tb2RlLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDYW5jZWxs
YWJsZSAgICAgICAgICAgICAgKmNhbmNlbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgICAgICAgIGNh
bGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGdwb2ludGVyICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7CisKK1dFQktJVF9BUEkg
R0lucHV0U3RyZWFtKgord2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoICAgICAgICAgICAgICAg
ICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAgICAgICAgKndlYl92aWV3LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBc3luY1Jlc3VsdCAg
ICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICAgICAgKiplcnJvcik7CisKK1dF
QktJVF9BUEkgdm9pZAord2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSAgICAgICAgICAgICAg
ICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAgICAgICAgKndlYl92aWV3LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGaWxlICAgICAgICAg
ICAgICAgICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgV2ViS2l0U2F2ZU1vZGUgICAgICAgICAgICAgc2F2ZV9tb2RlLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDYW5jZWxs
YWJsZSAgICAgICAgICAgICAgKmNhbmNlbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgICAgICAgIGNh
bGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGdwb2ludGVyICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7CisKK1dFQktJVF9BUEkg
Z2Jvb2xlYW4KK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoICAgICAgICAgICAg
ICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXN5bmNSZXN1bHQgICAgICAg
ICAgICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAgICAgICoqZXJyb3IpOworCiBHX0VORF9E
RUNMUwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlvbnMudHh0CmluZGV4IGFjYTM0ZGYuLjFl
N2YyYWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mv
d2Via2l0Mmd0ay1zZWN0aW9ucy50eHQKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dApAQCAtNTcsNiArNTcsNyBAQCB3ZWJr
aXRfd2ViX2NvbnRleHRfZ2V0X3R5cGUKIFdlYktpdFdlYlZpZXcKIFdlYktpdExvYWRFdmVudAog
V2ViS2l0UG9saWN5RGVjaXNpb25UeXBlCitXZWJLaXRTYXZlTW9kZQogCiA8U1VCU0VDVElPTiBF
ZGl0aW5nIENvbW1hbmRzPgogV0VCS0lUX0VESVRJTkdfQ09NTUFORF9DVVQKQEAgLTEwMCw2ICsx
MDEsMTAgQEAgd2Via2l0X3dlYl92aWV3X2dldF9qYXZhc2NyaXB0X2dsb2JhbF9jb250ZXh0CiB3
ZWJraXRfd2ViX3ZpZXdfcnVuX2phdmFzY3JpcHQKIHdlYmtpdF93ZWJfdmlld19ydW5famF2YXNj
cmlwdF9maW5pc2gKIHdlYmtpdF93ZWJfdmlld19jYW5fc2hvd19taW1lX3R5cGUKK3dlYmtpdF93
ZWJfdmlld19zYXZlCit3ZWJraXRfd2ViX3ZpZXdfc2F2ZV9maW5pc2gKK3dlYmtpdF93ZWJfdmll
d19zYXZlX3RvX2ZpbGUKK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoCiAKIDxT
VUJTRUNUSU9OIFdlYktpdEphdmFzY3JpcHRSZXN1bHQ+CiBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0
V2ViS2l0V2ViVmlldy5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0
cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAKaW5kZXggM2UxOTRhMS4uZjhjZjg2MyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZp
ZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RX
ZWJLaXRXZWJWaWV3LmNwcApAQCAtMjEsMTAgKzIxLDE0IEBACiAjaW5jbHVkZSAiV2ViVmlld1Rl
c3QuaCIKICNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1N0cmluZ1JlZi5oPgogI2luY2x1ZGUg
PEphdmFTY3JpcHRDb3JlL0pTVmFsdWVSZWYuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgog
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5o
PgogI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KIAorc3RhdGljIGNoYXIqIGtUZW1w
RGlyZWN0b3J5Oworc3RhdGljIGNoYXIqIGtTYXZlRGVzdGluYXRpb25GaWxlUGF0aDsKKwogc3Rh
dGljIHZvaWQgdGVzdFdlYlZpZXdEZWZhdWx0Q29udGV4dChXZWJWaWV3VGVzdCogdGVzdCwgZ2Nv
bnN0cG9pbnRlcikKIHsKICAgICBnX2Fzc2VydCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2NvbnRleHQo
dGVzdC0+bV93ZWJWaWV3KSA9PSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2RlZmF1bHQoKSk7CkBA
IC04NjUsOCArODY5LDgxIEBAIHN0YXRpYyB2b2lkIHRlc3RXZWJWaWV3Q2FuU2hvd01JTUVUeXBl
KFdlYlZpZXdUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogICAgIGdfYXNzZXJ0KCF3ZWJraXRf
d2ViX3ZpZXdfY2FuX3Nob3dfbWltZV90eXBlKHRlc3QtPm1fd2ViVmlldywgImFwcGxpY2F0aW9u
L29jdGV0LXN0cmVhbSIpKTsKIH0KIAorc3RhdGljIHZvaWQgd2ViVmlld1NhdmVkVG9GaWxlQ2Fs
bGJhY2soR09iamVjdCAqb2JqZWN0LCBHQXN5bmNSZXN1bHQgKnJlcywgV2ViVmlld1Rlc3QqIHRl
c3QpCit7CisgICAgR093blB0cjxHRXJyb3I+IGVycm9yOworICAgIGdfYXNzZXJ0KHdlYmtpdF93
ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoKHRlc3QtPm1fd2ViVmlldywgcmVzLCAmZXJyb3Iu
b3V0UHRyKCkpKTsKKyAgICBnX2Fzc2VydCghZXJyb3IpOworCisgICAgdGVzdC0+cXVpdE1haW5M
b29wKCk7Cit9CisKK3N0YXRpYyB2b2lkIHdlYlZpZXdTYXZlZENhbGxiYWNrKEdPYmplY3QgKm9i
amVjdCwgR0FzeW5jUmVzdWx0ICpyZXMsIFdlYlZpZXdUZXN0KiB0ZXN0KQoreworICAgIEdPd25Q
dHI8R0Vycm9yPiBlcnJvcjsKKyAgICBHUmVmUHRyPEdJbnB1dFN0cmVhbT4gaW5wdXRTdHJlYW0g
PSBhZG9wdEdSZWYod2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoKHRlc3QtPm1fd2ViVmlldywg
cmVzLCAmZXJyb3Iub3V0UHRyKCkpKTsKKyAgICBnX2Fzc2VydChHX0lTX0lOUFVUX1NUUkVBTShp
bnB1dFN0cmVhbS5nZXQoKSkpOworICAgIGdfYXNzZXJ0KCFlcnJvcik7CisKKyAgICAvLyBOb3cg
Y29tcGFyZSB5b3UgZ2V0IGV4YWN0bHkgdGhlIHNhbWUgcmVzdWx0IHRoYW4gd2hlbiBzYXZpbmcg
dG8gYSBmaWxlLgorICAgIEdSZWZQdHI8R0ZpbGU+IGZpbGUgPSBhZG9wdEdSZWYoZ19maWxlX25l
d19mb3JfcGF0aChrU2F2ZURlc3RpbmF0aW9uRmlsZVBhdGgpKTsKKyAgICBHUmVmUHRyPEdJbnB1
dFN0cmVhbT4gc2F2ZWRGaWxlSW5wdXRTdHJlYW0gPSBhZG9wdEdSZWYoR19JTlBVVF9TVFJFQU0o
Z19maWxlX3JlYWQoZmlsZS5nZXQoKSwgMCwgJmVycm9yLm91dFB0cigpKSkpOworICAgIGdfYXNz
ZXJ0KCFlcnJvcik7CisKKyAgICAvLyBXZSBzaG91bGQgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGFt
b3VudCBvZiBieXRlcyBpbiB0aGUgZmlsZQorICAgIC8vIHRoYW4gdGhvc2UgY29taW5nIGZyb20g
dGhlIEdJbnB1dFN0cmVhbS4gV2UgZG9uJ3QgY29tcGFyZSB0aGUKKyAgICAvLyBzdHJpbmdzIHJl
YWQgc2luY2UgdGhlICdEYXRlJyBmaWVsZCBhbmQgdGhlIGJvdW5kYXJpZXMgd2lsbCBiZQorICAg
IC8vIGRpZmZlcmVudCBvbiBlYWNoIGNhc2UuIE1IVE1MIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSB0
ZXN0ZWQgYnkKKyAgICAvLyBMYXlvdXQgdGVzdHMsIHNvIGNoZWNraW5nIHRoZSBhbW91bnQgb2Yg
Ynl0ZXMgaXMgZW5vdWdoLgorICAgIGdjaGFyIGJ1ZmZlcls1MTJdID0geyAwIH07CisgICAgZ3Nz
aXplIHJlYWRCeXRlcyA9IDA7CisgICAgZ3NzaXplIHRvdGFsQnl0ZXNGcm9tU3RyZWFtID0gMDsK
KyAgICB3aGlsZSAocmVhZEJ5dGVzID0gZ19pbnB1dF9zdHJlYW1fcmVhZChpbnB1dFN0cmVhbS5n
ZXQoKSwgJmJ1ZmZlciwgNTEyLCAwLCAmZXJyb3Iub3V0UHRyKCkpKSB7CisgICAgICAgIGdfYXNz
ZXJ0KCFlcnJvcik7CisgICAgICAgIHRvdGFsQnl0ZXNGcm9tU3RyZWFtICs9IHJlYWRCeXRlczsK
KyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBhIG1pbmltdW0gYW1vdW50IG9mIGJ5dGVz
IGFyZSByZWNlaXZlZCBpbiB0aGUgc3RyZWFtLgorICAgIGdfYXNzZXJ0X2NtcGludCh0b3RhbEJ5
dGVzRnJvbVN0cmVhbSwgPj0sIDIwNDgpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlsZSBl
eGlzdHMgYW5kIHRoYXQgaXQgY29udGFpbnMgYXQgbGVhc3QgdGhlIHNhbWUgYW1vdW50IG9mIGJ5
dGVzLgorICAgIEdSZWZQdHI8R0ZpbGVJbmZvPiBmaWxlSW5mbyA9IGFkb3B0R1JlZihnX2ZpbGVf
cXVlcnlfaW5mbyhmaWxlLmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX1NJWkUsIHN0
YXRpY19jYXN0PEdGaWxlUXVlcnlJbmZvRmxhZ3M+KDApLCAwLCAwKSk7CisgICAgZ19hc3NlcnRf
Y21waW50KGdfZmlsZV9pbmZvX2dldF9zaXplKGZpbGVJbmZvLmdldCgpKSwgPj0sIDIwNDgpOwor
CisgICAgZ19pbnB1dF9zdHJlYW1fY2xvc2UoaW5wdXRTdHJlYW0uZ2V0KCksIDAsIDApOworCisg
ICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RXZWJWaWV3U2F2
ZShVSUNsaWVudFRlc3QqIHRlc3QsIGdjb25zdHBvaW50ZXIpCit7CisgICAgdGVzdC0+bG9hZEh0
bWwoIjxodG1sPiIKKyAgICAgICAgICAgICAgICAgICAiPGJvZHk+IgorICAgICAgICAgICAgICAg
ICAgICIgIDxwPkEgcGFyYWdyYXBoIHdpdGggcGxhaW4gdGV4dDwvcD4iCisgICAgICAgICAgICAg
ICAgICAgIiAgPHA+IgorICAgICAgICAgICAgICAgICAgICIgICAgQSByZWQgYm94OiA8aW1nIHNy
Yz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBSUFBQUFD
Q0FJQUFBRDkxSnB6QUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDNBWVdE
VE1Wd25TWm53QUFBQjFwVkZoMFEyOXRiV1Z1ZEFBQUFBQUFRM0psWVhSbFpDQjNhWFJvSUVkSlRW
QmtMbVVIQUFBQUZrbEVRVlFJMTJQOHo4REF3TURBeE1EQXdNREFBQUFOSFFFREsrbW15QUFBQUFC
SlJVNUVya0pnZ2c9PSc+PC9icj4iCisgICAgICAgICAgICAgICAgICAgIiAgICBBIGJsdWUgYm94
OiA8aW1nIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdB
QUFBSUFBQUFDQ0FJQUFBRDkxSnB6QUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JK
VFVVSDNBWVdEVE12QkhoQUxRQUFBQjFwVkZoMFEyOXRiV1Z1ZEFBQUFBQUFRM0psWVhSbFpDQjNh
WFJvSUVkSlRWQmtMbVVIQUFBQUZrbEVRVlFJMTJOazRQblB3TURBeE1EQXdNREFBQUFMcndFUFBJ
czFwZ0FBQUFCSlJVNUVya0pnZ2c9PSc+IgorICAgICAgICAgICAgICAgICAgICIgIDwvcD4iCisg
ICAgICAgICAgICAgICAgICAgIjwvYm9keT4iCisgICAgICAgICAgICAgICAgICAgIjwvaHRtbD4i
LCAwKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWQoKTsKKworICAgIGtTYXZlRGVz
dGluYXRpb25GaWxlUGF0aCA9IGdfYnVpbGRfZmlsZW5hbWUoa1RlbXBEaXJlY3RvcnksICJ0ZXN0
V2ViVmlld1NhdmVSZXN1bHQubWh0IiwgTlVMTCk7CisgICAgR1JlZlB0cjxHRmlsZT4gZmlsZSA9
IGFkb3B0R1JlZihnX2ZpbGVfbmV3X2Zvcl9wYXRoKGtTYXZlRGVzdGluYXRpb25GaWxlUGF0aCkp
OworICAgIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUodGVzdC0+bV93ZWJWaWV3LCBmaWxl
LmdldCgpLCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVycHJldF9jYXN0PEdBc3lu
Y1JlYWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKSwgdGVzdCk7CisgICAg
dGVzdC0+d2FpdFVudGlsTWFpbkxvb3BGaW5pc2hlcygpOworCisgICAgd2Via2l0X3dlYl92aWV3
X3NhdmUodGVzdC0+bV93ZWJWaWV3LCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVy
cHJldF9jYXN0PEdBc3luY1JlYWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZENhbGxiYWNrKSwgdGVz
dCk7CisgICAgdGVzdC0+d2FpdFVudGlsTWFpbkxvb3BGaW5pc2hlcygpOworCisgICAgZ19maWxl
X2RlbGV0ZShmaWxlLmdldCgpLCAwLCAwKTsKK30KKwogdm9pZCBiZWZvcmVBbGwoKQogeworICAg
IGtUZW1wRGlyZWN0b3J5ID0gZ19kaXJfbWFrZV90bXAoIldlYktpdDJUZXN0cy1YWFhYWFgiLCAw
KTsKKyAgICBnX2Fzc2VydChrVGVtcERpcmVjdG9yeSk7CisKICAgICBXZWJWaWV3VGVzdDo6YWRk
KCJXZWJLaXRXZWJWaWV3IiwgImRlZmF1bHQtY29udGV4dCIsIHRlc3RXZWJWaWV3RGVmYXVsdENv
bnRleHQpOwogICAgIFdlYlZpZXdUZXN0OjphZGQoIldlYktpdFdlYlZpZXciLCAiY3VzdG9tLWNo
YXJzZXQiLCB0ZXN0V2ViVmlld0N1c3RvbUNoYXJzZXQpOwogICAgIFdlYlZpZXdUZXN0OjphZGQo
IldlYktpdFdlYlZpZXciLCAic2V0dGluZ3MiLCB0ZXN0V2ViVmlld1NldHRpbmdzKTsKQEAgLTg4
Myw4ICs5NjAsMTAgQEAgdm9pZCBiZWZvcmVBbGwoKQogICAgIEZpbGVDaG9vc2VyVGVzdDo6YWRk
KCJXZWJLaXRXZWJWaWV3IiwgImZpbGUtY2hvb3Nlci1yZXF1ZXN0IiwgdGVzdFdlYlZpZXdGaWxl
Q2hvb3NlclJlcXVlc3QpOwogICAgIEZ1bGxTY3JlZW5DbGllbnRUZXN0OjphZGQoIldlYktpdFdl
YlZpZXciLCAiZnVsbHNjcmVlbiIsIHRlc3RXZWJWaWV3RnVsbFNjcmVlbik7CiAgICAgV2ViVmll
d1Rlc3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJjYW4tc2hvdy1taW1lLXR5cGUiLCB0ZXN0V2Vi
Vmlld0NhblNob3dNSU1FVHlwZSk7CisgICAgVUlDbGllbnRUZXN0OjphZGQoIldlYktpdFdlYlZp
ZXciLCAic2F2ZSIsIHRlc3RXZWJWaWV3U2F2ZSk7CiB9CiAKIHZvaWQgYWZ0ZXJBbGwoKQogewor
ICAgIGdfcm1kaXIoa1RlbXBEaXJlY3RvcnkpOwogfQotLSAKMS43LjEwLjIKCg==
</data>
<flag name="commit-queue"
          id="157547"
          type_id="3"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>149551</attachid>
            <date>2012-06-26 10:14:07 -0700</date>
            <delta_ts>2012-08-08 00:22:57 -0700</delta_ts>
            <desc>Patch Proposal + Unit Tests + Documentation</desc>
            <filename>0001-2012-06-25-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>19775</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA2YTJmMTc2MTViMzZmN2E3MWE0ZjU4YTcyZjNlZjU4ZmM5NWQ1MGU1IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDI1IEp1biAyMDEyIDE1OjA5OjExICswMjAwClN1YmplY3Q6IFtQQVRD
SCAxLzNdIDIwMTItMDYtMjUgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgoKICAgICAgICBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIg
cGFnZSB1c2luZyBNSFRNTAogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD04OTg3MwoKICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCiAgICAg
ICAgSW1wbGVtZW50ZWQgbmV3IGFzeW5jaHJvbm91cyBBUEkgaW4gV2ViS2l0V2ViVmlldy4KCiAg
ICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcDoKICAgICAgICAoVmll
d1NhdmVBc3luY0RhdGEpOgogICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgogICAg
ICAgICh3ZWJWaWV3TUhUTUxEYXRhR290Q2FsbGJhY2spOgogICAgICAgICh3ZWJraXRfd2ViX3Zp
ZXdfc2F2ZSk6CiAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CiAgICAgICAg
KHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpOgogICAgICAgICh3ZWJraXRfd2ViX3ZpZXdf
c2F2ZV90b19maWxlX2ZpbmlzaCk6CiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRX
ZWJWaWV3Lmg6CgogICAgICAgIEFkZGVkIG5ldyB1bml0IHRlc3QuCgogICAgICAgICogVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwOgogICAgICAgICh3ZWJWaWV3
U2F2ZWRUb0ZpbGVDYWxsYmFjayk6CiAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxiYWNrKToKICAg
ICAgICAodGVzdFdlYlZpZXdTYXZlKToKICAgICAgICAoYmVmb3JlQWxsKToKICAgICAgICAoYWZ0
ZXJBbGwpOgoKICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBuZXcgc3lt
Ym9scy4KCiAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlv
bnMudHh0OgotLS0KIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAzMiArKysrCiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3LmNwcCB8ICAxNjkgKysrKysrKysrKysrKysrKysrKysKIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaCAgIHwgICAzNyArKysrKwogLi4uL1VJ
UHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQgfCAgICA1ICsKIC4u
Li9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAgIHwgICA3OSAr
KysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMzIyIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5k
ZXggNDdiMTFlNy4uZTYxY2FjNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9n
CisrKyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM3IEBACiAyMDEyLTA2
LTI1ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KIAorICAgICAg
ICBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIgcGFnZSB1c2luZyBN
SFRNTAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODk4
NzMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBs
ZW1lbnRlZCBuZXcgYXN5bmNocm9ub3VzIEFQSSBpbiBXZWJLaXRXZWJWaWV3LgorCisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHA6CisgICAgICAgIChWaWV3U2F2
ZUFzeW5jRGF0YSk6CisgICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgorICAgICAg
ICAod2ViVmlld01IVE1MRGF0YUdvdENhbGxiYWNrKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmll
d19zYXZlKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CisgICAgICAg
ICh3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmll
d19zYXZlX3RvX2ZpbGVfZmluaXNoKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3Lmg6CisKKyAgICAgICAgQWRkZWQgbmV3IHVuaXQgdGVzdC4KKworICAgICAgICAq
IFVJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcDoKKyAgICAgICAg
KHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKToKKyAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxi
YWNrKToKKyAgICAgICAgKHRlc3RXZWJWaWV3U2F2ZSk6CisgICAgICAgIChiZWZvcmVBbGwpOgor
ICAgICAgICAoYWZ0ZXJBbGwpOgorCisgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl
cyB3aXRoIG5ldyBzeW1ib2xzLgorCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93
ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dDoKKworMjAxMi0wNi0yNSAgTWFyaW8gU2FuY2hleiBQcmFk
YSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CisKICAgICAgICAgW1dLMl0gQWRkIG5ldyBDIEFQSSB0
byBnZW5lcmF0ZSBNSFRNTCBkYXRhIGZyb20gdGhlIFVJIHByb2Nlc3MKICAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg5ODcyCiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3BwIGIvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHAKaW5kZXggOTRhOTRj
YS4uNzI0MDhkNmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3Rr
L1dlYktpdFdlYlZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3Rr
L1dlYktpdFdlYlZpZXcuY3BwCkBAIC0yMjU4LDMgKzIyNTgsMTcyIEBAIGdib29sZWFuIHdlYmtp
dF93ZWJfdmlld19jYW5fc2hvd19taW1lX3R5cGUoV2ViS2l0V2ViVmlldyogd2ViVmlldywgY29u
c3QgY2hhcioKICAgICBXZWJQYWdlUHJveHkqIHBhZ2UgPSB3ZWJraXRXZWJWaWV3QmFzZUdldFBh
Z2UoV0VCS0lUX1dFQl9WSUVXX0JBU0Uod2ViVmlldykpOwogICAgIHJldHVybiBwYWdlLT5jYW5T
aG93TUlNRVR5cGUoU3RyaW5nOjpmcm9tVVRGOChtaW1lVHlwZSkpOwogfQorCitzdHJ1Y3QgVmll
d1NhdmVBc3luY0RhdGEgeworICAgIFdLUmV0YWluUHRyPFdLRGF0YVJlZj4gd2tEYXRhOworICAg
IEdSZWZQdHI8R0ZpbGU+IGZpbGU7CisgICAgR1JlZlB0cjxHQ2FuY2VsbGFibGU+IGNhbmNlbGxh
YmxlOworfTsKK1dFQktJVF9ERUZJTkVfQVNZTkNfREFUQV9TVFJVQ1QoVmlld1NhdmVBc3luY0Rh
dGEpCisKK3N0YXRpYyB2b2lkIGZpbGVSZXBsYWNlQ29udGVudHNDYWxsYmFjayhHT2JqZWN0KiBv
YmplY3QsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBncG9pbnRlciBkYXRhKQoreworICAgIEdGaWxl
KiBmaWxlID0gR19GSUxFKG9iamVjdCk7CisgICAgR1JlZlB0cjxHU2ltcGxlQXN5bmNSZXN1bHQ+
IHNhdmVkVG9GaWxlUmVzdWx0ID0gYWRvcHRHUmVmKEdfU0lNUExFX0FTWU5DX1JFU1VMVChkYXRh
KSk7CisKKyAgICBHRXJyb3IqIGVycm9yID0gMDsKKyAgICBpZiAoIWdfZmlsZV9yZXBsYWNlX2Nv
bnRlbnRzX2ZpbmlzaChmaWxlLCByZXN1bHQsIDAsICZlcnJvcikpCisgICAgICAgIGdfc2ltcGxl
X2FzeW5jX3Jlc3VsdF90YWtlX2Vycm9yKHNhdmVkVG9GaWxlUmVzdWx0LmdldCgpLCBlcnJvcik7
CisKKyAgICBnX3NpbXBsZV9hc3luY19yZXN1bHRfY29tcGxldGUoc2F2ZWRUb0ZpbGVSZXN1bHQu
Z2V0KCkpOworfQorCitzdGF0aWMgdm9pZCBnZXRDb250ZW50c0FzTUhUTUxEYXRhQ2FsbGJhY2so
V0tEYXRhUmVmIHdrRGF0YSwgV0tFcnJvclJlZiwgdm9pZCogY29udGV4dCkKK3sKKyAgICBHUmVm
UHRyPEdTaW1wbGVBc3luY1Jlc3VsdD4gcmVzdWx0ID0gYWRvcHRHUmVmKEdfU0lNUExFX0FTWU5D
X1JFU1VMVChjb250ZXh0KSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRhdGEgPSBzdGF0aWNf
Y2FzdDxWaWV3U2F2ZUFzeW5jRGF0YSo+KGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9nZXRfb3BfcmVz
X2dwb2ludGVyKHJlc3VsdC5nZXQoKSkpOworICAgIEdFcnJvciogZXJyb3IgPSAwOworCisgICAg
aWYgKGdfY2FuY2VsbGFibGVfc2V0X2Vycm9yX2lmX2NhbmNlbGxlZChkYXRhLT5jYW5jZWxsYWJs
ZS5nZXQoKSwgJmVycm9yKSkKKyAgICAgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3Rha2VfZXJy
b3IocmVzdWx0LmdldCgpLCBlcnJvcik7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFdlIG5lZWQg
dG8gcmV0YWluIHRoZSBkYXRhIHVudGlsIHRoZSBhc3luY3Jvbm91cyBwcm9jZXNzCisgICAgICAg
IC8vIGluaXRpYXRlZCBieSB0aGUgdXNlciBoYXMgZmluaXNoZWQgY29tcGxldGVseS4KKyAgICAg
ICAgZGF0YS0+d2tEYXRhID0gd2tEYXRhOworCisgICAgICAgIC8vIElmIHdlIGFyZSBzYXZpbmcg
dG8gYSBmaWxlIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGRhdGEgb24gZGlzayBiZWZvcmUgZmluaXNo
aW5nLgorICAgICAgICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9zb3VyY2VfdGFnKHJl
c3VsdC5nZXQoKSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSkgeworICAgICAgICAg
ICAgQVNTRVJUKEdfSVNfRklMRShkYXRhLT5maWxlLmdldCgpKSk7CisgICAgICAgICAgICBnX2Zp
bGVfcmVwbGFjZV9jb250ZW50c19hc3luYyhkYXRhLT5maWxlLmdldCgpLCByZWludGVycHJldF9j
YXN0PGNvbnN0IGdjaGFyKj4oV0tEYXRhR2V0Qnl0ZXMoZGF0YS0+d2tEYXRhLmdldCgpKSksIFdL
RGF0YUdldFNpemUoZGF0YS0+d2tEYXRhLmdldCgpKSwgMCwgRkFMU0UsIEdfRklMRV9DUkVBVEVf
UkVQTEFDRV9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGEtPmNhbmNlbGxhYmxlLmdldCgpLCBmaWxlUmVwbGFjZUNvbnRlbnRzQ2FsbGJh
Y2ssIGdfb2JqZWN0X3JlZihyZXN1bHQuZ2V0KCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9jb21wbGV0ZShyZXN1
bHQuZ2V0KCkpOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlOgorICogQHdlYl92
aWV3OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAc2F2ZV9tb2RlOiB0aGUgI1dlYktpdFNhdmVNb2Rl
IHNwZWNpZnlpbmcgaG93IHRoZSB3ZWIgcGFnZSBzaG91bGQgYmUgc2F2ZWQuCisgKiBAY2FuY2Vs
bGFibGU6IChhbGxvdy1ub25lKTogYSAjR0NhbmNlbGxhYmxlIG9yICVOVUxMIHRvIGlnbm9yZQor
ICogQGNhbGxiYWNrOiAoc2NvcGUgYXN5bmMpOiBhICNHQXN5bmNSZWFkeUNhbGxiYWNrIHRvIGNh
bGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBzYXRpc2ZpZWQKKyAqIEB1c2VyX2RhdGE6IChjbG9zdXJl
KTogdGhlIGRhdGEgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIEFzeW5jaHJv
bm91c2x5IHNhdmUgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgYXNzb2NpYXRlZCB0byB0aGUKKyAqICNX
ZWJLaXRXZWJWaWV3IGludG8gYSBzZWxmLWNvbnRhaW5lZCBmb3JtYXQgdXNpbmcgdGhlIG1vZGUK
KyAqIHNwZWNpZmllZCBpbiAjV2ViS2l0U2F2ZU1vZGUuCisgKgorICogV2hlbiB0aGUgb3BlcmF0
aW9uIGlzIGZpbmlzaGVkLCBAY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuIFlvdSBjYW4KKyAqIHRo
ZW4gY2FsbCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV9maW5pc2goKSB0byBnZXQgdGhlIHJlc3VsdCBv
ZiB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLwordm9pZCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZShXZWJL
aXRXZWJWaWV3KiB3ZWJWaWV3LCBXZWJLaXRTYXZlTW9kZSBzYXZlTW9kZSwgR0NhbmNlbGxhYmxl
KiBjYW5jZWxsYWJsZSwgR0FzeW5jUmVhZHlDYWxsYmFjayBjYWxsYmFjaywgZ3BvaW50ZXIgdXNl
ckRhdGEpCit7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmll
dykpOworCisgICAgLy8gV2Ugb25seSBzdXBwb3J0IE1IVE1MIGF0IHRoZSBtb21lbnQuCisgICAg
Z19yZXR1cm5faWZfZmFpbChzYXZlTW9kZSA9PSBXRUJLSVRfU0FWRV9NT0RFX01IVE1MKTsKKwor
ICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogcmVzdWx0ID0gZ19zaW1wbGVfYXN5bmNfcmVzdWx0X25l
dyhHX09CSkVDVCh3ZWJWaWV3KSwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9j
YXN0PGdwb2ludGVyPih3ZWJraXRfd2ViX3ZpZXdfc2F2ZSkpOworICAgIFZpZXdTYXZlQXN5bmNE
YXRhKiBkYXRhID0gY3JlYXRlVmlld1NhdmVBc3luY0RhdGEoKTsKKyAgICBkYXRhLT5jYW5jZWxs
YWJsZSA9IGNhbmNlbGxhYmxlOworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9zZXRfb3BfcmVz
X2dwb2ludGVyKHJlc3VsdCwgZGF0YSwgcmVpbnRlcnByZXRfY2FzdDxHRGVzdHJveU5vdGlmeT4o
ZGVzdHJveVZpZXdTYXZlQXN5bmNEYXRhKSk7CisKKyAgICBXS1BhZ2VSZWYgd2tQYWdlID0gdG9B
UEkod2Via2l0V2ViVmlld0Jhc2VHZXRQYWdlKFdFQktJVF9XRUJfVklFV19CQVNFKHdlYlZpZXcp
KSk7CisgICAgV0tQYWdlR2V0Q29udGVudHNBc01IVE1MRGF0YSh3a1BhZ2UsIGZhbHNlLCByZXN1
bHQsIGdldENvbnRlbnRzQXNNSFRNTERhdGFDYWxsYmFjayk7Cit9CisKKy8qKgorICogd2Via2l0
X3dlYl92aWV3X3NhdmVfZmluaXNoOgorICogQHdlYl92aWV3OiBhICNXZWJLaXRXZWJWaWV3Cisg
KiBAcmVzdWx0OiBhICNHQXN5bmNSZXN1bHQKKyAqIEBlcnJvcjogcmV0dXJuIGxvY2F0aW9uIGZv
ciBlcnJvciBvciAlTlVMTCB0byBpZ25vcmUKKyAqCisgKiBGaW5pc2ggYW4gYXN5bmNocm9ub3Vz
IG9wZXJhdGlvbiBzdGFydGVkIHdpdGggd2Via2l0X3dlYl92aWV3X3NhdmUoKS4KKyAqCisgKiBS
ZXR1cm5zOiAodHJhbnNmZXIgZnVsbCk6IGEgI0dJbnB1dFN0cmVhbSB3aXRoIHRoZSByZXN1bHQg
b2Ygc2F2aW5nCisgKiAgICB0aGUgY3VycmVudCB3ZWIgcGFnZSBvciAlTlVMTCBpbiBjYXNlIG9m
IGVycm9yLgorICovCitHSW5wdXRTdHJlYW0qIHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaChX
ZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBHQXN5bmNSZXN1bHQqIHJlc3VsdCwgR0Vycm9yKiogZXJy
b3IpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZp
ZXcpLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChHX0lTX0FTWU5DX1JFU1VMVChyZXN1
bHQpLCAwKTsKKworICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogc2ltcGxlID0gR19TSU1QTEVfQVNZ
TkNfUkVTVUxUKHJlc3VsdCk7CisgICAgZ193YXJuX2lmX2ZhaWwoZ19zaW1wbGVfYXN5bmNfcmVz
dWx0X2dldF9zb3VyY2VfdGFnKHNpbXBsZSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmUpOworCisg
ICAgaWYgKGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9wcm9wYWdhdGVfZXJyb3Ioc2ltcGxlLCBlcnJv
cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgR0lucHV0U3RyZWFtKiBkYXRhU3RyZWFtID0g
Z19tZW1vcnlfaW5wdXRfc3RyZWFtX25ldygpOworICAgIFZpZXdTYXZlQXN5bmNEYXRhKiBkYXRh
ID0gc3RhdGljX2Nhc3Q8Vmlld1NhdmVBc3luY0RhdGEqPihnX3NpbXBsZV9hc3luY19yZXN1bHRf
Z2V0X29wX3Jlc19ncG9pbnRlcihzaW1wbGUpKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBn
c2l6ZSBsZW5ndGggPSBXS0RhdGFHZXRTaXplKGRhdGEtPndrRGF0YS5nZXQoKSk7CisgICAgICAg
IGdfbWVtb3J5X2lucHV0X3N0cmVhbV9hZGRfZGF0YShHX01FTU9SWV9JTlBVVF9TVFJFQU0oZGF0
YVN0cmVhbSksIGdfbWVtZHVwKFdLRGF0YUdldEJ5dGVzKGRhdGEtPndrRGF0YS5nZXQoKSksIGxl
bmd0aCksIGxlbmd0aCwgZ19mcmVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YVN0cmVhbTsK
K30KKworLyoqCisgKiB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlOgorICogQHdlYl92aWV3
OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAZmlsZTogdGhlICNHRmlsZSB3aGVyZSB0aGUgY3VycmVu
dCB3ZWIgcGFnZSBzaG91bGQgYmUgc2F2ZWQgdG8uCisgKiBAc2F2ZV9tb2RlOiB0aGUgI1dlYktp
dFNhdmVNb2RlIHNwZWNpZnlpbmcgaG93IHRoZSB3ZWIgcGFnZSBzaG91bGQgYmUgc2F2ZWQuCisg
KiBAY2FuY2VsbGFibGU6IChhbGxvdy1ub25lKTogYSAjR0NhbmNlbGxhYmxlIG9yICVOVUxMIHRv
IGlnbm9yZQorICogQGNhbGxiYWNrOiAoc2NvcGUgYXN5bmMpOiBhICNHQXN5bmNSZWFkeUNhbGxi
YWNrIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBzYXRpc2ZpZWQKKyAqIEB1c2VyX2RhdGE6
IChjbG9zdXJlKTogdGhlIGRhdGEgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAq
IEFzeW5jaHJvbm91c2x5IHNhdmUgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgYXNzb2NpYXRlZCB0byB0
aGUKKyAqICNXZWJLaXRXZWJWaWV3IGludG8gYSBzZWxmLWNvbnRhaW5lZCBmb3JtYXQgdXNpbmcg
dGhlIG1vZGUKKyAqIHNwZWNpZmllZCBpbiAjV2ViS2l0U2F2ZU1vZGUgYW5kIHdyaXRpbmcgaXQg
dG8gQGZpbGUuCisgKgorICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBAY2FsbGJh
Y2sgd2lsbCBiZSBjYWxsZWQuIFlvdSBjYW4KKyAqIHRoZW4gY2FsbCB3ZWJraXRfd2ViX3ZpZXdf
c2F2ZV90b19maWxlX2ZpbmlzaCgpIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZQorICogb3BlcmF0
aW9uLgorICovCit2b2lkIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUoV2ViS2l0V2ViVmll
dyogd2ViVmlldywgR0ZpbGUqIGZpbGUsIFdlYktpdFNhdmVNb2RlIHNhdmVNb2RlLCBHQ2FuY2Vs
bGFibGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRl
ciB1c2VyRGF0YSkKK3sKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3
ZWJWaWV3KSk7CisgICAgZ19yZXR1cm5faWZfZmFpbChHX0lTX0ZJTEUoZmlsZSkpOworCisgICAg
Ly8gV2Ugb25seSBzdXBwb3J0IE1IVE1MIGF0IHRoZSBtb21lbnQuCisgICAgZ19yZXR1cm5faWZf
ZmFpbChzYXZlTW9kZSA9PSBXRUJLSVRfU0FWRV9NT0RFX01IVE1MKTsKKworICAgIEdTaW1wbGVB
c3luY1Jlc3VsdCogcmVzdWx0ID0gZ19zaW1wbGVfYXN5bmNfcmVzdWx0X25ldyhHX09CSkVDVCh3
ZWJWaWV3KSwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGdwb2ludGVy
Pih3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEq
IGRhdGEgPSBjcmVhdGVWaWV3U2F2ZUFzeW5jRGF0YSgpOworICAgIGRhdGEtPmZpbGUgPSBmaWxl
OworICAgIGRhdGEtPmNhbmNlbGxhYmxlID0gY2FuY2VsbGFibGU7CisgICAgZ19zaW1wbGVfYXN5
bmNfcmVzdWx0X3NldF9vcF9yZXNfZ3BvaW50ZXIocmVzdWx0LCBkYXRhLCByZWludGVycHJldF9j
YXN0PEdEZXN0cm95Tm90aWZ5PihkZXN0cm95Vmlld1NhdmVBc3luY0RhdGEpKTsKKworICAgIFdL
UGFnZVJlZiB3a1BhZ2UgPSB0b0FQSSh3ZWJraXRXZWJWaWV3QmFzZUdldFBhZ2UoV0VCS0lUX1dF
Ql9WSUVXX0JBU0Uod2ViVmlldykpKTsKKyAgICBXS1BhZ2VHZXRDb250ZW50c0FzTUhUTUxEYXRh
KHdrUGFnZSwgZmFsc2UsIHJlc3VsdCwgZ2V0Q29udGVudHNBc01IVE1MRGF0YUNhbGxiYWNrKTsK
K30KKworLyoqCisgKiB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaDoKKyAqIEB3
ZWJfdmlldzogYSAjV2ViS2l0V2ViVmlldworICogQHJlc3VsdDogYSAjR0FzeW5jUmVzdWx0Cisg
KiBAZXJyb3I6IHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3Igb3IgJU5VTEwgdG8gaWdub3JlCisg
KgorICogRmluaXNoIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIHdlYmtp
dF93ZWJfdmlld19zYXZlX3RvX2ZpbGUoKS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUg
d2ViIHBhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZCBvbiBkaXNrIG9yICVGQUxTRSBvdGhlcndp
c2UuCisgKi8KK2dib29sZWFuIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoKFdl
YktpdFdlYlZpZXcqIHdlYlZpZXcsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBHRXJyb3IqKiBlcnJv
cikKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmll
dyksIEZBTFNFKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChHX0lTX0FTWU5DX1JFU1VMVChy
ZXN1bHQpLCBGQUxTRSk7CisKKyAgICBHU2ltcGxlQXN5bmNSZXN1bHQqIHNpbXBsZSA9IEdfU0lN
UExFX0FTWU5DX1JFU1VMVChyZXN1bHQpOworICAgIGdfd2Fybl9pZl9mYWlsKGdfc2ltcGxlX2Fz
eW5jX3Jlc3VsdF9nZXRfc291cmNlX3RhZyhzaW1wbGUpID09IHdlYmtpdF93ZWJfdmlld19zYXZl
X3RvX2ZpbGUpOworCisgICAgaWYgKGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9wcm9wYWdhdGVfZXJy
b3Ioc2ltcGxlLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBU
UlVFOworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2Vi
S2l0V2ViVmlldy5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2Vi
Vmlldy5oCmluZGV4IDkzMjhmYTEuLjhiZGFjNDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmgKQEAgLTExNyw2ICsxMTcsMTggQEAgdHlw
ZWRlZiBlbnVtIHsKICAgICBXRUJLSVRfTE9BRF9GSU5JU0hFRAogfSBXZWJLaXRMb2FkRXZlbnQ7
CiAKKy8qKgorICogV2ViS2l0U2F2ZU1vZGU6CisgKiBAV0VCS0lUX1NBVkVfTU9ERV9NSFRNTDog
U2F2ZSB0aGUgY3VycmVudCBwYWdlIHVzaW5nIHRoZSBNSFRNTAorICogZm9ybWF0LgorICoKKyAq
IEVudW0gdmFsdWVzIHRvIHNwZWNpZnkgdGhlIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIGEgI1dl
YktpdFdlYlZpZXcKKyAqIHdpbGwgYmUgc2F2ZWQgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgaW50byBh
IHNlbGYtY29udGFpbmVkIGZpbGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgV0VCS0lUX1NB
VkVfTU9ERV9NSFRNTAorfSBXZWJLaXRTYXZlTW9kZTsKKwogc3RydWN0IF9XZWJLaXRXZWJWaWV3
IHsKICAgICBXZWJLaXRXZWJWaWV3QmFzZSBwYXJlbnQ7CiAKQEAgLTMxNSw2ICszMjcsMzEgQEAg
V0VCS0lUX0FQSSBnYm9vbGVhbgogd2Via2l0X3dlYl92aWV3X2Nhbl9zaG93X21pbWVfdHlwZSAg
ICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAgICAgICAgKndlYl92aWV3LAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdj
aGFyICAgICAgICAgICAgICAgKm1pbWVfdHlwZSk7CiAKK1dFQktJVF9BUEkgdm9pZAord2Via2l0
X3dlYl92aWV3X3NhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYktpdFdlYlZp
ZXcgICAgICAgICAgICAgKndlYl92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdlYktpdFNhdmVNb2RlICAgICAgICAgICAgIHNhdmVfbW9k
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBH
Q2FuY2VsbGFibGUgICAgICAgICAgICAgICpjYW5jZWxsYWJsZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXN5bmNSZWFkeUNhbGxiYWNrICAg
ICAgICBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBncG9pbnRlciAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOworCitXRUJL
SVRfQVBJIEdJbnB1dFN0cmVhbSoKK3dlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCAgICAgICAg
ICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXN5bmNS
ZXN1bHQgICAgICAgICAgICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAgICAgICoqZXJyb3Ip
OworCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUgICAgICAg
ICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRmlsZSAg
ICAgICAgICAgICAgICAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdlYktpdFNhdmVNb2RlICAgICAgICAgICAgIHNhdmVfbW9k
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBH
Q2FuY2VsbGFibGUgICAgICAgICAgICAgICpjYW5jZWxsYWJsZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXN5bmNSZWFkeUNhbGxiYWNrICAg
ICAgICBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBncG9pbnRlciAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOworCitXRUJL
SVRfQVBJIGdib29sZWFuCit3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaCAgICAg
ICAgICAgICAgICAoV2ViS2l0V2ViVmlldyAgICAgICAgICAgICAqd2ViX3ZpZXcsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FzeW5jUmVzdWx0
ICAgICAgICAgICAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgICAgICAqKmVycm9yKTsKKwog
R19FTkRfREVDTFMKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlvbnMudHh0IGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dAppbmRleCBhY2Ez
NGRmLi4xZTdmMmFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay9kb2NzL3dlYmtpdDJndGstc2VjdGlvbnMudHh0CisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQKQEAgLTU3LDYgKzU3LDcg
QEAgd2Via2l0X3dlYl9jb250ZXh0X2dldF90eXBlCiBXZWJLaXRXZWJWaWV3CiBXZWJLaXRMb2Fk
RXZlbnQKIFdlYktpdFBvbGljeURlY2lzaW9uVHlwZQorV2ViS2l0U2F2ZU1vZGUKIAogPFNVQlNF
Q1RJT04gRWRpdGluZyBDb21tYW5kcz4KIFdFQktJVF9FRElUSU5HX0NPTU1BTkRfQ1VUCkBAIC0x
MDAsNiArMTAxLDEwIEBAIHdlYmtpdF93ZWJfdmlld19nZXRfamF2YXNjcmlwdF9nbG9iYWxfY29u
dGV4dAogd2Via2l0X3dlYl92aWV3X3J1bl9qYXZhc2NyaXB0CiB3ZWJraXRfd2ViX3ZpZXdfcnVu
X2phdmFzY3JpcHRfZmluaXNoCiB3ZWJraXRfd2ViX3ZpZXdfY2FuX3Nob3dfbWltZV90eXBlCit3
ZWJraXRfd2ViX3ZpZXdfc2F2ZQord2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoCit3ZWJraXRf
d2ViX3ZpZXdfc2F2ZV90b19maWxlCit3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2Zpbmlz
aAogCiA8U1VCU0VDVElPTiBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0PgogV2ViS2l0SmF2YXNjcmlw
dFJlc3VsdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvdGVz
dHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9n
dGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwCmluZGV4IDNlMTk0YTEuLmY4Y2Y4NjMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJL
aXRXZWJWaWV3LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0
cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAKQEAgLTIxLDEwICsyMSwxNCBAQAogI2luY2x1ZGUgIldl
YlZpZXdUZXN0LmgiCiAjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdSZWYuaD4KICNp
bmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1ZhbHVlUmVmLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3Rk
aW8uaD4KICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dS
ZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKK3N0YXRpYyBjaGFy
KiBrVGVtcERpcmVjdG9yeTsKK3N0YXRpYyBjaGFyKiBrU2F2ZURlc3RpbmF0aW9uRmlsZVBhdGg7
CisKIHN0YXRpYyB2b2lkIHRlc3RXZWJWaWV3RGVmYXVsdENvbnRleHQoV2ViVmlld1Rlc3QqIHRl
c3QsIGdjb25zdHBvaW50ZXIpCiB7CiAgICAgZ19hc3NlcnQod2Via2l0X3dlYl92aWV3X2dldF9j
b250ZXh0KHRlc3QtPm1fd2ViVmlldykgPT0gd2Via2l0X3dlYl9jb250ZXh0X2dldF9kZWZhdWx0
KCkpOwpAQCAtODY1LDggKzg2OSw4MSBAQCBzdGF0aWMgdm9pZCB0ZXN0V2ViVmlld0NhblNob3dN
SU1FVHlwZShXZWJWaWV3VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKICAgICBnX2Fzc2VydCgh
d2Via2l0X3dlYl92aWV3X2Nhbl9zaG93X21pbWVfdHlwZSh0ZXN0LT5tX3dlYlZpZXcsICJhcHBs
aWNhdGlvbi9vY3RldC1zdHJlYW0iKSk7CiB9CiAKK3N0YXRpYyB2b2lkIHdlYlZpZXdTYXZlZFRv
RmlsZUNhbGxiYWNrKEdPYmplY3QgKm9iamVjdCwgR0FzeW5jUmVzdWx0ICpyZXMsIFdlYlZpZXdU
ZXN0KiB0ZXN0KQoreworICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKyAgICBnX2Fzc2VydCh3
ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaCh0ZXN0LT5tX3dlYlZpZXcsIHJlcywg
JmVycm9yLm91dFB0cigpKSk7CisgICAgZ19hc3NlcnQoIWVycm9yKTsKKworICAgIHRlc3QtPnF1
aXRNYWluTG9vcCgpOworfQorCitzdGF0aWMgdm9pZCB3ZWJWaWV3U2F2ZWRDYWxsYmFjayhHT2Jq
ZWN0ICpvYmplY3QsIEdBc3luY1Jlc3VsdCAqcmVzLCBXZWJWaWV3VGVzdCogdGVzdCkKK3sKKyAg
ICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisgICAgR1JlZlB0cjxHSW5wdXRTdHJlYW0+IGlucHV0
U3RyZWFtID0gYWRvcHRHUmVmKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCh0ZXN0LT5tX3dl
YlZpZXcsIHJlcywgJmVycm9yLm91dFB0cigpKSk7CisgICAgZ19hc3NlcnQoR19JU19JTlBVVF9T
VFJFQU0oaW5wdXRTdHJlYW0uZ2V0KCkpKTsKKyAgICBnX2Fzc2VydCghZXJyb3IpOworCisgICAg
Ly8gTm93IGNvbXBhcmUgeW91IGdldCBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCB0aGFuIHdoZW4g
c2F2aW5nIHRvIGEgZmlsZS4KKyAgICBHUmVmUHRyPEdGaWxlPiBmaWxlID0gYWRvcHRHUmVmKGdf
ZmlsZV9uZXdfZm9yX3BhdGgoa1NhdmVEZXN0aW5hdGlvbkZpbGVQYXRoKSk7CisgICAgR1JlZlB0
cjxHSW5wdXRTdHJlYW0+IHNhdmVkRmlsZUlucHV0U3RyZWFtID0gYWRvcHRHUmVmKEdfSU5QVVRf
U1RSRUFNKGdfZmlsZV9yZWFkKGZpbGUuZ2V0KCksIDAsICZlcnJvci5vdXRQdHIoKSkpKTsKKyAg
ICBnX2Fzc2VydCghZXJyb3IpOworCisgICAgLy8gV2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUg
c2FtZSBhbW91bnQgb2YgYnl0ZXMgaW4gdGhlIGZpbGUKKyAgICAvLyB0aGFuIHRob3NlIGNvbWlu
ZyBmcm9tIHRoZSBHSW5wdXRTdHJlYW0uIFdlIGRvbid0IGNvbXBhcmUgdGhlCisgICAgLy8gc3Ry
aW5ncyByZWFkIHNpbmNlIHRoZSAnRGF0ZScgZmllbGQgYW5kIHRoZSBib3VuZGFyaWVzIHdpbGwg
YmUKKyAgICAvLyBkaWZmZXJlbnQgb24gZWFjaCBjYXNlLiBNSFRNTCBmdW5jdGlvbmFsaXR5IHdp
bGwgYmUgdGVzdGVkIGJ5CisgICAgLy8gTGF5b3V0IHRlc3RzLCBzbyBjaGVja2luZyB0aGUgYW1v
dW50IG9mIGJ5dGVzIGlzIGVub3VnaC4KKyAgICBnY2hhciBidWZmZXJbNTEyXSA9IHsgMCB9Owor
ICAgIGdzc2l6ZSByZWFkQnl0ZXMgPSAwOworICAgIGdzc2l6ZSB0b3RhbEJ5dGVzRnJvbVN0cmVh
bSA9IDA7CisgICAgd2hpbGUgKHJlYWRCeXRlcyA9IGdfaW5wdXRfc3RyZWFtX3JlYWQoaW5wdXRT
dHJlYW0uZ2V0KCksICZidWZmZXIsIDUxMiwgMCwgJmVycm9yLm91dFB0cigpKSkgeworICAgICAg
ICBnX2Fzc2VydCghZXJyb3IpOworICAgICAgICB0b3RhbEJ5dGVzRnJvbVN0cmVhbSArPSByZWFk
Qnl0ZXM7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYSBtaW5pbXVtIGFtb3VudCBv
ZiBieXRlcyBhcmUgcmVjZWl2ZWQgaW4gdGhlIHN0cmVhbS4KKyAgICBnX2Fzc2VydF9jbXBpbnQo
dG90YWxCeXRlc0Zyb21TdHJlYW0sID49LCAyMDQ4KTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhl
IGZpbGUgZXhpc3RzIGFuZCB0aGF0IGl0IGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBzYW1lIGFtb3Vu
dCBvZiBieXRlcy4KKyAgICBHUmVmUHRyPEdGaWxlSW5mbz4gZmlsZUluZm8gPSBhZG9wdEdSZWYo
Z19maWxlX3F1ZXJ5X2luZm8oZmlsZS5nZXQoKSwgR19GSUxFX0FUVFJJQlVURV9TVEFOREFSRF9T
SVpFLCBzdGF0aWNfY2FzdDxHRmlsZVF1ZXJ5SW5mb0ZsYWdzPigwKSwgMCwgMCkpOworICAgIGdf
YXNzZXJ0X2NtcGludChnX2ZpbGVfaW5mb19nZXRfc2l6ZShmaWxlSW5mby5nZXQoKSksID49LCAy
MDQ4KTsKKworICAgIGdfaW5wdXRfc3RyZWFtX2Nsb3NlKGlucHV0U3RyZWFtLmdldCgpLCAwLCAw
KTsKKworICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0V2Vi
Vmlld1NhdmUoVUlDbGllbnRUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQoreworICAgIHRlc3Qt
PmxvYWRIdG1sKCI8aHRtbD4iCisgICAgICAgICAgICAgICAgICAgIjxib2R5PiIKKyAgICAgICAg
ICAgICAgICAgICAiICA8cD5BIHBhcmFncmFwaCB3aXRoIHBsYWluIHRleHQ8L3A+IgorICAgICAg
ICAgICAgICAgICAgICIgIDxwPiIKKyAgICAgICAgICAgICAgICAgICAiICAgIEEgcmVkIGJveDog
PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFB
QUlBQUFBQ0NBSUFBQUQ5MUpwekFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRV
VUgzQVlXRFRNVnduU1pud0FBQUIxcFZGaDBRMjl0YldWdWRBQUFBQUFBUTNKbFlYUmxaQ0IzYVhS
b0lFZEpUVkJrTG1VSEFBQUFGa2xFUVZRSTEyUDh6OERBd01EQXhNREF3TURBQUFBTkhRRURLK21t
eUFBQUFBQkpSVTVFcmtKZ2dnPT0nPjwvYnI+IgorICAgICAgICAgICAgICAgICAgICIgICAgQSBi
bHVlIGJveDogPGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFO
U1VoRVVnQUFBQUlBQUFBQ0NBSUFBQUQ5MUpwekFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lB
QUFBQjNSSlRVVUgzQVlXRFRNdkJIaEFMUUFBQUIxcFZGaDBRMjl0YldWdWRBQUFBQUFBUTNKbFlY
UmxaQ0IzYVhSb0lFZEpUVkJrTG1VSEFBQUFGa2xFUVZRSTEyTms0UG5Qd01EQXhNREF3TURBQUFB
THJ3RVBQSXMxcGdBQUFBQkpSVTVFcmtKZ2dnPT0nPiIKKyAgICAgICAgICAgICAgICAgICAiICA8
L3A+IgorICAgICAgICAgICAgICAgICAgICI8L2JvZHk+IgorICAgICAgICAgICAgICAgICAgICI8
L2h0bWw+IiwgMCk7CisgICAgdGVzdC0+d2FpdFVudGlsTG9hZEZpbmlzaGVkKCk7CisKKyAgICBr
U2F2ZURlc3RpbmF0aW9uRmlsZVBhdGggPSBnX2J1aWxkX2ZpbGVuYW1lKGtUZW1wRGlyZWN0b3J5
LCAidGVzdFdlYlZpZXdTYXZlUmVzdWx0Lm1odCIsIE5VTEwpOworICAgIEdSZWZQdHI8R0ZpbGU+
IGZpbGUgPSBhZG9wdEdSZWYoZ19maWxlX25ld19mb3JfcGF0aChrU2F2ZURlc3RpbmF0aW9uRmls
ZVBhdGgpKTsKKyAgICB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKHRlc3QtPm1fd2ViVmll
dywgZmlsZS5nZXQoKSwgV0VCS0lUX1NBVkVfTU9ERV9NSFRNTCwgMCwgcmVpbnRlcnByZXRfY2Fz
dDxHQXN5bmNSZWFkeUNhbGxiYWNrPih3ZWJWaWV3U2F2ZWRUb0ZpbGVDYWxsYmFjayksIHRlc3Qp
OworICAgIHRlc3QtPndhaXRVbnRpbE1haW5Mb29wRmluaXNoZXMoKTsKKworICAgIHdlYmtpdF93
ZWJfdmlld19zYXZlKHRlc3QtPm1fd2ViVmlldywgV0VCS0lUX1NBVkVfTU9ERV9NSFRNTCwgMCwg
cmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPih3ZWJWaWV3U2F2ZWRDYWxsYmFj
ayksIHRlc3QpOworICAgIHRlc3QtPndhaXRVbnRpbE1haW5Mb29wRmluaXNoZXMoKTsKKworICAg
IGdfZmlsZV9kZWxldGUoZmlsZS5nZXQoKSwgMCwgMCk7Cit9CisKIHZvaWQgYmVmb3JlQWxsKCkK
IHsKKyAgICBrVGVtcERpcmVjdG9yeSA9IGdfZGlyX21ha2VfdG1wKCJXZWJLaXQyVGVzdHMtWFhY
WFhYIiwgMCk7CisgICAgZ19hc3NlcnQoa1RlbXBEaXJlY3RvcnkpOworCiAgICAgV2ViVmlld1Rl
c3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJkZWZhdWx0LWNvbnRleHQiLCB0ZXN0V2ViVmlld0Rl
ZmF1bHRDb250ZXh0KTsKICAgICBXZWJWaWV3VGVzdDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgImN1
c3RvbS1jaGFyc2V0IiwgdGVzdFdlYlZpZXdDdXN0b21DaGFyc2V0KTsKICAgICBXZWJWaWV3VGVz
dDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgInNldHRpbmdzIiwgdGVzdFdlYlZpZXdTZXR0aW5ncyk7
CkBAIC04ODMsOCArOTYwLDEwIEBAIHZvaWQgYmVmb3JlQWxsKCkKICAgICBGaWxlQ2hvb3NlclRl
c3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJmaWxlLWNob29zZXItcmVxdWVzdCIsIHRlc3RXZWJW
aWV3RmlsZUNob29zZXJSZXF1ZXN0KTsKICAgICBGdWxsU2NyZWVuQ2xpZW50VGVzdDo6YWRkKCJX
ZWJLaXRXZWJWaWV3IiwgImZ1bGxzY3JlZW4iLCB0ZXN0V2ViVmlld0Z1bGxTY3JlZW4pOwogICAg
IFdlYlZpZXdUZXN0OjphZGQoIldlYktpdFdlYlZpZXciLCAiY2FuLXNob3ctbWltZS10eXBlIiwg
dGVzdFdlYlZpZXdDYW5TaG93TUlNRVR5cGUpOworICAgIFVJQ2xpZW50VGVzdDo6YWRkKCJXZWJL
aXRXZWJWaWV3IiwgInNhdmUiLCB0ZXN0V2ViVmlld1NhdmUpOwogfQogCiB2b2lkIGFmdGVyQWxs
KCkKIHsKKyAgICBnX3JtZGlyKGtUZW1wRGlyZWN0b3J5KTsKIH0KLS0gCjEuNy4xMC4yCgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157139</attachid>
            <date>2012-08-08 00:23:08 -0700</date>
            <delta_ts>2012-08-09 05:05:52 -0700</delta_ts>
            <desc>Patch Proposal + Unit Tests + Documentation</desc>
            <filename>bug-89873-20120808092242.patch</filename>
            <type>text/plain</type>
            <size>18571</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI1MDAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggZTcwYTdjZWE4ZjNhZDc1
ZjY1ZWQ2NGFjZjg4MDc5NzNjODdhNjk4NS4uMWU4ZDhlZmZkZDQyZTRiMmNjN2Y0MTg2ZTQ5NjUy
ZDI2ZTBhZTA1MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM3IEBACiAyMDEyLTA4LTA4ICBNYXJp
byBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KIAorICAgICAgICBbV0syXVtH
VEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIgcGFnZSB1c2luZyBNSFRNTAorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODk4NzMKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnRlZCBu
ZXcgYXN5bmNocm9ub3VzIEFQSSBpbiBXZWJLaXRXZWJWaWV3LgorCisgICAgICAgICogVUlQcm9j
ZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHA6CisgICAgICAgIChWaWV3U2F2ZUFzeW5jRGF0
YSk6CisgICAgICAgICh3ZWJWaWV3RmlsZVNhdmVkQ2FsbGJhY2spOgorICAgICAgICAod2ViVmll
d01IVE1MRGF0YUdvdENhbGxiYWNrKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlKToK
KyAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCk6CisgICAgICAgICh3ZWJraXRf
d2ViX3ZpZXdfc2F2ZV90b19maWxlKToKKyAgICAgICAgKHdlYmtpdF93ZWJfdmlld19zYXZlX3Rv
X2ZpbGVfZmluaXNoKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3
Lmg6CisKKyAgICAgICAgQWRkZWQgbmV3IHVuaXQgdGVzdC4KKworICAgICAgICAqIFVJUHJvY2Vz
cy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcDoKKyAgICAgICAgKHdlYlZpZXdT
YXZlZFRvRmlsZUNhbGxiYWNrKToKKyAgICAgICAgKHdlYlZpZXdTYXZlZENhbGxiYWNrKToKKyAg
ICAgICAgKHRlc3RXZWJWaWV3U2F2ZSk6CisgICAgICAgIChiZWZvcmVBbGwpOgorICAgICAgICAo
YWZ0ZXJBbGwpOgorCisgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyB3aXRoIG5l
dyBzeW1ib2xzLgorCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3Rr
LXNlY3Rpb25zLnR4dDoKKworMjAxMi0wOC0wOCAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5j
aGV6QGlnYWxpYS5jb20+CisKICAgICAgICAgW1dLMl0gQWRkIG5ldyBDIEFQSSB0byBnZW5lcmF0
ZSBNSFRNTCBkYXRhIGZyb20gdGhlIFVJIHByb2Nlc3MKICAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg5ODcyCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3BwIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5jcHAKaW5kZXggYmY3ZmM3YmNkNzA2N2Iw
OGM1ZGJjY2QyNjlmOTZlNjQwNDU5ODMwMi4uNjJlZWY2YTYxYWFlNjhmN2Q3NGE5NmUwNTIyNWM2
MGYyZmNmYjBiYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsv
V2ViS2l0V2ViVmlldy5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsv
V2ViS2l0V2ViVmlldy5jcHAKQEAgLTI0MDAsMyArMjQwMCwxNzIgQEAgZ2Jvb2xlYW4gd2Via2l0
X3dlYl92aWV3X2Nhbl9zaG93X21pbWVfdHlwZShXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBjb25z
dCBjaGFyKgogICAgIFdlYlBhZ2VQcm94eSogcGFnZSA9IHdlYmtpdFdlYlZpZXdCYXNlR2V0UGFn
ZShXRUJLSVRfV0VCX1ZJRVdfQkFTRSh3ZWJWaWV3KSk7CiAgICAgcmV0dXJuIHBhZ2UtPmNhblNo
b3dNSU1FVHlwZShTdHJpbmc6OmZyb21VVEY4KG1pbWVUeXBlKSk7CiB9CisKK3N0cnVjdCBWaWV3
U2F2ZUFzeW5jRGF0YSB7CisgICAgV0tSZXRhaW5QdHI8V0tEYXRhUmVmPiB3a0RhdGE7CisgICAg
R1JlZlB0cjxHRmlsZT4gZmlsZTsKKyAgICBHUmVmUHRyPEdDYW5jZWxsYWJsZT4gY2FuY2VsbGFi
bGU7Cit9OworV0VCS0lUX0RFRklORV9BU1lOQ19EQVRBX1NUUlVDVChWaWV3U2F2ZUFzeW5jRGF0
YSkKKworc3RhdGljIHZvaWQgZmlsZVJlcGxhY2VDb250ZW50c0NhbGxiYWNrKEdPYmplY3QqIG9i
amVjdCwgR0FzeW5jUmVzdWx0KiByZXN1bHQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgR0ZpbGUq
IGZpbGUgPSBHX0ZJTEUob2JqZWN0KTsKKyAgICBHUmVmUHRyPEdTaW1wbGVBc3luY1Jlc3VsdD4g
c2F2ZWRUb0ZpbGVSZXN1bHQgPSBhZG9wdEdSZWYoR19TSU1QTEVfQVNZTkNfUkVTVUxUKGRhdGEp
KTsKKworICAgIEdFcnJvciogZXJyb3IgPSAwOworICAgIGlmICghZ19maWxlX3JlcGxhY2VfY29u
dGVudHNfZmluaXNoKGZpbGUsIHJlc3VsdCwgMCwgJmVycm9yKSkKKyAgICAgICAgZ19zaW1wbGVf
YXN5bmNfcmVzdWx0X3Rha2VfZXJyb3Ioc2F2ZWRUb0ZpbGVSZXN1bHQuZ2V0KCksIGVycm9yKTsK
KworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9jb21wbGV0ZShzYXZlZFRvRmlsZVJlc3VsdC5n
ZXQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbnRlbnRzQXNNSFRNTERhdGFDYWxsYmFjayhX
S0RhdGFSZWYgd2tEYXRhLCBXS0Vycm9yUmVmLCB2b2lkKiBjb250ZXh0KQoreworICAgIEdSZWZQ
dHI8R1NpbXBsZUFzeW5jUmVzdWx0PiByZXN1bHQgPSBhZG9wdEdSZWYoR19TSU1QTEVfQVNZTkNf
UkVTVUxUKGNvbnRleHQpKTsKKyAgICBWaWV3U2F2ZUFzeW5jRGF0YSogZGF0YSA9IHN0YXRpY19j
YXN0PFZpZXdTYXZlQXN5bmNEYXRhKj4oZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9vcF9yZXNf
Z3BvaW50ZXIocmVzdWx0LmdldCgpKSk7CisgICAgR0Vycm9yKiBlcnJvciA9IDA7CisKKyAgICBp
ZiAoZ19jYW5jZWxsYWJsZV9zZXRfZXJyb3JfaWZfY2FuY2VsbGVkKGRhdGEtPmNhbmNlbGxhYmxl
LmdldCgpLCAmZXJyb3IpKQorICAgICAgICBnX3NpbXBsZV9hc3luY19yZXN1bHRfdGFrZV9lcnJv
cihyZXN1bHQuZ2V0KCksIGVycm9yKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0
byByZXRhaW4gdGhlIGRhdGEgdW50aWwgdGhlIGFzeW5jcm9ub3VzIHByb2Nlc3MKKyAgICAgICAg
Ly8gaW5pdGlhdGVkIGJ5IHRoZSB1c2VyIGhhcyBmaW5pc2hlZCBjb21wbGV0ZWx5LgorICAgICAg
ICBkYXRhLT53a0RhdGEgPSB3a0RhdGE7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIHNhdmluZyB0
byBhIGZpbGUgd2UgbmVlZCB0byB3cml0ZSB0aGUgZGF0YSBvbiBkaXNrIGJlZm9yZSBmaW5pc2hp
bmcuCisgICAgICAgIGlmIChnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0X3NvdXJjZV90YWcocmVz
dWx0LmdldCgpKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKSB7CisgICAgICAgICAg
ICBBU1NFUlQoR19JU19GSUxFKGRhdGEtPmZpbGUuZ2V0KCkpKTsKKyAgICAgICAgICAgIGdfZmls
ZV9yZXBsYWNlX2NvbnRlbnRzX2FzeW5jKGRhdGEtPmZpbGUuZ2V0KCksIHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgZ2NoYXIqPihXS0RhdGFHZXRCeXRlcyhkYXRhLT53a0RhdGEuZ2V0KCkpKSwgV0tE
YXRhR2V0U2l6ZShkYXRhLT53a0RhdGEuZ2V0KCkpLCAwLCBGQUxTRSwgR19GSUxFX0NSRUFURV9S
RVBMQUNFX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGF0YS0+Y2FuY2VsbGFibGUuZ2V0KCksIGZpbGVSZXBsYWNlQ29udGVudHNDYWxsYmFj
aywgZ19vYmplY3RfcmVmKHJlc3VsdC5nZXQoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgfQorCisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2NvbXBsZXRlKHJlc3Vs
dC5nZXQoKSk7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl92aWV3X3NhdmU6CisgKiBAd2ViX3Zp
ZXc6IGEgI1dlYktpdFdlYlZpZXcKKyAqIEBzYXZlX21vZGU6IHRoZSAjV2ViS2l0U2F2ZU1vZGUg
c3BlY2lmeWluZyBob3cgdGhlIHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZC4KKyAqIEBjYW5jZWxs
YWJsZTogKGFsbG93LW5vbmUpOiBhICNHQ2FuY2VsbGFibGUgb3IgJU5VTEwgdG8gaWdub3JlCisg
KiBAY2FsbGJhY2s6IChzY29wZSBhc3luYyk6IGEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8gY2Fs
bCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZAorICogQHVzZXJfZGF0YTogKGNsb3N1cmUp
OiB0aGUgZGF0YSB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogQXN5bmNocm9u
b3VzbHkgc2F2ZSB0aGUgY3VycmVudCB3ZWIgcGFnZSBhc3NvY2lhdGVkIHRvIHRoZQorICogI1dl
YktpdFdlYlZpZXcgaW50byBhIHNlbGYtY29udGFpbmVkIGZvcm1hdCB1c2luZyB0aGUgbW9kZQor
ICogc3BlY2lmaWVkIGluICNXZWJLaXRTYXZlTW9kZS4KKyAqCisgKiBXaGVuIHRoZSBvcGVyYXRp
b24gaXMgZmluaXNoZWQsIEBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4gWW91IGNhbgorICogdGhl
biBjYWxsIHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaCgpIHRvIGdldCB0aGUgcmVzdWx0IG9m
IHRoZQorICogb3BlcmF0aW9uLgorICovCit2b2lkIHdlYmtpdF93ZWJfdmlld19zYXZlKFdlYktp
dFdlYlZpZXcqIHdlYlZpZXcsIFdlYktpdFNhdmVNb2RlIHNhdmVNb2RlLCBHQ2FuY2VsbGFibGUq
IGNhbmNlbGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1c2Vy
RGF0YSkKK3sKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3ZWJWaWV3
KSk7CisKKyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgTUhUTUwgYXQgdGhlIG1vbWVudC4KKyAgICBn
X3JldHVybl9pZl9mYWlsKHNhdmVNb2RlID09IFdFQktJVF9TQVZFX01PREVfTUhUTUwpOworCisg
ICAgR1NpbXBsZUFzeW5jUmVzdWx0KiByZXN1bHQgPSBnX3NpbXBsZV9hc3luY19yZXN1bHRfbmV3
KEdfT0JKRUNUKHdlYlZpZXcpLCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nh
c3Q8Z3BvaW50ZXI+KHdlYmtpdF93ZWJfdmlld19zYXZlKSk7CisgICAgVmlld1NhdmVBc3luY0Rh
dGEqIGRhdGEgPSBjcmVhdGVWaWV3U2F2ZUFzeW5jRGF0YSgpOworICAgIGRhdGEtPmNhbmNlbGxh
YmxlID0gY2FuY2VsbGFibGU7CisgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3NldF9vcF9yZXNf
Z3BvaW50ZXIocmVzdWx0LCBkYXRhLCByZWludGVycHJldF9jYXN0PEdEZXN0cm95Tm90aWZ5Pihk
ZXN0cm95Vmlld1NhdmVBc3luY0RhdGEpKTsKKworICAgIFdLUGFnZVJlZiB3a1BhZ2UgPSB0b0FQ
SSh3ZWJraXRXZWJWaWV3QmFzZUdldFBhZ2UoV0VCS0lUX1dFQl9WSUVXX0JBU0Uod2ViVmlldykp
KTsKKyAgICBXS1BhZ2VHZXRDb250ZW50c0FzTUhUTUxEYXRhKHdrUGFnZSwgZmFsc2UsIHJlc3Vs
dCwgZ2V0Q29udGVudHNBc01IVE1MRGF0YUNhbGxiYWNrKTsKK30KKworLyoqCisgKiB3ZWJraXRf
d2ViX3ZpZXdfc2F2ZV9maW5pc2g6CisgKiBAd2ViX3ZpZXc6IGEgI1dlYktpdFdlYlZpZXcKKyAq
IEByZXN1bHQ6IGEgI0dBc3luY1Jlc3VsdAorICogQGVycm9yOiByZXR1cm4gbG9jYXRpb24gZm9y
IGVycm9yIG9yICVOVUxMIHRvIGlnbm9yZQorICoKKyAqIEZpbmlzaCBhbiBhc3luY2hyb25vdXMg
b3BlcmF0aW9uIHN0YXJ0ZWQgd2l0aCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSgpLgorICoKKyAqIFJl
dHVybnM6ICh0cmFuc2ZlciBmdWxsKTogYSAjR0lucHV0U3RyZWFtIHdpdGggdGhlIHJlc3VsdCBv
ZiBzYXZpbmcKKyAqICAgIHRoZSBjdXJyZW50IHdlYiBwYWdlIG9yICVOVUxMIGluIGNhc2Ugb2Yg
ZXJyb3IuCisgKi8KK0dJbnB1dFN0cmVhbSogd2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNoKFdl
YktpdFdlYlZpZXcqIHdlYlZpZXcsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBHRXJyb3IqKiBlcnJv
cikKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmll
dyksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZTkNfUkVTVUxUKHJlc3Vs
dCksIDApOworCisgICAgR1NpbXBsZUFzeW5jUmVzdWx0KiBzaW1wbGUgPSBHX1NJTVBMRV9BU1lO
Q19SRVNVTFQocmVzdWx0KTsKKyAgICBnX3dhcm5faWZfZmFpbChnX3NpbXBsZV9hc3luY19yZXN1
bHRfZ2V0X3NvdXJjZV90YWcoc2ltcGxlKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZSk7CisKKyAg
ICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3Byb3BhZ2F0ZV9lcnJvcihzaW1wbGUsIGVycm9y
KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBHSW5wdXRTdHJlYW0qIGRhdGFTdHJlYW0gPSBn
X21lbW9yeV9pbnB1dF9zdHJlYW1fbmV3KCk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRhdGEg
PSBzdGF0aWNfY2FzdDxWaWV3U2F2ZUFzeW5jRGF0YSo+KGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9n
ZXRfb3BfcmVzX2dwb2ludGVyKHNpbXBsZSkpOworICAgIGlmIChkYXRhKSB7CisgICAgICAgIGdz
aXplIGxlbmd0aCA9IFdLRGF0YUdldFNpemUoZGF0YS0+d2tEYXRhLmdldCgpKTsKKyAgICAgICAg
Z19tZW1vcnlfaW5wdXRfc3RyZWFtX2FkZF9kYXRhKEdfTUVNT1JZX0lOUFVUX1NUUkVBTShkYXRh
U3RyZWFtKSwgZ19tZW1kdXAoV0tEYXRhR2V0Qnl0ZXMoZGF0YS0+d2tEYXRhLmdldCgpKSwgbGVu
Z3RoKSwgbGVuZ3RoLCBnX2ZyZWUpOworICAgIH0KKworICAgIHJldHVybiBkYXRhU3RyZWFtOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGU6CisgKiBAd2ViX3ZpZXc6
IGEgI1dlYktpdFdlYlZpZXcKKyAqIEBmaWxlOiB0aGUgI0dGaWxlIHdoZXJlIHRoZSBjdXJyZW50
IHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZCB0by4KKyAqIEBzYXZlX21vZGU6IHRoZSAjV2ViS2l0
U2F2ZU1vZGUgc3BlY2lmeWluZyBob3cgdGhlIHdlYiBwYWdlIHNob3VsZCBiZSBzYXZlZC4KKyAq
IEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBhICNHQ2FuY2VsbGFibGUgb3IgJU5VTEwgdG8g
aWdub3JlCisgKiBAY2FsbGJhY2s6IChzY29wZSBhc3luYyk6IGEgI0dBc3luY1JlYWR5Q2FsbGJh
Y2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZAorICogQHVzZXJfZGF0YTog
KGNsb3N1cmUpOiB0aGUgZGF0YSB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICog
QXN5bmNocm9ub3VzbHkgc2F2ZSB0aGUgY3VycmVudCB3ZWIgcGFnZSBhc3NvY2lhdGVkIHRvIHRo
ZQorICogI1dlYktpdFdlYlZpZXcgaW50byBhIHNlbGYtY29udGFpbmVkIGZvcm1hdCB1c2luZyB0
aGUgbW9kZQorICogc3BlY2lmaWVkIGluICNXZWJLaXRTYXZlTW9kZSBhbmQgd3JpdGluZyBpdCB0
byBAZmlsZS4KKyAqCisgKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxsYmFj
ayB3aWxsIGJlIGNhbGxlZC4gWW91IGNhbgorICogdGhlbiBjYWxsIHdlYmtpdF93ZWJfdmlld19z
YXZlX3RvX2ZpbGVfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlCisgKiBvcGVyYXRp
b24uCisgKi8KK3ZvaWQgd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZShXZWJLaXRXZWJWaWV3
KiB3ZWJWaWV3LCBHRmlsZSogZmlsZSwgV2ViS2l0U2F2ZU1vZGUgc2F2ZU1vZGUsIEdDYW5jZWxs
YWJsZSogY2FuY2VsbGFibGUsIEdBc3luY1JlYWR5Q2FsbGJhY2sgY2FsbGJhY2ssIGdwb2ludGVy
IHVzZXJEYXRhKQoreworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdl
YlZpZXcpKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKEdfSVNfRklMRShmaWxlKSk7CisKKyAgICAv
LyBXZSBvbmx5IHN1cHBvcnQgTUhUTUwgYXQgdGhlIG1vbWVudC4KKyAgICBnX3JldHVybl9pZl9m
YWlsKHNhdmVNb2RlID09IFdFQktJVF9TQVZFX01PREVfTUhUTUwpOworCisgICAgR1NpbXBsZUFz
eW5jUmVzdWx0KiByZXN1bHQgPSBnX3NpbXBsZV9hc3luY19yZXN1bHRfbmV3KEdfT0JKRUNUKHdl
YlZpZXcpLCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3BvaW50ZXI+
KHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUpKTsKKyAgICBWaWV3U2F2ZUFzeW5jRGF0YSog
ZGF0YSA9IGNyZWF0ZVZpZXdTYXZlQXN5bmNEYXRhKCk7CisgICAgZGF0YS0+ZmlsZSA9IGZpbGU7
CisgICAgZGF0YS0+Y2FuY2VsbGFibGUgPSBjYW5jZWxsYWJsZTsKKyAgICBnX3NpbXBsZV9hc3lu
Y19yZXN1bHRfc2V0X29wX3Jlc19ncG9pbnRlcihyZXN1bHQsIGRhdGEsIHJlaW50ZXJwcmV0X2Nh
c3Q8R0Rlc3Ryb3lOb3RpZnk+KGRlc3Ryb3lWaWV3U2F2ZUFzeW5jRGF0YSkpOworCisgICAgV0tQ
YWdlUmVmIHdrUGFnZSA9IHRvQVBJKHdlYmtpdFdlYlZpZXdCYXNlR2V0UGFnZShXRUJLSVRfV0VC
X1ZJRVdfQkFTRSh3ZWJWaWV3KSkpOworICAgIFdLUGFnZUdldENvbnRlbnRzQXNNSFRNTERhdGEo
d2tQYWdlLCBmYWxzZSwgcmVzdWx0LCBnZXRDb250ZW50c0FzTUhUTUxEYXRhQ2FsbGJhY2spOwor
fQorCisvKioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoOgorICogQHdl
Yl92aWV3OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAcmVzdWx0OiBhICNHQXN5bmNSZXN1bHQKKyAq
IEBlcnJvcjogcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBvciAlTlVMTCB0byBpZ25vcmUKKyAq
CisgKiBGaW5pc2ggYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBzdGFydGVkIHdpdGggd2Via2l0
X3dlYl92aWV3X3NhdmVfdG9fZmlsZSgpLgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSB3
ZWIgcGFnZSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkIG9uIGRpc2sgb3IgJUZBTFNFIG90aGVyd2lz
ZS4KKyAqLworZ2Jvb2xlYW4gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZV9maW5pc2goV2Vi
S2l0V2ViVmlldyogd2ViVmlldywgR0FzeW5jUmVzdWx0KiByZXN1bHQsIEdFcnJvcioqIGVycm9y
KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3ZWJWaWV3
KSwgRkFMU0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdfSVNfQVNZTkNfUkVTVUxUKHJl
c3VsdCksIEZBTFNFKTsKKworICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogc2ltcGxlID0gR19TSU1Q
TEVfQVNZTkNfUkVTVUxUKHJlc3VsdCk7CisgICAgZ193YXJuX2lmX2ZhaWwoZ19zaW1wbGVfYXN5
bmNfcmVzdWx0X2dldF9zb3VyY2VfdGFnKHNpbXBsZSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmVf
dG9fZmlsZSk7CisKKyAgICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3Byb3BhZ2F0ZV9lcnJv
cihzaW1wbGUsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRS
VUU7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3LmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJW
aWV3LmgKaW5kZXggMjU1M2IxODQwNjZmN2NhNzBlNDAxNmIzZjFmNmI3YjFiNDc3ZTk0NS4uYmQ1
OTljYTY1MGJkMGJjOWUzOWU2NzBkMTJiZTY3MmExOGMxNDMwYiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0V2ViVmlldy5oCisrKyBiL1NvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaApAQCAtMTE4LDYgKzExOCwx
OCBAQCB0eXBlZGVmIGVudW0gewogICAgIFdFQktJVF9MT0FEX0ZJTklTSEVECiB9IFdlYktpdExv
YWRFdmVudDsKIAorLyoqCisgKiBXZWJLaXRTYXZlTW9kZToKKyAqIEBXRUJLSVRfU0FWRV9NT0RF
X01IVE1MOiBTYXZlIHRoZSBjdXJyZW50IHBhZ2UgdXNpbmcgdGhlIE1IVE1MCisgKiBmb3JtYXQu
CisgKgorICogRW51bSB2YWx1ZXMgdG8gc3BlY2lmeSB0aGUgZGlmZmVyZW50IHdheXMgaW4gd2hp
Y2ggYSAjV2ViS2l0V2ViVmlldworICogd2lsbCBiZSBzYXZlZCB0aGUgY3VycmVudCB3ZWIgcGFn
ZSBpbnRvIGEgc2VsZi1jb250YWluZWQgZmlsZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBX
RUJLSVRfU0FWRV9NT0RFX01IVE1MCit9IFdlYktpdFNhdmVNb2RlOworCiBzdHJ1Y3QgX1dlYktp
dFdlYlZpZXcgewogICAgIFdlYktpdFdlYlZpZXdCYXNlIHBhcmVudDsKIApAQCAtMzE5LDYgKzMz
MSwzMSBAQCBXRUJLSVRfQVBJIGdib29sZWFuCiB3ZWJraXRfd2ViX3ZpZXdfY2FuX3Nob3dfbWlt
ZV90eXBlICAgICAgICAgICAgICAgICAoV2ViS2l0V2ViVmlldyAgICAgICAgICAgICAqd2ViX3Zp
ZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgZ2NoYXIgICAgICAgICAgICAgICAqbWltZV90eXBlKTsKIAorV0VCS0lUX0FQSSB2b2lk
Cit3ZWJraXRfd2ViX3ZpZXdfc2F2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2Vi
S2l0V2ViVmlldyAgICAgICAgICAgICAqd2ViX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViS2l0U2F2ZU1vZGUgICAgICAgICAgICAg
c2F2ZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgICAgKmNhbmNlbGxhYmxlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBc3luY1JlYWR5Q2Fs
bGJhY2sgICAgICAgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7
CisKK1dFQktJVF9BUEkgR0lucHV0U3RyZWFtKgord2Via2l0X3dlYl92aWV3X3NhdmVfZmluaXNo
ICAgICAgICAgICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAgICAgICAgKndlYl92
aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEdBc3luY1Jlc3VsdCAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICAgICAg
KiplcnJvcik7CisKK1dFQktJVF9BUEkgdm9pZAord2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmls
ZSAgICAgICAgICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcgICAgICAgICAgICAgKndlYl92
aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEdGaWxlICAgICAgICAgICAgICAgICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViS2l0U2F2ZU1vZGUgICAgICAgICAgICAg
c2F2ZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgICAgKmNhbmNlbGxhYmxlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBc3luY1JlYWR5Q2Fs
bGJhY2sgICAgICAgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7
CisKK1dFQktJVF9BUEkgZ2Jvb2xlYW4KK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmlu
aXNoICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXN5
bmNSZXN1bHQgICAgICAgICAgICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAgICAgICoqZXJy
b3IpOworCiBHX0VORF9ERUNMUwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQgYi9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJndGstc2VjdGlvbnMudHh0Cmlu
ZGV4IDczZjA5ZDVkMzc3YjBiNDExNTE3YjAzODM2NzYwNmU2ZmM0NWM1YTIuLjkyZGExZWJlNWIx
ZTVhNjI4NGJjODVmZjY3ZjZmNzA5NGMwYmVmMTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQKKysrIGIvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4
dApAQCAtNjIsNiArNjIsNyBAQCB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X3R5cGUKIFdlYktpdFdl
YlZpZXcKIFdlYktpdExvYWRFdmVudAogV2ViS2l0UG9saWN5RGVjaXNpb25UeXBlCitXZWJLaXRT
YXZlTW9kZQogCiA8U1VCU0VDVElPTiBFZGl0aW5nIENvbW1hbmRzPgogV0VCS0lUX0VESVRJTkdf
Q09NTUFORF9DVVQKQEAgLTEwNSw2ICsxMDYsMTAgQEAgd2Via2l0X3dlYl92aWV3X2dldF9qYXZh
c2NyaXB0X2dsb2JhbF9jb250ZXh0CiB3ZWJraXRfd2ViX3ZpZXdfcnVuX2phdmFzY3JpcHQKIHdl
YmtpdF93ZWJfdmlld19ydW5famF2YXNjcmlwdF9maW5pc2gKIHdlYmtpdF93ZWJfdmlld19jYW5f
c2hvd19taW1lX3R5cGUKK3dlYmtpdF93ZWJfdmlld19zYXZlCit3ZWJraXRfd2ViX3ZpZXdfc2F2
ZV9maW5pc2gKK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUKK3dlYmtpdF93ZWJfdmlld19z
YXZlX3RvX2ZpbGVfZmluaXNoCiAKIDxTVUJTRUNUSU9OIFdlYktpdEphdmFzY3JpcHRSZXN1bHQ+
CiBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAgYi9Tb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAKaW5kZXggZWVj
NmZjNzg2ZjIxNmZmNzU3NGEwZDBjNGI0NjEwZDJiZTQ2ZGU0NC4uZmQ2ZmQwYWNlODZlZjgxNzgy
MTVmYzUzNGMzMjM1YTIwMmQxYjBiNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcApAQCAtMjEs
MTAgKzIxLDE0IEBACiAjaW5jbHVkZSAiV2ViVmlld1Rlc3QuaCIKICNpbmNsdWRlIDxKYXZhU2Ny
aXB0Q29yZS9KU1N0cmluZ1JlZi5oPgogI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTVmFsdWVS
ZWYuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1N0
cmluZ0hhc2guaD4KIAorc3RhdGljIGNoYXIqIGtUZW1wRGlyZWN0b3J5Oworc3RhdGljIGNoYXIq
IGtTYXZlRGVzdGluYXRpb25GaWxlUGF0aDsKKwogc3RhdGljIHZvaWQgdGVzdFdlYlZpZXdEZWZh
dWx0Q29udGV4dChXZWJWaWV3VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKIHsKICAgICBnX2Fz
c2VydCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2NvbnRleHQodGVzdC0+bV93ZWJWaWV3KSA9PSB3ZWJr
aXRfd2ViX2NvbnRleHRfZ2V0X2RlZmF1bHQoKSk7CkBAIC05NDYsOCArOTUwLDgxIEBAIHN0YXRp
YyB2b2lkIHRlc3RXZWJWaWV3U3VibWl0Rm9ybShGb3JtQ2xpZW50VGVzdCogdGVzdCwgZ2NvbnN0
cG9pbnRlcikKICAgICBnX2Fzc2VydF9jbXBzdHIoc3RhdGljX2Nhc3Q8Y2hhcio+KGdfaGFzaF90
YWJsZV9sb29rdXAodmFsdWVzLCAicGFzc3dvcmQiKSksID09LCAic2VjcmV0Iik7CiB9CiAKK3N0
YXRpYyB2b2lkIHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKEdPYmplY3QgKm9iamVjdCwgR0Fz
eW5jUmVzdWx0ICpyZXMsIFdlYlZpZXdUZXN0KiB0ZXN0KQoreworICAgIEdPd25QdHI8R0Vycm9y
PiBlcnJvcjsKKyAgICBnX2Fzc2VydCh3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2Zpbmlz
aCh0ZXN0LT5tX3dlYlZpZXcsIHJlcywgJmVycm9yLm91dFB0cigpKSk7CisgICAgZ19hc3NlcnQo
IWVycm9yKTsKKworICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOworfQorCitzdGF0aWMgdm9pZCB3
ZWJWaWV3U2F2ZWRDYWxsYmFjayhHT2JqZWN0ICpvYmplY3QsIEdBc3luY1Jlc3VsdCAqcmVzLCBX
ZWJWaWV3VGVzdCogdGVzdCkKK3sKKyAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7CisgICAgR1Jl
ZlB0cjxHSW5wdXRTdHJlYW0+IGlucHV0U3RyZWFtID0gYWRvcHRHUmVmKHdlYmtpdF93ZWJfdmll
d19zYXZlX2ZpbmlzaCh0ZXN0LT5tX3dlYlZpZXcsIHJlcywgJmVycm9yLm91dFB0cigpKSk7Cisg
ICAgZ19hc3NlcnQoR19JU19JTlBVVF9TVFJFQU0oaW5wdXRTdHJlYW0uZ2V0KCkpKTsKKyAgICBn
X2Fzc2VydCghZXJyb3IpOworCisgICAgLy8gTm93IGNvbXBhcmUgeW91IGdldCBleGFjdGx5IHRo
ZSBzYW1lIHJlc3VsdCB0aGFuIHdoZW4gc2F2aW5nIHRvIGEgZmlsZS4KKyAgICBHUmVmUHRyPEdG
aWxlPiBmaWxlID0gYWRvcHRHUmVmKGdfZmlsZV9uZXdfZm9yX3BhdGgoa1NhdmVEZXN0aW5hdGlv
bkZpbGVQYXRoKSk7CisgICAgR1JlZlB0cjxHSW5wdXRTdHJlYW0+IHNhdmVkRmlsZUlucHV0U3Ry
ZWFtID0gYWRvcHRHUmVmKEdfSU5QVVRfU1RSRUFNKGdfZmlsZV9yZWFkKGZpbGUuZ2V0KCksIDAs
ICZlcnJvci5vdXRQdHIoKSkpKTsKKyAgICBnX2Fzc2VydCghZXJyb3IpOworCisgICAgLy8gV2Ug
c2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBhbW91bnQgb2YgYnl0ZXMgaW4gdGhlIGZpbGUK
KyAgICAvLyB0aGFuIHRob3NlIGNvbWluZyBmcm9tIHRoZSBHSW5wdXRTdHJlYW0uIFdlIGRvbid0
IGNvbXBhcmUgdGhlCisgICAgLy8gc3RyaW5ncyByZWFkIHNpbmNlIHRoZSAnRGF0ZScgZmllbGQg
YW5kIHRoZSBib3VuZGFyaWVzIHdpbGwgYmUKKyAgICAvLyBkaWZmZXJlbnQgb24gZWFjaCBjYXNl
LiBNSFRNTCBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgdGVzdGVkIGJ5CisgICAgLy8gTGF5b3V0IHRl
c3RzLCBzbyBjaGVja2luZyB0aGUgYW1vdW50IG9mIGJ5dGVzIGlzIGVub3VnaC4KKyAgICBnY2hh
ciBidWZmZXJbNTEyXSA9IHsgMCB9OworICAgIGdzc2l6ZSByZWFkQnl0ZXMgPSAwOworICAgIGdz
c2l6ZSB0b3RhbEJ5dGVzRnJvbVN0cmVhbSA9IDA7CisgICAgd2hpbGUgKHJlYWRCeXRlcyA9IGdf
aW5wdXRfc3RyZWFtX3JlYWQoaW5wdXRTdHJlYW0uZ2V0KCksICZidWZmZXIsIDUxMiwgMCwgJmVy
cm9yLm91dFB0cigpKSkgeworICAgICAgICBnX2Fzc2VydCghZXJyb3IpOworICAgICAgICB0b3Rh
bEJ5dGVzRnJvbVN0cmVhbSArPSByZWFkQnl0ZXM7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhh
dCB0aGUgYSBtaW5pbXVtIGFtb3VudCBvZiBieXRlcyBhcmUgcmVjZWl2ZWQgaW4gdGhlIHN0cmVh
bS4KKyAgICBnX2Fzc2VydF9jbXBpbnQodG90YWxCeXRlc0Zyb21TdHJlYW0sID49LCAyMDQ4KTsK
KworICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGF0IGl0IGNvbnRhaW5z
IGF0IGxlYXN0IHRoZSBzYW1lIGFtb3VudCBvZiBieXRlcy4KKyAgICBHUmVmUHRyPEdGaWxlSW5m
bz4gZmlsZUluZm8gPSBhZG9wdEdSZWYoZ19maWxlX3F1ZXJ5X2luZm8oZmlsZS5nZXQoKSwgR19G
SUxFX0FUVFJJQlVURV9TVEFOREFSRF9TSVpFLCBzdGF0aWNfY2FzdDxHRmlsZVF1ZXJ5SW5mb0Zs
YWdzPigwKSwgMCwgMCkpOworICAgIGdfYXNzZXJ0X2NtcGludChnX2ZpbGVfaW5mb19nZXRfc2l6
ZShmaWxlSW5mby5nZXQoKSksID49LCAyMDQ4KTsKKworICAgIGdfaW5wdXRfc3RyZWFtX2Nsb3Nl
KGlucHV0U3RyZWFtLmdldCgpLCAwLCAwKTsKKworICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOwor
fQorCitzdGF0aWMgdm9pZCB0ZXN0V2ViVmlld1NhdmUoVUlDbGllbnRUZXN0KiB0ZXN0LCBnY29u
c3Rwb2ludGVyKQoreworICAgIHRlc3QtPmxvYWRIdG1sKCI8aHRtbD4iCisgICAgICAgICAgICAg
ICAgICAgIjxib2R5PiIKKyAgICAgICAgICAgICAgICAgICAiICA8cD5BIHBhcmFncmFwaCB3aXRo
IHBsYWluIHRleHQ8L3A+IgorICAgICAgICAgICAgICAgICAgICIgIDxwPiIKKyAgICAgICAgICAg
ICAgICAgICAiICAgIEEgcmVkIGJveDogPGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxp
VkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUlBQUFBQ0NBSUFBQUQ5MUpwekFBQUFDWEJJV1hNQUFB
c1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUgzQVlXRFRNVnduU1pud0FBQUIxcFZGaDBRMjl0YldW
dWRBQUFBQUFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJrTG1VSEFBQUFGa2xFUVZRSTEyUDh6OERB
d01EQXhNREF3TURBQUFBTkhRRURLK21teUFBQUFBQkpSVTVFcmtKZ2dnPT0nPjwvYnI+IgorICAg
ICAgICAgICAgICAgICAgICIgICAgQSBibHVlIGJveDogPGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5n
O2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUlBQUFBQ0NBSUFBQUQ5MUpwekFBQUFD
WEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUgzQVlXRFRNdkJIaEFMUUFBQUIxcFZG
aDBRMjl0YldWdWRBQUFBQUFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJrTG1VSEFBQUFGa2xFUVZR
STEyTms0UG5Qd01EQXhNREF3TURBQUFBTHJ3RVBQSXMxcGdBQUFBQkpSVTVFcmtKZ2dnPT0nPiIK
KyAgICAgICAgICAgICAgICAgICAiICA8L3A+IgorICAgICAgICAgICAgICAgICAgICI8L2JvZHk+
IgorICAgICAgICAgICAgICAgICAgICI8L2h0bWw+IiwgMCk7CisgICAgdGVzdC0+d2FpdFVudGls
TG9hZEZpbmlzaGVkKCk7CisKKyAgICBrU2F2ZURlc3RpbmF0aW9uRmlsZVBhdGggPSBnX2J1aWxk
X2ZpbGVuYW1lKGtUZW1wRGlyZWN0b3J5LCAidGVzdFdlYlZpZXdTYXZlUmVzdWx0Lm1odCIsIE5V
TEwpOworICAgIEdSZWZQdHI8R0ZpbGU+IGZpbGUgPSBhZG9wdEdSZWYoZ19maWxlX25ld19mb3Jf
cGF0aChrU2F2ZURlc3RpbmF0aW9uRmlsZVBhdGgpKTsKKyAgICB3ZWJraXRfd2ViX3ZpZXdfc2F2
ZV90b19maWxlKHRlc3QtPm1fd2ViVmlldywgZmlsZS5nZXQoKSwgV0VCS0lUX1NBVkVfTU9ERV9N
SFRNTCwgMCwgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxiYWNrPih3ZWJWaWV3U2F2
ZWRUb0ZpbGVDYWxsYmFjayksIHRlc3QpOworICAgIHRlc3QtPndhaXRVbnRpbE1haW5Mb29wRmlu
aXNoZXMoKTsKKworICAgIHdlYmtpdF93ZWJfdmlld19zYXZlKHRlc3QtPm1fd2ViVmlldywgV0VC
S0lUX1NBVkVfTU9ERV9NSFRNTCwgMCwgcmVpbnRlcnByZXRfY2FzdDxHQXN5bmNSZWFkeUNhbGxi
YWNrPih3ZWJWaWV3U2F2ZWRDYWxsYmFjayksIHRlc3QpOworICAgIHRlc3QtPndhaXRVbnRpbE1h
aW5Mb29wRmluaXNoZXMoKTsKKworICAgIGdfZmlsZV9kZWxldGUoZmlsZS5nZXQoKSwgMCwgMCk7
Cit9CisKIHZvaWQgYmVmb3JlQWxsKCkKIHsKKyAgICBrVGVtcERpcmVjdG9yeSA9IGdfZGlyX21h
a2VfdG1wKCJXZWJLaXQyVGVzdHMtWFhYWFhYIiwgMCk7CisgICAgZ19hc3NlcnQoa1RlbXBEaXJl
Y3RvcnkpOworCiAgICAgV2ViVmlld1Rlc3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJkZWZhdWx0
LWNvbnRleHQiLCB0ZXN0V2ViVmlld0RlZmF1bHRDb250ZXh0KTsKICAgICBXZWJWaWV3VGVzdDo6
YWRkKCJXZWJLaXRXZWJWaWV3IiwgImN1c3RvbS1jaGFyc2V0IiwgdGVzdFdlYlZpZXdDdXN0b21D
aGFyc2V0KTsKICAgICBXZWJWaWV3VGVzdDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgInNldHRpbmdz
IiwgdGVzdFdlYlZpZXdTZXR0aW5ncyk7CkBAIC05NjUsOCArMTA0MiwxMCBAQCB2b2lkIGJlZm9y
ZUFsbCgpCiAgICAgRnVsbFNjcmVlbkNsaWVudFRlc3Q6OmFkZCgiV2ViS2l0V2ViVmlldyIsICJm
dWxsc2NyZWVuIiwgdGVzdFdlYlZpZXdGdWxsU2NyZWVuKTsKICAgICBXZWJWaWV3VGVzdDo6YWRk
KCJXZWJLaXRXZWJWaWV3IiwgImNhbi1zaG93LW1pbWUtdHlwZSIsIHRlc3RXZWJWaWV3Q2FuU2hv
d01JTUVUeXBlKTsKICAgICBGb3JtQ2xpZW50VGVzdDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgInN1
Ym1pdC1mb3JtIiwgdGVzdFdlYlZpZXdTdWJtaXRGb3JtKTsKKyAgICBVSUNsaWVudFRlc3Q6OmFk
ZCgiV2ViS2l0V2ViVmlldyIsICJzYXZlIiwgdGVzdFdlYlZpZXdTYXZlKTsKIH0KIAogdm9pZCBh
ZnRlckFsbCgpCiB7CisgICAgZ19ybWRpcihrVGVtcERpcmVjdG9yeSk7CiB9Cg==
</data>
<flag name="review"
          id="166972"
          type_id="1"
          status="-"
          setter="cgarcia"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>157435</attachid>
            <date>2012-08-09 05:05:52 -0700</date>
            <delta_ts>2012-08-09 05:23:27 -0700</delta_ts>
            <desc>Patch Proposal + Unit Tests + Documentation</desc>
            <filename>0001-WK2-GTK-Implement-new-API-to-save-a-web-page-using-M.patch</filename>
            <type>text/plain</type>
            <size>19337</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSBhMDgyZWQxZmNhNGFhYmM2MGQ1YTlkMWI4YjFjYzk4ZjY4ZmMzYzhhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBUaHUsIDkgQXVnIDIwMTIgMDk6MzU6MjcgKzAyMDAKU3ViamVjdDogW1BBVENI
XSBbV0syXVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIgcGFnZSB1c2luZyBN
SFRNTAogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg5ODczCgpSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkltcGxlbWVudGVkIG5ldyBhc3luY2hyb25vdXMgQVBJ
IGluIFdlYktpdFdlYlZpZXcuCgoqIFVJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3Bw
OgooVmlld1NhdmVBc3luY0RhdGEpOgood2ViVmlld0ZpbGVTYXZlZENhbGxiYWNrKToKKHdlYlZp
ZXdNSFRNTERhdGFHb3RDYWxsYmFjayk6Cih3ZWJraXRfd2ViX3ZpZXdfc2F2ZSk6Cih3ZWJraXRf
d2ViX3ZpZXdfc2F2ZV9maW5pc2gpOgood2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSk6Cih3
ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaCk6CiogVUlQcm9jZXNzL0FQSS9ndGsv
V2ViS2l0V2ViVmlldy5oOgoKQWRkZWQgbmV3IHVuaXQgdGVzdC4KCiogVUlQcm9jZXNzL0FQSS9n
dGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwOgoodGVzdFdlYlZpZXdTYXZlKToKKGJlZm9y
ZUFsbCk6CihhZnRlckFsbCk6CgpVcGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBuZXcg
c3ltYm9scy4KCiogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4
dDoKLS0tCiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAg
ICB8ICAzMiArKysrCiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJW
aWV3LmNwcCB8IDE2OCArKysrKysrKysrKysrKysrKysrKysKIFNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaCAgIHwgIDM2ICsrKysrCiAuLi4vVUlQcm9jZXNz
L0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dCB8ICAgNSArCiAuLi4vVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwICB8ICA5NCArKysrKysrKysr
KysKIDUgZmlsZXMgY2hhbmdlZCwgMzM1IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggZTcw
YTdjZS4uMTMzMzcyMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBi
L1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM1IEBACisyMDEyLTA4LTA5ICBN
YXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbV0sy
XVtHVEtdIEltcGxlbWVudCBuZXcgQVBJIHRvIHNhdmUgYSB3ZWIgcGFnZSB1c2luZyBNSFRNTAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODk4NzMKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnRl
ZCBuZXcgYXN5bmNocm9ub3VzIEFQSSBpbiBXZWJLaXRXZWJWaWV3IGZvciBzYXZpbmcgYSB3ZWIK
KyAgICAgICAgcGFnZSB0byBhIEdJbnB1dFN0cmVhbSBvciB0byBhIGZpbGUsIHVzaW5nIE1IVE1M
IGFzIHRoZSBvbmx5CisgICAgICAgIHN1cHBvcnRlZCBtZXRob2QgYXQgdGhlIG1vbWVudC4KKwor
ICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3BwOgorICAgICAgICAo
Vmlld1NhdmVBc3luY0RhdGEpOgorICAgICAgICAod2ViVmlld0ZpbGVTYXZlZENhbGxiYWNrKToK
KyAgICAgICAgKHdlYlZpZXdNSFRNTERhdGFHb3RDYWxsYmFjayk6CisgICAgICAgICh3ZWJraXRf
d2ViX3ZpZXdfc2F2ZSk6CisgICAgICAgICh3ZWJraXRfd2ViX3ZpZXdfc2F2ZV9maW5pc2gpOgor
ICAgICAgICAod2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSk6CisgICAgICAgICh3ZWJraXRf
d2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaCk6CisgICAgICAgICogVUlQcm9jZXNzL0FQSS9n
dGsvV2ViS2l0V2ViVmlldy5oOgorCisgICAgICAgIEFkZGVkIG5ldyB1bml0IHRlc3QuCisKKyAg
ICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHA6Cisg
ICAgICAgICh0ZXN0V2ViVmlld1NhdmUpOgorICAgICAgICAoYmVmb3JlQWxsKToKKyAgICAgICAg
KGFmdGVyQWxsKToKKworICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBu
ZXcgc3ltYm9scy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0
ay1zZWN0aW9ucy50eHQ6CisKIDIwMTItMDgtMDggIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2Fu
Y2hlekBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtXSzJdIEFkZCBuZXcgQyBBUEkgdG8gZ2VuZXJh
dGUgTUhUTUwgZGF0YSBmcm9tIHRoZSBVSSBwcm9jZXNzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJLaXRXZWJWaWV3LmNwcCBiL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuY3BwCmluZGV4IGJmN2ZjN2IuLmU5ZDA4
ODYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdl
YlZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdl
YlZpZXcuY3BwCkBAIC0yNDAwLDMgKzI0MDAsMTcxIEBAIGdib29sZWFuIHdlYmtpdF93ZWJfdmll
d19jYW5fc2hvd19taW1lX3R5cGUoV2ViS2l0V2ViVmlldyogd2ViVmlldywgY29uc3QgY2hhcioK
ICAgICBXZWJQYWdlUHJveHkqIHBhZ2UgPSB3ZWJraXRXZWJWaWV3QmFzZUdldFBhZ2UoV0VCS0lU
X1dFQl9WSUVXX0JBU0Uod2ViVmlldykpOwogICAgIHJldHVybiBwYWdlLT5jYW5TaG93TUlNRVR5
cGUoU3RyaW5nOjpmcm9tVVRGOChtaW1lVHlwZSkpOwogfQorCitzdHJ1Y3QgVmlld1NhdmVBc3lu
Y0RhdGEgeworICAgIFdLUmV0YWluUHRyPFdLRGF0YVJlZj4gd2tEYXRhOworICAgIEdSZWZQdHI8
R0ZpbGU+IGZpbGU7CisgICAgR1JlZlB0cjxHQ2FuY2VsbGFibGU+IGNhbmNlbGxhYmxlOworfTsK
K1dFQktJVF9ERUZJTkVfQVNZTkNfREFUQV9TVFJVQ1QoVmlld1NhdmVBc3luY0RhdGEpCisKK3N0
YXRpYyB2b2lkIGZpbGVSZXBsYWNlQ29udGVudHNDYWxsYmFjayhHT2JqZWN0KiBvYmplY3QsIEdB
c3luY1Jlc3VsdCogcmVzdWx0LCBncG9pbnRlciBkYXRhKQoreworICAgIEdGaWxlKiBmaWxlID0g
R19GSUxFKG9iamVjdCk7CisgICAgR1JlZlB0cjxHU2ltcGxlQXN5bmNSZXN1bHQ+IHNhdmVkVG9G
aWxlUmVzdWx0ID0gYWRvcHRHUmVmKEdfU0lNUExFX0FTWU5DX1JFU1VMVChkYXRhKSk7CisKKyAg
ICBHRXJyb3IqIGVycm9yID0gMDsKKyAgICBpZiAoIWdfZmlsZV9yZXBsYWNlX2NvbnRlbnRzX2Zp
bmlzaChmaWxlLCByZXN1bHQsIDAsICZlcnJvcikpCisgICAgICAgIGdfc2ltcGxlX2FzeW5jX3Jl
c3VsdF90YWtlX2Vycm9yKHNhdmVkVG9GaWxlUmVzdWx0LmdldCgpLCBlcnJvcik7CisKKyAgICBn
X3NpbXBsZV9hc3luY19yZXN1bHRfY29tcGxldGUoc2F2ZWRUb0ZpbGVSZXN1bHQuZ2V0KCkpOwor
fQorCitzdGF0aWMgdm9pZCBnZXRDb250ZW50c0FzTUhUTUxEYXRhQ2FsbGJhY2soV0tEYXRhUmVm
IHdrRGF0YSwgV0tFcnJvclJlZiwgdm9pZCogY29udGV4dCkKK3sKKyAgICBHUmVmUHRyPEdTaW1w
bGVBc3luY1Jlc3VsdD4gcmVzdWx0ID0gYWRvcHRHUmVmKEdfU0lNUExFX0FTWU5DX1JFU1VMVChj
b250ZXh0KSk7CisgICAgVmlld1NhdmVBc3luY0RhdGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxWaWV3
U2F2ZUFzeW5jRGF0YSo+KGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9nZXRfb3BfcmVzX2dwb2ludGVy
KHJlc3VsdC5nZXQoKSkpOworICAgIEdFcnJvciogZXJyb3IgPSAwOworCisgICAgaWYgKGdfY2Fu
Y2VsbGFibGVfc2V0X2Vycm9yX2lmX2NhbmNlbGxlZChkYXRhLT5jYW5jZWxsYWJsZS5nZXQoKSwg
JmVycm9yKSkKKyAgICAgICAgZ19zaW1wbGVfYXN5bmNfcmVzdWx0X3Rha2VfZXJyb3IocmVzdWx0
LmdldCgpLCBlcnJvcik7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gcmV0YWlu
IHRoZSBkYXRhIHVudGlsIHRoZSBhc3luY3Jvbm91cyBwcm9jZXNzCisgICAgICAgIC8vIGluaXRp
YXRlZCBieSB0aGUgdXNlciBoYXMgZmluaXNoZWQgY29tcGxldGVseS4KKyAgICAgICAgZGF0YS0+
d2tEYXRhID0gd2tEYXRhOworCisgICAgICAgIC8vIElmIHdlIGFyZSBzYXZpbmcgdG8gYSBmaWxl
IHdlIG5lZWQgdG8gd3JpdGUgdGhlIGRhdGEgb24gZGlzayBiZWZvcmUgZmluaXNoaW5nLgorICAg
ICAgICBpZiAoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9zb3VyY2VfdGFnKHJlc3VsdC5nZXQo
KSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSkgeworICAgICAgICAgICAgQVNTRVJU
KEdfSVNfRklMRShkYXRhLT5maWxlLmdldCgpKSk7CisgICAgICAgICAgICBnX2ZpbGVfcmVwbGFj
ZV9jb250ZW50c19hc3luYyhkYXRhLT5maWxlLmdldCgpLCByZWludGVycHJldF9jYXN0PGNvbnN0
IGdjaGFyKj4oV0tEYXRhR2V0Qnl0ZXMoZGF0YS0+d2tEYXRhLmdldCgpKSksIFdLRGF0YUdldFNp
emUoZGF0YS0+d2tEYXRhLmdldCgpKSwgMCwgRkFMU0UsIEdfRklMRV9DUkVBVEVfUkVQTEFDRV9E
RVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRh
dGEtPmNhbmNlbGxhYmxlLmdldCgpLCBmaWxlUmVwbGFjZUNvbnRlbnRzQ2FsbGJhY2ssIGdfb2Jq
ZWN0X3JlZihyZXN1bHQuZ2V0KCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9jb21wbGV0ZShyZXN1bHQuZ2V0KCkp
OworfQorCisvKioKKyAqIHdlYmtpdF93ZWJfdmlld19zYXZlOgorICogQHdlYl92aWV3OiBhICNX
ZWJLaXRXZWJWaWV3CisgKiBAc2F2ZV9tb2RlOiB0aGUgI1dlYktpdFNhdmVNb2RlIHNwZWNpZnlp
bmcgaG93IHRoZSB3ZWIgcGFnZSBzaG91bGQgYmUgc2F2ZWQuCisgKiBAY2FuY2VsbGFibGU6IChh
bGxvdy1ub25lKTogYSAjR0NhbmNlbGxhYmxlIG9yICVOVUxMIHRvIGlnbm9yZQorICogQGNhbGxi
YWNrOiAoc2NvcGUgYXN5bmMpOiBhICNHQXN5bmNSZWFkeUNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0
aGUgcmVxdWVzdCBpcyBzYXRpc2ZpZWQKKyAqIEB1c2VyX2RhdGE6IChjbG9zdXJlKTogdGhlIGRh
dGEgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIEFzeW5jaHJvbm91c2x5IHNh
dmUgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgYXNzb2NpYXRlZCB0byB0aGUKKyAqICNXZWJLaXRXZWJW
aWV3IGludG8gYSBzZWxmLWNvbnRhaW5lZCBmb3JtYXQgdXNpbmcgdGhlIG1vZGUKKyAqIHNwZWNp
ZmllZCBpbiAjV2ViS2l0U2F2ZU1vZGUuCisgKgorICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZp
bmlzaGVkLCBAY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuIFlvdSBjYW4KKyAqIHRoZW4gY2FsbCB3
ZWJraXRfd2ViX3ZpZXdfc2F2ZV9maW5pc2goKSB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUKKyAq
IG9wZXJhdGlvbi4KKyAqLwordm9pZCB3ZWJraXRfd2ViX3ZpZXdfc2F2ZShXZWJLaXRXZWJWaWV3
KiB3ZWJWaWV3LCBXZWJLaXRTYXZlTW9kZSBzYXZlTW9kZSwgR0NhbmNlbGxhYmxlKiBjYW5jZWxs
YWJsZSwgR0FzeW5jUmVhZHlDYWxsYmFjayBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlckRhdGEpCit7
CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldykpOworCisg
ICAgLy8gV2Ugb25seSBzdXBwb3J0IE1IVE1MIGF0IHRoZSBtb21lbnQuCisgICAgZ19yZXR1cm5f
aWZfZmFpbChzYXZlTW9kZSA9PSBXRUJLSVRfU0FWRV9NT0RFX01IVE1MKTsKKworICAgIEdTaW1w
bGVBc3luY1Jlc3VsdCogcmVzdWx0ID0gZ19zaW1wbGVfYXN5bmNfcmVzdWx0X25ldyhHX09CSkVD
VCh3ZWJWaWV3KSwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGdwb2lu
dGVyPih3ZWJraXRfd2ViX3ZpZXdfc2F2ZSkpOworICAgIFZpZXdTYXZlQXN5bmNEYXRhKiBkYXRh
ID0gY3JlYXRlVmlld1NhdmVBc3luY0RhdGEoKTsKKyAgICBkYXRhLT5jYW5jZWxsYWJsZSA9IGNh
bmNlbGxhYmxlOworICAgIGdfc2ltcGxlX2FzeW5jX3Jlc3VsdF9zZXRfb3BfcmVzX2dwb2ludGVy
KHJlc3VsdCwgZGF0YSwgcmVpbnRlcnByZXRfY2FzdDxHRGVzdHJveU5vdGlmeT4oZGVzdHJveVZp
ZXdTYXZlQXN5bmNEYXRhKSk7CisKKyAgICBXS1BhZ2VSZWYgd2tQYWdlID0gdG9BUEkod2Via2l0
V2ViVmlld0Jhc2VHZXRQYWdlKFdFQktJVF9XRUJfVklFV19CQVNFKHdlYlZpZXcpKSk7CisgICAg
V0tQYWdlR2V0Q29udGVudHNBc01IVE1MRGF0YSh3a1BhZ2UsIGZhbHNlLCByZXN1bHQsIGdldENv
bnRlbnRzQXNNSFRNTERhdGFDYWxsYmFjayk7Cit9CisKKy8qKgorICogd2Via2l0X3dlYl92aWV3
X3NhdmVfZmluaXNoOgorICogQHdlYl92aWV3OiBhICNXZWJLaXRXZWJWaWV3CisgKiBAcmVzdWx0
OiBhICNHQXN5bmNSZXN1bHQKKyAqIEBlcnJvcjogcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBv
ciAlTlVMTCB0byBpZ25vcmUKKyAqCisgKiBGaW5pc2ggYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlv
biBzdGFydGVkIHdpdGggd2Via2l0X3dlYl92aWV3X3NhdmUoKS4KKyAqCisgKiBSZXR1cm5zOiAo
dHJhbnNmZXIgZnVsbCk6IGEgI0dJbnB1dFN0cmVhbSB3aXRoIHRoZSByZXN1bHQgb2Ygc2F2aW5n
CisgKiAgICB0aGUgY3VycmVudCB3ZWIgcGFnZSBvciAlTlVMTCBpbiBjYXNlIG9mIGVycm9yLgor
ICovCitHSW5wdXRTdHJlYW0qIHdlYmtpdF93ZWJfdmlld19zYXZlX2ZpbmlzaChXZWJLaXRXZWJW
aWV3KiB3ZWJWaWV3LCBHQXN5bmNSZXN1bHQqIHJlc3VsdCwgR0Vycm9yKiogZXJyb3IpCit7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcpLCAwKTsK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChHX0lTX0FTWU5DX1JFU1VMVChyZXN1bHQpLCAwKTsK
KworICAgIEdTaW1wbGVBc3luY1Jlc3VsdCogc2ltcGxlID0gR19TSU1QTEVfQVNZTkNfUkVTVUxU
KHJlc3VsdCk7CisgICAgZ193YXJuX2lmX2ZhaWwoZ19zaW1wbGVfYXN5bmNfcmVzdWx0X2dldF9z
b3VyY2VfdGFnKHNpbXBsZSkgPT0gd2Via2l0X3dlYl92aWV3X3NhdmUpOworCisgICAgaWYgKGdf
c2ltcGxlX2FzeW5jX3Jlc3VsdF9wcm9wYWdhdGVfZXJyb3Ioc2ltcGxlLCBlcnJvcikpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgR0lucHV0U3RyZWFtKiBkYXRhU3RyZWFtID0gZ19tZW1vcnlf
aW5wdXRfc3RyZWFtX25ldygpOworICAgIFZpZXdTYXZlQXN5bmNEYXRhKiBkYXRhID0gc3RhdGlj
X2Nhc3Q8Vmlld1NhdmVBc3luY0RhdGEqPihnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0X29wX3Jl
c19ncG9pbnRlcihzaW1wbGUpKTsKKyAgICBnc2l6ZSBsZW5ndGggPSBXS0RhdGFHZXRTaXplKGRh
dGEtPndrRGF0YS5nZXQoKSk7CisgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgZ19tZW1vcnlfaW5w
dXRfc3RyZWFtX2FkZF9kYXRhKEdfTUVNT1JZX0lOUFVUX1NUUkVBTShkYXRhU3RyZWFtKSwgZ19t
ZW1kdXAoV0tEYXRhR2V0Qnl0ZXMoZGF0YS0+d2tEYXRhLmdldCgpKSwgbGVuZ3RoKSwgbGVuZ3Ro
LCBnX2ZyZWUpOworCisgICAgcmV0dXJuIGRhdGFTdHJlYW07Cit9CisKKy8qKgorICogd2Via2l0
X3dlYl92aWV3X3NhdmVfdG9fZmlsZToKKyAqIEB3ZWJfdmlldzogYSAjV2ViS2l0V2ViVmlldwor
ICogQGZpbGU6IHRoZSAjR0ZpbGUgd2hlcmUgdGhlIGN1cnJlbnQgd2ViIHBhZ2Ugc2hvdWxkIGJl
IHNhdmVkIHRvLgorICogQHNhdmVfbW9kZTogdGhlICNXZWJLaXRTYXZlTW9kZSBzcGVjaWZ5aW5n
IGhvdyB0aGUgd2ViIHBhZ2Ugc2hvdWxkIGJlIHNhdmVkLgorICogQGNhbmNlbGxhYmxlOiAoYWxs
b3ctbm9uZSk6IGEgI0dDYW5jZWxsYWJsZSBvciAlTlVMTCB0byBpZ25vcmUKKyAqIEBjYWxsYmFj
azogKHNjb3BlIGFzeW5jKTogYSAjR0FzeW5jUmVhZHlDYWxsYmFjayB0byBjYWxsIHdoZW4gdGhl
IHJlcXVlc3QgaXMgc2F0aXNmaWVkCisgKiBAdXNlcl9kYXRhOiAoY2xvc3VyZSk6IHRoZSBkYXRh
IHRvIHBhc3MgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBBc3luY2hyb25vdXNseSBzYXZl
IHRoZSBjdXJyZW50IHdlYiBwYWdlIGFzc29jaWF0ZWQgdG8gdGhlCisgKiAjV2ViS2l0V2ViVmll
dyBpbnRvIGEgc2VsZi1jb250YWluZWQgZm9ybWF0IHVzaW5nIHRoZSBtb2RlCisgKiBzcGVjaWZp
ZWQgaW4gQHNhdmVfbW9kZSBhbmQgd3JpdGluZyBpdCB0byBAZmlsZS4KKyAqCisgKiBXaGVuIHRo
ZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4gWW91IGNh
bgorICogdGhlbiBjYWxsIHdlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoKCkgdG8g
Z2V0IHRoZSByZXN1bHQgb2YgdGhlCisgKiBvcGVyYXRpb24uCisgKi8KK3ZvaWQgd2Via2l0X3dl
Yl92aWV3X3NhdmVfdG9fZmlsZShXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBHRmlsZSogZmlsZSwg
V2ViS2l0U2F2ZU1vZGUgc2F2ZU1vZGUsIEdDYW5jZWxsYWJsZSogY2FuY2VsbGFibGUsIEdBc3lu
Y1JlYWR5Q2FsbGJhY2sgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJEYXRhKQoreworICAgIGdfcmV0
dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcpKTsKKyAgICBnX3JldHVybl9p
Zl9mYWlsKEdfSVNfRklMRShmaWxlKSk7CisKKyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgTUhUTUwg
YXQgdGhlIG1vbWVudC4KKyAgICBnX3JldHVybl9pZl9mYWlsKHNhdmVNb2RlID09IFdFQktJVF9T
QVZFX01PREVfTUhUTUwpOworCisgICAgR1NpbXBsZUFzeW5jUmVzdWx0KiByZXN1bHQgPSBnX3Np
bXBsZV9hc3luY19yZXN1bHRfbmV3KEdfT0JKRUNUKHdlYlZpZXcpLCBjYWxsYmFjaywgdXNlckRh
dGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3BvaW50ZXI+KHdlYmtpdF93ZWJfdmlld19zYXZlX3Rv
X2ZpbGUpKTsKKyAgICBWaWV3U2F2ZUFzeW5jRGF0YSogZGF0YSA9IGNyZWF0ZVZpZXdTYXZlQXN5
bmNEYXRhKCk7CisgICAgZGF0YS0+ZmlsZSA9IGZpbGU7CisgICAgZGF0YS0+Y2FuY2VsbGFibGUg
PSBjYW5jZWxsYWJsZTsKKyAgICBnX3NpbXBsZV9hc3luY19yZXN1bHRfc2V0X29wX3Jlc19ncG9p
bnRlcihyZXN1bHQsIGRhdGEsIHJlaW50ZXJwcmV0X2Nhc3Q8R0Rlc3Ryb3lOb3RpZnk+KGRlc3Ry
b3lWaWV3U2F2ZUFzeW5jRGF0YSkpOworCisgICAgV0tQYWdlUmVmIHdrUGFnZSA9IHRvQVBJKHdl
YmtpdFdlYlZpZXdCYXNlR2V0UGFnZShXRUJLSVRfV0VCX1ZJRVdfQkFTRSh3ZWJWaWV3KSkpOwor
ICAgIFdLUGFnZUdldENvbnRlbnRzQXNNSFRNTERhdGEod2tQYWdlLCBmYWxzZSwgcmVzdWx0LCBn
ZXRDb250ZW50c0FzTUhUTUxEYXRhQ2FsbGJhY2spOworfQorCisvKioKKyAqIHdlYmtpdF93ZWJf
dmlld19zYXZlX3RvX2ZpbGVfZmluaXNoOgorICogQHdlYl92aWV3OiBhICNXZWJLaXRXZWJWaWV3
CisgKiBAcmVzdWx0OiBhICNHQXN5bmNSZXN1bHQKKyAqIEBlcnJvcjogcmV0dXJuIGxvY2F0aW9u
IGZvciBlcnJvciBvciAlTlVMTCB0byBpZ25vcmUKKyAqCisgKiBGaW5pc2ggYW4gYXN5bmNocm9u
b3VzIG9wZXJhdGlvbiBzdGFydGVkIHdpdGggd2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZSgp
LgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSB3ZWIgcGFnZSB3YXMgc3VjY2Vzc2Z1bGx5
IHNhdmVkIHRvIGEgZmlsZSBvciAlRkFMU0Ugb3RoZXJ3aXNlLgorICovCitnYm9vbGVhbiB3ZWJr
aXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlX2ZpbmlzaChXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBH
QXN5bmNSZXN1bHQqIHJlc3VsdCwgR0Vycm9yKiogZXJyb3IpCit7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcpLCBGQUxTRSk7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwoR19JU19BU1lOQ19SRVNVTFQocmVzdWx0KSwgRkFMU0UpOworCisgICAg
R1NpbXBsZUFzeW5jUmVzdWx0KiBzaW1wbGUgPSBHX1NJTVBMRV9BU1lOQ19SRVNVTFQocmVzdWx0
KTsKKyAgICBnX3dhcm5faWZfZmFpbChnX3NpbXBsZV9hc3luY19yZXN1bHRfZ2V0X3NvdXJjZV90
YWcoc2ltcGxlKSA9PSB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKTsKKworICAgIGlmIChn
X3NpbXBsZV9hc3luY19yZXN1bHRfcHJvcGFnYXRlX2Vycm9yKHNpbXBsZSwgZXJyb3IpKQorICAg
ICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaCBiL1NvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL1dlYktpdFdlYlZpZXcuaAppbmRleCAyNTUzYjE4Li42
ZWJkMTdmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9XZWJL
aXRXZWJWaWV3LmgKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvV2ViS2l0
V2ViVmlldy5oCkBAIC0xMTgsNiArMTE4LDE3IEBAIHR5cGVkZWYgZW51bSB7CiAgICAgV0VCS0lU
X0xPQURfRklOSVNIRUQKIH0gV2ViS2l0TG9hZEV2ZW50OwogCisvKioKKyAqIFdlYktpdFNhdmVN
b2RlOgorICogQFdFQktJVF9TQVZFX01PREVfTUhUTUw6IFNhdmUgdGhlIGN1cnJlbnQgcGFnZSB1
c2luZyB0aGUgTUhUTUwgZm9ybWF0LgorICoKKyAqIEVudW0gdmFsdWVzIHRvIHNwZWNpZnkgdGhl
IGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIGEgI1dlYktpdFdlYlZpZXcKKyAqIGNhbiBzYXZlIGl0
cyBjdXJyZW50IHdlYiBwYWdlIGludG8gYSBzZWxmLWNvbnRhaW5lZCBmaWxlLgorICovCit0eXBl
ZGVmIGVudW0geworICAgIFdFQktJVF9TQVZFX01PREVfTUhUTUwKK30gV2ViS2l0U2F2ZU1vZGU7
CisKIHN0cnVjdCBfV2ViS2l0V2ViVmlldyB7CiAgICAgV2ViS2l0V2ViVmlld0Jhc2UgcGFyZW50
OwogCkBAIC0zMTksNiArMzMwLDMxIEBAIFdFQktJVF9BUEkgZ2Jvb2xlYW4KIHdlYmtpdF93ZWJf
dmlld19jYW5fc2hvd19taW1lX3R5cGUgICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAg
ICAgICAgICAgICp3ZWJfdmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAgICAgICptaW1lX3R5cGUpOwog
CitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF93ZWJfdmlld19zYXZlICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAgICAgICAgICp3ZWJfdmlldywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJLaXRTYXZl
TW9kZSAgICAgICAgICAgICBzYXZlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgR0NhbmNlbGxhYmxlICAgICAgICAgICAgICAqY2FuY2Vs
bGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgICAgICAgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgICAgICAgICAgICAg
ICAgICAgdXNlcl9kYXRhKTsKKworV0VCS0lUX0FQSSBHSW5wdXRTdHJlYW0gKgord2Via2l0X3dl
Yl92aWV3X3NhdmVfZmluaXNoICAgICAgICAgICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcg
ICAgICAgICAgICAgKndlYl92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEdBc3luY1Jlc3VsdCAgICAgICAgICAgICAgKnJlc3VsdCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3Ig
ICAgICAgICAgICAgICAgICAgKiplcnJvcik7CisKK1dFQktJVF9BUEkgdm9pZAord2Via2l0X3dl
Yl92aWV3X3NhdmVfdG9fZmlsZSAgICAgICAgICAgICAgICAgICAgICAgKFdlYktpdFdlYlZpZXcg
ICAgICAgICAgICAgKndlYl92aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEdGaWxlICAgICAgICAgICAgICAgICAgICAgKmZpbGUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViS2l0U2F2
ZU1vZGUgICAgICAgICAgICAgc2F2ZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgICAgKmNhbmNl
bGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgICAgICAgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICAgICAgICAgICAg
ICAgICAgIHVzZXJfZGF0YSk7CisKK1dFQktJVF9BUEkgZ2Jvb2xlYW4KK3dlYmtpdF93ZWJfdmll
d19zYXZlX3RvX2ZpbGVfZmluaXNoICAgICAgICAgICAgICAgIChXZWJLaXRXZWJWaWV3ICAgICAg
ICAgICAgICp3ZWJfdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBHQXN5bmNSZXN1bHQgICAgICAgICAgICAgICpyZXN1bHQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAg
ICAgICAgICAgICAgICoqZXJyb3IpOworCiBHX0VORF9ERUNMUwogCiAjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0
aW9ucy50eHQgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdDJn
dGstc2VjdGlvbnMudHh0CmluZGV4IDczZjA5ZDUuLjkyZGExZWIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1zZWN0aW9ucy50eHQK
KysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNl
Y3Rpb25zLnR4dApAQCAtNjIsNiArNjIsNyBAQCB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X3R5cGUK
IFdlYktpdFdlYlZpZXcKIFdlYktpdExvYWRFdmVudAogV2ViS2l0UG9saWN5RGVjaXNpb25UeXBl
CitXZWJLaXRTYXZlTW9kZQogCiA8U1VCU0VDVElPTiBFZGl0aW5nIENvbW1hbmRzPgogV0VCS0lU
X0VESVRJTkdfQ09NTUFORF9DVVQKQEAgLTEwNSw2ICsxMDYsMTAgQEAgd2Via2l0X3dlYl92aWV3
X2dldF9qYXZhc2NyaXB0X2dsb2JhbF9jb250ZXh0CiB3ZWJraXRfd2ViX3ZpZXdfcnVuX2phdmFz
Y3JpcHQKIHdlYmtpdF93ZWJfdmlld19ydW5famF2YXNjcmlwdF9maW5pc2gKIHdlYmtpdF93ZWJf
dmlld19jYW5fc2hvd19taW1lX3R5cGUKK3dlYmtpdF93ZWJfdmlld19zYXZlCit3ZWJraXRfd2Vi
X3ZpZXdfc2F2ZV9maW5pc2gKK3dlYmtpdF93ZWJfdmlld19zYXZlX3RvX2ZpbGUKK3dlYmtpdF93
ZWJfdmlld19zYXZlX3RvX2ZpbGVfZmluaXNoCiAKIDxTVUJTRUNUSU9OIFdlYktpdEphdmFzY3Jp
cHRSZXN1bHQ+CiBXZWJLaXRKYXZhc2NyaXB0UmVzdWx0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAgYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay90ZXN0cy9UZXN0V2ViS2l0V2ViVmlldy5jcHAK
aW5kZXggZWVjNmZjNy4uNWZmNzVmYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvdGVzdHMvVGVzdFdlYktpdFdlYlZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL3Rlc3RzL1Rlc3RXZWJLaXRXZWJWaWV3LmNwcApAQCAtMjEs
NiArMjEsNyBAQAogI2luY2x1ZGUgIldlYlZpZXdUZXN0LmgiCiAjaW5jbHVkZSA8SmF2YVNjcmlw
dENvcmUvSlNTdHJpbmdSZWYuaD4KICNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1ZhbHVlUmVm
Lmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgog
I2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJp
bmdIYXNoLmg+CkBAIC05NDYsNiArOTQ3LDk4IEBAIHN0YXRpYyB2b2lkIHRlc3RXZWJWaWV3U3Vi
bWl0Rm9ybShGb3JtQ2xpZW50VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKICAgICBnX2Fzc2Vy
dF9jbXBzdHIoc3RhdGljX2Nhc3Q8Y2hhcio+KGdfaGFzaF90YWJsZV9sb29rdXAodmFsdWVzLCAi
cGFzc3dvcmQiKSksID09LCAic2VjcmV0Iik7CiB9CiAKK2NsYXNzIFNhdmVXZWJWaWV3VGVzdDog
cHVibGljIFdlYlZpZXdUZXN0IHsKK3B1YmxpYzoKKyAgICBNQUtFX0dMSUJfVEVTVF9GSVhUVVJF
KFNhdmVXZWJWaWV3VGVzdCk7CisKKyAgICBTYXZlV2ViVmlld1Rlc3QoKQorICAgIHsKKyAgICAg
ICAgbV90ZW1wRGlyZWN0b3J5LnNldChnX2Rpcl9tYWtlX3RtcCgiV2ViS2l0MlNhdmVWaWV3VGVz
dC1YWFhYWFgiLCAwKSk7CisgICAgICAgIGdfYXNzZXJ0KG1fdGVtcERpcmVjdG9yeS5nZXQoKSk7
CisgICAgfQorCisgICAgflNhdmVXZWJWaWV3VGVzdCgpCisgICAgeworICAgICAgICBnX2ZpbGVf
ZGVsZXRlKG1fZmlsZS5nZXQoKSwgMCwgMCk7CisgICAgICAgIGdfcm1kaXIobV90ZW1wRGlyZWN0
b3J5LmdldCgpKTsKKyAgICAgICAgZ19pbnB1dF9zdHJlYW1fY2xvc2UobV9pbnB1dFN0cmVhbS5n
ZXQoKSwgMCwgMCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgd2ViVmlld1NhdmVkVG9TdHJl
YW1DYWxsYmFjayhHT2JqZWN0KiBvYmplY3QsIEdBc3luY1Jlc3VsdCogcmVzdWx0LCBTYXZlV2Vi
Vmlld1Rlc3QqIHRlc3QpCisgICAgeworICAgICAgICBHT3duUHRyPEdFcnJvcj4gZXJyb3I7Cisg
ICAgICAgIHRlc3QtPm1faW5wdXRTdHJlYW0gPSBhZG9wdEdSZWYod2Via2l0X3dlYl92aWV3X3Nh
dmVfZmluaXNoKHRlc3QtPm1fd2ViVmlldywgcmVzdWx0LCAmZXJyb3Iub3V0UHRyKCkpKTsKKyAg
ICAgICAgZ19hc3NlcnQoR19JU19JTlBVVF9TVFJFQU0odGVzdC0+bV9pbnB1dFN0cmVhbS5nZXQo
KSkpOworICAgICAgICBnX2Fzc2VydCghZXJyb3IpOworCisgICAgICAgIHRlc3QtPnF1aXRNYWlu
TG9vcCgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxi
YWNrKEdPYmplY3QqIG9iamVjdCwgR0FzeW5jUmVzdWx0KiByZXN1bHQsIFNhdmVXZWJWaWV3VGVz
dCogdGVzdCkKKyAgICB7CisgICAgICAgIEdPd25QdHI8R0Vycm9yPiBlcnJvcjsKKyAgICAgICAg
Z19hc3NlcnQod2Via2l0X3dlYl92aWV3X3NhdmVfdG9fZmlsZV9maW5pc2godGVzdC0+bV93ZWJW
aWV3LCByZXN1bHQsICZlcnJvci5vdXRQdHIoKSkpOworICAgICAgICBnX2Fzc2VydCghZXJyb3Ip
OworCisgICAgICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOworICAgIH0KKworICAgIHZvaWQgc2F2
ZUFuZFdhaXRGb3JTdHJlYW0oKQorICAgIHsKKyAgICAgICAgd2Via2l0X3dlYl92aWV3X3NhdmUo
bV93ZWJWaWV3LCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVycHJldF9jYXN0PEdB
c3luY1JlYWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZFRvU3RyZWFtQ2FsbGJhY2spLCB0aGlzKTsK
KyAgICAgICAgZ19tYWluX2xvb3BfcnVuKG1fbWFpbkxvb3ApOworICAgIH0KKworICAgIHZvaWQg
c2F2ZUFuZFdhaXRGb3JGaWxlKCkKKyAgICB7CisgICAgICAgIG1fc2F2ZURlc3RpbmF0aW9uRmls
ZVBhdGguc2V0KGdfYnVpbGRfZmlsZW5hbWUobV90ZW1wRGlyZWN0b3J5LmdldCgpLCAidGVzdFdl
YlZpZXdTYXZlUmVzdWx0Lm1odCIsIE5VTEwpKTsKKyAgICAgICAgbV9maWxlID0gYWRvcHRHUmVm
KGdfZmlsZV9uZXdfZm9yX3BhdGgobV9zYXZlRGVzdGluYXRpb25GaWxlUGF0aC5nZXQoKSkpOwor
ICAgICAgICB3ZWJraXRfd2ViX3ZpZXdfc2F2ZV90b19maWxlKG1fd2ViVmlldywgbV9maWxlLmdl
dCgpLCBXRUJLSVRfU0FWRV9NT0RFX01IVE1MLCAwLCByZWludGVycHJldF9jYXN0PEdBc3luY1Jl
YWR5Q2FsbGJhY2s+KHdlYlZpZXdTYXZlZFRvRmlsZUNhbGxiYWNrKSwgdGhpcyk7CisgICAgICAg
IGdfbWFpbl9sb29wX3J1bihtX21haW5Mb29wKTsKKyAgICB9CisKKyAgICBHT3duUHRyPGNoYXI+
IG1fdGVtcERpcmVjdG9yeTsKKyAgICBHT3duUHRyPGNoYXI+IG1fc2F2ZURlc3RpbmF0aW9uRmls
ZVBhdGg7CisgICAgR1JlZlB0cjxHSW5wdXRTdHJlYW0+IG1faW5wdXRTdHJlYW07CisgICAgR1Jl
ZlB0cjxHRmlsZT4gbV9maWxlOworfTsKKworc3RhdGljIHZvaWQgdGVzdFdlYlZpZXdTYXZlKFNh
dmVXZWJWaWV3VGVzdCogdGVzdCwgZ2NvbnN0cG9pbnRlcikKK3sKKyAgICB0ZXN0LT5sb2FkSHRt
bCgiPGh0bWw+IgorICAgICAgICAgICAgICAgICAgICI8Ym9keT4iCisgICAgICAgICAgICAgICAg
ICAgIiAgPHA+QSBwYXJhZ3JhcGggd2l0aCBwbGFpbiB0ZXh0PC9wPiIKKyAgICAgICAgICAgICAg
ICAgICAiICA8cD4iCisgICAgICAgICAgICAgICAgICAgIiAgICBBIHJlZCBib3g6IDxpbWcgc3Jj
PSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFJQUFBQUND
QUlBQUFEOTFKcHpBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVIM0FZV0RU
TVZ3blNabndBQUFCMXBWRmgwUTI5dGJXVnVkQUFBQUFBQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZC
a0xtVUhBQUFBRmtsRVFWUUkxMlA4ejhEQXdNREF4TURBd01EQUFBQU5IUUVESyttbXlBQUFBQUJK
UlU1RXJrSmdnZz09Jz48L2JyPiIKKyAgICAgICAgICAgICAgICAgICAiICAgIEEgYmx1ZSBib3g6
IDxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FB
QUFJQUFBQUNDQUlBQUFEOTFKcHpBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpU
VVVIM0FZV0RUTXZCSGhBTFFBQUFCMXBWRmgwUTI5dGJXVnVkQUFBQUFBQVEzSmxZWFJsWkNCM2FY
Um9JRWRKVFZCa0xtVUhBQUFBRmtsRVFWUUkxMk5rNFBuUHdNREF4TURBd01EQUFBQUxyd0VQUElz
MXBnQUFBQUJKUlU1RXJrSmdnZz09Jz4iCisgICAgICAgICAgICAgICAgICAgIiAgPC9wPiIKKyAg
ICAgICAgICAgICAgICAgICAiPC9ib2R5PiIKKyAgICAgICAgICAgICAgICAgICAiPC9odG1sPiIs
IDApOworICAgIHRlc3QtPndhaXRVbnRpbExvYWRGaW5pc2hlZCgpOworCisgICAgLy8gV3JpdGUg
dG8gYSBmaWxlIGFuZCB0byBhbiBpbnB1dCBzdHJlYW0uCisgICAgdGVzdC0+c2F2ZUFuZFdhaXRG
b3JGaWxlKCk7CisgICAgdGVzdC0+c2F2ZUFuZFdhaXRGb3JTdHJlYW0oKTsKKworICAgIC8vIFdl
IHNob3VsZCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgYW1vdW50IG9mIGJ5dGVzIGluIHRoZSBmaWxl
CisgICAgLy8gdGhhbiB0aG9zZSBjb21pbmcgZnJvbSB0aGUgR0lucHV0U3RyZWFtLiBXZSBkb24n
dCBjb21wYXJlIHRoZQorICAgIC8vIHN0cmluZ3MgcmVhZCBzaW5jZSB0aGUgJ0RhdGUnIGZpZWxk
IGFuZCB0aGUgYm91bmRhcmllcyB3aWxsIGJlCisgICAgLy8gZGlmZmVyZW50IG9uIGVhY2ggY2Fz
ZS4gTUhUTUwgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIHRlc3RlZCBieQorICAgIC8vIExheW91dCB0
ZXN0cywgc28gY2hlY2tpbmcgdGhlIGFtb3VudCBvZiBieXRlcyBpcyBlbm91Z2guCisgICAgR093
blB0cjxHRXJyb3I+IGVycm9yOworICAgIGdjaGFyIGJ1ZmZlcls1MTJdID0geyAwIH07CisgICAg
Z3NzaXplIHJlYWRCeXRlcyA9IDA7CisgICAgZ3NzaXplIHRvdGFsQnl0ZXNGcm9tU3RyZWFtID0g
MDsKKyAgICB3aGlsZSAocmVhZEJ5dGVzID0gZ19pbnB1dF9zdHJlYW1fcmVhZCh0ZXN0LT5tX2lu
cHV0U3RyZWFtLmdldCgpLCAmYnVmZmVyLCA1MTIsIDAsICZlcnJvci5vdXRQdHIoKSkpIHsKKyAg
ICAgICAgZ19hc3NlcnQoIWVycm9yKTsKKyAgICAgICAgdG90YWxCeXRlc0Zyb21TdHJlYW0gKz0g
cmVhZEJ5dGVzOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpbGUgZXhpc3RzIGFu
ZCB0aGF0IGl0IGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBzYW1lIGFtb3VudCBvZiBieXRlcy4KKyAg
ICBHUmVmUHRyPEdGaWxlSW5mbz4gZmlsZUluZm8gPSBhZG9wdEdSZWYoZ19maWxlX3F1ZXJ5X2lu
Zm8odGVzdC0+bV9maWxlLmdldCgpLCBHX0ZJTEVfQVRUUklCVVRFX1NUQU5EQVJEX1NJWkUsIHN0
YXRpY19jYXN0PEdGaWxlUXVlcnlJbmZvRmxhZ3M+KDApLCAwLCAwKSk7CisgICAgZ19hc3NlcnRf
Y21waW50KGdfZmlsZV9pbmZvX2dldF9zaXplKGZpbGVJbmZvLmdldCgpKSwgPT0sIHRvdGFsQnl0
ZXNGcm9tU3RyZWFtKTsKK30KKwogdm9pZCBiZWZvcmVBbGwoKQogewogICAgIFdlYlZpZXdUZXN0
OjphZGQoIldlYktpdFdlYlZpZXciLCAiZGVmYXVsdC1jb250ZXh0IiwgdGVzdFdlYlZpZXdEZWZh
dWx0Q29udGV4dCk7CkBAIC05NjUsNiArMTA1OCw3IEBAIHZvaWQgYmVmb3JlQWxsKCkKICAgICBG
dWxsU2NyZWVuQ2xpZW50VGVzdDo6YWRkKCJXZWJLaXRXZWJWaWV3IiwgImZ1bGxzY3JlZW4iLCB0
ZXN0V2ViVmlld0Z1bGxTY3JlZW4pOwogICAgIFdlYlZpZXdUZXN0OjphZGQoIldlYktpdFdlYlZp
ZXciLCAiY2FuLXNob3ctbWltZS10eXBlIiwgdGVzdFdlYlZpZXdDYW5TaG93TUlNRVR5cGUpOwog
ICAgIEZvcm1DbGllbnRUZXN0OjphZGQoIldlYktpdFdlYlZpZXciLCAic3VibWl0LWZvcm0iLCB0
ZXN0V2ViVmlld1N1Ym1pdEZvcm0pOworICAgIFNhdmVXZWJWaWV3VGVzdDo6YWRkKCJXZWJLaXRX
ZWJWaWV3IiwgInNhdmUiLCB0ZXN0V2ViVmlld1NhdmUpOwogfQogCiB2b2lkIGFmdGVyQWxsKCkK
LS0gCjEuNy4xMS4yCgo=
</data>
<flag name="review"
          id="167350"
          type_id="1"
          status="+"
          setter="cgarcia"
    />
          </attachment>
      

    </bug>

</bugzilla>