<?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>52997</bug_id>
          
          <creation_ts>2011-01-24 00:55:25 -0800</creation_ts>
          <short_desc>[GTK] DRT&apos;s TextInputController is unimplemented on GTK</short_desc>
          <delta_ts>2011-02-08 02:21:27 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alejandro G. Castro">alex</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cgarcia</cc>
    
    <cc>mrobinson</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>338886</commentid>
    <comment_count>0</comment_count>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2011-01-24 00:55:25 -0800</bug_when>
    <thetext>GTK needs support for the TextInputController in order to pass some tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338893</commentid>
    <comment_count>1</comment_count>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2011-01-24 01:13:16 -0800</bug_when>
    <thetext>Tests skipped due to this reason:

fast/forms/input-maxlength-ime-completed.html
fast/forms/input-maxlength-ime-preedit.html
fast/text/international/thai-cursor-position.html
fast/events/ime-composition-events-001.html
fast/dom/tab-in-right-alignment.html
editing/input/ime-composition-clearpreedit.html
svg/text/caret-in-svg-text.xhtml
editing/inserting/insert-composition-whitespace.html

New test skipped today:

http://trac.webkit.org/changeset/76489</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341418</commentid>
    <comment_count>2</comment_count>
      <attachid>80443</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-01-28 06:33:22 -0800</bug_when>
    <thetext>Created attachment 80443
Initial implementation of TextInputController

With this initial implementation all tests mentioned here pass now, except svg/text/caret-in-svg-text.xhtml that still fails, I don&apos;t know why though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341487</commentid>
    <comment_count>3</comment_count>
      <attachid>80443</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-01-28 09:36:20 -0800</bug_when>
    <thetext>Comment on attachment 80443
Initial implementation of TextInputController

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

This is awesome! I&apos;d prefer you to try to go through the im-context where possible so that we have adequate testing on the WebKit layer. Does this also need &quot;doCommand&quot;? Other than that, it looks great!

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:471
&gt; +void DumpRenderTreeSupportGtk::setComposition(WebKitWebView* webView, const gchar* text, gint start, gint end)

Please use char and int here, since this isn&apos;t public API.

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:489
&gt; +    String compositionString = String::fromUTF8(text);
&gt; +    Vector&lt;CompositionUnderline&gt; underlines;
&gt; +    underlines.append(CompositionUnderline(0, compositionString.length(), Color(0, 0, 0), false));
&gt; +    editor-&gt;setComposition(compositionString, underlines, start, end);

If possible I think I&apos;d either like to see this touch the GtkIMContext of the WebView either here or below. That way this will also test the WebKit layer.

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:492
&gt; +void DumpRenderTreeSupportGtk::confirmComposition(WebKitWebView* webView, const gchar* text)

ghcar -&gt; char

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:510
&gt; +    if (editor-&gt;hasComposition()) {
&gt; +        if (text)
&gt; +            editor-&gt;confirmComposition(String::fromUTF8(text));
&gt; +        else
&gt; +            editor-&gt;confirmComposition();
&gt; +    } else
&gt; +        editor-&gt;insertText(String::fromUTF8(text), 0);

Same comment as above.

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:513
&gt; +bool DumpRenderTreeSupportGtk::firstRectForCharacterRange(WebKitWebView* webView, gint location, gint length, GdkRectangle* rect)

gint -&gt; int. It&apos;s fine to keep GdkRectangle since it&apos;s the only rect type that DumpRenderTree and WebKit share.

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:540
&gt; +bool DumpRenderTreeSupportGtk::selectedRange(WebKitWebView* webView, gint* start, gint* end)

Ditto.

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:562
&gt; +    RefPtr&lt;Range&gt; testRange = Range::create(scope-&gt;document(), scope, 0, range-&gt;startContainer(), range-&gt;startOffset());
&gt; +    ASSERT(testRange-&gt;startContainer() == scope);
&gt; +    *start = TextIterator::rangeLength(testRange.get());
&gt; +
&gt; +    ExceptionCode ec;
&gt; +    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset(), ec);
&gt; +    ASSERT(testRange-&gt;startContainer() == scope);
&gt; +    *end = TextIterator::rangeLength(testRange.get());

GTK+ doesn&apos;t seem to have the equivalent of seletion events the same way Qt and Mac do, so we must do this here. :)

&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.h:76
&gt; +    static void setComposition(WebKitWebView*, const gchar* text, gint start, gint end);
&gt; +    static void confirmComposition(WebKitWebView*, const gchar* text);
&gt; +    static bool firstRectForCharacterRange(WebKitWebView*, gint location, gint length, GdkRectangle*);
&gt; +    static bool selectedRange(WebKitWebView*, gint* start, gint* end);

These should probably just be static functions in TextInputController.h

&gt; Tools/DumpRenderTree/gtk/TextInputController.cpp:65
&gt; +    g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
&gt; +
&gt; +    DumpRenderTreeSupportGtk::setComposition(view, stringBuffer.get(), start, end);
&gt; +
&gt; +    return JSValueMakeUndefined(context);

Can you just use the im-context property from the WebView and emit the preedit-changed signal?

&gt; Tools/DumpRenderTree/gtk/TextInputController.cpp:87
&gt; +static JSValueRef insertTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
&gt; +{
&gt; +    WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
&gt; +    if (!view)
&gt; +        return JSValueMakeUndefined(context);
&gt; +
&gt; +    if (argumentCount &lt; 1)
&gt; +        return JSValueMakeUndefined(context);
&gt; +
&gt; +    JSStringRef string = JSValueToStringCopy(context, arguments[0], exception);
&gt; +    g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
&gt; +
&gt; +    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(string);
&gt; +    GOwnPtr&lt;gchar&gt; stringBuffer(static_cast&lt;gchar*&gt;(g_malloc(bufferSize)));
&gt; +    JSStringGetUTF8CString(string, stringBuffer.get(), bufferSize);
&gt; +    JSStringRelease(string);
&gt; +
&gt; +    DumpRenderTreeSupportGtk::confirmComposition(view, stringBuffer.get());
&gt; +
&gt; +    return JSValueMakeUndefined(context);

Is it possible just to get the im-context via the im-context property on the WebView and then emit the &quot;commit&quot; signal?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341494</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-01-28 10:00:23 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 80443 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=80443&amp;action=review
&gt; 
&gt; This is awesome! I&apos;d prefer you to try to go through the im-context where possible so that we have adequate testing on the WebKit layer. Does this also need &quot;doCommand&quot;? Other than that, it looks great!

Yes, well, that&apos;s why the changelog says &quot;initial&quot; implementation, I added the minimum stuff to fix the tests mentioned in this bug report, but there are several TextInputController methods not implemented, like doCommand that we can add in future patches. 

&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:471
&gt; &gt; +void DumpRenderTreeSupportGtk::setComposition(WebKitWebView* webView, const gchar* text, gint start, gint end)
&gt; 
&gt; Please use char and int here, since this isn&apos;t public API.

Ok

&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:489
&gt; &gt; +    String compositionString = String::fromUTF8(text);
&gt; &gt; +    Vector&lt;CompositionUnderline&gt; underlines;
&gt; &gt; +    underlines.append(CompositionUnderline(0, compositionString.length(), Color(0, 0, 0), false));
&gt; &gt; +    editor-&gt;setComposition(compositionString, underlines, start, end);
&gt; 
&gt; If possible I think I&apos;d either like to see this touch the GtkIMContext of the WebView either here or below. That way this will also test the WebKit layer.
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:492
&gt; &gt; +void DumpRenderTreeSupportGtk::confirmComposition(WebKitWebView* webView, const gchar* text)
&gt; 
&gt; ghcar -&gt; char
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:510
&gt; &gt; +    if (editor-&gt;hasComposition()) {
&gt; &gt; +        if (text)
&gt; &gt; +            editor-&gt;confirmComposition(String::fromUTF8(text));
&gt; &gt; +        else
&gt; &gt; +            editor-&gt;confirmComposition();
&gt; &gt; +    } else
&gt; &gt; +        editor-&gt;insertText(String::fromUTF8(text), 0);
&gt; 
&gt; Same comment as above.
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:513
&gt; &gt; +bool DumpRenderTreeSupportGtk::firstRectForCharacterRange(WebKitWebView* webView, gint location, gint length, GdkRectangle* rect)
&gt; 
&gt; gint -&gt; int. It&apos;s fine to keep GdkRectangle since it&apos;s the only rect type that DumpRenderTree and WebKit share.
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:540
&gt; &gt; +bool DumpRenderTreeSupportGtk::selectedRange(WebKitWebView* webView, gint* start, gint* end)
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp:562
&gt; &gt; +    RefPtr&lt;Range&gt; testRange = Range::create(scope-&gt;document(), scope, 0, range-&gt;startContainer(), range-&gt;startOffset());
&gt; &gt; +    ASSERT(testRange-&gt;startContainer() == scope);
&gt; &gt; +    *start = TextIterator::rangeLength(testRange.get());
&gt; &gt; +
&gt; &gt; +    ExceptionCode ec;
&gt; &gt; +    testRange-&gt;setEnd(range-&gt;endContainer(), range-&gt;endOffset(), ec);
&gt; &gt; +    ASSERT(testRange-&gt;startContainer() == scope);
&gt; &gt; +    *end = TextIterator::rangeLength(testRange.get());
&gt; 
&gt; GTK+ doesn&apos;t seem to have the equivalent of seletion events the same way Qt and Mac do, so we must do this here. :)
&gt; 
&gt; &gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.h:76
&gt; &gt; +    static void setComposition(WebKitWebView*, const gchar* text, gint start, gint end);
&gt; &gt; +    static void confirmComposition(WebKitWebView*, const gchar* text);
&gt; &gt; +    static bool firstRectForCharacterRange(WebKitWebView*, gint location, gint length, GdkRectangle*);
&gt; &gt; +    static bool selectedRange(WebKitWebView*, gint* start, gint* end);
&gt; 
&gt; These should probably just be static functions in TextInputController.h

They are here because they use WebCore API.

&gt; &gt; Tools/DumpRenderTree/gtk/TextInputController.cpp:65
&gt; &gt; +    g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
&gt; &gt; +
&gt; &gt; +    DumpRenderTreeSupportGtk::setComposition(view, stringBuffer.get(), start, end);
&gt; &gt; +
&gt; &gt; +    return JSValueMakeUndefined(context);
&gt; 
&gt; Can you just use the im-context property from the WebView and emit the preedit-changed signal?
&gt; 
&gt; &gt; Tools/DumpRenderTree/gtk/TextInputController.cpp:87
&gt; &gt; +static JSValueRef insertTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
&gt; &gt; +{
&gt; &gt; +    WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
&gt; &gt; +    if (!view)
&gt; &gt; +        return JSValueMakeUndefined(context);
&gt; &gt; +
&gt; &gt; +    if (argumentCount &lt; 1)
&gt; &gt; +        return JSValueMakeUndefined(context);
&gt; &gt; +
&gt; &gt; +    JSStringRef string = JSValueToStringCopy(context, arguments[0], exception);
&gt; &gt; +    g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
&gt; &gt; +
&gt; &gt; +    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(string);
&gt; &gt; +    GOwnPtr&lt;gchar&gt; stringBuffer(static_cast&lt;gchar*&gt;(g_malloc(bufferSize)));
&gt; &gt; +    JSStringGetUTF8CString(string, stringBuffer.get(), bufferSize);
&gt; &gt; +    JSStringRelease(string);
&gt; &gt; +
&gt; &gt; +    DumpRenderTreeSupportGtk::confirmComposition(view, stringBuffer.get());
&gt; &gt; +
&gt; &gt; +    return JSValueMakeUndefined(context);
&gt; 
&gt; Is it possible just to get the im-context via the im-context property on the WebView and then emit the &quot;commit&quot; signal?

I don&apos;t know how im-context works, I&apos;ll try to use it instead. Thanks for the comments!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341508</commentid>
    <comment_count>5</comment_count>
      <attachid>80443</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-01-28 10:23:14 -0800</bug_when>
    <thetext>Comment on attachment 80443
Initial implementation of TextInputController

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

&gt;&gt; Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.h:76
&gt;&gt; +    static bool selectedRange(WebKitWebView*, gint* start, gint* end);
&gt; 
&gt; These should probably just be static functions in TextInputController.h

Sorry! This comment was made in error.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345447</commentid>
    <comment_count>6</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-02-04 05:24:24 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 80443 [details])
&gt; If possible I think I&apos;d either like to see this touch the GtkIMContext of the WebView either here or below. That way this will also test the WebKit layer.

The problem is that it&apos;s not always possible to use the im-context, see below

&gt; &gt; Tools/DumpRenderTree/gtk/TextInputController.cpp:65
&gt; &gt; +    g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
&gt; &gt; +
&gt; &gt; +    DumpRenderTreeSupportGtk::setComposition(view, stringBuffer.get(), start, end);
&gt; &gt; +
&gt; &gt; +    return JSValueMakeUndefined(context);
&gt; 
&gt; Can you just use the im-context property from the WebView and emit the preedit-changed signal?

preedit-changed callback doesn&apos;t receive the start and end, so setComposition() is always called with 0, 0

frame-&gt;editor()-&gt;setComposition(preeditString, underlines, 0, 0);
 
&gt; Is it possible just to get the im-context via the im-context property on the WebView and then emit the &quot;commit&quot; signal?

in this case it would probably be possible, but I&apos;m not sure it makes sense to use it only in this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345459</commentid>
    <comment_count>7</comment_count>
      <attachid>81210</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-02-04 06:34:41 -0800</bug_when>
    <thetext>Created attachment 81210
Updated patch

Updated patch using int/char instead of gint/gchar</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346617</commentid>
    <comment_count>8</comment_count>
      <attachid>81210</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-02-07 09:18:01 -0800</bug_when>
    <thetext>Comment on attachment 81210
Updated patch

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

Okay! It&apos;s too bad we cannot use the real IME API to do this, but I understand if it just isn&apos;t possible.

&gt; LayoutTests/platform/gtk/Skipped:3776
&gt;  # No TextInputController support
&gt;  # https://bugs.webkit.org/show_bug.cgi?id=52997

I think it makes sense to remove this comment now.

&gt; LayoutTests/platform/gtk/Skipped:3777
&gt;  svg/text/caret-in-svg-text.xhtml

Please open a specific bug for this test explaining what feature is missing and add it above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347245</commentid>
    <comment_count>9</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-02-08 02:21:14 -0800</bug_when>
    <thetext>Committed r77917: &lt;http://trac.webkit.org/changeset/77917&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80443</attachid>
            <date>2011-01-28 06:33:22 -0800</date>
            <delta_ts>2011-02-04 06:34:41 -0800</delta_ts>
            <desc>Initial implementation of TextInputController</desc>
            <filename>text-input-controller.diff</filename>
            <type>text/plain</type>
            <size>21148</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBjYWExMmI5Li5mNDA4MjA4IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDEt
MjggIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIERSVCdzIFRleHRJ
bnB1dENvbnRyb2xsZXIgaXMgdW5pbXBsZW1lbnRlZCBvbiBHVEsKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyOTk3CisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ndGsvU2tpcHBlZDogVW5za2lwIHNldmVyYWwgdGVzdHMgdGhhdCBwYXNzIG5vdyB0aGF0IHdl
CisgICAgICAgIGhhdmUgVGV4dElucHV0Q29udHJvbGxlci4KKwogMjAxMS0wMS0yNyAgUnlvc3Vr
ZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBVbnJldmlld2VkIENocm9taXVt
IHRlc3QgZXhwZWN0YXRpb24gdXBkYXRlLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ndGsv
Q2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nCmluZGV4IGFmZGMzNzUuLjE4
ZTQwODEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOCBAQAorMjAxMS0wMS0yOCAgQ2Fy
bG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0dUS10gRFJUJ3MgVGV4dElucHV0Q29u
dHJvbGxlciBpcyB1bmltcGxlbWVudGVkIG9uIEdUSworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI5OTcKKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0
L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5jcHA6CisgICAgICAgIChEdW1wUmVuZGVyVHJlZVN1
cHBvcnRHdGs6OnNldENvbXBvc2l0aW9uKToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9y
dEd0azo6Y29uZmlybUNvbXBvc2l0aW9uKToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9y
dEd0azo6Zmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UpOgorICAgICAgICAoRHVtcFJlbmRlclRy
ZWVTdXBwb3J0R3RrOjpzZWxlY3RlZFJhbmdlKTogTmV3IG1ldGhvZHMgbmVlZGVkIGJ5CisgICAg
ICAgIFRleHRJbnB1dENvbnRyb2xsZXIuCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvRHVtcFJl
bmRlclRyZWVTdXBwb3J0R3RrLmg6CisKIDIwMTEtMDEtMjcgIE5hdGUgQ2hhcGluICA8amFwaGV0
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIEJhcnRoLgpkaWZmIC0t
Z2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9nCmluZGV4IDMxYzNhZjYuLmFj
MGZjZTEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwyNSBAQAorMjAxMS0wMS0yOCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2Fy
Y2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgW0dUS10gRFJUJ3MgVGV4dElucHV0Q29udHJvbGxlciBpcyB1bmltcGxlbWVudGVk
IG9uIEdUSworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTI5OTcKKworICAgICAgICBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIFRleHRJbnB1dENvbnRy
b2xsZXIgZm9yIEdUSyBwb3J0LgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZ3RrL0R1bXBS
ZW5kZXJUcmVlLmNwcDoKKyAgICAgICAgKHdlYlZpZXdXaW5kb3dPYmplY3RDbGVhcmVkKToKKyAg
ICAgICAgKiBEdW1wUmVuZGVyVHJlZS9ndGsvVGV4dElucHV0Q29udHJvbGxlci5jcHA6IEFkZGVk
LgorICAgICAgICAoc2V0TWFya2VkVGV4dENhbGxiYWNrKToKKyAgICAgICAgKGluc2VydFRleHRD
YWxsYmFjayk6CisgICAgICAgICh1bm1hcmtUZXh0Q2FsbGJhY2spOgorICAgICAgICAoZmlyc3RS
ZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayk6CisgICAgICAgIChzZWxlY3RlZFJhbmdlQ2Fs
bGJhY2spOgorICAgICAgICAoZ2V0Q2xhc3MpOgorICAgICAgICAobWFrZVRleHRJbnB1dENvbnRy
b2xsZXIpOgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2d0ay9UZXh0SW5wdXRDb250cm9sbGVy
Lmg6IEFkZGVkLgorICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorCiAyMDExLTAxLTI3ICBHcmVn
IENvbGV0dGEgIDxncmVnLmNvbGV0dGFAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IExhc3psbyBHb21ib3MuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tp
cHBlZCBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCmluZGV4IDU3MmY5NjQuLmFi
OTFmNjkgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCisrKyBi
L0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCkBAIC00MTY2LDE0ICs0MTY2LDcgQEAg
ZmFzdC9sb2FkZXIvb3BhcXVlLWJhc2UtdXJsLmh0bWwKIAogIyBObyBUZXh0SW5wdXRDb250cm9s
bGVyIHN1cHBvcnQKICMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUy
OTk3Ci1mYXN0L2Zvcm1zL2lucHV0LW1heGxlbmd0aC1pbWUtY29tcGxldGVkLmh0bWwKLWZhc3Qv
Zm9ybXMvaW5wdXQtbWF4bGVuZ3RoLWltZS1wcmVlZGl0Lmh0bWwKLWZhc3QvdGV4dC9pbnRlcm5h
dGlvbmFsL3RoYWktY3Vyc29yLXBvc2l0aW9uLmh0bWwKLWZhc3QvZXZlbnRzL2ltZS1jb21wb3Np
dGlvbi1ldmVudHMtMDAxLmh0bWwKLWZhc3QvZG9tL3RhYi1pbi1yaWdodC1hbGlnbm1lbnQuaHRt
bAotZWRpdGluZy9pbnB1dC9pbWUtY29tcG9zaXRpb24tY2xlYXJwcmVlZGl0Lmh0bWwKIHN2Zy90
ZXh0L2NhcmV0LWluLXN2Zy10ZXh0LnhodG1sCi1lZGl0aW5nL2luc2VydGluZy9pbnNlcnQtY29t
cG9zaXRpb24td2hpdGVzcGFjZS5odG1sCiAKICMgTm8gVXNlciBTY3JpcHRzCiB1c2Vyc2NyaXB0
cy9zY3JpcHQtbm90LXJ1bi1mb3ItZnJhZ21lbnRzLmh0bWwKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5jcHAgYi9T
b3VyY2UvV2ViS2l0L2d0ay9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGsu
Y3BwCmluZGV4IDZmMzE4ODcuLjY1NTllN2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3Rr
L1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5jcHAKKysrIGIvU291cmNl
L1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrLmNwcApA
QCAtMiw2ICsyLDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpv
b25lIEh1ciA8am9vbmVAa2xkcC5vcmc+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBT
LkwuCiAgKgogICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC00Nyw2ICs0OCw3IEBACiAjaW5jbHVkZSAiUmVu
ZGVyVHJlZUFzVGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTZWN1
cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgogI2luY2x1ZGUgIldvcmtl
clRocmVhZC5oIgogI2luY2x1ZGUgIndlYmtpdHdlYmZyYW1lLmgiCiAjaW5jbHVkZSAid2Via2l0
d2ViZnJhbWVwcml2YXRlLmgiCkBAIC00NjYsNiArNDY4LDEwMiBAQCBib29sIER1bXBSZW5kZXJU
cmVlU3VwcG9ydEd0azo6aXNDb21tYW5kRW5hYmxlZChXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBj
b25zdCBnYwogICAgIHJldHVybiBjb3JlKHdlYlZpZXcpLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9j
dXNlZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpLT5jb21tYW5kKG5hbWUpLmlzRW5hYmxlZCgpOwog
fQogCit2b2lkIER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6c2V0Q29tcG9zaXRpb24oV2ViS2l0
V2ViVmlldyogd2ViVmlldywgY29uc3QgZ2NoYXIqIHRleHQsIGdpbnQgc3RhcnQsIGdpbnQgZW5k
KQoreworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcpKTsK
KyAgICBnX3JldHVybl9pZl9mYWlsKHRleHQpOworCisgICAgRnJhbWUqIGZyYW1lID0gY29yZSh3
ZWJWaWV3KS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlm
ICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEVkaXRvciogZWRpdG9yID0gZnJhbWUt
PmVkaXRvcigpOworICAgIGlmICghZWRpdG9yKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFl
ZGl0b3ItPmNhbkVkaXQoKSAmJiAhZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTdHJpbmcgY29tcG9zaXRpb25TdHJpbmcgPSBTdHJpbmc6OmZyb21VVEY4
KHRleHQpOworICAgIFZlY3RvcjxDb21wb3NpdGlvblVuZGVybGluZT4gdW5kZXJsaW5lczsKKyAg
ICB1bmRlcmxpbmVzLmFwcGVuZChDb21wb3NpdGlvblVuZGVybGluZSgwLCBjb21wb3NpdGlvblN0
cmluZy5sZW5ndGgoKSwgQ29sb3IoMCwgMCwgMCksIGZhbHNlKSk7CisgICAgZWRpdG9yLT5zZXRD
b21wb3NpdGlvbihjb21wb3NpdGlvblN0cmluZywgdW5kZXJsaW5lcywgc3RhcnQsIGVuZCk7Cit9
CisKK3ZvaWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpjb25maXJtQ29tcG9zaXRpb24oV2Vi
S2l0V2ViVmlldyogd2ViVmlldywgY29uc3QgZ2NoYXIqIHRleHQpCit7CisgICAgZ19yZXR1cm5f
aWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldykpOworCisgICAgRnJhbWUqIGZyYW1l
ID0gY29yZSh3ZWJWaWV3KS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgp
OworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEVkaXRvciogZWRpdG9y
ID0gZnJhbWUtPmVkaXRvcigpOworICAgIGlmICghZWRpdG9yIHx8ICghZWRpdG9yLT5oYXNDb21w
b3NpdGlvbigpICYmICF0ZXh0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGVkaXRvci0+
aGFzQ29tcG9zaXRpb24oKSkgeworICAgICAgICBpZiAodGV4dCkKKyAgICAgICAgICAgIGVkaXRv
ci0+Y29uZmlybUNvbXBvc2l0aW9uKFN0cmluZzo6ZnJvbVVURjgodGV4dCkpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBlZGl0b3ItPmNvbmZpcm1Db21wb3NpdGlvbigpOworICAgIH0gZWxz
ZQorICAgICAgICBlZGl0b3ItPmluc2VydFRleHQoU3RyaW5nOjpmcm9tVVRGOCh0ZXh0KSwgMCk7
Cit9CisKK2Jvb2wgRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpmaXJzdFJlY3RGb3JDaGFyYWN0
ZXJSYW5nZShXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBnaW50IGxvY2F0aW9uLCBnaW50IGxlbmd0
aCwgR2RrUmVjdGFuZ2xlKiByZWN0KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJ
VF9JU19XRUJfVklFVyh3ZWJWaWV3KSwgZmFsc2UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWls
KHJlY3QsIGZhbHNlKTsKKworICAgIGlmICgobG9jYXRpb24gKyBsZW5ndGggPCBsb2NhdGlvbikg
JiYgKGxvY2F0aW9uICsgbGVuZ3RoKSkKKyAgICAgICAgbGVuZ3RoID0gMDsKKworICAgIEZyYW1l
KiBmcmFtZSA9IGNvcmUod2ViVmlldyktPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBF
ZGl0b3IqIGVkaXRvciA9IGZyYW1lLT5lZGl0b3IoKTsKKyAgICBpZiAoIWVkaXRvcikKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgRWxlbWVudCogc2VsZWN0aW9uUm9vdCA9IGZyYW1lLT5z
ZWxlY3Rpb24oKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIEVsZW1lbnQqIHNjb3BlID0g
c2VsZWN0aW9uUm9vdCA/IHNlbGVjdGlvblJvb3QgOiBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9jdW1l
bnRFbGVtZW50KCk7CisgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFu
Z2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoc2NvcGUsIGxvY2F0aW9uLCBsZW5ndGgpOworICAgIGlm
ICghcmFuZ2UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICpyZWN0ID0gZWRpdG9yLT5m
aXJzdFJlY3RGb3JSYW5nZShyYW5nZS5nZXQoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBEdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGs6OnNlbGVjdGVkUmFuZ2UoV2ViS2l0V2ViVmll
dyogd2ViVmlldywgZ2ludCogc3RhcnQsIGdpbnQqIGVuZCkKK3sKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbChXRUJLSVRfSVNfV0VCX1ZJRVcod2ViVmlldyksIGZhbHNlKTsKKyAgICBnX3JldHVy
bl92YWxfaWZfZmFpbChzdGFydCwgZmFsc2UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKGVu
ZCwgZmFsc2UpOworCisgICAgRnJhbWUqIGZyYW1lID0gY29yZSh3ZWJWaWV3KS0+Zm9jdXNDb250
cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBmcmFtZS0+c2VsZWN0
aW9uKCktPnRvTm9ybWFsaXplZFJhbmdlKCkuZ2V0KCk7CisKKyAgICBFbGVtZW50KiBzZWxlY3Rp
b25Sb290ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVtZW50KCk7CisgICAg
RWxlbWVudCogc2NvcGUgPSBzZWxlY3Rpb25Sb290ID8gc2VsZWN0aW9uUm9vdCA6IGZyYW1lLT5k
b2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKTsKKworICAgIFJlZlB0cjxSYW5nZT4gdGVzdFJh
bmdlID0gUmFuZ2U6OmNyZWF0ZShzY29wZS0+ZG9jdW1lbnQoKSwgc2NvcGUsIDAsIHJhbmdlLT5z
dGFydENvbnRhaW5lcigpLCByYW5nZS0+c3RhcnRPZmZzZXQoKSk7CisgICAgQVNTRVJUKHRlc3RS
YW5nZS0+c3RhcnRDb250YWluZXIoKSA9PSBzY29wZSk7CisgICAgKnN0YXJ0ID0gVGV4dEl0ZXJh
dG9yOjpyYW5nZUxlbmd0aCh0ZXN0UmFuZ2UuZ2V0KCkpOworCisgICAgRXhjZXB0aW9uQ29kZSBl
YzsKKyAgICB0ZXN0UmFuZ2UtPnNldEVuZChyYW5nZS0+ZW5kQ29udGFpbmVyKCksIHJhbmdlLT5l
bmRPZmZzZXQoKSwgZWMpOworICAgIEFTU0VSVCh0ZXN0UmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCkg
PT0gc2NvcGUpOworICAgICplbmQgPSBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHRlc3RSYW5n
ZS5nZXQoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBEdW1wUmVuZGVyVHJlZVN1
cHBvcnRHdGs6OndoaXRlTGlzdEFjY2Vzc0Zyb21PcmlnaW4oY29uc3QgZ2NoYXIqIHNvdXJjZU9y
aWdpbiwgY29uc3QgZ2NoYXIqIGRlc3RpbmF0aW9uUHJvdG9jb2wsIGNvbnN0IGdjaGFyKiBkZXN0
aW5hdGlvbkhvc3QsIGJvb2wgYWxsb3dEZXN0aW5hdGlvblN1YmRvbWFpbnMpCiB7CiAgICAgU2Vj
dXJpdHlPcmlnaW46OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpTZWN1cml0eU9yaWdp
bjo6Y3JlYXRlRnJvbVN0cmluZyhzb3VyY2VPcmlnaW4pLCBkZXN0aW5hdGlvblByb3RvY29sLCBk
ZXN0aW5hdGlvbkhvc3QsIGFsbG93RGVzdGluYXRpb25TdWJkb21haW5zKTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0
ay5oIGIvU291cmNlL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBw
b3J0R3RrLmgKaW5kZXggNjYzZjEzYS4uYmMyYzAyNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9ndGsvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrLmgKKysrIGIvU291
cmNlL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrLmgK
QEAgLTcwLDYgKzcwLDEwIEBAIHB1YmxpYzoKICAgICAvLyBXZWJLaXRXZWJWaWV3CiAgICAgc3Rh
dGljIHZvaWQgZXhlY3V0ZUNvcmVDb21tYW5kQnlOYW1lKFdlYktpdFdlYlZpZXcqLCBjb25zdCBn
Y2hhciogbmFtZSwgY29uc3QgZ2NoYXIqIHZhbHVlKTsKICAgICBzdGF0aWMgYm9vbCBpc0NvbW1h
bmRFbmFibGVkKFdlYktpdFdlYlZpZXcqLCBjb25zdCBnY2hhciogbmFtZSk7CisgICAgc3RhdGlj
IHZvaWQgc2V0Q29tcG9zaXRpb24oV2ViS2l0V2ViVmlldyosIGNvbnN0IGdjaGFyKiB0ZXh0LCBn
aW50IHN0YXJ0LCBnaW50IGVuZCk7CisgICAgc3RhdGljIHZvaWQgY29uZmlybUNvbXBvc2l0aW9u
KFdlYktpdFdlYlZpZXcqLCBjb25zdCBnY2hhciogdGV4dCk7CisgICAgc3RhdGljIGJvb2wgZmly
c3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UoV2ViS2l0V2ViVmlldyosIGdpbnQgbG9jYXRpb24sIGdp
bnQgbGVuZ3RoLCBHZGtSZWN0YW5nbGUqKTsKKyAgICBzdGF0aWMgYm9vbCBzZWxlY3RlZFJhbmdl
KFdlYktpdFdlYlZpZXcqLCBnaW50KiBzdGFydCwgZ2ludCogZW5kKTsKIAogICAgIC8vIEdDCiAg
ICAgc3RhdGljIHZvaWQgZ2NDb2xsZWN0SmF2YXNjcmlwdE9iamVjdHMoKTsKZGlmZiAtLWdpdCBh
L1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9EdW1wUmVuZGVyVHJlZS5jcHAgYi9Ub29scy9EdW1w
UmVuZGVyVHJlZS9ndGsvRHVtcFJlbmRlclRyZWUuY3BwCmluZGV4IGZmOTBkODEuLjBhMDE5YWQg
MTAwNjQ0Ci0tLSBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9EdW1wUmVuZGVyVHJlZS5jcHAK
KysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL0R1bXBSZW5kZXJUcmVlLmNwcApAQCAtMzks
NiArMzksNyBAQAogI2luY2x1ZGUgIkdPd25QdHIuaCIKICNpbmNsdWRlICJMYXlvdXRUZXN0Q29u
dHJvbGxlci5oIgogI2luY2x1ZGUgIlBpeGVsRHVtcFN1cHBvcnQuaCIKKyNpbmNsdWRlICJUZXh0
SW5wdXRDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRy
ZWVTdXBwb3J0R3RrLmgiCiAjaW5jbHVkZSAiV29ya1F1ZXVlLmgiCiAjaW5jbHVkZSAiV29ya1F1
ZXVlSXRlbS5oIgpAQCAtNzgxLDYgKzc4MiwxMSBAQCBzdGF0aWMgdm9pZCB3ZWJWaWV3V2luZG93
T2JqZWN0Q2xlYXJlZChXZWJLaXRXZWJWaWV3KiB2aWV3LCBXZWJLaXRXZWJGcmFtZSogZnJhbQog
ICAgIEpTVmFsdWVSZWYgZXZlbnRTZW5kZXIgPSBtYWtlRXZlbnRTZW5kZXIoY29udGV4dCwgIXdl
YmtpdF93ZWJfZnJhbWVfZ2V0X3BhcmVudChmcmFtZSkpOwogICAgIEpTT2JqZWN0U2V0UHJvcGVy
dHkoY29udGV4dCwgd2luZG93T2JqZWN0LCBldmVudFNlbmRlclN0ciwgZXZlbnRTZW5kZXIsIGtK
U1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxl
dGUsIDApOwogICAgIEpTU3RyaW5nUmVsZWFzZShldmVudFNlbmRlclN0cik7CisKKyAgICBKU1N0
cmluZ1JlZiB0ZXh0SW5wdXRDb250cm9sbGVyU3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENT
dHJpbmcoInRleHRJbnB1dENvbnRyb2xsZXIiKTsKKyAgICBKU1ZhbHVlUmVmIHRleHRJbnB1dENv
bnRyb2xsZXIgPSBtYWtlVGV4dElucHV0Q29udHJvbGxlcihjb250ZXh0KTsKKyAgICBKU09iamVj
dFNldFByb3BlcnR5KGNvbnRleHQsIHdpbmRvd09iamVjdCwgdGV4dElucHV0Q29udHJvbGxlclN0
ciwgdGV4dElucHV0Q29udHJvbGxlciwga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtK
U1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7CisgICAgSlNTdHJpbmdSZWxlYXNlKHRl
eHRJbnB1dENvbnRyb2xsZXJTdHIpOwogfQogCiBzdGF0aWMgZ2Jvb2xlYW4gd2ViVmlld0NvbnNv
bGVNZXNzYWdlKFdlYktpdFdlYlZpZXcqIHZpZXcsIGNvbnN0IGdjaGFyKiBtZXNzYWdlLCB1bnNp
Z25lZCBpbnQgbGluZSwgY29uc3QgZ2NoYXIqIHNvdXJjZUlkLCBncG9pbnRlciBkYXRhKQpkaWZm
IC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL1RleHRJbnB1dENvbnRyb2xsZXIuY3Bw
IGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL1RleHRJbnB1dENvbnRyb2xsZXIuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDNmZGMKLS0tIC9kZXYvbnVsbAorKysg
Yi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ndGsvVGV4dElucHV0Q29udHJvbGxlci5jcHAKQEAgLTAs
MCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSWdhbGlhIFMuTC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dElucHV0Q29udHJvbGxlci5oIgorCisjaW5jbHVk
ZSAiRHVtcFJlbmRlclRyZWUuaCIKKyNpbmNsdWRlICJXZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVy
VHJlZVN1cHBvcnRHdGsuaCIKKyNpbmNsdWRlIDxHT3duUHRyR3RrLmg+CisjaW5jbHVkZSA8SmF2
YVNjcmlwdENvcmUvSlNPYmplY3RSZWYuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1Jl
dGFpblB0ci5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTU3RyaW5nUmVmLmg+CisjaW5j
bHVkZSA8Y3N0cmluZz4KKworc3RhdGljIEpTVmFsdWVSZWYgc2V0TWFya2VkVGV4dENhbGxiYWNr
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYg
dGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1l
bnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBXZWJLaXRXZWJWaWV3KiB2aWV3
ID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfd2ViX3ZpZXcobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZp
ZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAg
IGlmIChhcmd1bWVudENvdW50IDwgMykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZp
bmVkKGNvbnRleHQpOworCisgICAgSlNTdHJpbmdSZWYgc3RyaW5nID0gSlNWYWx1ZVRvU3RyaW5n
Q29weShjb250ZXh0LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KSk7CisKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IEpTU3RyaW5nR2V0TWF4aW11
bVVURjhDU3RyaW5nU2l6ZShzdHJpbmcpOworICAgIEdPd25QdHI8Z2NoYXI+IHN0cmluZ0J1ZmZl
cihzdGF0aWNfY2FzdDxnY2hhcio+KGdfbWFsbG9jKGJ1ZmZlclNpemUpKSk7CisgICAgSlNTdHJp
bmdHZXRVVEY4Q1N0cmluZyhzdHJpbmcsIHN0cmluZ0J1ZmZlci5nZXQoKSwgYnVmZmVyU2l6ZSk7
CisgICAgSlNTdHJpbmdSZWxlYXNlKHN0cmluZyk7CisKKyAgICBpbnQgc3RhcnQgPSBzdGF0aWNf
Y2FzdDxpbnQ+KEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlv
bikpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCghZXhjZXB0aW9uIHx8ICEqZXhjZXB0aW9u
KSwgSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCkpOworCisgICAgaW50IGVuZCA9IHN0YXRp
Y19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1syXSwgZXhjZXB0
aW9uKSk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoKCFleGNlcHRpb24gfHwgISpleGNlcHRp
b24pLCBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KSk7CisKKyAgICBEdW1wUmVuZGVyVHJl
ZVN1cHBvcnRHdGs6OnNldENvbXBvc2l0aW9uKHZpZXcsIHN0cmluZ0J1ZmZlci5nZXQoKSwgc3Rh
cnQsIGVuZCk7CisKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9
CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGluc2VydFRleHRDYWxsYmFjayhKU0NvbnRleHRSZWYgY29u
dGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVf
dCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVm
KiBleGNlcHRpb24pCit7CisgICAgV2ViS2l0V2ViVmlldyogdmlldyA9IHdlYmtpdF93ZWJfZnJh
bWVfZ2V0X3dlYl92aWV3KG1haW5GcmFtZSk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1
cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpZiAoYXJndW1lbnRDb3Vu
dCA8IDEpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKwor
ICAgIEpTU3RyaW5nUmVmIHN0cmluZyA9IEpTVmFsdWVUb1N0cmluZ0NvcHkoY29udGV4dCwgYXJn
dW1lbnRzWzBdLCBleGNlcHRpb24pOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCghZXhjZXB0
aW9uIHx8ICEqZXhjZXB0aW9uKSwgSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCkpOworCisg
ICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUo
c3RyaW5nKTsKKyAgICBHT3duUHRyPGdjaGFyPiBzdHJpbmdCdWZmZXIoc3RhdGljX2Nhc3Q8Z2No
YXIqPihnX21hbGxvYyhidWZmZXJTaXplKSkpOworICAgIEpTU3RyaW5nR2V0VVRGOENTdHJpbmco
c3RyaW5nLCBzdHJpbmdCdWZmZXIuZ2V0KCksIGJ1ZmZlclNpemUpOworICAgIEpTU3RyaW5nUmVs
ZWFzZShzdHJpbmcpOworCisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpjb25maXJtQ29t
cG9zaXRpb24odmlldywgc3RyaW5nQnVmZmVyLmdldCgpKTsKKworICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgdW5tYXJrVGV4
dENhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNP
YmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVS
ZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBXZWJLaXRXZWJW
aWV3KiB2aWV3ID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfd2ViX3ZpZXcobWFpbkZyYW1lKTsKKyAg
ICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KTsKKworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6Y29uZmlybUNvbXBvc2l0aW9uKHZp
ZXcsIDApOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKwor
c3RhdGljIEpTVmFsdWVSZWYgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhKU0Nv
bnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNP
YmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1td
LCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgV2ViS2l0V2ViVmlldyogdmlldyA9IHdl
YmtpdF93ZWJfZnJhbWVfZ2V0X3dlYl92aWV3KG1haW5GcmFtZSk7CisgICAgaWYgKCF2aWV3KQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpZiAo
YXJndW1lbnRDb3VudCA8IDIpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChj
b250ZXh0KTsKKworICAgIGludCBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRv
TnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAgZ19yZXR1cm5f
dmFsX2lmX2ZhaWwoKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFrZVVuZGVm
aW5lZChjb250ZXh0KSk7CisKKyAgICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihKU1Zh
bHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRpb24pKTsKKyAgICBnX3Jl
dHVybl92YWxfaWZfZmFpbCgoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlvbiksIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpKTsKKworICAgIEdka1JlY3RhbmdsZSByZWN0OworICAgIGlmICgh
RHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZSh2aWV3
LCBsb2NhdGlvbiwgbGVuZ3RoLCAmcmVjdCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVu
ZGVmaW5lZChjb250ZXh0KTsKKworICAgIEpTVmFsdWVSZWYgYXJyYXlWYWx1ZXNbNF07CisgICAg
YXJyYXlWYWx1ZXNbMF0gPSBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCByZWN0LngpOworICAg
IGFycmF5VmFsdWVzWzFdID0gSlNWYWx1ZU1ha2VOdW1iZXIoY29udGV4dCwgcmVjdC55KTsKKyAg
ICBhcnJheVZhbHVlc1syXSA9IEpTVmFsdWVNYWtlTnVtYmVyKGNvbnRleHQsIHJlY3Qud2lkdGgp
OworICAgIGFycmF5VmFsdWVzWzNdID0gSlNWYWx1ZU1ha2VOdW1iZXIoY29udGV4dCwgcmVjdC5o
ZWlnaHQpOworICAgIEpTT2JqZWN0UmVmIGFycmF5T2JqZWN0ID0gSlNPYmplY3RNYWtlQXJyYXko
Y29udGV4dCwgNCwgYXJyYXlWYWx1ZXMsIGV4Y2VwdGlvbik7CisgICAgZ19yZXR1cm5fdmFsX2lm
X2ZhaWwoKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFrZVVuZGVmaW5lZChj
b250ZXh0KSk7CisKKyAgICByZXR1cm4gYXJyYXlPYmplY3Q7Cit9CisKK3N0YXRpYyBKU1ZhbHVl
UmVmIHNlbGVjdGVkUmFuZ2VDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RS
ZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50
LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7
CisgICAgV2ViS2l0V2ViVmlldyogdmlldyA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X3dlYl92aWV3
KG1haW5GcmFtZSk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VV
bmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpbnQgc3RhcnQsIGVuZDsKKyAgICBpZiAoIUR1bXBS
ZW5kZXJUcmVlU3VwcG9ydEd0azo6c2VsZWN0ZWRSYW5nZSh2aWV3LCAmc3RhcnQsICZlbmQpKQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBKU1Zh
bHVlUmVmIGFycmF5VmFsdWVzWzJdOworICAgIGFycmF5VmFsdWVzWzBdID0gSlNWYWx1ZU1ha2VO
dW1iZXIoY29udGV4dCwgc3RhcnQpOworICAgIGFycmF5VmFsdWVzWzFdID0gSlNWYWx1ZU1ha2VO
dW1iZXIoY29udGV4dCwgZW5kKTsKKyAgICBKU09iamVjdFJlZiBhcnJheU9iamVjdCA9IEpTT2Jq
ZWN0TWFrZUFycmF5KGNvbnRleHQsIDIsIGFycmF5VmFsdWVzLCBleGNlcHRpb24pOworICAgIGdf
cmV0dXJuX3ZhbF9pZl9mYWlsKCghZXhjZXB0aW9uIHx8ICEqZXhjZXB0aW9uKSwgSlNWYWx1ZU1h
a2VVbmRlZmluZWQoY29udGV4dCkpOworCisgICAgcmV0dXJuIGFycmF5T2JqZWN0OworfQorCitz
dGF0aWMgSlNTdGF0aWNGdW5jdGlvbiBzdGF0aWNGdW5jdGlvbnNbXSA9IHsKKyAgICB7ICJzZXRN
YXJrZWRUZXh0Iiwgc2V0TWFya2VkVGV4dENhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJl
YWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAiaW5zZXJ0
VGV4dCIsIGluc2VydFRleHRDYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8
IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInVubWFya1RleHQiLCB1
bm1hcmtUZXh0Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJmaXJzdFJlY3RGb3JDaGFyYWN0ZXJS
YW5nZSIsIGZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0
cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7
ICJzZWxlY3RlZFJhbmdlIiwgc2VsZWN0ZWRSYW5nZUNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJp
YnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAw
LCAwLCAwIH0KK307CisKK3N0YXRpYyBKU0NsYXNzUmVmIGdldENsYXNzKEpTQ29udGV4dFJlZiBj
b250ZXh0KQoreworICAgIHN0YXRpYyBKU0NsYXNzUmVmIHRleHRJbnB1dENvbnRyb2xsZXJDbGFz
cyA9IDA7CisKKyAgICBpZiAoIXRleHRJbnB1dENvbnRyb2xsZXJDbGFzcykgeworICAgICAgICBK
U0NsYXNzRGVmaW5pdGlvbiBjbGFzc0RlZmluaXRpb24gPSB7CisgICAgICAgICAgICAgICAgMCwg
MCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwfTsKKyAgICAgICAgY2xhc3NEZWZpbml0aW9uLnN0YXRpY0Z1bmN0aW9ucyA9IHN0YXRp
Y0Z1bmN0aW9uczsKKworICAgICAgICB0ZXh0SW5wdXRDb250cm9sbGVyQ2xhc3MgPSBKU0NsYXNz
Q3JlYXRlKCZjbGFzc0RlZmluaXRpb24pOworICAgIH0KKworICAgIHJldHVybiB0ZXh0SW5wdXRD
b250cm9sbGVyQ2xhc3M7Cit9CisKK0pTT2JqZWN0UmVmIG1ha2VUZXh0SW5wdXRDb250cm9sbGVy
KEpTQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIHJldHVybiBKU09iamVjdE1ha2UoY29udGV4
dCwgZ2V0Q2xhc3MoY29udGV4dCksIDApOworfQpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRl
clRyZWUvZ3RrL1RleHRJbnB1dENvbnRyb2xsZXIuaCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0
ay9UZXh0SW5wdXRDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uNTM3OTNmNgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9U
ZXh0SW5wdXRDb250cm9sbGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBJZ2FsaWEgUy5MLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGV4dElucHV0Q29udHJvbGxlcl9oCisjZGVmaW5l
IFRleHRJbnB1dENvbnRyb2xsZXJfaAorCit0eXBlZGVmIGNvbnN0IHN0cnVjdCBPcGFxdWVKU0Nv
bnRleHQqIEpTQ29udGV4dFJlZjsKK3R5cGVkZWYgc3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTT2Jq
ZWN0UmVmOworCitKU09iamVjdFJlZiBtYWtlVGV4dElucHV0Q29udHJvbGxlcihKU0NvbnRleHRS
ZWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Rvb2xzL0dOVW1ha2VmaWxlLmFtIGIvVG9vbHMv
R05VbWFrZWZpbGUuYW0KaW5kZXggM2RiNzY2Zi4uYmM3NGViYyAxMDA2NDQKLS0tIGEvVG9vbHMv
R05VbWFrZWZpbGUuYW0KKysrIGIvVG9vbHMvR05VbWFrZWZpbGUuYW0KQEAgLTgwLDYgKzgwLDgg
QEAgUHJvZ3JhbXNfRHVtcFJlbmRlclRyZWVfU09VUkNFUyA9IFwKIAlUb29scy9EdW1wUmVuZGVy
VHJlZS9ndGsvR0NDb250cm9sbGVyR3RrLmNwcCBcCiAJVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3Rr
L0xheW91dFRlc3RDb250cm9sbGVyR3RrLmNwcCBcCiAJVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3Rr
L1BpeGVsRHVtcFN1cHBvcnRHdGsuY3BwIFwKKwlUb29scy9EdW1wUmVuZGVyVHJlZS9ndGsvVGV4
dElucHV0Q29udHJvbGxlci5oIFwKKwlUb29scy9EdW1wUmVuZGVyVHJlZS9ndGsvVGV4dElucHV0
Q29udHJvbGxlci5jcHAgXAogCVRvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9Xb3JrUXVldWVJdGVt
R3RrLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL0d0a1ZlcnNpb25pbmcuYwog
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81210</attachid>
            <date>2011-02-04 06:34:41 -0800</date>
            <delta_ts>2011-02-08 02:21:27 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>text-input-controller2.diff</filename>
            <type>text/plain</type>
            <size>21117</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCAyYTdjNjI4Li42MTUwMDI2IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDIt
MDQgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIERSVCdzIFRleHRJ
bnB1dENvbnRyb2xsZXIgaXMgdW5pbXBsZW1lbnRlZCBvbiBHVEsKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyOTk3CisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ndGsvU2tpcHBlZDogVW5za2lwIHNldmVyYWwgdGVzdHMgdGhhdCBwYXNzIG5vdyB0aGF0IHdl
CisgICAgICAgIGhhdmUgVGV4dElucHV0Q29udHJvbGxlci4KKwogMjAxMS0wMi0wNCAgU2VyZ2lv
IFZpbGxhciBTZW5pbiAgPHN2aWxsYXJAaWdhbGlhLmNvbT4KIAogICAgICAgICBVbnJldmlld2Vk
LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktp
dC9ndGsvQ2hhbmdlTG9nCmluZGV4IGQyNmM5MjkuLjJmZmI4YjYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwxOCBAQAorMjAxMS0wMi0wNCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2Fy
Y2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgW0dUS10gRFJUJ3MgVGV4dElucHV0Q29udHJvbGxlciBpcyB1bmltcGxlbWVudGVk
IG9uIEdUSworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTI5OTcKKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0
ay5jcHA6CisgICAgICAgIChEdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGs6OnNldENvbXBvc2l0aW9u
KToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6Y29uZmlybUNvbXBvc2l0aW9u
KToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6Zmlyc3RSZWN0Rm9yQ2hhcmFj
dGVyUmFuZ2UpOgorICAgICAgICAoRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpzZWxlY3RlZFJh
bmdlKTogTmV3IG1ldGhvZHMgbmVlZGVkIGJ5CisgICAgICAgIFRleHRJbnB1dENvbnRyb2xsZXIu
CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrLmg6CisK
IDIwMTEtMDItMDMgIEFkYW0gTGFuZ2xleSAgPGFnbEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rv
b2xzL0NoYW5nZUxvZwppbmRleCA2YjBkMzU0Li4wZjllN2FiIDEwMDY0NAotLS0gYS9Ub29scy9D
aGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjUgQEAKKzIwMTEtMDIt
MDQgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIERSVCdzIFRleHRJ
bnB1dENvbnRyb2xsZXIgaXMgdW5pbXBsZW1lbnRlZCBvbiBHVEsKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyOTk3CisKKyAgICAgICAgSW5pdGlhbCBp
bXBsZW1lbnRhdGlvbiBvZiBUZXh0SW5wdXRDb250cm9sbGVyIGZvciBHVEsgcG9ydC4KKworICAg
ICAgICAqIER1bXBSZW5kZXJUcmVlL2d0ay9EdW1wUmVuZGVyVHJlZS5jcHA6CisgICAgICAgICh3
ZWJWaWV3V2luZG93T2JqZWN0Q2xlYXJlZCk6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZ3Rr
L1RleHRJbnB1dENvbnRyb2xsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKHNldE1hcmtlZFRleHRD
YWxsYmFjayk6CisgICAgICAgIChpbnNlcnRUZXh0Q2FsbGJhY2spOgorICAgICAgICAodW5tYXJr
VGV4dENhbGxiYWNrKToKKyAgICAgICAgKGZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJh
Y2spOgorICAgICAgICAoc2VsZWN0ZWRSYW5nZUNhbGxiYWNrKToKKyAgICAgICAgKGdldENsYXNz
KToKKyAgICAgICAgKG1ha2VUZXh0SW5wdXRDb250cm9sbGVyKToKKyAgICAgICAgKiBEdW1wUmVu
ZGVyVHJlZS9ndGsvVGV4dElucHV0Q29udHJvbGxlci5oOiBBZGRlZC4KKyAgICAgICAgKiBHTlVt
YWtlZmlsZS5hbToKKwogMjAxMS0wMi0wMyAgTWFjaWVqIFN0YWNob3dpYWsgIDxtanNAYXBwbGUu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhbiBCZXJuc3RlaW4uCmRpZmYgLS1naXQgYS9M
YXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZCBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0
ay9Ta2lwcGVkCmluZGV4IDdmNmFlMTEuLjM0NjU4YzQgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3Rz
L3BsYXRmb3JtL2d0ay9Ta2lwcGVkCisrKyBiL0xheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lw
cGVkCkBAIC0zNzc0LDE0ICszNzc0LDcgQEAgZmFzdC9oaXN0b3J5L3RpbWVkLXJlZnJlc2gtaW4t
Y2FjaGVkLWZyYW1lLmh0bWwKIAogIyBObyBUZXh0SW5wdXRDb250cm9sbGVyIHN1cHBvcnQKICMg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyOTk3Ci1mYXN0L2Zvcm1z
L2lucHV0LW1heGxlbmd0aC1pbWUtY29tcGxldGVkLmh0bWwKLWZhc3QvZm9ybXMvaW5wdXQtbWF4
bGVuZ3RoLWltZS1wcmVlZGl0Lmh0bWwKLWZhc3QvdGV4dC9pbnRlcm5hdGlvbmFsL3RoYWktY3Vy
c29yLXBvc2l0aW9uLmh0bWwKLWZhc3QvZXZlbnRzL2ltZS1jb21wb3NpdGlvbi1ldmVudHMtMDAx
Lmh0bWwKLWZhc3QvZG9tL3RhYi1pbi1yaWdodC1hbGlnbm1lbnQuaHRtbAotZWRpdGluZy9pbnB1
dC9pbWUtY29tcG9zaXRpb24tY2xlYXJwcmVlZGl0Lmh0bWwKIHN2Zy90ZXh0L2NhcmV0LWluLXN2
Zy10ZXh0LnhodG1sCi1lZGl0aW5nL2luc2VydGluZy9pbnNlcnQtY29tcG9zaXRpb24td2hpdGVz
cGFjZS5odG1sCiAKICMgTm8gVXNlciBTY3JpcHRzCiB1c2Vyc2NyaXB0cy9zY3JpcHQtbm90LXJ1
bi1mb3ItZnJhZ21lbnRzLmh0bWwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvZ3RrL1dlYkNv
cmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5jcHAgYi9Tb3VyY2UvV2ViS2l0L2d0
ay9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGsuY3BwCmluZGV4IDZmMzE4
ODcuLmY1MzVhNzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0
L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5jcHAKKysrIGIvU291cmNlL1dlYktpdC9ndGsvV2Vi
Q29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrLmNwcApAQCAtMiw2ICsyLDcgQEAK
ICAqICBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEpvb25lIEh1ciA8am9vbmVA
a2xkcC5vcmc+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBTLkwuCiAgKgogICogIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCkBAIC00Nyw2ICs0OCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyVHJlZUFzVGV4dC5o
IgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgor
I2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgogI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgogI2lu
Y2x1ZGUgIndlYmtpdHdlYmZyYW1lLmgiCiAjaW5jbHVkZSAid2Via2l0d2ViZnJhbWVwcml2YXRl
LmgiCkBAIC00NjYsNiArNDY4LDEwMiBAQCBib29sIER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6
aXNDb21tYW5kRW5hYmxlZChXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBjb25zdCBnYwogICAgIHJl
dHVybiBjb3JlKHdlYlZpZXcpLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCktPmVkaXRvcigpLT5jb21tYW5kKG5hbWUpLmlzRW5hYmxlZCgpOwogfQogCit2b2lkIER1bXBS
ZW5kZXJUcmVlU3VwcG9ydEd0azo6c2V0Q29tcG9zaXRpb24oV2ViS2l0V2ViVmlldyogd2ViVmll
dywgY29uc3QgY2hhciogdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgIGdfcmV0dXJu
X2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9WSUVXKHdlYlZpZXcpKTsKKyAgICBnX3JldHVybl9pZl9m
YWlsKHRleHQpOworCisgICAgRnJhbWUqIGZyYW1lID0gY29yZSh3ZWJWaWV3KS0+Zm9jdXNDb250
cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAg
IHJldHVybjsKKworICAgIEVkaXRvciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOworICAgIGlm
ICghZWRpdG9yKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFlZGl0b3ItPmNhbkVkaXQoKSAm
JiAhZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJp
bmcgY29tcG9zaXRpb25TdHJpbmcgPSBTdHJpbmc6OmZyb21VVEY4KHRleHQpOworICAgIFZlY3Rv
cjxDb21wb3NpdGlvblVuZGVybGluZT4gdW5kZXJsaW5lczsKKyAgICB1bmRlcmxpbmVzLmFwcGVu
ZChDb21wb3NpdGlvblVuZGVybGluZSgwLCBjb21wb3NpdGlvblN0cmluZy5sZW5ndGgoKSwgQ29s
b3IoMCwgMCwgMCksIGZhbHNlKSk7CisgICAgZWRpdG9yLT5zZXRDb21wb3NpdGlvbihjb21wb3Np
dGlvblN0cmluZywgdW5kZXJsaW5lcywgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgRHVtcFJlbmRl
clRyZWVTdXBwb3J0R3RrOjpjb25maXJtQ29tcG9zaXRpb24oV2ViS2l0V2ViVmlldyogd2ViVmll
dywgY29uc3QgY2hhciogdGV4dCkKK3sKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19X
RUJfVklFVyh3ZWJWaWV3KSk7CisKKyAgICBGcmFtZSogZnJhbWUgPSBjb3JlKHdlYlZpZXcpLT5m
b2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgRWRpdG9yKiBlZGl0b3IgPSBmcmFtZS0+ZWRpdG9yKCk7
CisgICAgaWYgKCFlZGl0b3IgfHwgKCFlZGl0b3ItPmhhc0NvbXBvc2l0aW9uKCkgJiYgIXRleHQp
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKSB7
CisgICAgICAgIGlmICh0ZXh0KQorICAgICAgICAgICAgZWRpdG9yLT5jb25maXJtQ29tcG9zaXRp
b24oU3RyaW5nOjpmcm9tVVRGOCh0ZXh0KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVk
aXRvci0+Y29uZmlybUNvbXBvc2l0aW9uKCk7CisgICAgfSBlbHNlCisgICAgICAgIGVkaXRvci0+
aW5zZXJ0VGV4dChTdHJpbmc6OmZyb21VVEY4KHRleHQpLCAwKTsKK30KKworYm9vbCBEdW1wUmVu
ZGVyVHJlZVN1cHBvcnRHdGs6OmZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlKFdlYktpdFdlYlZp
ZXcqIHdlYlZpZXcsIGludCBsb2NhdGlvbiwgaW50IGxlbmd0aCwgR2RrUmVjdGFuZ2xlKiByZWN0
KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19XRUJfVklFVyh3ZWJWaWV3
KSwgZmFsc2UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKHJlY3QsIGZhbHNlKTsKKworICAg
IGlmICgobG9jYXRpb24gKyBsZW5ndGggPCBsb2NhdGlvbikgJiYgKGxvY2F0aW9uICsgbGVuZ3Ro
KSkKKyAgICAgICAgbGVuZ3RoID0gMDsKKworICAgIEZyYW1lKiBmcmFtZSA9IGNvcmUod2ViVmll
dyktPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoIWZy
YW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBFZGl0b3IqIGVkaXRvciA9IGZyYW1l
LT5lZGl0b3IoKTsKKyAgICBpZiAoIWVkaXRvcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgRWxlbWVudCogc2VsZWN0aW9uUm9vdCA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+cm9vdEVkaXRh
YmxlRWxlbWVudCgpOworICAgIEVsZW1lbnQqIHNjb3BlID0gc2VsZWN0aW9uUm9vdCA/IHNlbGVj
dGlvblJvb3QgOiBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCk7CisgICAgUmVm
UHRyPFJhbmdlPiByYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5n
dGgoc2NvcGUsIGxvY2F0aW9uLCBsZW5ndGgpOworICAgIGlmICghcmFuZ2UpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICpyZWN0ID0gZWRpdG9yLT5maXJzdFJlY3RGb3JSYW5nZShyYW5n
ZS5nZXQoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEdW1wUmVuZGVyVHJlZVN1
cHBvcnRHdGs6OnNlbGVjdGVkUmFuZ2UoV2ViS2l0V2ViVmlldyogd2ViVmlldywgaW50KiBzdGFy
dCwgaW50KiBlbmQpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX1dFQl9W
SUVXKHdlYlZpZXcpLCBmYWxzZSk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoc3RhcnQsIGZh
bHNlKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChlbmQsIGZhbHNlKTsKKworICAgIEZyYW1l
KiBmcmFtZSA9IGNvcmUod2ViVmlldyktPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBS
ZWZQdHI8UmFuZ2U+IHJhbmdlID0gZnJhbWUtPnNlbGVjdGlvbigpLT50b05vcm1hbGl6ZWRSYW5n
ZSgpLmdldCgpOworCisgICAgRWxlbWVudCogc2VsZWN0aW9uUm9vdCA9IGZyYW1lLT5zZWxlY3Rp
b24oKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIEVsZW1lbnQqIHNjb3BlID0gc2VsZWN0
aW9uUm9vdCA/IHNlbGVjdGlvblJvb3QgOiBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVt
ZW50KCk7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHRlc3RSYW5nZSA9IFJhbmdlOjpjcmVhdGUoc2Nv
cGUtPmRvY3VtZW50KCksIHNjb3BlLCAwLCByYW5nZS0+c3RhcnRDb250YWluZXIoKSwgcmFuZ2Ut
PnN0YXJ0T2Zmc2V0KCkpOworICAgIEFTU0VSVCh0ZXN0UmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCkg
PT0gc2NvcGUpOworICAgICpzdGFydCA9IFRleHRJdGVyYXRvcjo6cmFuZ2VMZW5ndGgodGVzdFJh
bmdlLmdldCgpKTsKKworICAgIEV4Y2VwdGlvbkNvZGUgZWM7CisgICAgdGVzdFJhbmdlLT5zZXRF
bmQocmFuZ2UtPmVuZENvbnRhaW5lcigpLCByYW5nZS0+ZW5kT2Zmc2V0KCksIGVjKTsKKyAgICBB
U1NFUlQodGVzdFJhbmdlLT5zdGFydENvbnRhaW5lcigpID09IHNjb3BlKTsKKyAgICAqZW5kID0g
VGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aCh0ZXN0UmFuZ2UuZ2V0KCkpOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKIHZvaWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjp3aGl0ZUxpc3RBY2Nl
c3NGcm9tT3JpZ2luKGNvbnN0IGdjaGFyKiBzb3VyY2VPcmlnaW4sIGNvbnN0IGdjaGFyKiBkZXN0
aW5hdGlvblByb3RvY29sLCBjb25zdCBnY2hhciogZGVzdGluYXRpb25Ib3N0LCBib29sIGFsbG93
RGVzdGluYXRpb25TdWJkb21haW5zKQogewogICAgIFNlY3VyaXR5T3JpZ2luOjphZGRPcmlnaW5B
Y2Nlc3NXaGl0ZWxpc3RFbnRyeSgqU2VjdXJpdHlPcmlnaW46OmNyZWF0ZUZyb21TdHJpbmcoc291
cmNlT3JpZ2luKSwgZGVzdGluYXRpb25Qcm90b2NvbCwgZGVzdGluYXRpb25Ib3N0LCBhbGxvd0Rl
c3RpbmF0aW9uU3ViZG9tYWlucyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2d0ay9XZWJD
b3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGsuaCBiL1NvdXJjZS9XZWJLaXQvZ3Rr
L1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5oCmluZGV4IDY2M2YxM2Eu
LmE5ODkyMjUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0R1
bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5oCisrKyBiL1NvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVT
dXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5oCkBAIC03MCw2ICs3MCwxMCBAQCBwdWJs
aWM6CiAgICAgLy8gV2ViS2l0V2ViVmlldwogICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGVDb3JlQ29t
bWFuZEJ5TmFtZShXZWJLaXRXZWJWaWV3KiwgY29uc3QgZ2NoYXIqIG5hbWUsIGNvbnN0IGdjaGFy
KiB2YWx1ZSk7CiAgICAgc3RhdGljIGJvb2wgaXNDb21tYW5kRW5hYmxlZChXZWJLaXRXZWJWaWV3
KiwgY29uc3QgZ2NoYXIqIG5hbWUpOworICAgIHN0YXRpYyB2b2lkIHNldENvbXBvc2l0aW9uKFdl
YktpdFdlYlZpZXcqLCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpOworICAg
IHN0YXRpYyB2b2lkIGNvbmZpcm1Db21wb3NpdGlvbihXZWJLaXRXZWJWaWV3KiwgY29uc3QgY2hh
ciogdGV4dCk7CisgICAgc3RhdGljIGJvb2wgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UoV2Vi
S2l0V2ViVmlldyosIGludCBsb2NhdGlvbiwgaW50IGxlbmd0aCwgR2RrUmVjdGFuZ2xlKik7Cisg
ICAgc3RhdGljIGJvb2wgc2VsZWN0ZWRSYW5nZShXZWJLaXRXZWJWaWV3KiwgaW50KiBzdGFydCwg
aW50KiBlbmQpOwogCiAgICAgLy8gR0MKICAgICBzdGF0aWMgdm9pZCBnY0NvbGxlY3RKYXZhc2Ny
aXB0T2JqZWN0cygpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL0R1bXBS
ZW5kZXJUcmVlLmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9EdW1wUmVuZGVyVHJlZS5j
cHAKaW5kZXggN2I3NzQ2NC4uODEzYjgwMyAxMDA2NDQKLS0tIGEvVG9vbHMvRHVtcFJlbmRlclRy
ZWUvZ3RrL0R1bXBSZW5kZXJUcmVlLmNwcAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ndGsv
RHVtcFJlbmRlclRyZWUuY3BwCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiR093blB0ci5o
IgogI2luY2x1ZGUgIkxheW91dFRlc3RDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiUGl4ZWxEdW1w
U3VwcG9ydC5oIgorI2luY2x1ZGUgIlRleHRJbnB1dENvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJX
ZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGsuaCIKICNpbmNsdWRlICJXb3Jr
UXVldWUuaCIKICNpbmNsdWRlICJXb3JrUXVldWVJdGVtLmgiCkBAIC03NzksNiArNzgwLDExIEBA
IHN0YXRpYyB2b2lkIHdlYlZpZXdXaW5kb3dPYmplY3RDbGVhcmVkKFdlYktpdFdlYlZpZXcqIHZp
ZXcsIFdlYktpdFdlYkZyYW1lKiBmcmFtCiAgICAgSlNWYWx1ZVJlZiBldmVudFNlbmRlciA9IG1h
a2VFdmVudFNlbmRlcihjb250ZXh0LCAhd2Via2l0X3dlYl9mcmFtZV9nZXRfcGFyZW50KGZyYW1l
KSk7CiAgICAgSlNPYmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dPYmplY3QsIGV2ZW50
U2VuZGVyU3RyLCBldmVudFNlbmRlciwga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtK
U1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7CiAgICAgSlNTdHJpbmdSZWxlYXNlKGV2
ZW50U2VuZGVyU3RyKTsKKworICAgIEpTU3RyaW5nUmVmIHRleHRJbnB1dENvbnRyb2xsZXJTdHIg
PSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZygidGV4dElucHV0Q29udHJvbGxlciIpOwor
ICAgIEpTVmFsdWVSZWYgdGV4dElucHV0Q29udHJvbGxlciA9IG1ha2VUZXh0SW5wdXRDb250cm9s
bGVyKGNvbnRleHQpOworICAgIEpTT2JqZWN0U2V0UHJvcGVydHkoY29udGV4dCwgd2luZG93T2Jq
ZWN0LCB0ZXh0SW5wdXRDb250cm9sbGVyU3RyLCB0ZXh0SW5wdXRDb250cm9sbGVyLCBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlLCAw
KTsKKyAgICBKU1N0cmluZ1JlbGVhc2UodGV4dElucHV0Q29udHJvbGxlclN0cik7CiB9CiAKIHN0
YXRpYyBnYm9vbGVhbiB3ZWJWaWV3Q29uc29sZU1lc3NhZ2UoV2ViS2l0V2ViVmlldyogdmlldywg
Y29uc3QgZ2NoYXIqIG1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBnY2hhciogc291
cmNlSWQsIGdwb2ludGVyIGRhdGEpCmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9n
dGsvVGV4dElucHV0Q29udHJvbGxlci5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ndGsvVGV4
dElucHV0Q29udHJvbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NzI0M2ZkYwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9UZXh0
SW5wdXRDb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBJZ2FsaWEgUy5MLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUZXh0SW5w
dXRDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorI2luY2x1ZGUg
IldlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5oIgorI2luY2x1ZGUgPEdP
d25QdHJHdGsuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU09iamVjdFJlZi5oPgorI2lu
Y2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTUmV0YWluUHRyLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlw
dENvcmUvSlNTdHJpbmdSZWYuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCitzdGF0aWMgSlNWYWx1
ZVJlZiBzZXRNYXJrZWRUZXh0Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0
UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3Vu
dCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQor
eworICAgIFdlYktpdFdlYlZpZXcqIHZpZXcgPSB3ZWJraXRfd2ViX2ZyYW1lX2dldF93ZWJfdmll
dyhtYWluRnJhbWUpOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAzKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBKU1N0cmluZ1Jl
ZiBzdHJpbmcgPSBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhj
ZXB0aW9uKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCgoIWV4Y2VwdGlvbiB8fCAhKmV4Y2Vw
dGlvbiksIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpKTsKKworICAgIHNpemVfdCBidWZm
ZXJTaXplID0gSlNTdHJpbmdHZXRNYXhpbXVtVVRGOENTdHJpbmdTaXplKHN0cmluZyk7CisgICAg
R093blB0cjxnY2hhcj4gc3RyaW5nQnVmZmVyKHN0YXRpY19jYXN0PGdjaGFyKj4oZ19tYWxsb2Mo
YnVmZmVyU2l6ZSkpKTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3RyaW5nKHN0cmluZywgc3RyaW5n
QnVmZmVyLmdldCgpLCBidWZmZXJTaXplKTsKKyAgICBKU1N0cmluZ1JlbGVhc2Uoc3RyaW5nKTsK
KworICAgIGludCBzdGFydCA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRl
eHQsIGFyZ3VtZW50c1sxXSwgZXhjZXB0aW9uKSk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwo
KCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KSk7CisKKyAgICBpbnQgZW5kID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29u
dGV4dCwgYXJndW1lbnRzWzJdLCBleGNlcHRpb24pKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bCgoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlvbiksIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpKTsKKworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydEd0azo6c2V0Q29tcG9zaXRpb24odmll
dywgc3RyaW5nQnVmZmVyLmdldCgpLCBzdGFydCwgZW5kKTsKKworICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgaW5zZXJ0VGV4
dENhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNP
YmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVS
ZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBXZWJLaXRXZWJW
aWV3KiB2aWV3ID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfd2ViX3ZpZXcobWFpbkZyYW1lKTsKKyAg
ICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KTsKKworICAgIGlmIChhcmd1bWVudENvdW50IDwgMSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVN
YWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgSlNTdHJpbmdSZWYgc3RyaW5nID0gSlNWYWx1
ZVRvU3RyaW5nQ29weShjb250ZXh0LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7CisgICAgZ19y
ZXR1cm5fdmFsX2lmX2ZhaWwoKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFr
ZVVuZGVmaW5lZChjb250ZXh0KSk7CisKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IEpTU3RyaW5n
R2V0TWF4aW11bVVURjhDU3RyaW5nU2l6ZShzdHJpbmcpOworICAgIEdPd25QdHI8Z2NoYXI+IHN0
cmluZ0J1ZmZlcihzdGF0aWNfY2FzdDxnY2hhcio+KGdfbWFsbG9jKGJ1ZmZlclNpemUpKSk7Cisg
ICAgSlNTdHJpbmdHZXRVVEY4Q1N0cmluZyhzdHJpbmcsIHN0cmluZ0J1ZmZlci5nZXQoKSwgYnVm
ZmVyU2l6ZSk7CisgICAgSlNTdHJpbmdSZWxlYXNlKHN0cmluZyk7CisKKyAgICBEdW1wUmVuZGVy
VHJlZVN1cHBvcnRHdGs6OmNvbmZpcm1Db21wb3NpdGlvbih2aWV3LCBzdHJpbmdCdWZmZXIuZ2V0
KCkpOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitz
dGF0aWMgSlNWYWx1ZVJlZiB1bm1hcmtUZXh0Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQs
IEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJn
dW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhj
ZXB0aW9uKQoreworICAgIFdlYktpdFdlYlZpZXcqIHZpZXcgPSB3ZWJraXRfd2ViX2ZyYW1lX2dl
dF93ZWJfdmlldyhtYWluRnJhbWUpOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIEpT
VmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0
R3RrOjpjb25maXJtQ29tcG9zaXRpb24odmlldywgMCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBmaXJzdFJlY3RGb3JD
aGFyYWN0ZXJSYW5nZUNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBm
dW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNv
bnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAg
ICBXZWJLaXRXZWJWaWV3KiB2aWV3ID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfd2ViX3ZpZXcobWFp
bkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVm
aW5lZChjb250ZXh0KTsKKworICAgIGlmIChhcmd1bWVudENvdW50IDwgMikKKyAgICAgICAgcmV0
dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgaW50IGxvY2F0aW9uID0g
c3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzBdLCBl
eGNlcHRpb24pKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCgoIWV4Y2VwdGlvbiB8fCAhKmV4
Y2VwdGlvbiksIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpKTsKKworICAgIGludCBsZW5n
dGggPSBzdGF0aWNfY2FzdDxpbnQ+KEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNb
MV0sIGV4Y2VwdGlvbikpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCghZXhjZXB0aW9uIHx8
ICEqZXhjZXB0aW9uKSwgSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCkpOworCisgICAgR2Rr
UmVjdGFuZ2xlIHJlY3Q7CisgICAgaWYgKCFEdW1wUmVuZGVyVHJlZVN1cHBvcnRHdGs6OmZpcnN0
UmVjdEZvckNoYXJhY3RlclJhbmdlKHZpZXcsIGxvY2F0aW9uLCBsZW5ndGgsICZyZWN0KSkKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgSlNWYWx1
ZVJlZiBhcnJheVZhbHVlc1s0XTsKKyAgICBhcnJheVZhbHVlc1swXSA9IEpTVmFsdWVNYWtlTnVt
YmVyKGNvbnRleHQsIHJlY3QueCk7CisgICAgYXJyYXlWYWx1ZXNbMV0gPSBKU1ZhbHVlTWFrZU51
bWJlcihjb250ZXh0LCByZWN0LnkpOworICAgIGFycmF5VmFsdWVzWzJdID0gSlNWYWx1ZU1ha2VO
dW1iZXIoY29udGV4dCwgcmVjdC53aWR0aCk7CisgICAgYXJyYXlWYWx1ZXNbM10gPSBKU1ZhbHVl
TWFrZU51bWJlcihjb250ZXh0LCByZWN0LmhlaWdodCk7CisgICAgSlNPYmplY3RSZWYgYXJyYXlP
YmplY3QgPSBKU09iamVjdE1ha2VBcnJheShjb250ZXh0LCA0LCBhcnJheVZhbHVlcywgZXhjZXB0
aW9uKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCgoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlv
biksIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpKTsKKworICAgIHJldHVybiBhcnJheU9i
amVjdDsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgc2VsZWN0ZWRSYW5nZUNhbGxiYWNrKEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09i
amVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10s
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBXZWJLaXRXZWJWaWV3KiB2aWV3ID0gd2Vi
a2l0X3dlYl9mcmFtZV9nZXRfd2ViX3ZpZXcobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGludCBz
dGFydCwgZW5kOworICAgIGlmICghRHVtcFJlbmRlclRyZWVTdXBwb3J0R3RrOjpzZWxlY3RlZFJh
bmdlKHZpZXcsICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVm
aW5lZChjb250ZXh0KTsKKworICAgIEpTVmFsdWVSZWYgYXJyYXlWYWx1ZXNbMl07CisgICAgYXJy
YXlWYWx1ZXNbMF0gPSBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCBzdGFydCk7CisgICAgYXJy
YXlWYWx1ZXNbMV0gPSBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCBlbmQpOworICAgIEpTT2Jq
ZWN0UmVmIGFycmF5T2JqZWN0ID0gSlNPYmplY3RNYWtlQXJyYXkoY29udGV4dCwgMiwgYXJyYXlW
YWx1ZXMsIGV4Y2VwdGlvbik7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoKCFleGNlcHRpb24g
fHwgISpleGNlcHRpb24pLCBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KSk7CisKKyAgICBy
ZXR1cm4gYXJyYXlPYmplY3Q7Cit9CisKK3N0YXRpYyBKU1N0YXRpY0Z1bmN0aW9uIHN0YXRpY0Z1
bmN0aW9uc1tdID0geworICAgIHsgInNldE1hcmtlZFRleHQiLCBzZXRNYXJrZWRUZXh0Q2FsbGJh
Y2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURv
bnREZWxldGUgfSwKKyAgICB7ICJpbnNlcnRUZXh0IiwgaW5zZXJ0VGV4dENhbGxiYWNrLCBrSlNQ
cm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRl
IH0sCisgICAgeyAidW5tYXJrVGV4dCIsIHVubWFya1RleHRDYWxsYmFjaywga0pTUHJvcGVydHlB
dHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAg
IHsgImZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlIiwgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFu
Z2VDYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0
cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInNlbGVjdGVkUmFuZ2UiLCBzZWxlY3RlZFJhbmdl
Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJp
YnV0ZURvbnREZWxldGUgfSwKKyAgICB7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpTQ2xhc3NS
ZWYgZ2V0Q2xhc3MoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgc3RhdGljIEpTQ2xhc3NS
ZWYgdGV4dElucHV0Q29udHJvbGxlckNsYXNzID0gMDsKKworICAgIGlmICghdGV4dElucHV0Q29u
dHJvbGxlckNsYXNzKSB7CisgICAgICAgIEpTQ2xhc3NEZWZpbml0aW9uIGNsYXNzRGVmaW5pdGlv
biA9IHsKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAg
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICBjbGFzc0RlZmluaXRp
b24uc3RhdGljRnVuY3Rpb25zID0gc3RhdGljRnVuY3Rpb25zOworCisgICAgICAgIHRleHRJbnB1
dENvbnRyb2xsZXJDbGFzcyA9IEpTQ2xhc3NDcmVhdGUoJmNsYXNzRGVmaW5pdGlvbik7CisgICAg
fQorCisgICAgcmV0dXJuIHRleHRJbnB1dENvbnRyb2xsZXJDbGFzczsKK30KKworSlNPYmplY3RS
ZWYgbWFrZVRleHRJbnB1dENvbnRyb2xsZXIoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAg
cmV0dXJuIEpTT2JqZWN0TWFrZShjb250ZXh0LCBnZXRDbGFzcyhjb250ZXh0KSwgMCk7Cit9CmRp
ZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9ndGsvVGV4dElucHV0Q29udHJvbGxlci5o
IGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL1RleHRJbnB1dENvbnRyb2xsZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzc5M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvRHVtcFJlbmRlclRyZWUvZ3RrL1RleHRJbnB1dENvbnRyb2xsZXIuaApAQCAtMCwwICsx
LDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBTLkwuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9t
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBUZXh0
SW5wdXRDb250cm9sbGVyX2gKKyNkZWZpbmUgVGV4dElucHV0Q29udHJvbGxlcl9oCisKK3R5cGVk
ZWYgY29uc3Qgc3RydWN0IE9wYXF1ZUpTQ29udGV4dCogSlNDb250ZXh0UmVmOwordHlwZWRlZiBz
dHJ1Y3QgT3BhcXVlSlNWYWx1ZSogSlNPYmplY3RSZWY7CisKK0pTT2JqZWN0UmVmIG1ha2VUZXh0
SW5wdXRDb250cm9sbGVyKEpTQ29udGV4dFJlZik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvVG9v
bHMvR05VbWFrZWZpbGUuYW0gYi9Ub29scy9HTlVtYWtlZmlsZS5hbQppbmRleCAzZGI3NjZmLi5i
Yzc0ZWJjIDEwMDY0NAotLS0gYS9Ub29scy9HTlVtYWtlZmlsZS5hbQorKysgYi9Ub29scy9HTlVt
YWtlZmlsZS5hbQpAQCAtODAsNiArODAsOCBAQCBQcm9ncmFtc19EdW1wUmVuZGVyVHJlZV9TT1VS
Q0VTID0gXAogCVRvb2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9HQ0NvbnRyb2xsZXJHdGsuY3BwIFwK
IAlUb29scy9EdW1wUmVuZGVyVHJlZS9ndGsvTGF5b3V0VGVzdENvbnRyb2xsZXJHdGsuY3BwIFwK
IAlUb29scy9EdW1wUmVuZGVyVHJlZS9ndGsvUGl4ZWxEdW1wU3VwcG9ydEd0ay5jcHAgXAorCVRv
b2xzL0R1bXBSZW5kZXJUcmVlL2d0ay9UZXh0SW5wdXRDb250cm9sbGVyLmggXAorCVRvb2xzL0R1
bXBSZW5kZXJUcmVlL2d0ay9UZXh0SW5wdXRDb250cm9sbGVyLmNwcCBcCiAJVG9vbHMvRHVtcFJl
bmRlclRyZWUvZ3RrL1dvcmtRdWV1ZUl0ZW1HdGsuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvR3RrVmVyc2lvbmluZy5jCiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>