<?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>70755</bug_id>
          
          <creation_ts>2011-10-24 13:31:13 -0700</creation_ts>
          <short_desc>Merge endOfLine with logicalEndOfLine and startOfLine with logicalStartOfLine</short_desc>
          <delta_ts>2011-10-25 10:21:48 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>70757</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>cshu</cc>
    
    <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>kenneth</cc>
    
    <cc>leviw</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>morrita</cc>
    
    <cc>tkent</cc>
    
    <cc>tonikitoo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>489569</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 13:31:13 -0700</bug_when>
    <thetext>endOfLine and logicalEndOfLine duplicate a lot of code. We should merge them as well as startOfLine and logicalStartOfLine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489573</commentid>
    <comment_count>1</comment_count>
      <attachid>112240</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 13:35:15 -0700</bug_when>
    <thetext>Created attachment 112240
cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489576</commentid>
    <comment_count>2</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2011-10-24 13:38:22 -0700</bug_when>
    <thetext>Yay code simplification! What failed when you simply replaced one with the other?

Also, did you file bugs for placing the position after a table for end and for placing the position at [table, 0] for start?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489578</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 13:40:20 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Yay code simplification! What failed when you simply replaced one with the other?

There was some performance concern since VisiblePosition::VisiblePosition calls inSameLine

&gt; Also, did you file bugs for placing the position after a table for end and for placing the position at [table, 0] for start?

I&apos;m about to :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489584</commentid>
    <comment_count>4</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2011-10-24 13:43:19 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=112240&amp;action=review

&gt; Source/WebCore/editing/visible_units.cpp:332
&gt; +enum ShouldUseLogicalStart { UseLogicalStart, DoNotUseLogicalStart };

It seems like it&apos;d be more informative to use a second descriptor like Visual instead of negating Logical.

&gt; Source/WebCore/editing/visible_units.cpp:408
&gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };
&gt; +static VisiblePosition endPositionForLine(const VisiblePosition&amp; c, bool shouldUseLogicalEnd)

It seems kind of like overkill to define new enums for both of these static functions instead of re-using one that just says to behave logically or not. Either way, you&apos;re using a bool in this function instead of the enum :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489586</commentid>
    <comment_count>5</comment_count>
      <attachid>112240</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-24 13:43:57 -0700</bug_when>
    <thetext>Comment on attachment 112240
cleanup

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

Some comments for now. It is late here but I might be able to take another look tomorrow.

&gt; Source/WebCore/editing/visible_units.cpp:332
&gt; -static VisiblePosition startPositionForLine(const VisiblePosition&amp; c)
&gt; +enum ShouldUseLogicalStart { UseLogicalStart, DoNotUseLogicalStart };

This sounds a bit weird, what is the actual difference? something like the below?

enum PositionType { LogicalPosition, ActualPosition }; ?

&gt; Source/WebCore/editing/visible_units.cpp:357
&gt; +        // Generated content (e.g. list markers and CSS :before and :after pseudoelements) have no corresponding DOM element,
&gt; +        // and so cannot be represented by a VisiblePosition. Use whatever follows instead.

I normally try to keep comments within 80-100 chars. These are pretty long

&gt; Source/WebCore/editing/visible_units.cpp:359
&gt; +        while (1) {

I would have used while (true)

&gt; Source/WebCore/editing/visible_units.cpp:388
&gt; +    if (shouldUseLogicalStart == UseLogicalStart) {
&gt; +        if (Node* editableRoot = highestEditableRoot(c.deepEquivalent())) {
&gt; +            if (!editableRoot-&gt;contains(visPos.deepEquivalent().containerNode()))

What about &amp;&amp;&apos;ing these?

&gt; Source/WebCore/editing/visible_units.cpp:397
&gt; +VisiblePosition startOfLine(const VisiblePosition&amp; currentPosition)

inline?

&gt; Source/WebCore/editing/visible_units.cpp:443
&gt; +            endNode = endRenderer-&gt;node();
&gt; +            if (endNode)
&gt; +                break;

You don&apos;t seem to be using endNode after this, so why not if (endNode = endRenderer-&gt;node()) ?

&gt; Source/WebCore/editing/visible_units.cpp:453
&gt; +        pos = Position(static_cast&lt;Text*&gt;(endNode), static_cast&lt;InlineTextBox *&gt;(endBox)-&gt;caretMaxOffset());

Coding style, *.

Don&apos;t we have a toInlineTextBox?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489589</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-24 13:45:16 -0700</bug_when>
    <thetext>
&gt; &gt; Source/WebCore/editing/visible_units.cpp:408
&gt; &gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };
&gt; &gt; +static VisiblePosition endPositionForLine(const VisiblePosition&amp; c, bool shouldUseLogicalEnd)
&gt; 
&gt; It seems kind of like overkill to define new enums for both of these static functions instead of re-using one that just says to behave logically or not. Either way, you&apos;re using a bool in this function instead of the enum :)

It makes the call sites a lot more clear, so I guess it is fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489602</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 13:52:54 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=112240&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/visible_units.cpp:332
&gt; &gt; +enum ShouldUseLogicalStart { UseLogicalStart, DoNotUseLogicalStart };
&gt; 
&gt; It seems like it&apos;d be more informative to use a second descriptor like Visual instead of negating Logical.

The problem is that it&apos;s not visual either. Obtaining the first leaf or the last leaf result in grabbing whatever box that happens to be at the end. i.e. So the caret can be rendered anywhere.

As you know, we convert WebKit convention (node, offset) pair to (inlinebox, offset) pair in getInlineBoxAndOffset? endOfLine and startOfLine are bypassing this process and giving you whatever node that happens to render text at the beginning of at the end of a line. It basically gives you bogus result.

IMHO, we can call these functions only if we&apos;re deciding whether two positions belong to the same line or not.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:408
&gt; &gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };
&gt; &gt; +static VisiblePosition endPositionForLine(const VisiblePosition&amp; c, bool shouldUseLogicalEnd)
&gt; 
&gt; It seems kind of like overkill to define new enums for both of these static functions instead of re-using one that just says to behave logically or not. Either way, you&apos;re using a bool in this function instead of the enum :)

Any suggestions?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489619</commentid>
    <comment_count>8</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2011-10-24 13:59:42 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #4)
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=112240&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/editing/visible_units.cpp:332
&gt; &gt; &gt; +enum ShouldUseLogicalStart { UseLogicalStart, DoNotUseLogicalStart };
&gt; &gt; 
&gt; &gt; It seems like it&apos;d be more informative to use a second descriptor like Visual instead of negating Logical.
&gt; 
&gt; The problem is that it&apos;s not visual either. Obtaining the first leaf or the last leaf result in grabbing whatever box that happens to be at the end. i.e. So the caret can be rendered anywhere.
&gt; 
&gt; As you know, we convert WebKit convention (node, offset) pair to (inlinebox, offset) pair in getInlineBoxAndOffset? endOfLine and startOfLine are bypassing this process and giving you whatever node that happens to render text at the beginning of at the end of a line. It basically gives you bogus result.
&gt; 
&gt; IMHO, we can call these functions only if we&apos;re deciding whether two positions belong to the same line or not.

That&apos;s totally fair. Sounds like UseIllogicalStart to me ;)

&gt; 
&gt; &gt; &gt; Source/WebCore/editing/visible_units.cpp:408
&gt; &gt; &gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };
&gt; &gt; &gt; +static VisiblePosition endPositionForLine(const VisiblePosition&amp; c, bool shouldUseLogicalEnd)
&gt; &gt; 
&gt; &gt; It seems kind of like overkill to define new enums for both of these static functions instead of re-using one that just says to behave logically or not. Either way, you&apos;re using a bool in this function instead of the enum :)
&gt; 
&gt; Any suggestions?

UseLogicalOrdering, UseNativeOrdering?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489620</commentid>
    <comment_count>9</comment_count>
      <attachid>112240</attachid>
    <who name="Chang Shu">cshu</who>
    <bug_when>2011-10-24 14:00:11 -0700</bug_when>
    <thetext>Comment on attachment 112240
cleanup

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

&gt; Source/WebCore/editing/visible_units.cpp:344
&gt; -            return positionAvoidingFirstPositionInTable(c);
&gt; +            return c;

It doesn&apos;t look like a code simplification here to me. I noticed you have another bug dealing with this function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489630</commentid>
    <comment_count>10</comment_count>
      <attachid>112240</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-10-24 14:11:17 -0700</bug_when>
    <thetext>Comment on attachment 112240
cleanup

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

&gt; Source/WebCore/editing/visible_units.cpp:344
&gt; +            return c;

Why this change in this patch?

&gt; Source/WebCore/editing/visible_units.cpp:407
&gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };

Is it really necessary to have a separate enum for start and end? The only distinction is UseLogical, don&apos;t use logical.

&gt; Source/WebCore/editing/visible_units.cpp:433
&gt; +        while (1) {

Use while(true) here too</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489644</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 14:28:41 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; Source/WebCore/editing/visible_units.cpp:332
&gt; &gt; -static VisiblePosition startPositionForLine(const VisiblePosition&amp; c)
&gt; &gt; +enum ShouldUseLogicalStart { UseLogicalStart, DoNotUseLogicalStart };
&gt; 
&gt; This sounds a bit weird, what is the actual difference? something like the below?
&gt; 
&gt; enum PositionType { LogicalPosition, ActualPosition }; ?

&gt; &gt; Source/WebCore/editing/visible_units.cpp:407
&gt; &gt; +enum ShouldUseLogicalEnd { DoNotUseLogicalEnd, UseLogicalEnd };
&gt; 
&gt; Is it really necessary to have a separate enum for start and end? The only distinction is UseLogical, don&apos;t use logical.

Replaced by enum LineEndpointComputationMode { UseLogicalOrdering, UseInlineBoxOrdering }; per discussion with Levi.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:357
&gt; &gt; +        // Generated content (e.g. list markers and CSS :before and :after pseudoelements) have no corresponding DOM element,
&gt; &gt; +        // and so cannot be represented by a VisiblePosition. Use whatever follows instead.
&gt; 
&gt; I normally try to keep comments within 80-100 chars. These are pretty long

The comment is shorter than the line 342.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:359
&gt; &gt; +        while (1) {
&gt; 
&gt; I would have used while (true)

Done.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:388
&gt; &gt; +    if (shouldUseLogicalStart == UseLogicalStart) {
&gt; &gt; +        if (Node* editableRoot = highestEditableRoot(c.deepEquivalent())) {
&gt; &gt; +            if (!editableRoot-&gt;contains(visPos.deepEquivalent().containerNode()))
&gt; 
&gt; What about &amp;&amp;&apos;ing these?

Can&apos;t because of the second if and the changing the order of if&apos;s will add O(n) when shouldUseLogicalStart = DoNotUseLogicalStart.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:397
&gt; &gt; +VisiblePosition startOfLine(const VisiblePosition&amp; currentPosition)
&gt; 
&gt; inline?

Can&apos;t startOfLine is called by other cpp files. I don&apos;t expect it to be a performance hit, and I&apos;d like to keep the version that takes enum to be local static for now.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:443
&gt; &gt; +            endNode = endRenderer-&gt;node();
&gt; &gt; +            if (endNode)
&gt; &gt; +                break;
&gt; 
&gt; You don&apos;t seem to be using endNode after this, so why not if (endNode = endRenderer-&gt;node()) ?

We do use it. See if&apos;s at the end of the function.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:453
&gt; &gt; +        pos = Position(static_cast&lt;Text*&gt;(endNode), static_cast&lt;InlineTextBox *&gt;(endBox)-&gt;caretMaxOffset());
&gt; 
&gt; Coding style, *.

Done.

&gt; Don&apos;t we have a toInlineTextBox?

Yes, fixed.

(In reply to comment #9)
&gt; &gt; Source/WebCore/editing/visible_units.cpp:344
&gt; &gt; -            return positionAvoidingFirstPositionInTable(c);
&gt; &gt; +            return c;
&gt; 
&gt; It doesn&apos;t look like a code simplification here to me. I noticed you have another bug dealing with this function.

(In reply to comment #10)
&gt; &gt; Source/WebCore/editing/visible_units.cpp:344
&gt; &gt; +            return c;
&gt; 
&gt; Why this change in this patch?

Oops, this is a left over from the other patch. Reverted.

&gt; &gt; Source/WebCore/editing/visible_units.cpp:433
&gt; &gt; +        while (1) {
&gt; 
&gt; Use while(true) here too

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489653</commentid>
    <comment_count>12</comment_count>
      <attachid>112250</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-24 14:38:56 -0700</bug_when>
    <thetext>Created attachment 112250
Fixed per comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490053</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-25 08:39:02 -0700</bug_when>
    <thetext>Ping reviewers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490066</commentid>
    <comment_count>14</comment_count>
      <attachid>112250</attachid>
    <who name="Chang Shu">cshu</who>
    <bug_when>2011-10-25 09:26:21 -0700</bug_when>
    <thetext>Comment on attachment 112250
Fixed per comments

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

looks good to me.

&gt; Source/WebCore/editing/visible_units.cpp:453
&gt; -    } else if (endBox-&gt;isInlineTextBox() &amp;&amp; endNode-&gt;isTextNode()) {
&gt; -        InlineTextBox* endTextBox = static_cast&lt;InlineTextBox *&gt;(endBox);
&gt; -        int endOffset = endTextBox-&gt;start();
&gt; -        if (!endTextBox-&gt;isLineBreak())
&gt; -            endOffset += endTextBox-&gt;len();
&gt; -        pos = Position(static_cast&lt;Text*&gt;(endNode), endOffset);
&gt; -    } else
&gt; +    else if (endBox-&gt;isInlineTextBox() &amp;&amp; endNode-&gt;isTextNode())
&gt; +        pos = Position(static_cast&lt;Text*&gt;(endNode), toInlineTextBox(endBox)-&gt;caretMaxOffset());
&gt; +    else

I trust you they are equivalent. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490074</commentid>
    <comment_count>15</comment_count>
      <attachid>112250</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-25 09:49:48 -0700</bug_when>
    <thetext>Comment on attachment 112250
Fixed per comments

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

&gt;&gt; Source/WebCore/editing/visible_units.cpp:453

&gt; 
&gt; I trust you they are equivalent. :)

Okay, let me revert this part of the change just to be safe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490111</commentid>
    <comment_count>16</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-25 10:21:48 -0700</bug_when>
    <thetext>Committed r98358: &lt;http://trac.webkit.org/changeset/98358&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112240</attachid>
            <date>2011-10-24 13:35:15 -0700</date>
            <delta_ts>2011-10-24 14:38:52 -0700</delta_ts>
            <desc>cleanup</desc>
            <filename>bug-70755-20111024133514.patch</filename>
            <type>text/plain</type>
            <size>16455</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4MjcyKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTEtMTAtMjQgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgTWVyZ2UgZW5kT2ZMaW5lIHdpdGgg
bG9naWNhbEVuZE9mTGluZSBhbmQgc3RhcnRPZkxpbmUgd2l0aCBsb2dpY2FsU3RhcnRPZkxpbmUK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzU1CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWVyZ2VkIGVu
ZE9mTGluZSB3aXRoIGxvZ2ljYWxFbmRPZkxpbmUsIGFuZCBzdGFydE9mTGluZSB3aXRoIGxvZ2lj
YWxTdGFydE9mTGluZQorICAgICAgICB0byByZWR1Y2UgdGhlIGNvZGUgZHVwbGljYXRpb24uCisK
KyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
c3RhcnRQb3NpdGlvbkZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6c3RhcnRPZkxpbmUpOgor
ICAgICAgICAoV2ViQ29yZTo6bG9naWNhbFN0YXJ0T2ZMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6
OmVuZFBvc2l0aW9uRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjppblNhbWVMb2dpY2FsTGlu
ZSk6CisgICAgICAgIChXZWJDb3JlOjplbmRPZkxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6bG9n
aWNhbEVuZE9mTGluZSk6CisgICAgICAgICogZWRpdGluZy92aXNpYmxlX3VuaXRzLmg6CisKIDIw
MTEtMTAtMjQgIE5hdCBEdWNhICA8bmR1Y2FAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJv
bWl1bV0gRXhwb3NlIFdlYlRocmVhZDo6cG9zdERlbGF5ZWRUYXNrIHRvIENDVGhyZWFkCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHJldmlzaW9uIDk4MTY2
KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzI3LDggKzMyNywxMCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9u
QXZvaWRpbmdGCiAKICAgICByZXR1cm4gYzsKIH0KKyAgICAKIAotc3RhdGljIFZpc2libGVQb3Np
dGlvbiBzdGFydFBvc2l0aW9uRm9yTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMpCitlbnVt
IFNob3VsZFVzZUxvZ2ljYWxTdGFydCB7IFVzZUxvZ2ljYWxTdGFydCwgRG9Ob3RVc2VMb2dpY2Fs
U3RhcnQgfTsKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gc3RhcnRQb3NpdGlvbkZvckxpbmUoY29u
c3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBTaG91bGRVc2VMb2dpY2FsU3RhcnQgc2hvdWxkVXNlTG9n
aWNhbFN0YXJ0KQogewogICAgIGlmIChjLmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKCk7CkBAIC0zMzksNDQgKzM0MSw3MSBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IHN0YXJ0UG9zaXRpb25Gb3JMCiAgICAgICAgIC8vIFJvb3RJbmxpbmVCb3hlcywgbGlrZSBlbXB0
eSBlZGl0YWJsZSBibG9ja3MgYW5kIGJvcmRlcmVkIGJsb2Nrcy4KICAgICAgICAgUG9zaXRpb24g
cCA9IGMuZGVlcEVxdWl2YWxlbnQoKTsKICAgICAgICAgaWYgKHAuZGVwcmVjYXRlZE5vZGUoKS0+
cmVuZGVyZXIoKSAmJiBwLmRlcHJlY2F0ZWROb2RlKCktPnJlbmRlcmVyKCktPmlzUmVuZGVyQmxv
Y2soKSAmJiAhcC5kZXByZWNhdGVkRWRpdGluZ09mZnNldCgpKQotICAgICAgICAgICAgcmV0dXJu
IHBvc2l0aW9uQXZvaWRpbmdGaXJzdFBvc2l0aW9uSW5UYWJsZShjKTsKKyAgICAgICAgICAgIHJl
dHVybiBjOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogICAg
IH0KLSAgICAKLSAgICAvLyBHZW5lcmF0ZWQgY29udGVudCAoZS5nLiBsaXN0IG1hcmtlcnMgYW5k
IENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIKLSAgICAvLyBwc2V1ZG9lbGVtZW50cykgaGF2ZSBubyBj
b3JyZXNwb25kaW5nIERPTSBlbGVtZW50LCBhbmQgc28gY2Fubm90IGJlCi0gICAgLy8gcmVwcmVz
ZW50ZWQgYnkgYSBWaXNpYmxlUG9zaXRpb24uICBVc2Ugd2hhdGV2ZXIgZm9sbG93cyBpbnN0ZWFk
LgotICAgIElubGluZUJveCAqc3RhcnRCb3ggPSByb290Qm94LT5maXJzdExlYWZDaGlsZCgpOwot
ICAgIE5vZGUgKnN0YXJ0Tm9kZTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIXN0YXJ0
Qm94KQotICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogCi0gICAgICAgIFJl
bmRlck9iamVjdCAqc3RhcnRSZW5kZXJlciA9IHN0YXJ0Qm94LT5yZW5kZXJlcigpOwotICAgICAg
ICBpZiAoIXN0YXJ0UmVuZGVyZXIpCisgICAgTm9kZSogc3RhcnROb2RlOworICAgIElubGluZUJv
eCogc3RhcnRCb3g7CisgICAgaWYgKHNob3VsZFVzZUxvZ2ljYWxTdGFydCA9PSBVc2VMb2dpY2Fs
U3RhcnQpIHsKKyAgICAgICAgc3RhcnROb2RlID0gcm9vdEJveC0+Z2V0TG9naWNhbFN0YXJ0Qm94
V2l0aE5vZGUoc3RhcnRCb3gpOworICAgICAgICBpZiAoIXN0YXJ0Tm9kZSkKICAgICAgICAgICAg
IHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHZW5l
cmF0ZWQgY29udGVudCAoZS5nLiBsaXN0IG1hcmtlcnMgYW5kIENTUyA6YmVmb3JlIGFuZCA6YWZ0
ZXIgcHNldWRvZWxlbWVudHMpIGhhdmUgbm8gY29ycmVzcG9uZGluZyBET00gZWxlbWVudCwKKyAg
ICAgICAgLy8gYW5kIHNvIGNhbm5vdCBiZSByZXByZXNlbnRlZCBieSBhIFZpc2libGVQb3NpdGlv
bi4gVXNlIHdoYXRldmVyIGZvbGxvd3MgaW5zdGVhZC4KKyAgICAgICAgc3RhcnRCb3ggPSByb290
Qm94LT5maXJzdExlYWZDaGlsZCgpOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAg
aWYgKCFzdGFydEJveCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7
CisKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogc3RhcnRSZW5kZXJlciA9IHN0YXJ0Qm94LT5y
ZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFzdGFydFJlbmRlcmVyKQorICAgICAgICAgICAg
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIAotICAgICAgICBzdGFydE5vZGUgPSBzdGFy
dFJlbmRlcmVyLT5ub2RlKCk7Ci0gICAgICAgIGlmIChzdGFydE5vZGUpCi0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgCi0gICAgICAgIHN0YXJ0Qm94ID0gc3RhcnRCb3gtPm5leHRMZWFmQ2hp
bGQoKTsKKyAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0UmVuZGVyZXItPm5vZGUoKTsKKyAg
ICAgICAgICAgIGlmIChzdGFydE5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAg
ICAgICAgIHN0YXJ0Qm94ID0gc3RhcnRCb3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgfQog
ICAgIH0KLSAgICAKLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzUG9zID0gc3RhcnROb2RlLT5pc1Rl
eHROb2RlKCkgPyBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KHN0
YXJ0Tm9kZSksIHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihzdGFydEJveCktPnN0YXJ0KCkp
LCBET1dOU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6IFZpc2libGVQb3NpdGlvbihwb3NpdGlvbkJlZm9yZU5vZGUoc3RhcnROb2Rl
KSwgRE9XTlNUUkVBTSk7Ci0gICAgcmV0dXJuIHBvc2l0aW9uQXZvaWRpbmdGaXJzdFBvc2l0aW9u
SW5UYWJsZSh2aXNQb3MpOworCisgICAgaWYgKHN0YXJ0Tm9kZS0+aXNUZXh0Tm9kZSgpKQorICAg
ICAgICByZXR1cm4gcG9zaXRpb25Bdm9pZGluZ0ZpcnN0UG9zaXRpb25JblRhYmxlKFBvc2l0aW9u
KHN0YXRpY19jYXN0PFRleHQqPihzdGFydE5vZGUpLCBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94
Kj4oc3RhcnRCb3gpLT5zdGFydCgpKSk7CisgICAgcmV0dXJuIHBvc2l0aW9uQXZvaWRpbmdGaXJz
dFBvc2l0aW9uSW5UYWJsZShwb3NpdGlvbkJlZm9yZU5vZGUoc3RhcnROb2RlKSk7CiB9CiAKLVZp
c2libGVQb3NpdGlvbiBzdGFydE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMpCitzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYywg
U2hvdWxkVXNlTG9naWNhbFN0YXJ0IHNob3VsZFVzZUxvZ2ljYWxTdGFydCkKIHsKLSAgICBWaXNp
YmxlUG9zaXRpb24gdmlzUG9zID0gc3RhcnRQb3NpdGlvbkZvckxpbmUoYyk7CisgICAgLy8gVE9E
TzogdGhpcyBpcyB0aGUgY3VycmVudCBiZWhhdmlvciB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgZml4
ZWQuCisgICAgLy8gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00OTEwNyBmb3IgZGV0YWlsLgorICAgIFZpc2libGVQb3NpdGlvbiB2aXNQb3Mg
PSBzdGFydFBvc2l0aW9uRm9yTGluZShjLCBzaG91bGRVc2VMb2dpY2FsU3RhcnQpOworCisgICAg
aWYgKHNob3VsZFVzZUxvZ2ljYWxTdGFydCA9PSBVc2VMb2dpY2FsU3RhcnQpIHsKKyAgICAgICAg
aWYgKE5vZGUqIGVkaXRhYmxlUm9vdCA9IGhpZ2hlc3RFZGl0YWJsZVJvb3QoYy5kZWVwRXF1aXZh
bGVudCgpKSkgeworICAgICAgICAgICAgaWYgKCFlZGl0YWJsZVJvb3QtPmNvbnRhaW5zKHZpc1Bv
cy5kZWVwRXF1aXZhbGVudCgpLmNvbnRhaW5lck5vZGUoKSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZpcnN0UG9zaXRpb25Jbk5vZGUoZWRpdGFibGVSb290KTsKKyAgICAgICAgfQorICAgIH0K
IAogICAgIHJldHVybiBjLmhvbm9yRWRpdGluZ0JvdW5kYXJ5QXRPckJlZm9yZSh2aXNQb3MpOwog
fQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGVuZFBvc2l0aW9uRm9yTGluZShjb25zdCBWaXNp
YmxlUG9zaXRpb24mIGMpCisvLyBGSVhNRTogUmVuYW1lIHRoaXMgZnVuY3Rpb24gdG8gcmVmbGVj
dCB0aGUgZmFjdCBpdCBpZ25vcmVzIGJpZGkgbGV2ZWxzLgorVmlzaWJsZVBvc2l0aW9uIHN0YXJ0
T2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgY3VycmVudFBvc2l0aW9uKQoreworICAgIHJl
dHVybiBzdGFydE9mTGluZShjdXJyZW50UG9zaXRpb24sIERvTm90VXNlTG9naWNhbFN0YXJ0KTsK
K30KKworVmlzaWJsZVBvc2l0aW9uIGxvZ2ljYWxTdGFydE9mTGluZShjb25zdCBWaXNpYmxlUG9z
aXRpb24mIGN1cnJlbnRQb3NpdGlvbikKK3sKKyAgICByZXR1cm4gc3RhcnRPZkxpbmUoY3VycmVu
dFBvc2l0aW9uLCBVc2VMb2dpY2FsU3RhcnQpOworfQorCitlbnVtIFNob3VsZFVzZUxvZ2ljYWxF
bmQgeyBEb05vdFVzZUxvZ2ljYWxFbmQsIFVzZUxvZ2ljYWxFbmQgfTsKK3N0YXRpYyBWaXNpYmxl
UG9zaXRpb24gZW5kUG9zaXRpb25Gb3JMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYywgYm9v
bCBzaG91bGRVc2VMb2dpY2FsRW5kKQogewogICAgIGlmIChjLmlzTnVsbCgpKQogICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CkBAIC0zOTAsNDYgKzQxOSw3MiBAQCBzdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIGVuZFBvc2l0aW9uRm9yTGluCiAgICAgICAgICAgICByZXR1cm4gYzsKICAg
ICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogICAgIH0KLSAgICAKLSAgICAvLyBHZW5l
cmF0ZWQgY29udGVudCAoZS5nLiBsaXN0IG1hcmtlcnMgYW5kIENTUyA6YmVmb3JlIGFuZCA6YWZ0
ZXIKLSAgICAvLyBwc2V1ZG9lbGVtZW50cykgaGF2ZSBubyBjb3JyZXNwb25kaW5nIERPTSBlbGVt
ZW50LCBhbmQgc28gY2Fubm90IGJlCi0gICAgLy8gcmVwcmVzZW50ZWQgYnkgYSBWaXNpYmxlUG9z
aXRpb24uICBVc2Ugd2hhdGV2ZXIgcHJlY2VkZXMgaW5zdGVhZC4KLSAgICBOb2RlICplbmROb2Rl
OwotICAgIElubGluZUJveCAqZW5kQm94ID0gcm9vdEJveC0+bGFzdExlYWZDaGlsZCgpOwotICAg
IHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghZW5kQm94KQotICAgICAgICAgICAgcmV0dXJuIFZp
c2libGVQb3NpdGlvbigpOwogCi0gICAgICAgIFJlbmRlck9iamVjdCAqZW5kUmVuZGVyZXIgPSBl
bmRCb3gtPnJlbmRlcmVyKCk7Ci0gICAgICAgIGlmICghZW5kUmVuZGVyZXIpCisgICAgTm9kZSog
ZW5kTm9kZTsKKyAgICBJbmxpbmVCb3gqIGVuZEJveDsKKyAgICBpZiAoc2hvdWxkVXNlTG9naWNh
bEVuZCA9PSBVc2VMb2dpY2FsRW5kKSB7CisgICAgICAgIGVuZE5vZGUgPSByb290Qm94LT5nZXRM
b2dpY2FsRW5kQm94V2l0aE5vZGUoZW5kQm94KTsKKyAgICAgICAgaWYgKCFlbmROb2RlKQogICAg
ICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICAg
IC8vIEdlbmVyYXRlZCBjb250ZW50IChlLmcuIGxpc3QgbWFya2VycyBhbmQgQ1NTIDpiZWZvcmUg
YW5kIDphZnRlciBwc2V1ZG9lbGVtZW50cykgaGF2ZSBubyBjb3JyZXNwb25kaW5nIERPTSBlbGVt
ZW50LAorICAgICAgICAvLyBhbmQgc28gY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgVmlzaWJs
ZVBvc2l0aW9uLiBVc2Ugd2hhdGV2ZXIgcHJlY2VkZXMgaW5zdGVhZC4KKyAgICAgICAgZW5kQm94
ID0gcm9vdEJveC0+bGFzdExlYWZDaGlsZCgpOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAg
ICAgICAgaWYgKCFlbmRCb3gpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bigpOworCisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGVuZFJlbmRlcmVyID0gZW5kQm94LT5y
ZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFlbmRSZW5kZXJlcikKKyAgICAgICAgICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiAKLSAgICAgICAgZW5kTm9kZSA9IGVuZFJlbmRl
cmVyLT5ub2RlKCk7Ci0gICAgICAgIGlmIChlbmROb2RlKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIAotICAgICAgICBlbmRCb3ggPSBlbmRCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAg
ICAgICAgIGVuZE5vZGUgPSBlbmRSZW5kZXJlci0+bm9kZSgpOworICAgICAgICAgICAgaWYgKGVu
ZE5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGVuZEJveCA9IGVuZEJveC0+cHJldkxlYWZDaGlsZCgpOworICAgICAgICB9CiAgICAgfQotICAg
IAorCiAgICAgUG9zaXRpb24gcG9zOwotICAgIGlmIChlbmROb2RlLT5oYXNUYWdOYW1lKGJyVGFn
KSkgeworICAgIGlmIChlbmROb2RlLT5oYXNUYWdOYW1lKGJyVGFnKSkKICAgICAgICAgcG9zID0g
cG9zaXRpb25CZWZvcmVOb2RlKGVuZE5vZGUpOwotICAgIH0gZWxzZSBpZiAoZW5kQm94LT5pc0lu
bGluZVRleHRCb3goKSAmJiBlbmROb2RlLT5pc1RleHROb2RlKCkpIHsKLSAgICAgICAgSW5saW5l
VGV4dEJveCogZW5kVGV4dEJveCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3ggKj4oZW5kQm94
KTsKLSAgICAgICAgaW50IGVuZE9mZnNldCA9IGVuZFRleHRCb3gtPnN0YXJ0KCk7Ci0gICAgICAg
IGlmICghZW5kVGV4dEJveC0+aXNMaW5lQnJlYWsoKSkKLSAgICAgICAgICAgIGVuZE9mZnNldCAr
PSBlbmRUZXh0Qm94LT5sZW4oKTsKLSAgICAgICAgcG9zID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8
VGV4dCo+KGVuZE5vZGUpLCBlbmRPZmZzZXQpOwotICAgIH0gZWxzZQorICAgIGVsc2UgaWYgKGVu
ZEJveC0+aXNJbmxpbmVUZXh0Qm94KCkgJiYgZW5kTm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAg
ICBwb3MgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kTm9kZSksIHN0YXRpY19jYXN0
PElubGluZVRleHRCb3ggKj4oZW5kQm94KS0+Y2FyZXRNYXhPZmZzZXQoKSk7CisgICAgZWxzZQog
ICAgICAgICBwb3MgPSBwb3NpdGlvbkFmdGVyTm9kZShlbmROb2RlKTsKICAgICAKICAgICByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKHBvcywgVlBfVVBTVFJFQU1fSUZfUE9TU0lCTEUpOwogfQogCi1W
aXNpYmxlUG9zaXRpb24gZW5kT2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYykKK3N0YXRp
YyBib29sIGluU2FtZUxvZ2ljYWxMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYSwgY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBiKQogewotICAgIFZpc2libGVQb3NpdGlvbiB2aXNQb3MgPSBlbmRQ
b3NpdGlvbkZvckxpbmUoYyk7Ci0gICAgCisgICAgcmV0dXJuIGEuaXNOb3ROdWxsKCkgJiYgbG9n
aWNhbFN0YXJ0T2ZMaW5lKGEpID09IGxvZ2ljYWxTdGFydE9mTGluZShiKTsKK30KKworc3RhdGlj
IFZpc2libGVQb3NpdGlvbiBlbmRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBTaG91
bGRVc2VMb2dpY2FsRW5kIHNob3VsZFVzZUxvZ2ljYWxFbmQpCit7CisgICAgLy8gVE9ETzogdGhp
cyBpcyB0aGUgY3VycmVudCBiZWhhdmlvciB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgZml4ZWQuCisg
ICAgLy8gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD00OTEwNyBmb3IgZGV0YWlsLgorICAgIFZpc2libGVQb3NpdGlvbiB2aXNQb3MgPSBlbmRQ
b3NpdGlvbkZvckxpbmUoYywgc2hvdWxkVXNlTG9naWNhbEVuZCk7CisKKyAgICBpZiAoc2hvdWxk
VXNlTG9naWNhbEVuZCA9PSBVc2VMb2dpY2FsRW5kKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0
aGUgZW5kIG9mIGxpbmUgaXMgYXQgdGhlIHNhbWUgbGluZSBhcyB0aGUgZ2l2ZW4gaW5wdXQgcG9z
aXRpb24uIEZvciBhIHdyYXBwaW5nIGxpbmUsIHRoZSBsb2dpY2FsIGVuZAorICAgICAgICAvLyBw
b3NpdGlvbiBmb3IgdGhlIG5vdC1sYXN0LTItbGluZXMgbWlnaHQgaW5jb3JyZWN0bHkgaGFuZCBi
YWNrIHRoZSBsb2dpY2FsIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLiAKKyAgICAgICAgLy8g
Rm9yIGV4YW1wbGUsIDxkaXYgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIiBzdHlsZT0ibGluZS1i
cmVhazpiZWZvcmUtd2hpdGUtc3BhY2UiPmFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnCisgICAgICAg
IC8vIGEgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJj
ZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyA8L2Rpdj4KKyAgICAgICAgLy8gSW4gdGhpcyBj
YXNlLCB1c2UgdGhlIHByZXZpb3VzIHBvc2l0aW9uIG9mIHRoZSBjb21wdXRlZCBsb2dpY2FsIGVu
ZCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKCFpblNhbWVMb2dpY2FsTGluZShjLCB2aXNQb3MpKQor
ICAgICAgICAgICAgdmlzUG9zID0gdmlzUG9zLnByZXZpb3VzKCk7CisKKyAgICAgICAgaWYgKE5v
ZGUqIGVkaXRhYmxlUm9vdCA9IGhpZ2hlc3RFZGl0YWJsZVJvb3QoYy5kZWVwRXF1aXZhbGVudCgp
KSkgeworICAgICAgICAgICAgaWYgKCFlZGl0YWJsZVJvb3QtPmNvbnRhaW5zKHZpc1Bvcy5kZWVw
RXF1aXZhbGVudCgpLmNvbnRhaW5lck5vZGUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxh
c3RQb3NpdGlvbkluTm9kZShlZGl0YWJsZVJvb3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIGMuaG9ub3JFZGl0aW5nQm91bmRhcnlBdE9yQWZ0ZXIodmlzUG9zKTsKKyAgICB9CisKICAg
ICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiBsaW5lIGlzIGF0IHRoZSBzYW1lIGxpbmUgYXMgdGhl
IGdpdmVuIGlucHV0IHBvc2l0aW9uLiAgRWxzZSB1c2UgdGhlIHByZXZpb3VzIHBvc2l0aW9uIHRv
IAogICAgIC8vIG9idGFpbiBlbmQgb2YgbGluZS4gIFRoaXMgY29uZGl0aW9uIGhhcHBlbnMgd2hl
biB0aGUgaW5wdXQgcG9zaXRpb24gaXMgYmVmb3JlIHRoZSBzcGFjZSBjaGFyYWN0ZXIgYXQgdGhl
IGVuZCAKICAgICAvLyBvZiBhIHNvZnQtd3JhcHBlZCBub24tZWRpdGFibGUgbGluZS4gSW4gdGhp
cyBzY2VuYXJpbywgZW5kUG9zaXRpb25Gb3JMaW5lIHdvdWxkIGluY29ycmVjdGx5IGhhbmQgYmFj
ayBhIHBvc2l0aW9uCkBAIC00MzksMTIgKzQ5NCwyMyBAQCBWaXNpYmxlUG9zaXRpb24gZW5kT2ZM
aW5lKGNvbnN0IFZpc2libGVQCiAgICAgICAgIHZpc1BvcyA9IGMucHJldmlvdXMoKTsKICAgICAg
ICAgaWYgKHZpc1Bvcy5pc051bGwoKSkKICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRp
b24oKTsKLSAgICAgICAgdmlzUG9zID0gZW5kUG9zaXRpb25Gb3JMaW5lKHZpc1Bvcyk7CisgICAg
ICAgIHZpc1BvcyA9IGVuZFBvc2l0aW9uRm9yTGluZSh2aXNQb3MsIERvTm90VXNlTG9naWNhbEVu
ZCk7CiAgICAgfQogICAgIAogICAgIHJldHVybiBjLmhvbm9yRWRpdGluZ0JvdW5kYXJ5QXRPckFm
dGVyKHZpc1Bvcyk7CiB9CiAKKy8vIEZJWE1FOiBSZW5hbWUgdGhpcyBmdW5jdGlvbiB0byByZWZs
ZWN0IHRoZSBmYWN0IGl0IGlnbm9yZXMgYmlkaSBsZXZlbHMuCitWaXNpYmxlUG9zaXRpb24gZW5k
T2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgY3VycmVudFBvc2l0aW9uKQoreworICAgIHJl
dHVybiBlbmRPZkxpbmUoY3VycmVudFBvc2l0aW9uLCBEb05vdFVzZUxvZ2ljYWxFbmQpOworfQor
CitWaXNpYmxlUG9zaXRpb24gbG9naWNhbEVuZE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24m
IGN1cnJlbnRQb3NpdGlvbikKK3sKKyAgICByZXR1cm4gZW5kT2ZMaW5lKGN1cnJlbnRQb3NpdGlv
biwgVXNlTG9naWNhbEVuZCk7Cit9CisKIGJvb2wgaW5TYW1lTGluZShjb25zdCBWaXNpYmxlUG9z
aXRpb24gJmEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiAmYikKIHsKICAgICByZXR1cm4gYS5pc05v
dE51bGwoKSAmJiBzdGFydE9mTGluZShhKSA9PSBzdGFydE9mTGluZShiKTsKQEAgLTEwMzAsMTA5
ICsxMDk2LDYgQEAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mRWRpdGFibGVDb250ZW50KGNvbgogICAg
IHJldHVybiBsYXN0UG9zaXRpb25Jbk5vZGUoaGlnaGVzdFJvb3QpOwogfQogCi1zdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIGxvZ2ljYWxTdGFydFBvc2l0aW9uRm9yTGluZShjb25zdCBWaXNpYmxlUG9z
aXRpb24mIGMpCi17Ci0gICAgaWYgKGMuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oKTsKLQotICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBSZW5kZXJlZFBvc2l0
aW9uKGMpLnJvb3RCb3goKTsKLSAgICBpZiAoIXJvb3RCb3gpIHsKLSAgICAgICAgLy8gVGhlcmUg
YXJlIFZpc2libGVQb3NpdGlvbnMgYXQgb2Zmc2V0IDAgaW4gYmxvY2tzIHdpdGhvdXQKLSAgICAg
ICAgLy8gUm9vdElubGluZUJveGVzLCBsaWtlIGVtcHR5IGVkaXRhYmxlIGJsb2NrcyBhbmQgYm9y
ZGVyZWQgYmxvY2tzLgotICAgICAgICBQb3NpdGlvbiBwID0gYy5kZWVwRXF1aXZhbGVudCgpOwot
ICAgICAgICBpZiAocC5kZXByZWNhdGVkTm9kZSgpLT5yZW5kZXJlcigpICYmIHAuZGVwcmVjYXRl
ZE5vZGUoKS0+cmVuZGVyZXIoKS0+aXNSZW5kZXJCbG9jaygpICYmICFwLmRlcHJlY2F0ZWRFZGl0
aW5nT2Zmc2V0KCkpCi0gICAgICAgICAgICByZXR1cm4gcG9zaXRpb25Bdm9pZGluZ0ZpcnN0UG9z
aXRpb25JblRhYmxlKGMpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bigpOwotICAgIH0KLSAgICAKLSAgICBJbmxpbmVCb3gqIGxvZ2ljYWxTdGFydEJveDsKLSAgICBO
b2RlKiBsb2dpY2FsU3RhcnROb2RlID0gcm9vdEJveC0+Z2V0TG9naWNhbFN0YXJ0Qm94V2l0aE5v
ZGUobG9naWNhbFN0YXJ0Qm94KTsKLQotICAgIGlmICghbG9naWNhbFN0YXJ0Tm9kZSkKLSAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwotCi0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc1Bv
cyA9IGxvZ2ljYWxTdGFydE5vZGUtPmlzVGV4dE5vZGUoKSA/IFZpc2libGVQb3NpdGlvbihQb3Np
dGlvbihsb2dpY2FsU3RhcnROb2RlLCBsb2dpY2FsU3RhcnRCb3gtPmNhcmV0TWluT2Zmc2V0KCks
IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBW
aXNpYmxlUG9zaXRpb24ocG9zaXRpb25CZWZvcmVOb2RlKGxvZ2ljYWxTdGFydE5vZGUpLCBET1dO
U1RSRUFNKTsKLSAgICByZXR1cm4gcG9zaXRpb25Bdm9pZGluZ0ZpcnN0UG9zaXRpb25JblRhYmxl
KHZpc1Bvcyk7Ci19Ci0KLVZpc2libGVQb3NpdGlvbiBsb2dpY2FsU3RhcnRPZkxpbmUoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBjKQotewotICAgIC8vIFRPRE86IHRoaXMgaXMgdGhlIGN1cnJlbnQg
YmVoYXZpb3IgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGZpeGVkLgotICAgIC8vIFBsZWFzZSByZWZl
ciB0byBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMDcgZm9yIGRl
dGFpbC4KLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzUG9zID0gbG9naWNhbFN0YXJ0UG9zaXRpb25G
b3JMaW5lKGMpOwotCi0gICAgaWYgKE5vZGUqIGVkaXRhYmxlUm9vdCA9IGhpZ2hlc3RFZGl0YWJs
ZVJvb3QoYy5kZWVwRXF1aXZhbGVudCgpKSkgewotICAgICAgICBpZiAoIWVkaXRhYmxlUm9vdC0+
Y29udGFpbnModmlzUG9zLmRlZXBFcXVpdmFsZW50KCkuY29udGFpbmVyTm9kZSgpKSkKLSAgICAg
ICAgICAgIHJldHVybiBmaXJzdFBvc2l0aW9uSW5Ob2RlKGVkaXRhYmxlUm9vdCk7Ci0gICAgfQot
ICAgIHJldHVybiBjLmhvbm9yRWRpdGluZ0JvdW5kYXJ5QXRPckJlZm9yZSh2aXNQb3MpOwotfQot
Ci1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxvZ2ljYWxFbmRQb3NpdGlvbkZvckxpbmUoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBjKQotewotICAgIGlmIChjLmlzTnVsbCgpKQotICAgICAgICByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKCk7Ci0KLSAgICBSb290SW5saW5lQm94KiByb290Qm94ID0gUmVu
ZGVyZWRQb3NpdGlvbihjKS5yb290Qm94KCk7Ci0gICAgaWYgKCFyb290Qm94KSB7Ci0gICAgICAg
IC8vIFRoZXJlIGFyZSBWaXNpYmxlUG9zaXRpb25zIGF0IG9mZnNldCAwIGluIGJsb2NrcyB3aXRo
b3V0Ci0gICAgICAgIC8vIFJvb3RJbmxpbmVCb3hlcywgbGlrZSBlbXB0eSBlZGl0YWJsZSBibG9j
a3MgYW5kIGJvcmRlcmVkIGJsb2Nrcy4KLSAgICAgICAgUG9zaXRpb24gcCA9IGMuZGVlcEVxdWl2
YWxlbnQoKTsKLSAgICAgICAgaWYgKHAuZGVwcmVjYXRlZE5vZGUoKS0+cmVuZGVyZXIoKSAmJiBw
LmRlcHJlY2F0ZWROb2RlKCktPnJlbmRlcmVyKCktPmlzUmVuZGVyQmxvY2soKSAmJiAhcC5kZXBy
ZWNhdGVkRWRpdGluZ09mZnNldCgpKQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIHJl
dHVybiBWaXNpYmxlUG9zaXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgSW5saW5lQm94KiBsb2dp
Y2FsRW5kQm94OwotICAgIE5vZGUqIGxvZ2ljYWxFbmROb2RlID0gcm9vdEJveC0+Z2V0TG9naWNh
bEVuZEJveFdpdGhOb2RlKGxvZ2ljYWxFbmRCb3gpOwotCi0gICAgaWYgKCFsb2dpY2FsRW5kTm9k
ZSkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwotICAgIAotICAgIFBvc2l0aW9u
IHBvczsKLSAgICBpZiAobG9naWNhbEVuZE5vZGUtPmhhc1RhZ05hbWUoYnJUYWcpKQotICAgICAg
ICBwb3MgPSBwb3NpdGlvbkJlZm9yZU5vZGUobG9naWNhbEVuZE5vZGUpOwotICAgIGVsc2UgaWYg
KGxvZ2ljYWxFbmRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgIElubGluZVRleHRC
b3gqIGVuZFRleHRCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94Kj4obG9naWNhbEVuZEJv
eCk7Ci0gICAgICAgIGludCBlbmRPZmZzZXQgPSBlbmRUZXh0Qm94LT5zdGFydCgpOwotICAgICAg
ICBpZiAoIWVuZFRleHRCb3gtPmlzTGluZUJyZWFrKCkpCi0gICAgICAgICAgICBlbmRPZmZzZXQg
Kz0gZW5kVGV4dEJveC0+bGVuKCk7Ci0gICAgICAgIHBvcyA9IFBvc2l0aW9uKGxvZ2ljYWxFbmRO
b2RlLCBlbmRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwotICAg
IH0gZWxzZQotICAgICAgICBwb3MgPSBwb3NpdGlvbkFmdGVyTm9kZShsb2dpY2FsRW5kTm9kZSk7
Ci0gICAgCi0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihwb3MsIFZQX1VQU1RSRUFNX0lGX1BP
U1NJQkxFKTsKLX0KLQotYm9vbCBpblNhbWVMb2dpY2FsTGluZShjb25zdCBWaXNpYmxlUG9zaXRp
b24mIGEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYikKLXsKLSAgICByZXR1cm4gYS5pc05vdE51
bGwoKSAmJiBsb2dpY2FsU3RhcnRPZkxpbmUoYSkgPT0gbG9naWNhbFN0YXJ0T2ZMaW5lKGIpOwot
fQotCi1WaXNpYmxlUG9zaXRpb24gbG9naWNhbEVuZE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRp
b24mIGMpCi17Ci0gICAgLy8gVE9ETzogdGhpcyBpcyB0aGUgY3VycmVudCBiZWhhdmlvciB0aGF0
IG1pZ2h0IG5lZWQgdG8gYmUgZml4ZWQuCi0gICAgLy8gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00OTEwNyBmb3IgZGV0YWlsLgotCi0gICAg
VmlzaWJsZVBvc2l0aW9uIHZpc1BvcyA9IGxvZ2ljYWxFbmRQb3NpdGlvbkZvckxpbmUoYyk7Ci0g
ICAgCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBlbmQgb2YgbGluZSBpcyBhdCB0aGUgc2FtZSBsaW5l
IGFzIHRoZSBnaXZlbiBpbnB1dCBwb3NpdGlvbi4gRm9yIGEgd3JhcHBpbmcgbGluZSwgdGhlIGxv
Z2ljYWwgZW5kCi0gICAgLy8gcG9zaXRpb24gZm9yIHRoZSBub3QtbGFzdC0yLWxpbmVzIG1pZ2h0
IGluY29ycmVjdGx5IGhhbmQgYmFjayB0aGUgbG9naWNhbCBiZWdpbm5pbmcgb2YgdGhlIG5leHQg
bGluZS4gCi0gICAgLy8gRm9yIGV4YW1wbGUsIDxkaXYgY29udGVudGVkaXRhYmxlIGRpcj0icnRs
IiBzdHlsZT0ibGluZS1icmVhazpiZWZvcmUtd2hpdGUtc3BhY2UiPmFiY2RlZmcgYWJjZGVmZyBh
YmNkZWZnCi0gICAgLy8gYSBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcg
YWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnIDwvZGl2PgotICAgIC8vIElu
IHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBvZiB0aGUgY29tcHV0ZWQgbG9n
aWNhbCBlbmQgcG9zaXRpb24uCi0gICAgaWYgKCFpblNhbWVMb2dpY2FsTGluZShjLCB2aXNQb3Mp
KQotICAgICAgICB2aXNQb3MgPSB2aXNQb3MucHJldmlvdXMoKTsKLQotICAgIGlmIChOb2RlKiBl
ZGl0YWJsZVJvb3QgPSBoaWdoZXN0RWRpdGFibGVSb290KGMuZGVlcEVxdWl2YWxlbnQoKSkpIHsK
LSAgICAgICAgaWYgKCFlZGl0YWJsZVJvb3QtPmNvbnRhaW5zKHZpc1Bvcy5kZWVwRXF1aXZhbGVu
dCgpLmNvbnRhaW5lck5vZGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gbGFzdFBvc2l0aW9uSW5O
b2RlKGVkaXRhYmxlUm9vdCk7Ci0gICAgfQotICAgIHJldHVybiBjLmhvbm9yRWRpdGluZ0JvdW5k
YXJ5QXRPckFmdGVyKHZpc1Bvcyk7Ci19Ci0KIFZpc2libGVQb3NpdGlvbiBsZWZ0Qm91bmRhcnlP
ZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikK
IHsKICAgICByZXR1cm4gZGlyZWN0aW9uID09IExUUiA/IGxvZ2ljYWxTdGFydE9mTGluZShjKSA6
IGxvZ2ljYWxFbmRPZkxpbmUoYyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2li
bGVfdW5pdHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuaAkocmV2aXNpb24gOTgxNjYpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2li
bGVfdW5pdHMuaAkod29ya2luZyBjb3B5KQpAQCAtNTcsNyArNTcsNiBAQCBWaXNpYmxlUG9zaXRp
b24gZW5kT2ZMaW5lKGNvbnN0IFZpc2libGVQCiBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNMaW5l
UG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uICYsIGludCBsaW5lRGlyZWN0aW9uUG9pbnQp
OwogVmlzaWJsZVBvc2l0aW9uIG5leHRMaW5lUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9u
ICYsIGludCBsaW5lRGlyZWN0aW9uUG9pbnQpOwogYm9vbCBpblNhbWVMaW5lKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiAmLCBjb25zdCBWaXNpYmxlUG9zaXRpb24gJik7Ci1ib29sIGluU2FtZUxvZ2lj
YWxMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmLCBjb25zdCBWaXNpYmxlUG9zaXRpb24gJik7
CiBib29sIGlzU3RhcnRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uICYpOwogYm9vbCBpc0Vu
ZE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24gJik7CiBWaXNpYmxlUG9zaXRpb24gbG9naWNh
bFN0YXJ0T2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112250</attachid>
            <date>2011-10-24 14:38:56 -0700</date>
            <delta_ts>2011-10-25 09:49:48 -0700</delta_ts>
            <desc>Fixed per comments</desc>
            <filename>bug-70755-20111024143855.patch</filename>
            <type>text/plain</type>
            <size>15960</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4MjcyKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTEtMTAtMjQgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgTWVyZ2UgZW5kT2ZMaW5lIHdpdGgg
bG9naWNhbEVuZE9mTGluZSBhbmQgc3RhcnRPZkxpbmUgd2l0aCBsb2dpY2FsU3RhcnRPZkxpbmUK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzU1CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWVyZ2VkIGVu
ZE9mTGluZSB3aXRoIGxvZ2ljYWxFbmRPZkxpbmUsIGFuZCBzdGFydE9mTGluZSB3aXRoIGxvZ2lj
YWxTdGFydE9mTGluZQorICAgICAgICB0byByZWR1Y2UgdGhlIGNvZGUgZHVwbGljYXRpb24uCisK
KyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
c3RhcnRQb3NpdGlvbkZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6c3RhcnRPZkxpbmUpOgor
ICAgICAgICAoV2ViQ29yZTo6bG9naWNhbFN0YXJ0T2ZMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6
OmVuZFBvc2l0aW9uRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjppblNhbWVMb2dpY2FsTGlu
ZSk6CisgICAgICAgIChXZWJDb3JlOjplbmRPZkxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6bG9n
aWNhbEVuZE9mTGluZSk6CisgICAgICAgICogZWRpdGluZy92aXNpYmxlX3VuaXRzLmg6CisKIDIw
MTEtMTAtMjQgIE5hdCBEdWNhICA8bmR1Y2FAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJv
bWl1bV0gRXhwb3NlIFdlYlRocmVhZDo6cG9zdERlbGF5ZWRUYXNrIHRvIENDVGhyZWFkCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHJldmlzaW9uIDk4MTY2
KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzI3LDggKzMyNywxMCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9u
QXZvaWRpbmdGCiAKICAgICByZXR1cm4gYzsKIH0KKyAgICAKIAotc3RhdGljIFZpc2libGVQb3Np
dGlvbiBzdGFydFBvc2l0aW9uRm9yTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMpCitlbnVt
IExpbmVFbmRwb2ludENvbXB1dGF0aW9uTW9kZSB7IFVzZUxvZ2ljYWxPcmRlcmluZywgVXNlSW5s
aW5lQm94T3JkZXJpbmcgfTsKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gc3RhcnRQb3NpdGlvbkZv
ckxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBMaW5lRW5kcG9pbnRDb21wdXRhdGlvbk1v
ZGUgbW9kZSkKIHsKICAgICBpZiAoYy5pc051bGwoKSkKICAgICAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOwpAQCAtMzQzLDQwICszNDUsNjYgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBz
dGFydFBvc2l0aW9uRm9yTAogICAgICAgICAKICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bigpOwogICAgIH0KLSAgICAKLSAgICAvLyBHZW5lcmF0ZWQgY29udGVudCAoZS5nLiBsaXN0IG1h
cmtlcnMgYW5kIENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIKLSAgICAvLyBwc2V1ZG9lbGVtZW50cykg
aGF2ZSBubyBjb3JyZXNwb25kaW5nIERPTSBlbGVtZW50LCBhbmQgc28gY2Fubm90IGJlCi0gICAg
Ly8gcmVwcmVzZW50ZWQgYnkgYSBWaXNpYmxlUG9zaXRpb24uICBVc2Ugd2hhdGV2ZXIgZm9sbG93
cyBpbnN0ZWFkLgotICAgIElubGluZUJveCAqc3RhcnRCb3ggPSByb290Qm94LT5maXJzdExlYWZD
aGlsZCgpOwotICAgIE5vZGUgKnN0YXJ0Tm9kZTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBp
ZiAoIXN0YXJ0Qm94KQotICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogCi0g
ICAgICAgIFJlbmRlck9iamVjdCAqc3RhcnRSZW5kZXJlciA9IHN0YXJ0Qm94LT5yZW5kZXJlcigp
OwotICAgICAgICBpZiAoIXN0YXJ0UmVuZGVyZXIpCisgICAgTm9kZSogc3RhcnROb2RlOworICAg
IElubGluZUJveCogc3RhcnRCb3g7CisgICAgaWYgKG1vZGUgPT0gVXNlTG9naWNhbE9yZGVyaW5n
KSB7CisgICAgICAgIHN0YXJ0Tm9kZSA9IHJvb3RCb3gtPmdldExvZ2ljYWxTdGFydEJveFdpdGhO
b2RlKHN0YXJ0Qm94KTsKKyAgICAgICAgaWYgKCFzdGFydE5vZGUpCiAgICAgICAgICAgICByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gR2VuZXJhdGVk
IGNvbnRlbnQgKGUuZy4gbGlzdCBtYXJrZXJzIGFuZCBDU1MgOmJlZm9yZSBhbmQgOmFmdGVyIHBz
ZXVkb2VsZW1lbnRzKSBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgRE9NIGVsZW1lbnQsCisgICAgICAg
IC8vIGFuZCBzbyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYnkgYSBWaXNpYmxlUG9zaXRpb24uIFVz
ZSB3aGF0ZXZlciBmb2xsb3dzIGluc3RlYWQuCisgICAgICAgIHN0YXJ0Qm94ID0gcm9vdEJveC0+
Zmlyc3RMZWFmQ2hpbGQoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlm
ICghc3RhcnRCb3gpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwor
CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHN0YXJ0UmVuZGVyZXIgPSBzdGFydEJveC0+cmVu
ZGVyZXIoKTsKKyAgICAgICAgICAgIGlmICghc3RhcnRSZW5kZXJlcikKKyAgICAgICAgICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiAKLSAgICAgICAgc3RhcnROb2RlID0gc3RhcnRS
ZW5kZXJlci0+bm9kZSgpOwotICAgICAgICBpZiAoc3RhcnROb2RlKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIAotICAgICAgICBzdGFydEJveCA9IHN0YXJ0Qm94LT5uZXh0TGVhZkNoaWxk
KCk7CisgICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydFJlbmRlcmVyLT5ub2RlKCk7CisgICAg
ICAgICAgICBpZiAoc3RhcnROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAg
ICAgICBzdGFydEJveCA9IHN0YXJ0Qm94LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgICAgIH0KICAg
ICB9Ci0gICAgCi0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc1BvcyA9IHN0YXJ0Tm9kZS0+aXNUZXh0
Tm9kZSgpID8gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihzdGFy
dE5vZGUpLCBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94Kj4oc3RhcnRCb3gpLT5zdGFydCgpKSwg
RE9XTlNUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOiBWaXNpYmxlUG9zaXRpb24ocG9zaXRpb25CZWZvcmVOb2RlKHN0YXJ0Tm9kZSks
IERPV05TVFJFQU0pOwotICAgIHJldHVybiBwb3NpdGlvbkF2b2lkaW5nRmlyc3RQb3NpdGlvbklu
VGFibGUodmlzUG9zKTsKKworICAgIGlmIChzdGFydE5vZGUtPmlzVGV4dE5vZGUoKSkKKyAgICAg
ICAgcmV0dXJuIHBvc2l0aW9uQXZvaWRpbmdGaXJzdFBvc2l0aW9uSW5UYWJsZShQb3NpdGlvbihz
dGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnROb2RlKSwgdG9JbmxpbmVUZXh0Qm94KHN0YXJ0Qm94KS0+
c3RhcnQoKSkpOworICAgIHJldHVybiBwb3NpdGlvbkF2b2lkaW5nRmlyc3RQb3NpdGlvbkluVGFi
bGUocG9zaXRpb25CZWZvcmVOb2RlKHN0YXJ0Tm9kZSkpOwogfQogCi1WaXNpYmxlUG9zaXRpb24g
c3RhcnRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjKQorc3RhdGljIFZpc2libGVQb3Np
dGlvbiBzdGFydE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMsIExpbmVFbmRwb2ludENv
bXB1dGF0aW9uTW9kZSBtb2RlKQogewotICAgIFZpc2libGVQb3NpdGlvbiB2aXNQb3MgPSBzdGFy
dFBvc2l0aW9uRm9yTGluZShjKTsKKyAgICAvLyBUT0RPOiB0aGlzIGlzIHRoZSBjdXJyZW50IGJl
aGF2aW9yIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBmaXhlZC4KKyAgICAvLyBQbGVhc2UgcmVmZXIg
dG8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTA3IGZvciBkZXRh
aWwuCisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc1BvcyA9IHN0YXJ0UG9zaXRpb25Gb3JMaW5lKGMs
IG1vZGUpOworCisgICAgaWYgKG1vZGUgPT0gVXNlTG9naWNhbE9yZGVyaW5nKSB7CisgICAgICAg
IGlmIChOb2RlKiBlZGl0YWJsZVJvb3QgPSBoaWdoZXN0RWRpdGFibGVSb290KGMuZGVlcEVxdWl2
YWxlbnQoKSkpIHsKKyAgICAgICAgICAgIGlmICghZWRpdGFibGVSb290LT5jb250YWlucyh2aXNQ
b3MuZGVlcEVxdWl2YWxlbnQoKS5jb250YWluZXJOb2RlKCkpKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmaXJzdFBvc2l0aW9uSW5Ob2RlKGVkaXRhYmxlUm9vdCk7CisgICAgICAgIH0KKyAgICB9
CiAKICAgICByZXR1cm4gYy5ob25vckVkaXRpbmdCb3VuZGFyeUF0T3JCZWZvcmUodmlzUG9zKTsK
IH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBlbmRQb3NpdGlvbkZvckxpbmUoY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBjKQorLy8gRklYTUU6IFJlbmFtZSB0aGlzIGZ1bmN0aW9uIHRvIHJlZmxl
Y3QgdGhlIGZhY3QgaXQgaWdub3JlcyBiaWRpIGxldmVscy4KK1Zpc2libGVQb3NpdGlvbiBzdGFy
dE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGN1cnJlbnRQb3NpdGlvbikKK3sKKyAgICBy
ZXR1cm4gc3RhcnRPZkxpbmUoY3VycmVudFBvc2l0aW9uLCBVc2VJbmxpbmVCb3hPcmRlcmluZyk7
Cit9CisKK1Zpc2libGVQb3NpdGlvbiBsb2dpY2FsU3RhcnRPZkxpbmUoY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiBjdXJyZW50UG9zaXRpb24pCit7CisgICAgcmV0dXJuIHN0YXJ0T2ZMaW5lKGN1cnJl
bnRQb3NpdGlvbiwgVXNlTG9naWNhbE9yZGVyaW5nKTsKK30KKworc3RhdGljIFZpc2libGVQb3Np
dGlvbiBlbmRQb3NpdGlvbkZvckxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBMaW5lRW5k
cG9pbnRDb21wdXRhdGlvbk1vZGUgbW9kZSkKIHsKICAgICBpZiAoYy5pc051bGwoKSkKICAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwpAQCAtMzkwLDQ2ICs0MTgsNzIgQEAgc3RhdGlj
IFZpc2libGVQb3NpdGlvbiBlbmRQb3NpdGlvbkZvckxpbgogICAgICAgICAgICAgcmV0dXJuIGM7
CiAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKICAgICB9Ci0gICAgCi0gICAgLy8g
R2VuZXJhdGVkIGNvbnRlbnQgKGUuZy4gbGlzdCBtYXJrZXJzIGFuZCBDU1MgOmJlZm9yZSBhbmQg
OmFmdGVyCi0gICAgLy8gcHNldWRvZWxlbWVudHMpIGhhdmUgbm8gY29ycmVzcG9uZGluZyBET00g
ZWxlbWVudCwgYW5kIHNvIGNhbm5vdCBiZQotICAgIC8vIHJlcHJlc2VudGVkIGJ5IGEgVmlzaWJs
ZVBvc2l0aW9uLiAgVXNlIHdoYXRldmVyIHByZWNlZGVzIGluc3RlYWQuCi0gICAgTm9kZSAqZW5k
Tm9kZTsKLSAgICBJbmxpbmVCb3ggKmVuZEJveCA9IHJvb3RCb3gtPmxhc3RMZWFmQ2hpbGQoKTsK
LSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIWVuZEJveCkKLSAgICAgICAgICAgIHJldHVy
biBWaXNpYmxlUG9zaXRpb24oKTsKIAotICAgICAgICBSZW5kZXJPYmplY3QgKmVuZFJlbmRlcmVy
ID0gZW5kQm94LT5yZW5kZXJlcigpOwotICAgICAgICBpZiAoIWVuZFJlbmRlcmVyKQorICAgIE5v
ZGUqIGVuZE5vZGU7CisgICAgSW5saW5lQm94KiBlbmRCb3g7CisgICAgaWYgKG1vZGUgPT0gVXNl
TG9naWNhbE9yZGVyaW5nKSB7CisgICAgICAgIGVuZE5vZGUgPSByb290Qm94LT5nZXRMb2dpY2Fs
RW5kQm94V2l0aE5vZGUoZW5kQm94KTsKKyAgICAgICAgaWYgKCFlbmROb2RlKQogICAgICAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEdl
bmVyYXRlZCBjb250ZW50IChlLmcuIGxpc3QgbWFya2VycyBhbmQgQ1NTIDpiZWZvcmUgYW5kIDph
ZnRlciBwc2V1ZG9lbGVtZW50cykgaGF2ZSBubyBjb3JyZXNwb25kaW5nIERPTSBlbGVtZW50LAor
ICAgICAgICAvLyBhbmQgc28gY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgVmlzaWJsZVBvc2l0
aW9uLiBVc2Ugd2hhdGV2ZXIgcHJlY2VkZXMgaW5zdGVhZC4KKyAgICAgICAgZW5kQm94ID0gcm9v
dEJveC0+bGFzdExlYWZDaGlsZCgpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAg
ICAgaWYgKCFlbmRCb3gpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigp
OworCisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGVuZFJlbmRlcmVyID0gZW5kQm94LT5yZW5k
ZXJlcigpOworICAgICAgICAgICAgaWYgKCFlbmRSZW5kZXJlcikKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiAKLSAgICAgICAgZW5kTm9kZSA9IGVuZFJlbmRlcmVy
LT5ub2RlKCk7Ci0gICAgICAgIGlmIChlbmROb2RlKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIAotICAgICAgICBlbmRCb3ggPSBlbmRCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAg
ICAgIGVuZE5vZGUgPSBlbmRSZW5kZXJlci0+bm9kZSgpOworICAgICAgICAgICAgaWYgKGVuZE5v
ZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVu
ZEJveCA9IGVuZEJveC0+cHJldkxlYWZDaGlsZCgpOworICAgICAgICB9CiAgICAgfQotICAgIAor
CiAgICAgUG9zaXRpb24gcG9zOwotICAgIGlmIChlbmROb2RlLT5oYXNUYWdOYW1lKGJyVGFnKSkg
eworICAgIGlmIChlbmROb2RlLT5oYXNUYWdOYW1lKGJyVGFnKSkKICAgICAgICAgcG9zID0gcG9z
aXRpb25CZWZvcmVOb2RlKGVuZE5vZGUpOwotICAgIH0gZWxzZSBpZiAoZW5kQm94LT5pc0lubGlu
ZVRleHRCb3goKSAmJiBlbmROb2RlLT5pc1RleHROb2RlKCkpIHsKLSAgICAgICAgSW5saW5lVGV4
dEJveCogZW5kVGV4dEJveCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3ggKj4oZW5kQm94KTsK
LSAgICAgICAgaW50IGVuZE9mZnNldCA9IGVuZFRleHRCb3gtPnN0YXJ0KCk7Ci0gICAgICAgIGlm
ICghZW5kVGV4dEJveC0+aXNMaW5lQnJlYWsoKSkKLSAgICAgICAgICAgIGVuZE9mZnNldCArPSBl
bmRUZXh0Qm94LT5sZW4oKTsKLSAgICAgICAgcG9zID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4
dCo+KGVuZE5vZGUpLCBlbmRPZmZzZXQpOwotICAgIH0gZWxzZQorICAgIGVsc2UgaWYgKGVuZEJv
eC0+aXNJbmxpbmVUZXh0Qm94KCkgJiYgZW5kTm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICBw
b3MgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kTm9kZSksIHRvSW5saW5lVGV4dEJv
eChlbmRCb3gpLT5jYXJldE1heE9mZnNldCgpKTsKKyAgICBlbHNlCiAgICAgICAgIHBvcyA9IHBv
c2l0aW9uQWZ0ZXJOb2RlKGVuZE5vZGUpOwogICAgIAogICAgIHJldHVybiBWaXNpYmxlUG9zaXRp
b24ocG9zLCBWUF9VUFNUUkVBTV9JRl9QT1NTSUJMRSk7CiB9CiAKLVZpc2libGVQb3NpdGlvbiBl
bmRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjKQorc3RhdGljIGJvb2wgaW5TYW1lTG9n
aWNhbExpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBhLCBjb25zdCBWaXNpYmxlUG9zaXRpb24m
IGIpCiB7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc1BvcyA9IGVuZFBvc2l0aW9uRm9yTGluZShj
KTsKLSAgICAKKyAgICByZXR1cm4gYS5pc05vdE51bGwoKSAmJiBsb2dpY2FsU3RhcnRPZkxpbmUo
YSkgPT0gbG9naWNhbFN0YXJ0T2ZMaW5lKGIpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IGVuZE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMsIExpbmVFbmRwb2ludENvbXB1dGF0
aW9uTW9kZSBtb2RlKQoreworICAgIC8vIFRPRE86IHRoaXMgaXMgdGhlIGN1cnJlbnQgYmVoYXZp
b3IgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGZpeGVkLgorICAgIC8vIFBsZWFzZSByZWZlciB0byBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMDcgZm9yIGRldGFpbC4K
KyAgICBWaXNpYmxlUG9zaXRpb24gdmlzUG9zID0gZW5kUG9zaXRpb25Gb3JMaW5lKGMsIG1vZGUp
OworCisgICAgaWYgKG1vZGUgPT0gVXNlTG9naWNhbE9yZGVyaW5nKSB7CisgICAgICAgIC8vIE1h
a2Ugc3VyZSB0aGUgZW5kIG9mIGxpbmUgaXMgYXQgdGhlIHNhbWUgbGluZSBhcyB0aGUgZ2l2ZW4g
aW5wdXQgcG9zaXRpb24uIEZvciBhIHdyYXBwaW5nIGxpbmUsIHRoZSBsb2dpY2FsIGVuZAorICAg
ICAgICAvLyBwb3NpdGlvbiBmb3IgdGhlIG5vdC1sYXN0LTItbGluZXMgbWlnaHQgaW5jb3JyZWN0
bHkgaGFuZCBiYWNrIHRoZSBsb2dpY2FsIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLiAKKyAg
ICAgICAgLy8gRm9yIGV4YW1wbGUsIDxkaXYgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIiBzdHls
ZT0ibGluZS1icmVhazpiZWZvcmUtd2hpdGUtc3BhY2UiPmFiY2RlZmcgYWJjZGVmZyBhYmNkZWZn
CisgICAgICAgIC8vIGEgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnIGFi
Y2RlZmcgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyA8L2Rpdj4KKyAgICAgICAgLy8g
SW4gdGhpcyBjYXNlLCB1c2UgdGhlIHByZXZpb3VzIHBvc2l0aW9uIG9mIHRoZSBjb21wdXRlZCBs
b2dpY2FsIGVuZCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKCFpblNhbWVMb2dpY2FsTGluZShjLCB2
aXNQb3MpKQorICAgICAgICAgICAgdmlzUG9zID0gdmlzUG9zLnByZXZpb3VzKCk7CisKKyAgICAg
ICAgaWYgKE5vZGUqIGVkaXRhYmxlUm9vdCA9IGhpZ2hlc3RFZGl0YWJsZVJvb3QoYy5kZWVwRXF1
aXZhbGVudCgpKSkgeworICAgICAgICAgICAgaWYgKCFlZGl0YWJsZVJvb3QtPmNvbnRhaW5zKHZp
c1Bvcy5kZWVwRXF1aXZhbGVudCgpLmNvbnRhaW5lck5vZGUoKSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGxhc3RQb3NpdGlvbkluTm9kZShlZGl0YWJsZVJvb3QpOworICAgICAgICB9CisKKyAg
ICAgICAgcmV0dXJuIGMuaG9ub3JFZGl0aW5nQm91bmRhcnlBdE9yQWZ0ZXIodmlzUG9zKTsKKyAg
ICB9CisKICAgICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiBsaW5lIGlzIGF0IHRoZSBzYW1lIGxp
bmUgYXMgdGhlIGdpdmVuIGlucHV0IHBvc2l0aW9uLiAgRWxzZSB1c2UgdGhlIHByZXZpb3VzIHBv
c2l0aW9uIHRvIAogICAgIC8vIG9idGFpbiBlbmQgb2YgbGluZS4gIFRoaXMgY29uZGl0aW9uIGhh
cHBlbnMgd2hlbiB0aGUgaW5wdXQgcG9zaXRpb24gaXMgYmVmb3JlIHRoZSBzcGFjZSBjaGFyYWN0
ZXIgYXQgdGhlIGVuZCAKICAgICAvLyBvZiBhIHNvZnQtd3JhcHBlZCBub24tZWRpdGFibGUgbGlu
ZS4gSW4gdGhpcyBzY2VuYXJpbywgZW5kUG9zaXRpb25Gb3JMaW5lIHdvdWxkIGluY29ycmVjdGx5
IGhhbmQgYmFjayBhIHBvc2l0aW9uCkBAIC00MzksMTIgKzQ5MywyMyBAQCBWaXNpYmxlUG9zaXRp
b24gZW5kT2ZMaW5lKGNvbnN0IFZpc2libGVQCiAgICAgICAgIHZpc1BvcyA9IGMucHJldmlvdXMo
KTsKICAgICAgICAgaWYgKHZpc1Bvcy5pc051bGwoKSkKICAgICAgICAgICAgIHJldHVybiBWaXNp
YmxlUG9zaXRpb24oKTsKLSAgICAgICAgdmlzUG9zID0gZW5kUG9zaXRpb25Gb3JMaW5lKHZpc1Bv
cyk7CisgICAgICAgIHZpc1BvcyA9IGVuZFBvc2l0aW9uRm9yTGluZSh2aXNQb3MsIFVzZUlubGlu
ZUJveE9yZGVyaW5nKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIGMuaG9ub3JFZGl0aW5nQm91
bmRhcnlBdE9yQWZ0ZXIodmlzUG9zKTsKIH0KIAorLy8gRklYTUU6IFJlbmFtZSB0aGlzIGZ1bmN0
aW9uIHRvIHJlZmxlY3QgdGhlIGZhY3QgaXQgaWdub3JlcyBiaWRpIGxldmVscy4KK1Zpc2libGVQ
b3NpdGlvbiBlbmRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjdXJyZW50UG9zaXRpb24p
Cit7CisgICAgcmV0dXJuIGVuZE9mTGluZShjdXJyZW50UG9zaXRpb24sIFVzZUlubGluZUJveE9y
ZGVyaW5nKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIGxvZ2ljYWxFbmRPZkxpbmUoY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBjdXJyZW50UG9zaXRpb24pCit7CisgICAgcmV0dXJuIGVuZE9mTGluZShj
dXJyZW50UG9zaXRpb24sIFVzZUxvZ2ljYWxPcmRlcmluZyk7Cit9CisKIGJvb2wgaW5TYW1lTGlu
ZShjb25zdCBWaXNpYmxlUG9zaXRpb24gJmEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiAmYikKIHsK
ICAgICByZXR1cm4gYS5pc05vdE51bGwoKSAmJiBzdGFydE9mTGluZShhKSA9PSBzdGFydE9mTGlu
ZShiKTsKQEAgLTEwMzAsMTA5ICsxMDk1LDYgQEAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mRWRpdGFi
bGVDb250ZW50KGNvbgogICAgIHJldHVybiBsYXN0UG9zaXRpb25Jbk5vZGUoaGlnaGVzdFJvb3Qp
OwogfQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxvZ2ljYWxTdGFydFBvc2l0aW9uRm9yTGlu
ZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGMpCi17Ci0gICAgaWYgKGMuaXNOdWxsKCkpCi0gICAg
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKLQotICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RC
b3ggPSBSZW5kZXJlZFBvc2l0aW9uKGMpLnJvb3RCb3goKTsKLSAgICBpZiAoIXJvb3RCb3gpIHsK
LSAgICAgICAgLy8gVGhlcmUgYXJlIFZpc2libGVQb3NpdGlvbnMgYXQgb2Zmc2V0IDAgaW4gYmxv
Y2tzIHdpdGhvdXQKLSAgICAgICAgLy8gUm9vdElubGluZUJveGVzLCBsaWtlIGVtcHR5IGVkaXRh
YmxlIGJsb2NrcyBhbmQgYm9yZGVyZWQgYmxvY2tzLgotICAgICAgICBQb3NpdGlvbiBwID0gYy5k
ZWVwRXF1aXZhbGVudCgpOwotICAgICAgICBpZiAocC5kZXByZWNhdGVkTm9kZSgpLT5yZW5kZXJl
cigpICYmIHAuZGVwcmVjYXRlZE5vZGUoKS0+cmVuZGVyZXIoKS0+aXNSZW5kZXJCbG9jaygpICYm
ICFwLmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCkpCi0gICAgICAgICAgICByZXR1cm4gcG9zaXRp
b25Bdm9pZGluZ0ZpcnN0UG9zaXRpb25JblRhYmxlKGMpOwotICAgICAgICAKLSAgICAgICAgcmV0
dXJuIFZpc2libGVQb3NpdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBJbmxpbmVCb3gqIGxvZ2lj
YWxTdGFydEJveDsKLSAgICBOb2RlKiBsb2dpY2FsU3RhcnROb2RlID0gcm9vdEJveC0+Z2V0TG9n
aWNhbFN0YXJ0Qm94V2l0aE5vZGUobG9naWNhbFN0YXJ0Qm94KTsKLQotICAgIGlmICghbG9naWNh
bFN0YXJ0Tm9kZSkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwotCi0gICAgVmlz
aWJsZVBvc2l0aW9uIHZpc1BvcyA9IGxvZ2ljYWxTdGFydE5vZGUtPmlzVGV4dE5vZGUoKSA/IFZp
c2libGVQb3NpdGlvbihQb3NpdGlvbihsb2dpY2FsU3RhcnROb2RlLCBsb2dpY2FsU3RhcnRCb3gt
PmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBE
T1dOU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOiBWaXNpYmxlUG9zaXRpb24ocG9zaXRpb25CZWZvcmVOb2RlKGxvZ2lj
YWxTdGFydE5vZGUpLCBET1dOU1RSRUFNKTsKLSAgICByZXR1cm4gcG9zaXRpb25Bdm9pZGluZ0Zp
cnN0UG9zaXRpb25JblRhYmxlKHZpc1Bvcyk7Ci19Ci0KLVZpc2libGVQb3NpdGlvbiBsb2dpY2Fs
U3RhcnRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjKQotewotICAgIC8vIFRPRE86IHRo
aXMgaXMgdGhlIGN1cnJlbnQgYmVoYXZpb3IgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGZpeGVkLgot
ICAgIC8vIFBsZWFzZSByZWZlciB0byBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NDkxMDcgZm9yIGRldGFpbC4KLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzUG9zID0gbG9n
aWNhbFN0YXJ0UG9zaXRpb25Gb3JMaW5lKGMpOwotCi0gICAgaWYgKE5vZGUqIGVkaXRhYmxlUm9v
dCA9IGhpZ2hlc3RFZGl0YWJsZVJvb3QoYy5kZWVwRXF1aXZhbGVudCgpKSkgewotICAgICAgICBp
ZiAoIWVkaXRhYmxlUm9vdC0+Y29udGFpbnModmlzUG9zLmRlZXBFcXVpdmFsZW50KCkuY29udGFp
bmVyTm9kZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmaXJzdFBvc2l0aW9uSW5Ob2RlKGVkaXRh
YmxlUm9vdCk7Ci0gICAgfQotICAgIHJldHVybiBjLmhvbm9yRWRpdGluZ0JvdW5kYXJ5QXRPckJl
Zm9yZSh2aXNQb3MpOwotfQotCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxvZ2ljYWxFbmRQb3Np
dGlvbkZvckxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjKQotewotICAgIGlmIChjLmlzTnVs
bCgpKQotICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7Ci0KLSAgICBSb290SW5saW5l
Qm94KiByb290Qm94ID0gUmVuZGVyZWRQb3NpdGlvbihjKS5yb290Qm94KCk7Ci0gICAgaWYgKCFy
b290Qm94KSB7Ci0gICAgICAgIC8vIFRoZXJlIGFyZSBWaXNpYmxlUG9zaXRpb25zIGF0IG9mZnNl
dCAwIGluIGJsb2NrcyB3aXRob3V0Ci0gICAgICAgIC8vIFJvb3RJbmxpbmVCb3hlcywgbGlrZSBl
bXB0eSBlZGl0YWJsZSBibG9ja3MgYW5kIGJvcmRlcmVkIGJsb2Nrcy4KLSAgICAgICAgUG9zaXRp
b24gcCA9IGMuZGVlcEVxdWl2YWxlbnQoKTsKLSAgICAgICAgaWYgKHAuZGVwcmVjYXRlZE5vZGUo
KS0+cmVuZGVyZXIoKSAmJiBwLmRlcHJlY2F0ZWROb2RlKCktPnJlbmRlcmVyKCktPmlzUmVuZGVy
QmxvY2soKSAmJiAhcC5kZXByZWNhdGVkRWRpdGluZ09mZnNldCgpKQotICAgICAgICAgICAgcmV0
dXJuIGM7Ci0gICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKLSAgICB9Ci0gICAgCi0g
ICAgSW5saW5lQm94KiBsb2dpY2FsRW5kQm94OwotICAgIE5vZGUqIGxvZ2ljYWxFbmROb2RlID0g
cm9vdEJveC0+Z2V0TG9naWNhbEVuZEJveFdpdGhOb2RlKGxvZ2ljYWxFbmRCb3gpOwotCi0gICAg
aWYgKCFsb2dpY2FsRW5kTm9kZSkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwot
ICAgIAotICAgIFBvc2l0aW9uIHBvczsKLSAgICBpZiAobG9naWNhbEVuZE5vZGUtPmhhc1RhZ05h
bWUoYnJUYWcpKQotICAgICAgICBwb3MgPSBwb3NpdGlvbkJlZm9yZU5vZGUobG9naWNhbEVuZE5v
ZGUpOwotICAgIGVsc2UgaWYgKGxvZ2ljYWxFbmRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7Ci0g
ICAgICAgIElubGluZVRleHRCb3gqIGVuZFRleHRCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0
Qm94Kj4obG9naWNhbEVuZEJveCk7Ci0gICAgICAgIGludCBlbmRPZmZzZXQgPSBlbmRUZXh0Qm94
LT5zdGFydCgpOwotICAgICAgICBpZiAoIWVuZFRleHRCb3gtPmlzTGluZUJyZWFrKCkpCi0gICAg
ICAgICAgICBlbmRPZmZzZXQgKz0gZW5kVGV4dEJveC0+bGVuKCk7Ci0gICAgICAgIHBvcyA9IFBv
c2l0aW9uKGxvZ2ljYWxFbmROb2RlLCBlbmRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOwotICAgIH0gZWxzZQotICAgICAgICBwb3MgPSBwb3NpdGlvbkFmdGVyTm9k
ZShsb2dpY2FsRW5kTm9kZSk7Ci0gICAgCi0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihwb3Ms
IFZQX1VQU1RSRUFNX0lGX1BPU1NJQkxFKTsKLX0KLQotYm9vbCBpblNhbWVMb2dpY2FsTGluZShj
b25zdCBWaXNpYmxlUG9zaXRpb24mIGEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgYikKLXsKLSAg
ICByZXR1cm4gYS5pc05vdE51bGwoKSAmJiBsb2dpY2FsU3RhcnRPZkxpbmUoYSkgPT0gbG9naWNh
bFN0YXJ0T2ZMaW5lKGIpOwotfQotCi1WaXNpYmxlUG9zaXRpb24gbG9naWNhbEVuZE9mTGluZShj
b25zdCBWaXNpYmxlUG9zaXRpb24mIGMpCi17Ci0gICAgLy8gVE9ETzogdGhpcyBpcyB0aGUgY3Vy
cmVudCBiZWhhdmlvciB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgZml4ZWQuCi0gICAgLy8gUGxlYXNl
IHJlZmVyIHRvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00OTEwNyBm
b3IgZGV0YWlsLgotCi0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc1BvcyA9IGxvZ2ljYWxFbmRQb3Np
dGlvbkZvckxpbmUoYyk7Ci0gICAgCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBlbmQgb2YgbGluZSBp
cyBhdCB0aGUgc2FtZSBsaW5lIGFzIHRoZSBnaXZlbiBpbnB1dCBwb3NpdGlvbi4gRm9yIGEgd3Jh
cHBpbmcgbGluZSwgdGhlIGxvZ2ljYWwgZW5kCi0gICAgLy8gcG9zaXRpb24gZm9yIHRoZSBub3Qt
bGFzdC0yLWxpbmVzIG1pZ2h0IGluY29ycmVjdGx5IGhhbmQgYmFjayB0aGUgbG9naWNhbCBiZWdp
bm5pbmcgb2YgdGhlIG5leHQgbGluZS4gCi0gICAgLy8gRm9yIGV4YW1wbGUsIDxkaXYgY29udGVu
dGVkaXRhYmxlIGRpcj0icnRsIiBzdHlsZT0ibGluZS1icmVhazpiZWZvcmUtd2hpdGUtc3BhY2Ui
PmFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnCi0gICAgLy8gYSBhYmNkZWZnIGFiY2RlZmcgYWJjZGVm
ZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZnIGFiY2RlZmcgYWJjZGVmZyBhYmNkZWZn
IDwvZGl2PgotICAgIC8vIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBv
ZiB0aGUgY29tcHV0ZWQgbG9naWNhbCBlbmQgcG9zaXRpb24uCi0gICAgaWYgKCFpblNhbWVMb2dp
Y2FsTGluZShjLCB2aXNQb3MpKQotICAgICAgICB2aXNQb3MgPSB2aXNQb3MucHJldmlvdXMoKTsK
LQotICAgIGlmIChOb2RlKiBlZGl0YWJsZVJvb3QgPSBoaWdoZXN0RWRpdGFibGVSb290KGMuZGVl
cEVxdWl2YWxlbnQoKSkpIHsKLSAgICAgICAgaWYgKCFlZGl0YWJsZVJvb3QtPmNvbnRhaW5zKHZp
c1Bvcy5kZWVwRXF1aXZhbGVudCgpLmNvbnRhaW5lck5vZGUoKSkpCi0gICAgICAgICAgICByZXR1
cm4gbGFzdFBvc2l0aW9uSW5Ob2RlKGVkaXRhYmxlUm9vdCk7Ci0gICAgfQotICAgIHJldHVybiBj
Lmhvbm9yRWRpdGluZ0JvdW5kYXJ5QXRPckFmdGVyKHZpc1Bvcyk7Ci19Ci0KIFZpc2libGVQb3Np
dGlvbiBsZWZ0Qm91bmRhcnlPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBjLCBUZXh0RGly
ZWN0aW9uIGRpcmVjdGlvbikKIHsKICAgICByZXR1cm4gZGlyZWN0aW9uID09IExUUiA/IGxvZ2lj
YWxTdGFydE9mTGluZShjKSA6IGxvZ2ljYWxFbmRPZkxpbmUoYyk7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuaAkocmV2aXNpb24gOTgxNjYpCisrKyBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuaAkod29ya2luZyBjb3B5KQpAQCAtNTcsNyArNTcs
NiBAQCBWaXNpYmxlUG9zaXRpb24gZW5kT2ZMaW5lKGNvbnN0IFZpc2libGVQCiBWaXNpYmxlUG9z
aXRpb24gcHJldmlvdXNMaW5lUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uICYsIGludCBs
aW5lRGlyZWN0aW9uUG9pbnQpOwogVmlzaWJsZVBvc2l0aW9uIG5leHRMaW5lUG9zaXRpb24oY29u
c3QgVmlzaWJsZVBvc2l0aW9uICYsIGludCBsaW5lRGlyZWN0aW9uUG9pbnQpOwogYm9vbCBpblNh
bWVMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmLCBjb25zdCBWaXNpYmxlUG9zaXRpb24gJik7
Ci1ib29sIGluU2FtZUxvZ2ljYWxMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmLCBjb25zdCBW
aXNpYmxlUG9zaXRpb24gJik7CiBib29sIGlzU3RhcnRPZkxpbmUoY29uc3QgVmlzaWJsZVBvc2l0
aW9uICYpOwogYm9vbCBpc0VuZE9mTGluZShjb25zdCBWaXNpYmxlUG9zaXRpb24gJik7CiBWaXNp
YmxlUG9zaXRpb24gbG9naWNhbFN0YXJ0T2ZMaW5lKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsK
</data>
<flag name="review"
          id="110286"
          type_id="1"
          status="+"
          setter="cshu"
    />
          </attachment>
      

    </bug>

</bugzilla>