<?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>103295</bug_id>
          
          <creation_ts>2012-11-26 14:16:49 -0800</creation_ts>
          <short_desc>TextIterator unnecessarily converts 8 bit strings to 16 bits</short_desc>
          <delta_ts>2019-03-30 09:42:25 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=196427</see_also>
          <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="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>apinheiro</cc>
    
    <cc>bfulgham</cc>
    
    <cc>cfleizach</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>jdiggs</cc>
    
    <cc>koivisto</cc>
    
    <cc>mifenton</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>775882</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-26 14:16:49 -0800</bug_when>
    <thetext>TextIterator uses String::character() in emitText().  Also, the only access to text in a TextIterator is UChar* characters().

Given that most strings are 8 bit, TextIterator and functions that use TextIterator like plainText() should be changed to use Strings instead of UChar pointers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>776008</commentid>
    <comment_count>1</comment_count>
      <attachid>176103</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-26 16:05:55 -0800</bug_when>
    <thetext>Created attachment 176103
Patch

This change is a progression on the performance test attached to https://bugs.webkit.org/show_bug.cgi?id=81192 referenced in the code.
Comparing the geometric mean of 3 runs before and after the patch:
           Baseline   With Patch   Delta
innerText:  3676.2ms      3032.87ms   +17%
outerText:  3625.7ms      3603.27ms    +0.6%

It is also great improvement on the number of strings/characters that need to be up converted to 16 bits in our page load memory test.

Before, 21289 (10.73%) strings up converted totaling 432,175 characters using 864,350 bytes
After, 2201 ( 1.08%) strings up converted totaling 82,394 characters using 164,788 bytes
This is a 90% reduction of strings and an 81% reduction in characters / bytes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>776011</commentid>
    <comment_count>2</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-26 16:10:07 -0800</bug_when>
    <thetext>After posting, I noticed code that should have been removed from TextIterator.h:

#if 0
UChar* plainTextToMallocAllocatedBuffer(const Range*, unsigned&amp; bufferLength, bool isDisplayString, TextIteratorBehavior = TextIteratorDefaultBehavior);
#endif

It has been removed from my working code.  I can repost if needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>776080</commentid>
    <comment_count>3</comment_count>
      <attachid>176103</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-11-26 16:56:24 -0800</bug_when>
    <thetext>Comment on attachment 176103
Patch

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

&gt; Source/WebCore/editing/TextIterator.cpp:468
&gt; +    ASSERT(static_cast&lt;int&gt;(index) &lt; length());
&gt; +    if (!(static_cast&lt;int&gt;(index) &lt; length()))

I think the typecast needs to be done in the other direction, casting length() to an unsigned, otherwise large indexes will get past this check because they get converted to negative numbers.

&gt; Source/WebCore/editing/TextIterator.h:66
&gt; +#if 0
&gt;  UChar* plainTextToMallocAllocatedBuffer(const Range*, unsigned&amp; bufferLength, bool isDisplayString, TextIteratorBehavior = TextIteratorDefaultBehavior);
&gt; +#endif

Why just #if&apos;d out?

&gt; Source/WebCore/editing/TextIterator.h:103
&gt; +    int startOffset() const { return m_positionStartOffset; }
&gt; +    const String string() const { return m_text; }
&gt; +    const UChar* characters() const { return m_textCharacters ? m_textCharacters : m_text.characters() + startOffset(); }
&gt; +    UChar characterAt(unsigned index) const;
&gt; +    void appendTextToStringBuilder(StringBuilder&amp;) const;

This additional API makes TextIterator a lot more confusing to use than it was before. The old API was designed to make it hard to use incorrectly; there was no copying of text ever. I’m particularly confused about how to use the string() function. Do all these new functions need to be public?

The string() function should not return &quot;const String&quot;. It should just return &quot;String&quot;.

&gt; Source/WebKit/mac/WebView/WebFrame.mm:500
&gt; -    // This will give a system malloc&apos;d buffer that can be turned directly into an NSString
&gt; -    unsigned length;
&gt; -    UChar* buf = plainTextToMallocAllocatedBuffer(core(range), length, true);
&gt; -    
&gt; -    if (!buf)
&gt; -        return [NSString string];
&gt; -
&gt; -    // Transfer buffer ownership to NSString
&gt; -    return [[[NSString alloc] initWithCharactersNoCopy:buf length:length freeWhenDone:YES] autorelease];
&gt; +    return plainText(core(range), TextIteratorDefaultBehavior, true);

Why is it OK to remove the plainTextToMallocAllocatedBuffer optimization? That was a critical change back when Antti originally did it. Did you research why it was needed and determine it’s not needed any more?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777036</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-27 11:34:29 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 176103 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=176103&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.cpp:468
&gt; &gt; +    ASSERT(static_cast&lt;int&gt;(index) &lt; length());
&gt; &gt; +    if (!(static_cast&lt;int&gt;(index) &lt; length()))
&gt; 
&gt; I think the typecast needs to be done in the other direction, casting length() to an unsigned, otherwise large indexes will get past this check because they get converted to negative numbers.
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.h:66
&gt; &gt; +#if 0
&gt; &gt;  UChar* plainTextToMallocAllocatedBuffer(const Range*, unsigned&amp; bufferLength, bool isDisplayString, TextIteratorBehavior = TextIteratorDefaultBehavior);
&gt; &gt; +#endif
&gt; 
&gt; Why just #if&apos;d out?
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.h:103
&gt; &gt; +    int startOffset() const { return m_positionStartOffset; }
&gt; &gt; +    const String string() const { return m_text; }
&gt; &gt; +    const UChar* characters() const { return m_textCharacters ? m_textCharacters : m_text.characters() + startOffset(); }
&gt; &gt; +    UChar characterAt(unsigned index) const;
&gt; &gt; +    void appendTextToStringBuilder(StringBuilder&amp;) const;
&gt; 
&gt; This additional API makes TextIterator a lot more confusing to use than it was before. The old API was designed to make it hard to use incorrectly; there was no copying of text ever. I’m particularly confused about how to use the string() function. Do all these new functions need to be public?
&gt; 
&gt; The string() function should not return &quot;const String&quot;. It should just return &quot;String&quot;.
&gt; 
&gt; &gt; Source/WebKit/mac/WebView/WebFrame.mm:500
&gt; &gt; -    // This will give a system malloc&apos;d buffer that can be turned directly into an NSString
&gt; &gt; -    unsigned length;
&gt; &gt; -    UChar* buf = plainTextToMallocAllocatedBuffer(core(range), length, true);
&gt; &gt; -    
&gt; &gt; -    if (!buf)
&gt; &gt; -        return [NSString string];
&gt; &gt; -
&gt; &gt; -    // Transfer buffer ownership to NSString
&gt; &gt; -    return [[[NSString alloc] initWithCharactersNoCopy:buf length:length freeWhenDone:YES] autorelease];
&gt; &gt; +    return plainText(core(range), TextIteratorDefaultBehavior, true);
&gt; 
&gt; Why is it OK to remove the plainTextToMallocAllocatedBuffer optimization? That was a critical change back when Antti originally did it. Did you research why it was needed and determine it’s not needed any more?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777037</commentid>
    <comment_count>5</comment_count>
      <attachid>176308</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-27 11:35:12 -0800</bug_when>
    <thetext>Created attachment 176308
Updated Patch

(In reply to comment #3)
&gt; (From update of attachment 176103 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=176103&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.cpp:468
&gt; &gt; +    ASSERT(static_cast&lt;int&gt;(index) &lt; length());
&gt; &gt; +    if (!(static_cast&lt;int&gt;(index) &lt; length()))
&gt; 
&gt; I think the typecast needs to be done in the other direction, casting length() to an unsigned, otherwise large indexes will get past this check because they get converted to negative numbers.

Done.

&gt; &gt; Source/WebCore/editing/TextIterator.h:66
&gt; &gt; +#if 0
&gt; &gt;  UChar* plainTextToMallocAllocatedBuffer(const Range*, unsigned&amp; bufferLength, bool isDisplayString, TextIteratorBehavior = TextIteratorDefaultBehavior);
&gt; &gt; +#endif
&gt; 
&gt; Why just #if&apos;d out?

Oversight in original patch - fixed.
 
&gt; &gt; Source/WebCore/editing/TextIterator.h:103
&gt; &gt; +    int startOffset() const { return m_positionStartOffset; }
&gt; &gt; +    const String string() const { return m_text; }
&gt; &gt; +    const UChar* characters() const { return m_textCharacters ? m_textCharacters : m_text.characters() + startOffset(); }
&gt; &gt; +    UChar characterAt(unsigned index) const;
&gt; &gt; +    void appendTextToStringBuilder(StringBuilder&amp;) const;
&gt; 
&gt; This additional API makes TextIterator a lot more confusing to use than it was before. The old API was designed to make it hard to use incorrectly; there was no copying of text ever. I’m particularly confused about how to use the string() function. Do all these new functions need to be public?

I made startOffset() and string() private.  The way to access text data is as before via characters(), if one character is wanted use characterAt() or if appending to a StringBuilder using appendTextToStringBuilder().  The two new functions are optimized for 8 bit strings.

&gt; The string() function should not return &quot;const String&quot;. It should just return &quot;String&quot;.

Done.

&gt; &gt; Source/WebKit/mac/WebView/WebFrame.mm:500
&gt; &gt; -    // This will give a system malloc&apos;d buffer that can be turned directly into an NSString
&gt; &gt; -    unsigned length;
&gt; &gt; -    UChar* buf = plainTextToMallocAllocatedBuffer(core(range), length, true);
&gt; &gt; -    
&gt; &gt; -    if (!buf)
&gt; &gt; -        return [NSString string];
&gt; &gt; -
&gt; &gt; -    // Transfer buffer ownership to NSString
&gt; &gt; -    return [[[NSString alloc] initWithCharactersNoCopy:buf length:length freeWhenDone:YES] autorelease];
&gt; &gt; +    return plainText(core(range), TextIteratorDefaultBehavior, true);
&gt; 
&gt; Why is it OK to remove the plainTextToMallocAllocatedBuffer optimization? That was a critical change back when Antti originally did it. Did you research why it was needed and determine it’s not needed any more?

The original change was done in http://trac.webkit.org/changeset/24832 to fix fragmentation caused by plainText() on large full documents.  The change did two things to fix the problem, use system malloc and allocate large buffers.  The patch I propose goes back to using fastMalloc, but it keeps the large buffer behavior exactly for the original reason.

I tested it with the test referenced in the code and posted those results with the original patch.  That is a performance test and not a memory test.  The test site &quot;http://dscoder.com/test.txt&quot; referenced in Antti&apos;s change is no longer available.  Instead I tried some memory tests using the HTML 5 spec file in PerformanceTests/Parser/resources/html5.html (a 5.8MB file).  Loading this file invokes plainText() once to create a 2.6MB String.  I loaded this file and measured memory before and after this patch:
                          Baseline     With Patch   
Fast Malloc Allocations     835719         720998
Fast Malloc Dirty          133.1MB        127.5MB
System Malloc Allocations    35318          35320
System Malloc Dirty         25.2MB         22.8MB
Total Dirty                171.0MB        162.7MB</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777110</commentid>
    <comment_count>6</comment_count>
      <attachid>176308</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2012-11-27 12:26:52 -0800</bug_when>
    <thetext>Comment on attachment 176308
Updated Patch

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

This looks like a huge improvement!  However, I think it will be even better if you don&apos;t copy the entire String each time you want to access a single character :-)

r- for this reason (or please explain what I&apos;m misunderstanding about your code change).

&gt; Source/WebCore/editing/TextIterator.cpp:472
&gt; +        return string()[startOffset() + index];

Currently this makes a copy of the string, then returns one character from it!

&gt; Source/WebCore/editing/TextIterator.cpp:480
&gt; +        builder.append(string(), startOffset(), length());

Again, I think this is copying for no real reason...

&gt; Source/WebCore/editing/TextIterator.h:110
&gt; +    String string() const { return m_text; }

Isn&apos;t this making a copy?  I think your original &quot;const String&quot; should probably have just been &quot;const String&amp;&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777221</commentid>
    <comment_count>7</comment_count>
      <attachid>176338</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2012-11-27 14:21:03 -0800</bug_when>
    <thetext>Created attachment 176338
ANother updated patch

(In reply to comment #6)
&gt; (From update of attachment 176308 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=176308&amp;action=review
&gt; 
&gt; This looks like a huge improvement!  However, I think it will be even better if you don&apos;t copy the entire String each time you want to access a single character :-)
&gt; 
&gt; r- for this reason (or please explain what I&apos;m misunderstanding about your code change).
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.cpp:472
&gt; &gt; +        return string()[startOffset() + index];
&gt; 
&gt; Currently this makes a copy of the string, then returns one character from it!
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.cpp:480
&gt; &gt; +        builder.append(string(), startOffset(), length());
&gt; 
&gt; Again, I think this is copying for no real reason...
&gt; 
&gt; &gt; Source/WebCore/editing/TextIterator.h:110
&gt; &gt; +    String string() const { return m_text; }
&gt; 
&gt; Isn&apos;t this making a copy?  I think your original &quot;const String&quot; should probably have just been &quot;const String&amp;&quot;

Made string() be const String&amp; as suggested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777501</commentid>
    <comment_count>8</comment_count>
      <attachid>176338</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2012-11-27 21:20:09 -0800</bug_when>
    <thetext>Comment on attachment 176338
ANother updated patch

Looks great!  Thanks.  r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777506</commentid>
    <comment_count>9</comment_count>
      <attachid>176338</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-27 21:28:23 -0800</bug_when>
    <thetext>Comment on attachment 176338
ANother updated patch

Clearing flags on attachment: 176338

Committed r135972: &lt;http://trac.webkit.org/changeset/135972&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>777507</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-27 21:28:27 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>176103</attachid>
            <date>2012-11-26 16:05:55 -0800</date>
            <delta_ts>2012-11-27 11:35:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>103295.patch</filename>
            <type>text/plain</type>
            <size>14352</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNTc2NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDEyLTExLTI2ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFRleHRJdGVyYXRvciB1bm5l
Y2Vzc2FyaWx5IGNvbnZlcnRzIDggYml0IHN0cmluZ3MgdG8gMTYgYml0cworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMjk1CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlZCBUZXh0SXRlcmF0b3Ig
dG8gdXNlIHRoZSBjb250YWluZWQgc3RyaW5nIGluc3RlYWQgb2YgY2FsbGluZyBjaGFyYWN0ZXJz
KCkgb24gdGhhdCBzdHJpbmcuCisgICAgICAgIE90aGVyIHNvdXJjZXMgb2YgdGV4dCwgbGlrZSBl
bWl0Q2hhcmFjdGVyKCkgc3RpbGwgdXNlIHRoZSBjb250YWluZWQgVUNoYXIqIGJ1ZmZlci4KKyAg
ICAgICAgQWRkZWQgYXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRlcigpIHRvIGFwcGVuZCB0aGUgdGV4
dCBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpdGVyYXRvciB0byBhIHN0cmluZyBidWlsZGVyCisg
ICAgICAgIGlycmVzcGVjdGl2ZSBvZiB0aGUgc291cmNlIG9mIHRoZSB0ZXh0LgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cyBhcyBmdW5jdGlvbmFsaXR5IGNvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMu
CisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogVXBkYXRlZCBwbGFpblRleHQgZXhwb3J0IGFu
ZCBlbGltaW5hdGVkIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyIGV4cG9ydAorICAg
ICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5n
ZSk6IFVwZGF0ZWQgdG8gdXNlIFRleHRJdGVyYXRvcjo6YXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRl
cigpCisgICAgICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJBdCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhl
IGluZGV4ZWQgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IFRleHRJdGVyYXRvcgorICAgICAgICAo
V2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjphcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKTogQWRkZWQg
bWV0aG9kIHRvIGFwcGVuZCB3aGF0ZXZlciB0aGUgY3VycmVudCB0ZXh0IHRvIGEgU3RyaW5nQnVp
bGRlcgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjplbWl0VGV4dCk6IEVsaW1pbmF0
ZWQgYWNjZXNzaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YSB2aWEgY2hhcmFjdGVycygpLgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aCk6IENo
YW5nZWQgdG8gdXNlIGNoYXJhY3RlckF0KCkuCisgICAgICAgIChXZWJDb3JlOjpwbGFpblRleHQp
OiBDb21iaW5lZCB3aXRoIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKCkuCisgICAg
ICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuaDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRJdGVy
YXRvcjo6c3RhcnRPZmZzZXQpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0
ZXJhdG9yOjpzdHJpbmcpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJh
dG9yOjpjaGFyYWN0ZXJzKTogVXBkYXRlZCB0byB1c2UgY29ycmVjdCB0ZXN0IHNvdXJjZS4KKyAg
ICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpzZWxlY3Rpb25Db250YWluc1Bvc3NpYmxlV29yZCk6IENoYW5nZWQgdG8gdXNlIGNoYXJhY3Rl
ckF0KCkuCisKIDIwMTItMTEtMjYgIEFsZXggQ2hyaXN0ZW5zZW4gIDxhbGV4LmNocmlzdGVuc2Vu
QGZsZXhzaW0uY29tPgogCiAgICAgICAgIGNsaXBib2FyZHdpbiBjb21waWxlIGVycm9yIGZvciB3
aW42NApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4JKHJldmlzaW9uIDEzNTY0MCkKKysrIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC02OTAsNyArNjkwLDYg
QEAgX19aTjdXZWJDb3JlMzBob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUgogX19aTjdXZWJDb3Jl
MzBvdmVycmlkZVVzZXJQcmVmZXJyZWRMYW5ndWFnZXNFUktOM1dURjZWZWN0b3JJTlMwXzZTdHJp
bmdFTG0wRUVFCiBfX1pON1dlYkNvcmUzMUNyb3NzT3JpZ2luUHJlZmxpZ2h0UmVzdWx0Q2FjaGU1
ZW1wdHlFdgogX19aTjdXZWJDb3JlMzFDcm9zc09yaWdpblByZWZsaWdodFJlc3VsdENhY2hlNnNo
YXJlZEV2Ci1fX1pON1dlYkNvcmUzMnBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyRVBL
TlNfNVJhbmdlRVJqYk5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCiBfX1pON1dlYkNvcmUzM3N0
cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlc0VSS04zV1RGNlN0cmluZ0UKIF9fWk43V2Vi
Q29yZTM3V2lkZ2V0SGllcmFyY2h5VXBkYXRlc1N1c3BlbnNpb25TY29wZTExbW92ZVdpZGdldHNF
dgogX19aTjdXZWJDb3JlMzdXaWRnZXRIaWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lvblNjb3BlMzVz
X3dpZGdldEhpZXJhcmNoeVVwZGF0ZVN1c3BlbmRDb3VudEUKQEAgLTEwOTAsNyArMTA4OSw3IEBA
IF9fWk43V2ViQ29yZTllbmRPZldvcmRFUktOU18xNVZpc2libGVQb3MKIF9fWk43V2ViQ29yZTlm
b250Q2FjaGVFdgogX19aTjdXZWJDb3JlOW1ha2VSYW5nZUVSS05TXzE1VmlzaWJsZVBvc2l0aW9u
RVMyXwogX19aTjdXZWJDb3JlOXBhZ2VDYWNoZUV2Ci1fX1pON1dlYkNvcmU5cGxhaW5UZXh0RVBL
TlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCitfX1pON1dlYkNvcmU5cGxhaW5U
ZXh0RVBLTlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFYgogX19aTjdXZWJDb3Jl
OXRvRWxlbWVudEVOM0pTQzdKU1ZhbHVlRQogX19aTjdXZWJDb3JlOXVuaW9uUmVjdEVSS04zV1RG
NlZlY3RvcklOU185RmxvYXRSZWN0RUxtMEVFRQogX19aTkszSlNDOEJpbmRpbmdzMTBSb290T2Jq
ZWN0MTJnbG9iYWxPYmplY3RFdgpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9B
Y2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCShyZXZpc2lvbiAxMzU2NDApCisrKyBT
b3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC04MzcsNyArODM3LDcgQEAgU3RyaW5nIEFjY2Vzc2liaWxpdHlPYmplY3Q6
OnN0cmluZ0ZvclZpcwogICAgICAgICAgICAgaWYgKCFsaXN0TWFya2VyVGV4dC5pc0VtcHR5KCkp
CiAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGlzdE1hcmtlclRleHQpOwogCi0gICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZChpdC5jaGFyYWN0ZXJzKCksIGl0Lmxlbmd0aCgpKTsKKyAg
ICAgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7CiAgICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5kIHN0YXJ0aW5nIG9m
ZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQogICAgICAgICAgICAgaW50IGV4Y2VwdGlvbiA9
IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwCShyZXZpc2lv
biAxMzU2NDApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQ2Miw2ICs0NjIsMjYgQEAgdm9pZCBUZXh0SXRlcmF0b3I6OmFkdmFu
Y2UoKQogICAgIH0KIH0KIAorVUNoYXIgVGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJBdCh1bnNpZ25l
ZCBpbmRleCkgY29uc3QKK3sKKyAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8aW50PihpbmRleCkgPCBs
ZW5ndGgoKSk7CisgICAgaWYgKCEoc3RhdGljX2Nhc3Q8aW50PihpbmRleCkgPCBsZW5ndGgoKSkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFtX3RleHRDaGFyYWN0ZXJzKQorICAgICAg
ICByZXR1cm4gc3RyaW5nKClbc3RhcnRPZmZzZXQoKSArIGluZGV4XTsKKworICAgIHJldHVybiBt
X3RleHRDaGFyYWN0ZXJzW2luZGV4XTsKK30KKwordm9pZCBUZXh0SXRlcmF0b3I6OmFwcGVuZFRl
eHRUb1N0cmluZ0J1aWxkZXIoU3RyaW5nQnVpbGRlciYgYnVpbGRlcikgY29uc3QKK3sKKyAgICBp
ZiAoIW1fdGV4dENoYXJhY3RlcnMpCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN0cmluZygpLCBz
dGFydE9mZnNldCgpLCBsZW5ndGgoKSk7CisgICAgZWxzZQorICAgICAgICBidWlsZGVyLmFwcGVu
ZChjaGFyYWN0ZXJzKCksIGxlbmd0aCgpKTsKK30KKwogYm9vbCBUZXh0SXRlcmF0b3I6OmhhbmRs
ZVRleHROb2RlKCkKIHsKICAgICBpZiAobV9mdWxseUNsaXBwZWRTdGFjay50b3AoKSAmJiAhbV9p
Z25vcmVzU3R5bGVWaXNpYmlsaXR5KQpAQCAtMTAwNyw3ICsxMDI3LDcgQEAgdm9pZCBUZXh0SXRl
cmF0b3I6OmVtaXRUZXh0KE5vZGUqIHRleHRObwogewogICAgIFJlbmRlclRleHQqIHJlbmRlcmVy
ID0gdG9SZW5kZXJUZXh0KHJlbmRlck9iamVjdCk7CiAgICAgbV90ZXh0ID0gbV9lbWl0c09yaWdp
bmFsVGV4dCA/IHJlbmRlcmVyLT5vcmlnaW5hbFRleHQoKSA6IChtX2VtaXRzVGV4dFdpdGhvdXRU
cmFuc2NvZGluZyA/IHJlbmRlcmVyLT50ZXh0V2l0aG91dFRyYW5zY29kaW5nKCkgOiByZW5kZXJl
ci0+dGV4dCgpKTsKLSAgICBBU1NFUlQobV90ZXh0LmNoYXJhY3RlcnMoKSk7CisgICAgQVNTRVJU
KCFtX3RleHQuaXNFbXB0eSgpKTsKICAgICBBU1NFUlQoMCA8PSB0ZXh0U3RhcnRPZmZzZXQgJiYg
dGV4dFN0YXJ0T2Zmc2V0IDwgc3RhdGljX2Nhc3Q8aW50PihtX3RleHQubGVuZ3RoKCkpKTsKICAg
ICBBU1NFUlQoMCA8PSB0ZXh0RW5kT2Zmc2V0ICYmIHRleHRFbmRPZmZzZXQgPD0gc3RhdGljX2Nh
c3Q8aW50PihtX3RleHQubGVuZ3RoKCkpKTsKICAgICBBU1NFUlQodGV4dFN0YXJ0T2Zmc2V0IDw9
IHRleHRFbmRPZmZzZXQpOwpAQCAtMTAxNiw3ICsxMDM2LDcgQEAgdm9pZCBUZXh0SXRlcmF0b3I6
OmVtaXRUZXh0KE5vZGUqIHRleHRObwogICAgIG1fcG9zaXRpb25PZmZzZXRCYXNlTm9kZSA9IDA7
CiAgICAgbV9wb3NpdGlvblN0YXJ0T2Zmc2V0ID0gdGV4dFN0YXJ0T2Zmc2V0OwogICAgIG1fcG9z
aXRpb25FbmRPZmZzZXQgPSB0ZXh0RW5kT2Zmc2V0OwotICAgIG1fdGV4dENoYXJhY3RlcnMgPSBt
X3RleHQuY2hhcmFjdGVycygpICsgdGV4dFN0YXJ0T2Zmc2V0OworICAgIG1fdGV4dENoYXJhY3Rl
cnMgPSAwOwogICAgIG1fdGV4dExlbmd0aCA9IHRleHRFbmRPZmZzZXQgLSB0ZXh0U3RhcnRPZmZz
ZXQ7CiAgICAgbV9sYXN0Q2hhcmFjdGVyID0gbV90ZXh0W3RleHRFbmRPZmZzZXQgLSAxXTsKIApA
QCAtMjQzOSw3ICsyNDU5LDcgQEAgUGFzc1JlZlB0cjxSYW5nZT4gVGV4dEl0ZXJhdG9yOjpyYW5n
ZUZybwogICAgICAgICBpZiAoZm91bmRFbmQpIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlz
IGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgZW5kIG9mIGEgcnVuIGlzIG9m
dGVuIGF0IHRoZSB3cm9uZwogICAgICAgICAgICAgLy8gcG9zaXRpb24gZm9yIGVtaXR0ZWQgJ1xu
J3MuCi0gICAgICAgICAgICBpZiAobGVuID09IDEgJiYgaXQuY2hhcmFjdGVycygpWzBdID09ICdc
bicpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMSAmJiBpdC5jaGFyYWN0ZXJBdCgwKSA9PSAn
XG4nKSB7CiAgICAgICAgICAgICAgICAgc2NvcGUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dEln
bm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwogICAgICAgICAgICAgICAgIGl0LmFkdmFuY2UoKTsK
ICAgICAgICAgICAgICAgICBpZiAoIWl0LmF0RW5kKCkpIHsKQEAgLTI1MzEsODIgKzI1NTEsMzgg
QEAgYm9vbCBUZXh0SXRlcmF0b3I6OmdldExvY2F0aW9uQW5kTGVuZ3RoRgogfQogCiAvLyAtLS0t
LS0tLQotICAgIAotVUNoYXIqIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKGNvbnN0
IFJhbmdlKiByLCB1bnNpZ25lZCYgYnVmZmVyTGVuZ3RoLCBib29sIGlzRGlzcGxheVN0cmluZywg
VGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yKQotewotICAgIFVDaGFyKiByZXN1
bHQgPSAwOwogCitTdHJpbmcgcGxhaW5UZXh0KGNvbnN0IFJhbmdlKiByLCBUZXh0SXRlcmF0b3JC
ZWhhdmlvciBkZWZhdWx0QmVoYXZpb3IsIGJvb2wgaXNEaXNwbGF5U3RyaW5nKQorewogICAgIC8v
IFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplIGNhbiBiZSBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2U6
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MTE5MgogICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBjTWF4U2VnbWVudFNpemUgPSAxIDw8IDE1OwotICAgIGJ1ZmZlckxl
bmd0aCA9IDA7Ci0gICAgdHlwZWRlZiBwYWlyPFVDaGFyKiwgdW5zaWduZWQ+IFRleHRTZWdtZW50
OwotICAgIE93blB0cjxWZWN0b3I8VGV4dFNlZ21lbnQ+ID4gdGV4dFNlZ21lbnRzOwotICAgIFZl
Y3RvcjxVQ2hhcj4gdGV4dEJ1ZmZlcjsKLSAgICB0ZXh0QnVmZmVyLnJlc2VydmVJbml0aWFsQ2Fw
YWNpdHkoY01heFNlZ21lbnRTaXplKTsKKworICAgIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCA9IDA7
CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIucmVzZXJ2ZUNhcGFjaXR5
KGNNYXhTZWdtZW50U2l6ZSk7CiAgICAgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgYmVoYXZpb3IgPSBk
ZWZhdWx0QmVoYXZpb3I7CiAgICAgaWYgKCFpc0Rpc3BsYXlTdHJpbmcpCiAgICAgICAgIGJlaGF2
aW9yID0gc3RhdGljX2Nhc3Q8VGV4dEl0ZXJhdG9yQmVoYXZpb3I+KGJlaGF2aW9yIHwgVGV4dEl0
ZXJhdG9yRW1pdHNUZXh0c1dpdGhvdXRUcmFuc2NvZGluZyk7CiAgICAgCiAgICAgZm9yIChUZXh0
SXRlcmF0b3IgaXQociwgYmVoYXZpb3IpOyAhaXQuYXRFbmQoKTsgaXQuYWR2YW5jZSgpKSB7Ci0g
ICAgICAgIGlmICh0ZXh0QnVmZmVyLnNpemUoKSAmJiB0ZXh0QnVmZmVyLnNpemUoKSArIGl0Lmxl
bmd0aCgpID4gY01heFNlZ21lbnRTaXplKSB7Ci0gICAgICAgICAgICBVQ2hhciogbmV3U2VnbWVu
dEJ1ZmZlciA9IHN0YXRpY19jYXN0PFVDaGFyKj4obWFsbG9jKHRleHRCdWZmZXIuc2l6ZSgpICog
c2l6ZW9mKFVDaGFyKSkpOwotICAgICAgICAgICAgaWYgKCFuZXdTZWdtZW50QnVmZmVyKQotICAg
ICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgIG1lbWNweShuZXdTZWdtZW50QnVm
ZmVyLCB0ZXh0QnVmZmVyLmRhdGEoKSwgdGV4dEJ1ZmZlci5zaXplKCkgKiBzaXplb2YoVUNoYXIp
KTsKLSAgICAgICAgICAgIGlmICghdGV4dFNlZ21lbnRzKQotICAgICAgICAgICAgICAgIHRleHRT
ZWdtZW50cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8VGV4dFNlZ21lbnQ+KTsKLSAgICAgICAgICAg
IHRleHRTZWdtZW50cy0+YXBwZW5kKG1ha2VfcGFpcihuZXdTZWdtZW50QnVmZmVyLCAodW5zaWdu
ZWQpdGV4dEJ1ZmZlci5zaXplKCkpKTsKLSAgICAgICAgICAgIHRleHRCdWZmZXIuY2xlYXIoKTsK
LSAgICAgICAgfQotICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZChpdC5jaGFyYWN0ZXJzKCksIGl0
Lmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuY2FwYWNpdHkoKSA8IGJ1aWxkZXIubGVu
Z3RoKCkgKyBpdC5sZW5ndGgoKSkKKyAgICAgICAgICAgIGJ1aWxkZXIucmVzZXJ2ZUNhcGFjaXR5
KGJ1aWxkZXIuY2FwYWNpdHkoKSArIGNNYXhTZWdtZW50U2l6ZSk7CisKKyAgICAgICAgaXQuYXBw
ZW5kVGV4dFRvU3RyaW5nQnVpbGRlcihidWlsZGVyKTsKICAgICAgICAgYnVmZmVyTGVuZ3RoICs9
IGl0Lmxlbmd0aCgpOwogICAgIH0KIAogICAgIGlmICghYnVmZmVyTGVuZ3RoKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIC8vIFNpbmNlIHdlIGtub3cgdGhlIHNpemUgbm93LCB3ZSBjYW4gbWFr
ZSBhIHNpbmdsZSBidWZmZXIgb3V0IG9mIHRoZSBwaWVjZXMgd2l0aCBvbmUgYmlnIGFsbG9jCi0g
ICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8VUNoYXIqPihtYWxsb2MoYnVmZmVyTGVuZ3RoICogc2l6
ZW9mKFVDaGFyKSkpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICBnb3RvIGV4aXQ7CisgICAg
ICAgIHJldHVybiBlbXB0eVN0cmluZygpOwogCi0gICAgewotICAgICAgICBVQ2hhciogcmVzdWx0
UG9zID0gcmVzdWx0OwotICAgICAgICBpZiAodGV4dFNlZ21lbnRzKSB7Ci0gICAgICAgICAgICB1
bnNpZ25lZCBzaXplID0gdGV4dFNlZ21lbnRzLT5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgVGV4
dFNlZ21lbnQmIHNlZ21lbnQgPSB0ZXh0U2VnbWVudHMtPmF0KGkpOwotICAgICAgICAgICAgICAg
IG1lbWNweShyZXN1bHRQb3MsIHNlZ21lbnQuZmlyc3QsIHNlZ21lbnQuc2Vjb25kICogc2l6ZW9m
KFVDaGFyKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0UG9zICs9IHNlZ21lbnQuc2Vjb25kOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShyZXN1bHRQb3MsIHRleHRC
dWZmZXIuZGF0YSgpLCB0ZXh0QnVmZmVyLnNpemUoKSAqIHNpemVvZihVQ2hhcikpOwotICAgIH0K
KyAgICBTdHJpbmcgcmVzdWx0ID0gYnVpbGRlci50b1N0cmluZygpOwogCi1leGl0OgotICAgIGlm
ICh0ZXh0U2VnbWVudHMpIHsKLSAgICAgICAgdW5zaWduZWQgc2l6ZSA9IHRleHRTZWdtZW50cy0+
c2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAg
ICAgICAgICAgZnJlZSh0ZXh0U2VnbWVudHMtPmF0KGkpLmZpcnN0KTsKLSAgICB9Ci0gICAgCiAg
ICAgaWYgKGlzRGlzcGxheVN0cmluZyAmJiByLT5vd25lckRvY3VtZW50KCkpCi0gICAgICAgIHIt
Pm93bmVyRG9jdW1lbnQoKS0+ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGluZyhyZXN1bHQs
IGJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHItPm93bmVyRG9jdW1lbnQoKS0+ZGlzcGxheVN0cmlu
Z01vZGlmaWVkQnlFbmNvZGluZyhyZXN1bHQpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAot
U3RyaW5nIHBsYWluVGV4dChjb25zdCBSYW5nZSogciwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVm
YXVsdEJlaGF2aW9yKQotewotICAgIHVuc2lnbmVkIGxlbmd0aDsKLSAgICBVQ2hhciogYnVmID0g
cGxhaW5UZXh0VG9NYWxsb2NBbGxvY2F0ZWRCdWZmZXIociwgbGVuZ3RoLCBmYWxzZSwgZGVmYXVs
dEJlaGF2aW9yKTsKLSAgICBpZiAoIWJ1ZikKLSAgICAgICAgcmV0dXJuICIiOwotICAgIFN0cmlu
ZyByZXN1bHQoYnVmLCBsZW5ndGgpOwotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBbGxDb2xsYXBzaWJsZVdoaXRlc3BhY2UoY29u
c3QgU3RyaW5nJiBzdHJpbmcpCiB7CiAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSBzdHJp
bmcuY2hhcmFjdGVycygpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0SXRlcmF0
b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5o
CShyZXZpc2lvbiAxMzU2NDApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRv
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC02MCw4ICs2MCwxMCBAQCBpbmxpbmUgYm9vbCBpc0NvbGxh
cHNpYmxlV2hpdGVzcGFjZShVQ2hhCiAgICAgfQogfQogCi1TdHJpbmcgcGxhaW5UZXh0KGNvbnN0
IFJhbmdlKiwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yID0gVGV4dEl0ZXJh
dG9yRGVmYXVsdEJlaGF2aW9yKTsKK1N0cmluZyBwbGFpblRleHQoY29uc3QgUmFuZ2UqLCBUZXh0
SXRlcmF0b3JCZWhhdmlvciBkZWZhdWx0QmVoYXZpb3IgPSBUZXh0SXRlcmF0b3JEZWZhdWx0QmVo
YXZpb3IsIGJvb2wgaXNEaXNwbGF5U3RyaW5nID0gZmFsc2UpOworI2lmIDAKIFVDaGFyKiBwbGFp
blRleHRUb01hbGxvY0FsbG9jYXRlZEJ1ZmZlcihjb25zdCBSYW5nZSosIHVuc2lnbmVkJiBidWZm
ZXJMZW5ndGgsIGJvb2wgaXNEaXNwbGF5U3RyaW5nLCBUZXh0SXRlcmF0b3JCZWhhdmlvciA9IFRl
eHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvcik7CisjZW5kaWYKIFBhc3NSZWZQdHI8UmFuZ2U+IGZp
bmRQbGFpblRleHQoY29uc3QgUmFuZ2UqLCBjb25zdCBTdHJpbmcmLCBGaW5kT3B0aW9ucyk7CiAK
IGNsYXNzIEJpdFN0YWNrIHsKQEAgLTk0LDcgKzk2LDExIEBAIHB1YmxpYzoKICAgICB2b2lkIGFk
dmFuY2UoKTsKICAgICAKICAgICBpbnQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0TGVu
Z3RoOyB9Ci0gICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHRDaGFyYWN0ZXJzOyB9CisgICAgaW50IHN0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9w
b3NpdGlvblN0YXJ0T2Zmc2V0OyB9CisgICAgY29uc3QgU3RyaW5nIHN0cmluZygpIGNvbnN0IHsg
cmV0dXJuIG1fdGV4dDsgfQorICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzKCkgY29uc3QgeyBy
ZXR1cm4gbV90ZXh0Q2hhcmFjdGVycyA/IG1fdGV4dENoYXJhY3RlcnMgOiBtX3RleHQuY2hhcmFj
dGVycygpICsgc3RhcnRPZmZzZXQoKTsgfQorICAgIFVDaGFyIGNoYXJhY3RlckF0KHVuc2lnbmVk
IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoU3RyaW5n
QnVpbGRlciYpIGNvbnN0OwogICAgIAogICAgIFBhc3NSZWZQdHI8UmFuZ2U+IHJhbmdlKCkgY29u
c3Q7CiAgICAgTm9kZSogbm9kZSgpIGNvbnN0OwpAQCAtMTM5LDcgKzE0NSw3IEBAIHByaXZhdGU6
CiAgICAgbXV0YWJsZSBOb2RlKiBtX3Bvc2l0aW9uT2Zmc2V0QmFzZU5vZGU7CiAgICAgbXV0YWJs
ZSBpbnQgbV9wb3NpdGlvblN0YXJ0T2Zmc2V0OwogICAgIG11dGFibGUgaW50IG1fcG9zaXRpb25F
bmRPZmZzZXQ7Ci0gICAgY29uc3QgVUNoYXIqIG1fdGV4dENoYXJhY3RlcnM7CisgICAgY29uc3Qg
VUNoYXIqIG1fdGV4dENoYXJhY3RlcnM7IC8vIElmIG51bGwsIHRoZW4gdXNlIG1fdGV4dCBmb3Ig
Y2hhcmFjdGVyIGRhdGEuCiAgICAgaW50IG1fdGV4dExlbmd0aDsKICAgICAvLyBIb2xkIHN0cmlu
ZyBtX3RleHRDaGFyYWN0ZXJzIHBvaW50cyB0byBzbyB3ZSBlbnN1cmUgaXQgd29uJ3QgYmUgZGVs
ZXRlZC4KICAgICBTdHJpbmcgbV90ZXh0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9Db250
ZXh0TWVudUNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uv
Q29udGV4dE1lbnVDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMTM1NjQwKQorKysgU291cmNlL1dl
YkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03
MDIsOSArNzAyLDggQEAgc3RhdGljIGJvb2wgc2VsZWN0aW9uQ29udGFpbnNQb3NzaWJsZVdvcgog
ICAgIC8vIEN1cnJlbnQgYWxnb3JpdGhtOiBsb29rIGZvciBhIGNoYXJhY3RlciB0aGF0J3Mgbm90
IGp1c3QgYSBzZXBhcmF0b3IuCiAgICAgZm9yIChUZXh0SXRlcmF0b3IgaXQoZnJhbWUtPnNlbGVj
dGlvbigpLT50b05vcm1hbGl6ZWRSYW5nZSgpLmdldCgpKTsgIWl0LmF0RW5kKCk7IGl0LmFkdmFu
Y2UoKSkgewogICAgICAgICBpbnQgbGVuZ3RoID0gaXQubGVuZ3RoKCk7Ci0gICAgICAgIGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzID0gaXQuY2hhcmFjdGVycygpOwogICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGxlbmd0aDsgKytpKQotICAgICAgICAgICAgaWYgKCEoY2F0ZWdvcnkoY2hhcmFj
dGVyc1tpXSkgJiAoU2VwYXJhdG9yX1NwYWNlIHwgU2VwYXJhdG9yX0xpbmUgfCBTZXBhcmF0b3Jf
UGFyYWdyYXBoKSkpCisgICAgICAgICAgICBpZiAoIShjYXRlZ29yeShpdC5jaGFyYWN0ZXJBdChp
KSkgJiAoU2VwYXJhdG9yX1NwYWNlIHwgU2VwYXJhdG9yX0xpbmUgfCBTZXBhcmF0b3JfUGFyYWdy
YXBoKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBm
YWxzZTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNTc2NCkKKysrIFNvdXJjZS9X
ZWJLaXQvbWFjL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDEy
LTExLTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFRl
eHRJdGVyYXRvciB1bm5lY2Vzc2FyaWx5IGNvbnZlcnRzIDggYml0IHN0cmluZ3MgdG8gMTYgYml0
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMjk1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVXBkYXRl
ZCBfc3RyaW5nRm9yUmFuZ2UgdG8gdXNlIHBsYWluVGV4dCgpIGluc3RlYWQgb2YgcmVtb3ZlZCBw
bGFpblRleHRUb01hbGxvY0FsbG9jYXRlZEJ1ZmZlcigpLgorCisgICAgICAgICogV2ViVmlldy9X
ZWJGcmFtZS5tbToKKyAgICAgICAgKC1bV2ViRnJhbWUgX3N0cmluZ0ZvclJhbmdlOl0pOgorCiAy
MDEyLTExLTIzICBBbGV4aXMgTWVuYXJkICA8YWxleGlzQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
W0NTUzMgQmFja2dyb3VuZHMgYW5kIEJvcmRlcnNdIEltcGxlbWVudCBuZXcgQ1NTMyBiYWNrZ3Jv
dW5kLXBvc2l0aW9uIHBhcnNpbmcuCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9XZWJWaWV3L1dl
YkZyYW1lLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL1dlYlZpZXcvV2ViRnJh
bWUubW0JKHJldmlzaW9uIDEzNTY0MCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL1dlYlZpZXcvV2Vi
RnJhbWUubW0JKHdvcmtpbmcgY29weSkKQEAgLTQ5NywxNSArNDk3LDcgQEAgLSAoTlNTdHJpbmcg
Kilfc2VsZWN0ZWRTdHJpbmcKIAogLSAoTlNTdHJpbmcgKilfc3RyaW5nRm9yUmFuZ2U6KERPTVJh
bmdlICopcmFuZ2UKIHsKLSAgICAvLyBUaGlzIHdpbGwgZ2l2ZSBhIHN5c3RlbSBtYWxsb2MnZCBi
dWZmZXIgdGhhdCBjYW4gYmUgdHVybmVkIGRpcmVjdGx5IGludG8gYW4gTlNTdHJpbmcKLSAgICB1
bnNpZ25lZCBsZW5ndGg7Ci0gICAgVUNoYXIqIGJ1ZiA9IHBsYWluVGV4dFRvTWFsbG9jQWxsb2Nh
dGVkQnVmZmVyKGNvcmUocmFuZ2UpLCBsZW5ndGgsIHRydWUpOwotICAgIAotICAgIGlmICghYnVm
KQotICAgICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107Ci0KLSAgICAvLyBUcmFuc2ZlciBi
dWZmZXIgb3duZXJzaGlwIHRvIE5TU3RyaW5nCi0gICAgcmV0dXJuIFtbW05TU3RyaW5nIGFsbG9j
XSBpbml0V2l0aENoYXJhY3RlcnNOb0NvcHk6YnVmIGxlbmd0aDpsZW5ndGggZnJlZVdoZW5Eb25l
OllFU10gYXV0b3JlbGVhc2VdOworICAgIHJldHVybiBwbGFpblRleHQoY29yZShyYW5nZSksIFRl
eHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvciwgdHJ1ZSk7CiB9CiAKIC0gKEJPT0wpX3Nob3VsZEZs
YXR0ZW5Db21wb3NpdGluZ0xheWVyczooQ0dDb250ZXh0UmVmKWNvbnRleHQK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>176308</attachid>
            <date>2012-11-27 11:35:12 -0800</date>
            <delta_ts>2012-11-27 14:21:03 -0800</delta_ts>
            <desc>Updated Patch</desc>
            <filename>103295-3.patch</filename>
            <type>text/plain</type>
            <size>14610</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNTc4OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDEyLTExLTI2ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFRleHRJdGVyYXRvciB1bm5l
Y2Vzc2FyaWx5IGNvbnZlcnRzIDggYml0IHN0cmluZ3MgdG8gMTYgYml0cworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMjk1CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlZCBUZXh0SXRlcmF0b3Ig
dG8gdXNlIHRoZSBjb250YWluZWQgc3RyaW5nIGluc3RlYWQgb2YgY2FsbGluZyBjaGFyYWN0ZXJz
KCkgb24gdGhhdCBzdHJpbmcuCisgICAgICAgIE90aGVyIHNvdXJjZXMgb2YgdGV4dCwgbGlrZSBl
bWl0Q2hhcmFjdGVyKCkgc3RpbGwgdXNlIHRoZSBjb250YWluZWQgVUNoYXIqIGJ1ZmZlci4KKyAg
ICAgICAgQWRkZWQgYXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRlcigpIHRvIGFwcGVuZCB0aGUgdGV4
dCBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpdGVyYXRvciB0byBhIHN0cmluZyBidWlsZGVyCisg
ICAgICAgIGlycmVzcGVjdGl2ZSBvZiB0aGUgc291cmNlIG9mIHRoZSB0ZXh0LgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cyBhcyBmdW5jdGlvbmFsaXR5IGNvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMu
CisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogVXBkYXRlZCBwbGFpblRleHQgZXhwb3J0IGFu
ZCBlbGltaW5hdGVkIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyIGV4cG9ydAorICAg
ICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5n
ZSk6IFVwZGF0ZWQgdG8gdXNlIFRleHRJdGVyYXRvcjo6YXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRl
cigpCisgICAgICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJBdCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhl
IGluZGV4ZWQgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IFRleHRJdGVyYXRvcgorICAgICAgICAo
V2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjphcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKTogQWRkZWQg
bWV0aG9kIHRvIGFwcGVuZCB3aGF0ZXZlciB0aGUgY3VycmVudCB0ZXh0IHRvIGEgU3RyaW5nQnVp
bGRlcgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjplbWl0VGV4dCk6IEVsaW1pbmF0
ZWQgYWNjZXNzaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YSB2aWEgY2hhcmFjdGVycygpLgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aCk6IENo
YW5nZWQgdG8gdXNlIGNoYXJhY3RlckF0KCkuCisgICAgICAgIChXZWJDb3JlOjpwbGFpblRleHQp
OiBDb21iaW5lZCB3aXRoIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKCkuCisgICAg
ICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuaDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRJdGVy
YXRvcjo6c3RhcnRPZmZzZXQpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0
ZXJhdG9yOjpzdHJpbmcpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJh
dG9yOjpjaGFyYWN0ZXJzKTogVXBkYXRlZCB0byB1c2UgY29ycmVjdCB0ZXN0IHNvdXJjZS4KKyAg
ICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpzZWxlY3Rpb25Db250YWluc1Bvc3NpYmxlV29yZCk6IENoYW5nZWQgdG8gdXNlIGNoYXJhY3Rl
ckF0KCkuCisKIDIwMTItMTEtMjYgIEFuZHJlYXMgS2xpbmcgIDxha2xpbmdAYXBwbGUuY29tPgog
CiAgICAgICAgIFJlbmRlclN0eWxlOiBNb3ZlICdsaXN0LXN0eWxlLWltYWdlJyB0byByYXJlIGlu
aGVyaXRlZCBkYXRhLgpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4JKHJldmlzaW9uIDEzNTY0MCkK
KysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC02OTAs
NyArNjkwLDYgQEAgX19aTjdXZWJDb3JlMzBob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUgogX19a
TjdXZWJDb3JlMzBvdmVycmlkZVVzZXJQcmVmZXJyZWRMYW5ndWFnZXNFUktOM1dURjZWZWN0b3JJ
TlMwXzZTdHJpbmdFTG0wRUVFCiBfX1pON1dlYkNvcmUzMUNyb3NzT3JpZ2luUHJlZmxpZ2h0UmVz
dWx0Q2FjaGU1ZW1wdHlFdgogX19aTjdXZWJDb3JlMzFDcm9zc09yaWdpblByZWZsaWdodFJlc3Vs
dENhY2hlNnNoYXJlZEV2Ci1fX1pON1dlYkNvcmUzMnBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVk
QnVmZmVyRVBLTlNfNVJhbmdlRVJqYk5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCiBfX1pON1dl
YkNvcmUzM3N0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlc0VSS04zV1RGNlN0cmluZ0UK
IF9fWk43V2ViQ29yZTM3V2lkZ2V0SGllcmFyY2h5VXBkYXRlc1N1c3BlbnNpb25TY29wZTExbW92
ZVdpZGdldHNFdgogX19aTjdXZWJDb3JlMzdXaWRnZXRIaWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lv
blNjb3BlMzVzX3dpZGdldEhpZXJhcmNoeVVwZGF0ZVN1c3BlbmRDb3VudEUKQEAgLTEwOTAsNyAr
MTA4OSw3IEBAIF9fWk43V2ViQ29yZTllbmRPZldvcmRFUktOU18xNVZpc2libGVQb3MKIF9fWk43
V2ViQ29yZTlmb250Q2FjaGVFdgogX19aTjdXZWJDb3JlOW1ha2VSYW5nZUVSS05TXzE1VmlzaWJs
ZVBvc2l0aW9uRVMyXwogX19aTjdXZWJDb3JlOXBhZ2VDYWNoZUV2Ci1fX1pON1dlYkNvcmU5cGxh
aW5UZXh0RVBLTlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCitfX1pON1dlYkNv
cmU5cGxhaW5UZXh0RVBLTlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFYgogX19a
TjdXZWJDb3JlOXRvRWxlbWVudEVOM0pTQzdKU1ZhbHVlRQogX19aTjdXZWJDb3JlOXVuaW9uUmVj
dEVSS04zV1RGNlZlY3RvcklOU185RmxvYXRSZWN0RUxtMEVFRQogX19aTkszSlNDOEJpbmRpbmdz
MTBSb290T2JqZWN0MTJnbG9iYWxPYmplY3RFdgpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCShyZXZpc2lvbiAxMzU2
NDApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3Qu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MzcsNyArODM3LDcgQEAgU3RyaW5nIEFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclZpcwogICAgICAgICAgICAgaWYgKCFsaXN0TWFya2VyVGV4dC5p
c0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGlzdE1hcmtlclRleHQp
OwogCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpdC5jaGFyYWN0ZXJzKCksIGl0Lmxlbmd0
aCgpKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7
CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5kIHN0
YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQogICAgICAgICAgICAgaW50IGV4
Y2VwdGlvbiA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0SXRlcmF0b3IuY3Bw
CShyZXZpc2lvbiAxMzU2NDApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRv
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2Miw2ICs0NjIsMjYgQEAgdm9pZCBUZXh0SXRlcmF0
b3I6OmFkdmFuY2UoKQogICAgIH0KIH0KIAorVUNoYXIgVGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJB
dCh1bnNpZ25lZCBpbmRleCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaW5kZXggPCBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4obGVuZ3RoKCkpKTsKKyAgICBpZiAoIShpbmRleCA8IHN0YXRpY19jYXN0PHVu
c2lnbmVkPihsZW5ndGgoKSkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbV90ZXh0
Q2hhcmFjdGVycykKKyAgICAgICAgcmV0dXJuIHN0cmluZygpW3N0YXJ0T2Zmc2V0KCkgKyBpbmRl
eF07CisKKyAgICByZXR1cm4gbV90ZXh0Q2hhcmFjdGVyc1tpbmRleF07Cit9CisKK3ZvaWQgVGV4
dEl0ZXJhdG9yOjphcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKFN0cmluZ0J1aWxkZXImIGJ1aWxk
ZXIpIGNvbnN0Cit7CisgICAgaWYgKCFtX3RleHRDaGFyYWN0ZXJzKQorICAgICAgICBidWlsZGVy
LmFwcGVuZChzdHJpbmcoKSwgc3RhcnRPZmZzZXQoKSwgbGVuZ3RoKCkpOworICAgIGVsc2UKKyAg
ICAgICAgYnVpbGRlci5hcHBlbmQoY2hhcmFjdGVycygpLCBsZW5ndGgoKSk7Cit9CisKIGJvb2wg
VGV4dEl0ZXJhdG9yOjpoYW5kbGVUZXh0Tm9kZSgpCiB7CiAgICAgaWYgKG1fZnVsbHlDbGlwcGVk
U3RhY2sudG9wKCkgJiYgIW1faWdub3Jlc1N0eWxlVmlzaWJpbGl0eSkKQEAgLTEwMDcsNyArMTAy
Nyw3IEBAIHZvaWQgVGV4dEl0ZXJhdG9yOjplbWl0VGV4dChOb2RlKiB0ZXh0Tm8KIHsKICAgICBS
ZW5kZXJUZXh0KiByZW5kZXJlciA9IHRvUmVuZGVyVGV4dChyZW5kZXJPYmplY3QpOwogICAgIG1f
dGV4dCA9IG1fZW1pdHNPcmlnaW5hbFRleHQgPyByZW5kZXJlci0+b3JpZ2luYWxUZXh0KCkgOiAo
bV9lbWl0c1RleHRXaXRob3V0VHJhbnNjb2RpbmcgPyByZW5kZXJlci0+dGV4dFdpdGhvdXRUcmFu
c2NvZGluZygpIDogcmVuZGVyZXItPnRleHQoKSk7Ci0gICAgQVNTRVJUKG1fdGV4dC5jaGFyYWN0
ZXJzKCkpOworICAgIEFTU0VSVCghbV90ZXh0LmlzRW1wdHkoKSk7CiAgICAgQVNTRVJUKDAgPD0g
dGV4dFN0YXJ0T2Zmc2V0ICYmIHRleHRTdGFydE9mZnNldCA8IHN0YXRpY19jYXN0PGludD4obV90
ZXh0Lmxlbmd0aCgpKSk7CiAgICAgQVNTRVJUKDAgPD0gdGV4dEVuZE9mZnNldCAmJiB0ZXh0RW5k
T2Zmc2V0IDw9IHN0YXRpY19jYXN0PGludD4obV90ZXh0Lmxlbmd0aCgpKSk7CiAgICAgQVNTRVJU
KHRleHRTdGFydE9mZnNldCA8PSB0ZXh0RW5kT2Zmc2V0KTsKQEAgLTEwMTYsNyArMTAzNiw3IEBA
IHZvaWQgVGV4dEl0ZXJhdG9yOjplbWl0VGV4dChOb2RlKiB0ZXh0Tm8KICAgICBtX3Bvc2l0aW9u
T2Zmc2V0QmFzZU5vZGUgPSAwOwogICAgIG1fcG9zaXRpb25TdGFydE9mZnNldCA9IHRleHRTdGFy
dE9mZnNldDsKICAgICBtX3Bvc2l0aW9uRW5kT2Zmc2V0ID0gdGV4dEVuZE9mZnNldDsKLSAgICBt
X3RleHRDaGFyYWN0ZXJzID0gbV90ZXh0LmNoYXJhY3RlcnMoKSArIHRleHRTdGFydE9mZnNldDsK
KyAgICBtX3RleHRDaGFyYWN0ZXJzID0gMDsKICAgICBtX3RleHRMZW5ndGggPSB0ZXh0RW5kT2Zm
c2V0IC0gdGV4dFN0YXJ0T2Zmc2V0OwogICAgIG1fbGFzdENoYXJhY3RlciA9IG1fdGV4dFt0ZXh0
RW5kT2Zmc2V0IC0gMV07CiAKQEAgLTI0MzksNyArMjQ1OSw3IEBAIFBhc3NSZWZQdHI8UmFuZ2U+
IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm8KICAgICAgICAgaWYgKGZvdW5kRW5kKSB7CiAgICAgICAg
ICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgdGhl
IGVuZCBvZiBhIHJ1biBpcyBvZnRlbiBhdCB0aGUgd3JvbmcKICAgICAgICAgICAgIC8vIHBvc2l0
aW9uIGZvciBlbWl0dGVkICdcbidzLgotICAgICAgICAgICAgaWYgKGxlbiA9PSAxICYmIGl0LmNo
YXJhY3RlcnMoKVswXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAobGVuID09IDEgJiYgaXQu
Y2hhcmFjdGVyQXQoMCkgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgIHNjb3BlLT5kb2N1bWVu
dCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKICAgICAgICAgICAg
ICAgICBpdC5hZHZhbmNlKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFpdC5hdEVuZCgpKSB7CkBA
IC0yNTMxLDgyICsyNTUxLDM4IEBAIGJvb2wgVGV4dEl0ZXJhdG9yOjpnZXRMb2NhdGlvbkFuZExl
bmd0aEYKIH0KIAogLy8gLS0tLS0tLS0KLSAgICAKLVVDaGFyKiBwbGFpblRleHRUb01hbGxvY0Fs
bG9jYXRlZEJ1ZmZlcihjb25zdCBSYW5nZSogciwgdW5zaWduZWQmIGJ1ZmZlckxlbmd0aCwgYm9v
bCBpc0Rpc3BsYXlTdHJpbmcsIFRleHRJdGVyYXRvckJlaGF2aW9yIGRlZmF1bHRCZWhhdmlvcikK
LXsKLSAgICBVQ2hhciogcmVzdWx0ID0gMDsKIAorU3RyaW5nIHBsYWluVGV4dChjb25zdCBSYW5n
ZSogciwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yLCBib29sIGlzRGlzcGxh
eVN0cmluZykKK3sKICAgICAvLyBUaGUgaW5pdGlhbCBidWZmZXIgc2l6ZSBjYW4gYmUgY3JpdGlj
YWwgZm9yIHBlcmZvcm1hbmNlOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODExOTIKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY01heFNlZ21lbnRTaXplID0gMSA8
PCAxNTsKLSAgICBidWZmZXJMZW5ndGggPSAwOwotICAgIHR5cGVkZWYgcGFpcjxVQ2hhciosIHVu
c2lnbmVkPiBUZXh0U2VnbWVudDsKLSAgICBPd25QdHI8VmVjdG9yPFRleHRTZWdtZW50PiA+IHRl
eHRTZWdtZW50czsKLSAgICBWZWN0b3I8VUNoYXI+IHRleHRCdWZmZXI7Ci0gICAgdGV4dEJ1ZmZl
ci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNNYXhTZWdtZW50U2l6ZSk7CisKKyAgICB1bnNpZ25l
ZCBidWZmZXJMZW5ndGggPSAwOworICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWls
ZGVyLnJlc2VydmVDYXBhY2l0eShjTWF4U2VnbWVudFNpemUpOwogICAgIFRleHRJdGVyYXRvckJl
aGF2aW9yIGJlaGF2aW9yID0gZGVmYXVsdEJlaGF2aW9yOwogICAgIGlmICghaXNEaXNwbGF5U3Ry
aW5nKQogICAgICAgICBiZWhhdmlvciA9IHN0YXRpY19jYXN0PFRleHRJdGVyYXRvckJlaGF2aW9y
PihiZWhhdmlvciB8IFRleHRJdGVyYXRvckVtaXRzVGV4dHNXaXRob3V0VHJhbnNjb2RpbmcpOwog
ICAgIAogICAgIGZvciAoVGV4dEl0ZXJhdG9yIGl0KHIsIGJlaGF2aW9yKTsgIWl0LmF0RW5kKCk7
IGl0LmFkdmFuY2UoKSkgewotICAgICAgICBpZiAodGV4dEJ1ZmZlci5zaXplKCkgJiYgdGV4dEJ1
ZmZlci5zaXplKCkgKyBpdC5sZW5ndGgoKSA+IGNNYXhTZWdtZW50U2l6ZSkgewotICAgICAgICAg
ICAgVUNoYXIqIG5ld1NlZ21lbnRCdWZmZXIgPSBzdGF0aWNfY2FzdDxVQ2hhcio+KG1hbGxvYyh0
ZXh0QnVmZmVyLnNpemUoKSAqIHNpemVvZihVQ2hhcikpKTsKLSAgICAgICAgICAgIGlmICghbmV3
U2VnbWVudEJ1ZmZlcikKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICBt
ZW1jcHkobmV3U2VnbWVudEJ1ZmZlciwgdGV4dEJ1ZmZlci5kYXRhKCksIHRleHRCdWZmZXIuc2l6
ZSgpICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgICAgICBpZiAoIXRleHRTZWdtZW50cykKLSAg
ICAgICAgICAgICAgICB0ZXh0U2VnbWVudHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFRleHRTZWdt
ZW50Pik7Ci0gICAgICAgICAgICB0ZXh0U2VnbWVudHMtPmFwcGVuZChtYWtlX3BhaXIobmV3U2Vn
bWVudEJ1ZmZlciwgKHVuc2lnbmVkKXRleHRCdWZmZXIuc2l6ZSgpKSk7Ci0gICAgICAgICAgICB0
ZXh0QnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQo
aXQuY2hhcmFjdGVycygpLCBpdC5sZW5ndGgoKSk7CisgICAgICAgIGlmIChidWlsZGVyLmNhcGFj
aXR5KCkgPCBidWlsZGVyLmxlbmd0aCgpICsgaXQubGVuZ3RoKCkpCisgICAgICAgICAgICBidWls
ZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLmNhcGFjaXR5KCkgKyBjTWF4U2VnbWVudFNpemUp
OworCisgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7CiAgICAg
ICAgIGJ1ZmZlckxlbmd0aCArPSBpdC5sZW5ndGgoKTsKICAgICB9CiAKICAgICBpZiAoIWJ1ZmZl
ckxlbmd0aCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBTaW5jZSB3ZSBrbm93IHRoZSBz
aXplIG5vdywgd2UgY2FuIG1ha2UgYSBzaW5nbGUgYnVmZmVyIG91dCBvZiB0aGUgcGllY2VzIHdp
dGggb25lIGJpZyBhbGxvYwotICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFVDaGFyKj4obWFsbG9j
KGJ1ZmZlckxlbmd0aCAqIHNpemVvZihVQ2hhcikpKTsKLSAgICBpZiAoIXJlc3VsdCkKLSAgICAg
ICAgZ290byBleGl0OworICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmcoKTsKIAotICAgIHsKLSAg
ICAgICAgVUNoYXIqIHJlc3VsdFBvcyA9IHJlc3VsdDsKLSAgICAgICAgaWYgKHRleHRTZWdtZW50
cykgewotICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSA9IHRleHRTZWdtZW50cy0+c2l6ZSgpOwot
ICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAg
ICAgICAgICAgIGNvbnN0IFRleHRTZWdtZW50JiBzZWdtZW50ID0gdGV4dFNlZ21lbnRzLT5hdChp
KTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocmVzdWx0UG9zLCBzZWdtZW50LmZpcnN0LCBzZWdt
ZW50LnNlY29uZCAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICAgICAgICAgIHJlc3VsdFBvcyAr
PSBzZWdtZW50LnNlY29uZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZW1j
cHkocmVzdWx0UG9zLCB0ZXh0QnVmZmVyLmRhdGEoKSwgdGV4dEJ1ZmZlci5zaXplKCkgKiBzaXpl
b2YoVUNoYXIpKTsKLSAgICB9CisgICAgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmco
KTsKIAotZXhpdDoKLSAgICBpZiAodGV4dFNlZ21lbnRzKSB7Ci0gICAgICAgIHVuc2lnbmVkIHNp
emUgPSB0ZXh0U2VnbWVudHMtPnNpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHNpemU7ICsraSkKLSAgICAgICAgICAgIGZyZWUodGV4dFNlZ21lbnRzLT5hdChpKS5maXJz
dCk7Ci0gICAgfQotICAgIAogICAgIGlmIChpc0Rpc3BsYXlTdHJpbmcgJiYgci0+b3duZXJEb2N1
bWVudCgpKQotICAgICAgICByLT5vd25lckRvY3VtZW50KCktPmRpc3BsYXlCdWZmZXJNb2RpZmll
ZEJ5RW5jb2RpbmcocmVzdWx0LCBidWZmZXJMZW5ndGgpOworICAgICAgICByLT5vd25lckRvY3Vt
ZW50KCktPmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcocmVzdWx0KTsKIAogICAgIHJl
dHVybiByZXN1bHQ7CiB9CiAKLVN0cmluZyBwbGFpblRleHQoY29uc3QgUmFuZ2UqIHIsIFRleHRJ
dGVyYXRvckJlaGF2aW9yIGRlZmF1bHRCZWhhdmlvcikKLXsKLSAgICB1bnNpZ25lZCBsZW5ndGg7
Ci0gICAgVUNoYXIqIGJ1ZiA9IHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKHIsIGxl
bmd0aCwgZmFsc2UsIGRlZmF1bHRCZWhhdmlvcik7Ci0gICAgaWYgKCFidWYpCi0gICAgICAgIHJl
dHVybiAiIjsKLSAgICBTdHJpbmcgcmVzdWx0KGJ1ZiwgbGVuZ3RoKTsKLSAgICBmcmVlKGJ1Zik7
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdGljIGlubGluZSBib29sIGlzQWxsQ29sbGFw
c2libGVXaGl0ZXNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQogewogICAgIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzID0gc3RyaW5nLmNoYXJhY3RlcnMoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvVGV4dEl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9UZXh0SXRlcmF0b3IuaAkocmV2aXNpb24gMTM1NjQwKQorKysgU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9UZXh0SXRlcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNjAsOCArNjAsNyBAQCBp
bmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlV2hpdGVzcGFjZShVQ2hhCiAgICAgfQogfQogCi1TdHJp
bmcgcGxhaW5UZXh0KGNvbnN0IFJhbmdlKiwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJl
aGF2aW9yID0gVGV4dEl0ZXJhdG9yRGVmYXVsdEJlaGF2aW9yKTsKLVVDaGFyKiBwbGFpblRleHRU
b01hbGxvY0FsbG9jYXRlZEJ1ZmZlcihjb25zdCBSYW5nZSosIHVuc2lnbmVkJiBidWZmZXJMZW5n
dGgsIGJvb2wgaXNEaXNwbGF5U3RyaW5nLCBUZXh0SXRlcmF0b3JCZWhhdmlvciA9IFRleHRJdGVy
YXRvckRlZmF1bHRCZWhhdmlvcik7CitTdHJpbmcgcGxhaW5UZXh0KGNvbnN0IFJhbmdlKiwgVGV4
dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yID0gVGV4dEl0ZXJhdG9yRGVmYXVsdEJl
aGF2aW9yLCBib29sIGlzRGlzcGxheVN0cmluZyA9IGZhbHNlKTsKIFBhc3NSZWZQdHI8UmFuZ2U+
IGZpbmRQbGFpblRleHQoY29uc3QgUmFuZ2UqLCBjb25zdCBTdHJpbmcmLCBGaW5kT3B0aW9ucyk7
CiAKIGNsYXNzIEJpdFN0YWNrIHsKQEAgLTk0LDcgKzkzLDkgQEAgcHVibGljOgogICAgIHZvaWQg
YWR2YW5jZSgpOwogICAgIAogICAgIGludCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3RleHRM
ZW5ndGg7IH0KLSAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycygpIGNvbnN0IHsgcmV0dXJuIG1f
dGV4dENoYXJhY3RlcnM7IH0KKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycygpIGNvbnN0IHsg
cmV0dXJuIG1fdGV4dENoYXJhY3RlcnMgPyBtX3RleHRDaGFyYWN0ZXJzIDogbV90ZXh0LmNoYXJh
Y3RlcnMoKSArIHN0YXJ0T2Zmc2V0KCk7IH0KKyAgICBVQ2hhciBjaGFyYWN0ZXJBdCh1bnNpZ25l
ZCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBhcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKFN0cmlu
Z0J1aWxkZXImKSBjb25zdDsKICAgICAKICAgICBQYXNzUmVmUHRyPFJhbmdlPiByYW5nZSgpIGNv
bnN0OwogICAgIE5vZGUqIG5vZGUoKSBjb25zdDsKQEAgLTEwNSw2ICsxMDYsOCBAQCBwdWJsaWM6
CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmFuZ2U+IHN1YnJhbmdlKFJhbmdlKiBlbnRpcmVSYW5n
ZSwgaW50IGNoYXJhY3Rlck9mZnNldCwgaW50IGNoYXJhY3RlckNvdW50KTsKICAgICAKIHByaXZh
dGU6CisgICAgaW50IHN0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvblN0YXJ0
T2Zmc2V0OyB9CisgICAgU3RyaW5nIHN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dDsgfQog
ICAgIHZvaWQgZXhpdE5vZGUoKTsKICAgICBib29sIHNob3VsZFJlcHJlc2VudE5vZGVPZmZzZXRa
ZXJvKCk7CiAgICAgYm9vbCBzaG91bGRFbWl0U3BhY2VCZWZvcmVBbmRBZnRlck5vZGUoTm9kZSop
OwpAQCAtMTM5LDcgKzE0Miw3IEBAIHByaXZhdGU6CiAgICAgbXV0YWJsZSBOb2RlKiBtX3Bvc2l0
aW9uT2Zmc2V0QmFzZU5vZGU7CiAgICAgbXV0YWJsZSBpbnQgbV9wb3NpdGlvblN0YXJ0T2Zmc2V0
OwogICAgIG11dGFibGUgaW50IG1fcG9zaXRpb25FbmRPZmZzZXQ7Ci0gICAgY29uc3QgVUNoYXIq
IG1fdGV4dENoYXJhY3RlcnM7CisgICAgY29uc3QgVUNoYXIqIG1fdGV4dENoYXJhY3RlcnM7IC8v
IElmIG51bGwsIHRoZW4gdXNlIG1fdGV4dCBmb3IgY2hhcmFjdGVyIGRhdGEuCiAgICAgaW50IG1f
dGV4dExlbmd0aDsKICAgICAvLyBIb2xkIHN0cmluZyBtX3RleHRDaGFyYWN0ZXJzIHBvaW50cyB0
byBzbyB3ZSBlbnN1cmUgaXQgd29uJ3QgYmUgZGVsZXRlZC4KICAgICBTdHJpbmcgbV90ZXh0OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDb250cm9sbGVyLmNwcAko
cmV2aXNpb24gMTM1NjQwKQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRy
b2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MDIsOSArNzAyLDggQEAgc3RhdGljIGJvb2wg
c2VsZWN0aW9uQ29udGFpbnNQb3NzaWJsZVdvcgogICAgIC8vIEN1cnJlbnQgYWxnb3JpdGhtOiBs
b29rIGZvciBhIGNoYXJhY3RlciB0aGF0J3Mgbm90IGp1c3QgYSBzZXBhcmF0b3IuCiAgICAgZm9y
IChUZXh0SXRlcmF0b3IgaXQoZnJhbWUtPnNlbGVjdGlvbigpLT50b05vcm1hbGl6ZWRSYW5nZSgp
LmdldCgpKTsgIWl0LmF0RW5kKCk7IGl0LmFkdmFuY2UoKSkgewogICAgICAgICBpbnQgbGVuZ3Ro
ID0gaXQubGVuZ3RoKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gaXQuY2hh
cmFjdGVycygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQotICAg
ICAgICAgICAgaWYgKCEoY2F0ZWdvcnkoY2hhcmFjdGVyc1tpXSkgJiAoU2VwYXJhdG9yX1NwYWNl
IHwgU2VwYXJhdG9yX0xpbmUgfCBTZXBhcmF0b3JfUGFyYWdyYXBoKSkpCisgICAgICAgICAgICBp
ZiAoIShjYXRlZ29yeShpdC5jaGFyYWN0ZXJBdChpKSkgJiAoU2VwYXJhdG9yX1NwYWNlIHwgU2Vw
YXJhdG9yX0xpbmUgfCBTZXBhcmF0b3JfUGFyYWdyYXBoKSkpCiAgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQv
bWFjL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJ
KHJldmlzaW9uIDEzNTc2NCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDEyLTExLTI2ICBNaWNoYWVsIFNhYm9mZiAgPG1z
YWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFRleHRJdGVyYXRvciB1bm5lY2Vzc2FyaWx5IGNv
bnZlcnRzIDggYml0IHN0cmluZ3MgdG8gMTYgYml0cworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMjk1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgVXBkYXRlZCBfc3RyaW5nRm9yUmFuZ2UgdG8gdXNlIHBs
YWluVGV4dCgpIGluc3RlYWQgb2YgcmVtb3ZlZCBwbGFpblRleHRUb01hbGxvY0FsbG9jYXRlZEJ1
ZmZlcigpLgorCisgICAgICAgICogV2ViVmlldy9XZWJGcmFtZS5tbToKKyAgICAgICAgKC1bV2Vi
RnJhbWUgX3N0cmluZ0ZvclJhbmdlOl0pOgorCiAyMDEyLTExLTIzICBBbGV4aXMgTWVuYXJkICA8
YWxleGlzQHdlYmtpdC5vcmc+CiAKICAgICAgICAgW0NTUzMgQmFja2dyb3VuZHMgYW5kIEJvcmRl
cnNdIEltcGxlbWVudCBuZXcgQ1NTMyBiYWNrZ3JvdW5kLXBvc2l0aW9uIHBhcnNpbmcuCkluZGV4
OiBTb3VyY2UvV2ViS2l0L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQvbWFjL1dlYlZpZXcvV2ViRnJhbWUubW0JKHJldmlzaW9uIDEzNTY0MCkKKysr
IFNvdXJjZS9XZWJLaXQvbWFjL1dlYlZpZXcvV2ViRnJhbWUubW0JKHdvcmtpbmcgY29weSkKQEAg
LTQ5NywxNSArNDk3LDcgQEAgLSAoTlNTdHJpbmcgKilfc2VsZWN0ZWRTdHJpbmcKIAogLSAoTlNT
dHJpbmcgKilfc3RyaW5nRm9yUmFuZ2U6KERPTVJhbmdlICopcmFuZ2UKIHsKLSAgICAvLyBUaGlz
IHdpbGwgZ2l2ZSBhIHN5c3RlbSBtYWxsb2MnZCBidWZmZXIgdGhhdCBjYW4gYmUgdHVybmVkIGRp
cmVjdGx5IGludG8gYW4gTlNTdHJpbmcKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci0gICAgVUNoYXIq
IGJ1ZiA9IHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKGNvcmUocmFuZ2UpLCBsZW5n
dGgsIHRydWUpOwotICAgIAotICAgIGlmICghYnVmKQotICAgICAgICByZXR1cm4gW05TU3RyaW5n
IHN0cmluZ107Ci0KLSAgICAvLyBUcmFuc2ZlciBidWZmZXIgb3duZXJzaGlwIHRvIE5TU3RyaW5n
Ci0gICAgcmV0dXJuIFtbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0NvcHk6
YnVmIGxlbmd0aDpsZW5ndGggZnJlZVdoZW5Eb25lOllFU10gYXV0b3JlbGVhc2VdOworICAgIHJl
dHVybiBwbGFpblRleHQoY29yZShyYW5nZSksIFRleHRJdGVyYXRvckRlZmF1bHRCZWhhdmlvciwg
dHJ1ZSk7CiB9CiAKIC0gKEJPT0wpX3Nob3VsZEZsYXR0ZW5Db21wb3NpdGluZ0xheWVyczooQ0dD
b250ZXh0UmVmKWNvbnRleHQK
</data>
<flag name="review"
          id="192042"
          type_id="1"
          status="-"
          setter="bfulgham"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>176338</attachid>
            <date>2012-11-27 14:21:03 -0800</date>
            <delta_ts>2012-11-27 21:28:23 -0800</delta_ts>
            <desc>ANother updated patch</desc>
            <filename>103295-4.patch</filename>
            <type>text/plain</type>
            <size>14617</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNTc4OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDEyLTExLTI2ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFRleHRJdGVyYXRvciB1bm5l
Y2Vzc2FyaWx5IGNvbnZlcnRzIDggYml0IHN0cmluZ3MgdG8gMTYgYml0cworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMjk1CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlZCBUZXh0SXRlcmF0b3Ig
dG8gdXNlIHRoZSBjb250YWluZWQgc3RyaW5nIGluc3RlYWQgb2YgY2FsbGluZyBjaGFyYWN0ZXJz
KCkgb24gdGhhdCBzdHJpbmcuCisgICAgICAgIE90aGVyIHNvdXJjZXMgb2YgdGV4dCwgbGlrZSBl
bWl0Q2hhcmFjdGVyKCkgc3RpbGwgdXNlIHRoZSBjb250YWluZWQgVUNoYXIqIGJ1ZmZlci4KKyAg
ICAgICAgQWRkZWQgYXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRlcigpIHRvIGFwcGVuZCB0aGUgdGV4
dCBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpdGVyYXRvciB0byBhIHN0cmluZyBidWlsZGVyCisg
ICAgICAgIGlycmVzcGVjdGl2ZSBvZiB0aGUgc291cmNlIG9mIHRoZSB0ZXh0LgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cyBhcyBmdW5jdGlvbmFsaXR5IGNvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMu
CisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogVXBkYXRlZCBwbGFpblRleHQgZXhwb3J0IGFu
ZCBlbGltaW5hdGVkIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyIGV4cG9ydAorICAg
ICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5n
ZSk6IFVwZGF0ZWQgdG8gdXNlIFRleHRJdGVyYXRvcjo6YXBwZW5kVGV4dFRvU3RyaW5nQnVpbGRl
cigpCisgICAgICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJBdCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhl
IGluZGV4ZWQgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IFRleHRJdGVyYXRvcgorICAgICAgICAo
V2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjphcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKTogQWRkZWQg
bWV0aG9kIHRvIGFwcGVuZCB3aGF0ZXZlciB0aGUgY3VycmVudCB0ZXh0IHRvIGEgU3RyaW5nQnVp
bGRlcgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjplbWl0VGV4dCk6IEVsaW1pbmF0
ZWQgYWNjZXNzaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YSB2aWEgY2hhcmFjdGVycygpLgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aCk6IENo
YW5nZWQgdG8gdXNlIGNoYXJhY3RlckF0KCkuCisgICAgICAgIChXZWJDb3JlOjpwbGFpblRleHQp
OiBDb21iaW5lZCB3aXRoIHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKCkuCisgICAg
ICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuaDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRJdGVy
YXRvcjo6c3RhcnRPZmZzZXQpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0
ZXJhdG9yOjpzdHJpbmcpOiBOZXcgZ2V0dGVyLgorICAgICAgICAoV2ViQ29yZTo6VGV4dEl0ZXJh
dG9yOjpjaGFyYWN0ZXJzKTogVXBkYXRlZCB0byB1c2UgY29ycmVjdCB0ZXN0IHNvdXJjZS4KKyAg
ICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpzZWxlY3Rpb25Db250YWluc1Bvc3NpYmxlV29yZCk6IENoYW5nZWQgdG8gdXNlIGNoYXJhY3Rl
ckF0KCkuCisKIDIwMTItMTEtMjYgIEFuZHJlYXMgS2xpbmcgIDxha2xpbmdAYXBwbGUuY29tPgog
CiAgICAgICAgIFJlbmRlclN0eWxlOiBNb3ZlICdsaXN0LXN0eWxlLWltYWdlJyB0byByYXJlIGlu
aGVyaXRlZCBkYXRhLgpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4JKHJldmlzaW9uIDEzNTY0MCkK
KysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC02OTAs
NyArNjkwLDYgQEAgX19aTjdXZWJDb3JlMzBob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUgogX19a
TjdXZWJDb3JlMzBvdmVycmlkZVVzZXJQcmVmZXJyZWRMYW5ndWFnZXNFUktOM1dURjZWZWN0b3JJ
TlMwXzZTdHJpbmdFTG0wRUVFCiBfX1pON1dlYkNvcmUzMUNyb3NzT3JpZ2luUHJlZmxpZ2h0UmVz
dWx0Q2FjaGU1ZW1wdHlFdgogX19aTjdXZWJDb3JlMzFDcm9zc09yaWdpblByZWZsaWdodFJlc3Vs
dENhY2hlNnNoYXJlZEV2Ci1fX1pON1dlYkNvcmUzMnBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVk
QnVmZmVyRVBLTlNfNVJhbmdlRVJqYk5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCiBfX1pON1dl
YkNvcmUzM3N0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlc0VSS04zV1RGNlN0cmluZ0UK
IF9fWk43V2ViQ29yZTM3V2lkZ2V0SGllcmFyY2h5VXBkYXRlc1N1c3BlbnNpb25TY29wZTExbW92
ZVdpZGdldHNFdgogX19aTjdXZWJDb3JlMzdXaWRnZXRIaWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lv
blNjb3BlMzVzX3dpZGdldEhpZXJhcmNoeVVwZGF0ZVN1c3BlbmRDb3VudEUKQEAgLTEwOTAsNyAr
MTA4OSw3IEBAIF9fWk43V2ViQ29yZTllbmRPZldvcmRFUktOU18xNVZpc2libGVQb3MKIF9fWk43
V2ViQ29yZTlmb250Q2FjaGVFdgogX19aTjdXZWJDb3JlOW1ha2VSYW5nZUVSS05TXzE1VmlzaWJs
ZVBvc2l0aW9uRVMyXwogX19aTjdXZWJDb3JlOXBhZ2VDYWNoZUV2Ci1fX1pON1dlYkNvcmU5cGxh
aW5UZXh0RVBLTlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFCitfX1pON1dlYkNv
cmU5cGxhaW5UZXh0RVBLTlNfNVJhbmdlRU5TXzIwVGV4dEl0ZXJhdG9yQmVoYXZpb3JFYgogX19a
TjdXZWJDb3JlOXRvRWxlbWVudEVOM0pTQzdKU1ZhbHVlRQogX19aTjdXZWJDb3JlOXVuaW9uUmVj
dEVSS04zV1RGNlZlY3RvcklOU185RmxvYXRSZWN0RUxtMEVFRQogX19aTkszSlNDOEJpbmRpbmdz
MTBSb290T2JqZWN0MTJnbG9iYWxPYmplY3RFdgpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCShyZXZpc2lvbiAxMzU2
NDApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3Qu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MzcsNyArODM3LDcgQEAgU3RyaW5nIEFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclZpcwogICAgICAgICAgICAgaWYgKCFsaXN0TWFya2VyVGV4dC5p
c0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGlzdE1hcmtlclRleHQp
OwogCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpdC5jaGFyYWN0ZXJzKCksIGl0Lmxlbmd0
aCgpKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7
CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5kIHN0
YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQogICAgICAgICAgICAgaW50IGV4
Y2VwdGlvbiA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0SXRlcmF0b3IuY3Bw
CShyZXZpc2lvbiAxMzU2NDApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRv
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2Miw2ICs0NjIsMjYgQEAgdm9pZCBUZXh0SXRlcmF0
b3I6OmFkdmFuY2UoKQogICAgIH0KIH0KIAorVUNoYXIgVGV4dEl0ZXJhdG9yOjpjaGFyYWN0ZXJB
dCh1bnNpZ25lZCBpbmRleCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaW5kZXggPCBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4obGVuZ3RoKCkpKTsKKyAgICBpZiAoIShpbmRleCA8IHN0YXRpY19jYXN0PHVu
c2lnbmVkPihsZW5ndGgoKSkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbV90ZXh0
Q2hhcmFjdGVycykKKyAgICAgICAgcmV0dXJuIHN0cmluZygpW3N0YXJ0T2Zmc2V0KCkgKyBpbmRl
eF07CisKKyAgICByZXR1cm4gbV90ZXh0Q2hhcmFjdGVyc1tpbmRleF07Cit9CisKK3ZvaWQgVGV4
dEl0ZXJhdG9yOjphcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKFN0cmluZ0J1aWxkZXImIGJ1aWxk
ZXIpIGNvbnN0Cit7CisgICAgaWYgKCFtX3RleHRDaGFyYWN0ZXJzKQorICAgICAgICBidWlsZGVy
LmFwcGVuZChzdHJpbmcoKSwgc3RhcnRPZmZzZXQoKSwgbGVuZ3RoKCkpOworICAgIGVsc2UKKyAg
ICAgICAgYnVpbGRlci5hcHBlbmQoY2hhcmFjdGVycygpLCBsZW5ndGgoKSk7Cit9CisKIGJvb2wg
VGV4dEl0ZXJhdG9yOjpoYW5kbGVUZXh0Tm9kZSgpCiB7CiAgICAgaWYgKG1fZnVsbHlDbGlwcGVk
U3RhY2sudG9wKCkgJiYgIW1faWdub3Jlc1N0eWxlVmlzaWJpbGl0eSkKQEAgLTEwMDcsNyArMTAy
Nyw3IEBAIHZvaWQgVGV4dEl0ZXJhdG9yOjplbWl0VGV4dChOb2RlKiB0ZXh0Tm8KIHsKICAgICBS
ZW5kZXJUZXh0KiByZW5kZXJlciA9IHRvUmVuZGVyVGV4dChyZW5kZXJPYmplY3QpOwogICAgIG1f
dGV4dCA9IG1fZW1pdHNPcmlnaW5hbFRleHQgPyByZW5kZXJlci0+b3JpZ2luYWxUZXh0KCkgOiAo
bV9lbWl0c1RleHRXaXRob3V0VHJhbnNjb2RpbmcgPyByZW5kZXJlci0+dGV4dFdpdGhvdXRUcmFu
c2NvZGluZygpIDogcmVuZGVyZXItPnRleHQoKSk7Ci0gICAgQVNTRVJUKG1fdGV4dC5jaGFyYWN0
ZXJzKCkpOworICAgIEFTU0VSVCghbV90ZXh0LmlzRW1wdHkoKSk7CiAgICAgQVNTRVJUKDAgPD0g
dGV4dFN0YXJ0T2Zmc2V0ICYmIHRleHRTdGFydE9mZnNldCA8IHN0YXRpY19jYXN0PGludD4obV90
ZXh0Lmxlbmd0aCgpKSk7CiAgICAgQVNTRVJUKDAgPD0gdGV4dEVuZE9mZnNldCAmJiB0ZXh0RW5k
T2Zmc2V0IDw9IHN0YXRpY19jYXN0PGludD4obV90ZXh0Lmxlbmd0aCgpKSk7CiAgICAgQVNTRVJU
KHRleHRTdGFydE9mZnNldCA8PSB0ZXh0RW5kT2Zmc2V0KTsKQEAgLTEwMTYsNyArMTAzNiw3IEBA
IHZvaWQgVGV4dEl0ZXJhdG9yOjplbWl0VGV4dChOb2RlKiB0ZXh0Tm8KICAgICBtX3Bvc2l0aW9u
T2Zmc2V0QmFzZU5vZGUgPSAwOwogICAgIG1fcG9zaXRpb25TdGFydE9mZnNldCA9IHRleHRTdGFy
dE9mZnNldDsKICAgICBtX3Bvc2l0aW9uRW5kT2Zmc2V0ID0gdGV4dEVuZE9mZnNldDsKLSAgICBt
X3RleHRDaGFyYWN0ZXJzID0gbV90ZXh0LmNoYXJhY3RlcnMoKSArIHRleHRTdGFydE9mZnNldDsK
KyAgICBtX3RleHRDaGFyYWN0ZXJzID0gMDsKICAgICBtX3RleHRMZW5ndGggPSB0ZXh0RW5kT2Zm
c2V0IC0gdGV4dFN0YXJ0T2Zmc2V0OwogICAgIG1fbGFzdENoYXJhY3RlciA9IG1fdGV4dFt0ZXh0
RW5kT2Zmc2V0IC0gMV07CiAKQEAgLTI0MzksNyArMjQ1OSw3IEBAIFBhc3NSZWZQdHI8UmFuZ2U+
IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm8KICAgICAgICAgaWYgKGZvdW5kRW5kKSB7CiAgICAgICAg
ICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgdGhl
IGVuZCBvZiBhIHJ1biBpcyBvZnRlbiBhdCB0aGUgd3JvbmcKICAgICAgICAgICAgIC8vIHBvc2l0
aW9uIGZvciBlbWl0dGVkICdcbidzLgotICAgICAgICAgICAgaWYgKGxlbiA9PSAxICYmIGl0LmNo
YXJhY3RlcnMoKVswXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAobGVuID09IDEgJiYgaXQu
Y2hhcmFjdGVyQXQoMCkgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgIHNjb3BlLT5kb2N1bWVu
dCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKICAgICAgICAgICAg
ICAgICBpdC5hZHZhbmNlKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFpdC5hdEVuZCgpKSB7CkBA
IC0yNTMxLDgyICsyNTUxLDM4IEBAIGJvb2wgVGV4dEl0ZXJhdG9yOjpnZXRMb2NhdGlvbkFuZExl
bmd0aEYKIH0KIAogLy8gLS0tLS0tLS0KLSAgICAKLVVDaGFyKiBwbGFpblRleHRUb01hbGxvY0Fs
bG9jYXRlZEJ1ZmZlcihjb25zdCBSYW5nZSogciwgdW5zaWduZWQmIGJ1ZmZlckxlbmd0aCwgYm9v
bCBpc0Rpc3BsYXlTdHJpbmcsIFRleHRJdGVyYXRvckJlaGF2aW9yIGRlZmF1bHRCZWhhdmlvcikK
LXsKLSAgICBVQ2hhciogcmVzdWx0ID0gMDsKIAorU3RyaW5nIHBsYWluVGV4dChjb25zdCBSYW5n
ZSogciwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yLCBib29sIGlzRGlzcGxh
eVN0cmluZykKK3sKICAgICAvLyBUaGUgaW5pdGlhbCBidWZmZXIgc2l6ZSBjYW4gYmUgY3JpdGlj
YWwgZm9yIHBlcmZvcm1hbmNlOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODExOTIKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY01heFNlZ21lbnRTaXplID0gMSA8
PCAxNTsKLSAgICBidWZmZXJMZW5ndGggPSAwOwotICAgIHR5cGVkZWYgcGFpcjxVQ2hhciosIHVu
c2lnbmVkPiBUZXh0U2VnbWVudDsKLSAgICBPd25QdHI8VmVjdG9yPFRleHRTZWdtZW50PiA+IHRl
eHRTZWdtZW50czsKLSAgICBWZWN0b3I8VUNoYXI+IHRleHRCdWZmZXI7Ci0gICAgdGV4dEJ1ZmZl
ci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNNYXhTZWdtZW50U2l6ZSk7CisKKyAgICB1bnNpZ25l
ZCBidWZmZXJMZW5ndGggPSAwOworICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWls
ZGVyLnJlc2VydmVDYXBhY2l0eShjTWF4U2VnbWVudFNpemUpOwogICAgIFRleHRJdGVyYXRvckJl
aGF2aW9yIGJlaGF2aW9yID0gZGVmYXVsdEJlaGF2aW9yOwogICAgIGlmICghaXNEaXNwbGF5U3Ry
aW5nKQogICAgICAgICBiZWhhdmlvciA9IHN0YXRpY19jYXN0PFRleHRJdGVyYXRvckJlaGF2aW9y
PihiZWhhdmlvciB8IFRleHRJdGVyYXRvckVtaXRzVGV4dHNXaXRob3V0VHJhbnNjb2RpbmcpOwog
ICAgIAogICAgIGZvciAoVGV4dEl0ZXJhdG9yIGl0KHIsIGJlaGF2aW9yKTsgIWl0LmF0RW5kKCk7
IGl0LmFkdmFuY2UoKSkgewotICAgICAgICBpZiAodGV4dEJ1ZmZlci5zaXplKCkgJiYgdGV4dEJ1
ZmZlci5zaXplKCkgKyBpdC5sZW5ndGgoKSA+IGNNYXhTZWdtZW50U2l6ZSkgewotICAgICAgICAg
ICAgVUNoYXIqIG5ld1NlZ21lbnRCdWZmZXIgPSBzdGF0aWNfY2FzdDxVQ2hhcio+KG1hbGxvYyh0
ZXh0QnVmZmVyLnNpemUoKSAqIHNpemVvZihVQ2hhcikpKTsKLSAgICAgICAgICAgIGlmICghbmV3
U2VnbWVudEJ1ZmZlcikKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICBt
ZW1jcHkobmV3U2VnbWVudEJ1ZmZlciwgdGV4dEJ1ZmZlci5kYXRhKCksIHRleHRCdWZmZXIuc2l6
ZSgpICogc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgICAgICBpZiAoIXRleHRTZWdtZW50cykKLSAg
ICAgICAgICAgICAgICB0ZXh0U2VnbWVudHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFRleHRTZWdt
ZW50Pik7Ci0gICAgICAgICAgICB0ZXh0U2VnbWVudHMtPmFwcGVuZChtYWtlX3BhaXIobmV3U2Vn
bWVudEJ1ZmZlciwgKHVuc2lnbmVkKXRleHRCdWZmZXIuc2l6ZSgpKSk7Ci0gICAgICAgICAgICB0
ZXh0QnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQo
aXQuY2hhcmFjdGVycygpLCBpdC5sZW5ndGgoKSk7CisgICAgICAgIGlmIChidWlsZGVyLmNhcGFj
aXR5KCkgPCBidWlsZGVyLmxlbmd0aCgpICsgaXQubGVuZ3RoKCkpCisgICAgICAgICAgICBidWls
ZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLmNhcGFjaXR5KCkgKyBjTWF4U2VnbWVudFNpemUp
OworCisgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7CiAgICAg
ICAgIGJ1ZmZlckxlbmd0aCArPSBpdC5sZW5ndGgoKTsKICAgICB9CiAKICAgICBpZiAoIWJ1ZmZl
ckxlbmd0aCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBTaW5jZSB3ZSBrbm93IHRoZSBz
aXplIG5vdywgd2UgY2FuIG1ha2UgYSBzaW5nbGUgYnVmZmVyIG91dCBvZiB0aGUgcGllY2VzIHdp
dGggb25lIGJpZyBhbGxvYwotICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PFVDaGFyKj4obWFsbG9j
KGJ1ZmZlckxlbmd0aCAqIHNpemVvZihVQ2hhcikpKTsKLSAgICBpZiAoIXJlc3VsdCkKLSAgICAg
ICAgZ290byBleGl0OworICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmcoKTsKIAotICAgIHsKLSAg
ICAgICAgVUNoYXIqIHJlc3VsdFBvcyA9IHJlc3VsdDsKLSAgICAgICAgaWYgKHRleHRTZWdtZW50
cykgewotICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSA9IHRleHRTZWdtZW50cy0+c2l6ZSgpOwot
ICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAg
ICAgICAgICAgIGNvbnN0IFRleHRTZWdtZW50JiBzZWdtZW50ID0gdGV4dFNlZ21lbnRzLT5hdChp
KTsKLSAgICAgICAgICAgICAgICBtZW1jcHkocmVzdWx0UG9zLCBzZWdtZW50LmZpcnN0LCBzZWdt
ZW50LnNlY29uZCAqIHNpemVvZihVQ2hhcikpOwotICAgICAgICAgICAgICAgIHJlc3VsdFBvcyAr
PSBzZWdtZW50LnNlY29uZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZW1j
cHkocmVzdWx0UG9zLCB0ZXh0QnVmZmVyLmRhdGEoKSwgdGV4dEJ1ZmZlci5zaXplKCkgKiBzaXpl
b2YoVUNoYXIpKTsKLSAgICB9CisgICAgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmco
KTsKIAotZXhpdDoKLSAgICBpZiAodGV4dFNlZ21lbnRzKSB7Ci0gICAgICAgIHVuc2lnbmVkIHNp
emUgPSB0ZXh0U2VnbWVudHMtPnNpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHNpemU7ICsraSkKLSAgICAgICAgICAgIGZyZWUodGV4dFNlZ21lbnRzLT5hdChpKS5maXJz
dCk7Ci0gICAgfQotICAgIAogICAgIGlmIChpc0Rpc3BsYXlTdHJpbmcgJiYgci0+b3duZXJEb2N1
bWVudCgpKQotICAgICAgICByLT5vd25lckRvY3VtZW50KCktPmRpc3BsYXlCdWZmZXJNb2RpZmll
ZEJ5RW5jb2RpbmcocmVzdWx0LCBidWZmZXJMZW5ndGgpOworICAgICAgICByLT5vd25lckRvY3Vt
ZW50KCktPmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcocmVzdWx0KTsKIAogICAgIHJl
dHVybiByZXN1bHQ7CiB9CiAKLVN0cmluZyBwbGFpblRleHQoY29uc3QgUmFuZ2UqIHIsIFRleHRJ
dGVyYXRvckJlaGF2aW9yIGRlZmF1bHRCZWhhdmlvcikKLXsKLSAgICB1bnNpZ25lZCBsZW5ndGg7
Ci0gICAgVUNoYXIqIGJ1ZiA9IHBsYWluVGV4dFRvTWFsbG9jQWxsb2NhdGVkQnVmZmVyKHIsIGxl
bmd0aCwgZmFsc2UsIGRlZmF1bHRCZWhhdmlvcik7Ci0gICAgaWYgKCFidWYpCi0gICAgICAgIHJl
dHVybiAiIjsKLSAgICBTdHJpbmcgcmVzdWx0KGJ1ZiwgbGVuZ3RoKTsKLSAgICBmcmVlKGJ1Zik7
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdGljIGlubGluZSBib29sIGlzQWxsQ29sbGFw
c2libGVXaGl0ZXNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQogewogICAgIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzID0gc3RyaW5nLmNoYXJhY3RlcnMoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvVGV4dEl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9UZXh0SXRlcmF0b3IuaAkocmV2aXNpb24gMTM1NjQwKQorKysgU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9UZXh0SXRlcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNjAsOCArNjAsNyBAQCBp
bmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlV2hpdGVzcGFjZShVQ2hhCiAgICAgfQogfQogCi1TdHJp
bmcgcGxhaW5UZXh0KGNvbnN0IFJhbmdlKiwgVGV4dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJl
aGF2aW9yID0gVGV4dEl0ZXJhdG9yRGVmYXVsdEJlaGF2aW9yKTsKLVVDaGFyKiBwbGFpblRleHRU
b01hbGxvY0FsbG9jYXRlZEJ1ZmZlcihjb25zdCBSYW5nZSosIHVuc2lnbmVkJiBidWZmZXJMZW5n
dGgsIGJvb2wgaXNEaXNwbGF5U3RyaW5nLCBUZXh0SXRlcmF0b3JCZWhhdmlvciA9IFRleHRJdGVy
YXRvckRlZmF1bHRCZWhhdmlvcik7CitTdHJpbmcgcGxhaW5UZXh0KGNvbnN0IFJhbmdlKiwgVGV4
dEl0ZXJhdG9yQmVoYXZpb3IgZGVmYXVsdEJlaGF2aW9yID0gVGV4dEl0ZXJhdG9yRGVmYXVsdEJl
aGF2aW9yLCBib29sIGlzRGlzcGxheVN0cmluZyA9IGZhbHNlKTsKIFBhc3NSZWZQdHI8UmFuZ2U+
IGZpbmRQbGFpblRleHQoY29uc3QgUmFuZ2UqLCBjb25zdCBTdHJpbmcmLCBGaW5kT3B0aW9ucyk7
CiAKIGNsYXNzIEJpdFN0YWNrIHsKQEAgLTk0LDcgKzkzLDkgQEAgcHVibGljOgogICAgIHZvaWQg
YWR2YW5jZSgpOwogICAgIAogICAgIGludCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3RleHRM
ZW5ndGg7IH0KLSAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycygpIGNvbnN0IHsgcmV0dXJuIG1f
dGV4dENoYXJhY3RlcnM7IH0KKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycygpIGNvbnN0IHsg
cmV0dXJuIG1fdGV4dENoYXJhY3RlcnMgPyBtX3RleHRDaGFyYWN0ZXJzIDogbV90ZXh0LmNoYXJh
Y3RlcnMoKSArIHN0YXJ0T2Zmc2V0KCk7IH0KKyAgICBVQ2hhciBjaGFyYWN0ZXJBdCh1bnNpZ25l
ZCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBhcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKFN0cmlu
Z0J1aWxkZXImKSBjb25zdDsKICAgICAKICAgICBQYXNzUmVmUHRyPFJhbmdlPiByYW5nZSgpIGNv
bnN0OwogICAgIE5vZGUqIG5vZGUoKSBjb25zdDsKQEAgLTEwNSw2ICsxMDYsOCBAQCBwdWJsaWM6
CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmFuZ2U+IHN1YnJhbmdlKFJhbmdlKiBlbnRpcmVSYW5n
ZSwgaW50IGNoYXJhY3Rlck9mZnNldCwgaW50IGNoYXJhY3RlckNvdW50KTsKICAgICAKIHByaXZh
dGU6CisgICAgaW50IHN0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvblN0YXJ0
T2Zmc2V0OyB9CisgICAgY29uc3QgU3RyaW5nJiBzdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHQ7IH0KICAgICB2b2lkIGV4aXROb2RlKCk7CiAgICAgYm9vbCBzaG91bGRSZXByZXNlbnROb2Rl
T2Zmc2V0WmVybygpOwogICAgIGJvb2wgc2hvdWxkRW1pdFNwYWNlQmVmb3JlQW5kQWZ0ZXJOb2Rl
KE5vZGUqKTsKQEAgLTEzOSw3ICsxNDIsNyBAQCBwcml2YXRlOgogICAgIG11dGFibGUgTm9kZSog
bV9wb3NpdGlvbk9mZnNldEJhc2VOb2RlOwogICAgIG11dGFibGUgaW50IG1fcG9zaXRpb25TdGFy
dE9mZnNldDsKICAgICBtdXRhYmxlIGludCBtX3Bvc2l0aW9uRW5kT2Zmc2V0OwotICAgIGNvbnN0
IFVDaGFyKiBtX3RleHRDaGFyYWN0ZXJzOworICAgIGNvbnN0IFVDaGFyKiBtX3RleHRDaGFyYWN0
ZXJzOyAvLyBJZiBudWxsLCB0aGVuIHVzZSBtX3RleHQgZm9yIGNoYXJhY3RlciBkYXRhLgogICAg
IGludCBtX3RleHRMZW5ndGg7CiAgICAgLy8gSG9sZCBzdHJpbmcgbV90ZXh0Q2hhcmFjdGVycyBw
b2ludHMgdG8gc28gd2UgZW5zdXJlIGl0IHdvbid0IGJlIGRlbGV0ZWQuCiAgICAgU3RyaW5nIG1f
dGV4dDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDb250cm9sbGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0NvbnRleHRNZW51Q29udHJvbGxl
ci5jcHAJKHJldmlzaW9uIDEzNTY0MCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvQ29udGV4dE1l
bnVDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAyLDkgKzcwMiw4IEBAIHN0YXRp
YyBib29sIHNlbGVjdGlvbkNvbnRhaW5zUG9zc2libGVXb3IKICAgICAvLyBDdXJyZW50IGFsZ29y
aXRobTogbG9vayBmb3IgYSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBqdXN0IGEgc2VwYXJhdG9yLgog
ICAgIGZvciAoVGV4dEl0ZXJhdG9yIGl0KGZyYW1lLT5zZWxlY3Rpb24oKS0+dG9Ob3JtYWxpemVk
UmFuZ2UoKS5nZXQoKSk7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNlKCkpIHsKICAgICAgICAgaW50
IGxlbmd0aCA9IGl0Lmxlbmd0aCgpOwotICAgICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9
IGl0LmNoYXJhY3RlcnMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsr
aSkKLSAgICAgICAgICAgIGlmICghKGNhdGVnb3J5KGNoYXJhY3RlcnNbaV0pICYgKFNlcGFyYXRv
cl9TcGFjZSB8IFNlcGFyYXRvcl9MaW5lIHwgU2VwYXJhdG9yX1BhcmFncmFwaCkpKQorICAgICAg
ICAgICAgaWYgKCEoY2F0ZWdvcnkoaXQuY2hhcmFjdGVyQXQoaSkpICYgKFNlcGFyYXRvcl9TcGFj
ZSB8IFNlcGFyYXRvcl9MaW5lIHwgU2VwYXJhdG9yX1BhcmFncmFwaCkpKQogICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkluZGV4OiBTb3VyY2Uv
V2ViS2l0L21hYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9tYWMvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxMzU3NjQpCisrKyBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxMi0xMS0yNiAgTWljaGFlbCBTYWJv
ZmYgIDxtc2Fib2ZmQGFwcGxlLmNvbT4KKworICAgICAgICBUZXh0SXRlcmF0b3IgdW5uZWNlc3Nh
cmlseSBjb252ZXJ0cyA4IGJpdCBzdHJpbmdzIHRvIDE2IGJpdHMKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMzI5NQorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0ZWQgX3N0cmluZ0ZvclJhbmdlIHRv
IHVzZSBwbGFpblRleHQoKSBpbnN0ZWFkIG9mIHJlbW92ZWQgcGxhaW5UZXh0VG9NYWxsb2NBbGxv
Y2F0ZWRCdWZmZXIoKS4KKworICAgICAgICAqIFdlYlZpZXcvV2ViRnJhbWUubW06CisgICAgICAg
ICgtW1dlYkZyYW1lIF9zdHJpbmdGb3JSYW5nZTpdKToKKwogMjAxMi0xMS0yMyAgQWxleGlzIE1l
bmFyZCAgPGFsZXhpc0B3ZWJraXQub3JnPgogCiAgICAgICAgIFtDU1MzIEJhY2tncm91bmRzIGFu
ZCBCb3JkZXJzXSBJbXBsZW1lbnQgbmV3IENTUzMgYmFja2dyb3VuZC1wb3NpdGlvbiBwYXJzaW5n
LgpJbmRleDogU291cmNlL1dlYktpdC9tYWMvV2ViVmlldy9XZWJGcmFtZS5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCShyZXZpc2lvbiAxMzU2
NDApCisrKyBTb3VyY2UvV2ViS2l0L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCSh3b3JraW5nIGNv
cHkpCkBAIC00OTcsMTUgKzQ5Nyw3IEBAIC0gKE5TU3RyaW5nICopX3NlbGVjdGVkU3RyaW5nCiAK
IC0gKE5TU3RyaW5nICopX3N0cmluZ0ZvclJhbmdlOihET01SYW5nZSAqKXJhbmdlCiB7Ci0gICAg
Ly8gVGhpcyB3aWxsIGdpdmUgYSBzeXN0ZW0gbWFsbG9jJ2QgYnVmZmVyIHRoYXQgY2FuIGJlIHR1
cm5lZCBkaXJlY3RseSBpbnRvIGFuIE5TU3RyaW5nCi0gICAgdW5zaWduZWQgbGVuZ3RoOwotICAg
IFVDaGFyKiBidWYgPSBwbGFpblRleHRUb01hbGxvY0FsbG9jYXRlZEJ1ZmZlcihjb3JlKHJhbmdl
KSwgbGVuZ3RoLCB0cnVlKTsKLSAgICAKLSAgICBpZiAoIWJ1ZikKLSAgICAgICAgcmV0dXJuIFtO
U1N0cmluZyBzdHJpbmddOwotCi0gICAgLy8gVHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcCB0byBO
U1N0cmluZwotICAgIHJldHVybiBbW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhDaGFyYWN0ZXJz
Tm9Db3B5OmJ1ZiBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpZRVNdIGF1dG9yZWxlYXNlXTsK
KyAgICByZXR1cm4gcGxhaW5UZXh0KGNvcmUocmFuZ2UpLCBUZXh0SXRlcmF0b3JEZWZhdWx0QmVo
YXZpb3IsIHRydWUpOwogfQogCiAtIChCT09MKV9zaG91bGRGbGF0dGVuQ29tcG9zaXRpbmdMYXll
cnM6KENHQ29udGV4dFJlZiljb250ZXh0Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>