<?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>57806</bug_id>
          
          <creation_ts>2011-04-04 16:35:52 -0700</creation_ts>
          <short_desc>continue experiment with moving caret by word in visual order</short_desc>
          <delta_ts>2011-04-11 13:03:53 -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>PC</rep_platform>
          <op_sys>OS X 10.5</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>25298</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Xiaomei Ji">xji</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>eric</cc>
    
    <cc>mitz</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>379198</commentid>
    <comment_count>0</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-04 16:35:52 -0700</bug_when>
    <thetext>This is the 2nd patch, which adds implementation when caret is inside box (not at boundaries).
If the word break is inside the same box and not at the boundaries either, the word break will be returned.
If need to search the adjacent boxes for word breaks, then, only the cases implemented in bug 57336 work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379204</commentid>
    <comment_count>1</comment_count>
      <attachid>88157</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-04 16:42:41 -0700</bug_when>
    <thetext>Created attachment 88157
patch w/ layout test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379205</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-04 16:44:01 -0700</bug_when>
    <thetext>Attachment 88157 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1

Last 3072 characters of output:
/visible_units.cpp:1357:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1358:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1359:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1360:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1361:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1362:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1363:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1364:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1365:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1366:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1367:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1368:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1369:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1370:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1371:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1372:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1373:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1374:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1376:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1377:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1420:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1429:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1430:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1431:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1432:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1433:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1434:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1435:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1450:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/editing/visible_units.cpp:1459:  Tab found; better to use spaces  [whitespace/tab] [1]
Total errors found: 39 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379227</commentid>
    <comment_count>3</comment_count>
      <attachid>88162</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-04 16:57:14 -0700</bug_when>
    <thetext>Created attachment 88162
patch w/ layout test

fix style errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379730</commentid>
    <comment_count>4</comment_count>
      <attachid>88162</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-05 10:42:19 -0700</bug_when>
    <thetext>Comment on attachment 88162
patch w/ layout test

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

&gt; Source/WebCore/editing/visible_units.cpp:1185
&gt; +        return previousLeaf ? Position(previousLeaf-&gt;renderer()-&gt;node(), previousLeaf-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor) :
&gt; +        Position(node, 0, Position::PositionIsOffsetInAnchor);

I&apos;d use the regular if statement instead of a tertiary operator here since the statement is really long.

&gt; Source/WebCore/editing/visible_units.cpp:1206
&gt; +    const InlineBox* box, const VisiblePosition&amp; previousWordBreak, int&amp; offsetOfWordBreak, bool&amp; last)

what does last mean here?  last in the box?

Also, this function has very few blank lines.  It&apos;s hard to grasp the logic when there is one giant block of code.  Please insert blank lines as needed to separate blocks of logic.  I&apos;m likely to have to come back to this function again later because I&apos;m yet to fully understand how it works.  But extracting functions and refactoring a bit should help.

&gt; Source/WebCore/editing/visible_units.cpp:1233
&gt; +    int previousOffset = offsetOfWordBreak;
&gt; +    InlineBox* boxOfWordBreak;
&gt; +    wordBreak.getInlineBoxAndOffset(boxOfWordBreak, offsetOfWordBreak);
&gt; +    // &quot;previousOffset &lt; offsetOfWordBreak&quot; is to check the offset values are in ascending order.
&gt; +    // For example, RTL box &quot;FED CBA&quot; (in visual display) in LTR block, when cursor is at the left of &quot;CBA&quot;,
&gt; +    // nextWordPosition returns position right of &quot;CBA&quot;, which needs to be skipped to keep the the offsets ordered from right to left.
&gt; +    if (boxOfWordBreak == box &amp;&amp; (!hasSeenWordBreakInThisBox || previousOffset &lt; offsetOfWordBreak))
&gt; +        return wordBreak;

I&apos;d extract this condition as a function instead of adding comment here like this.

&gt; Source/WebCore/editing/visible_units.cpp:1237
&gt; +    bool hasRTLPreviousBox = previousLeaf &amp;&amp; !previousLeaf-&gt;isLeftToRightDirection();

I don&apos;t think we need to have a variable for this. It&apos;s pretty self-evident what the code is doing.

&gt; Source/WebCore/editing/visible_units.cpp:1240
&gt; +    VisiblePosition boundaryPosition;

What does boundaryPosition mean? I don&apos;t think it&apos;s descriptive.

&gt; Source/WebCore/editing/visible_units.cpp:1244
&gt; +        boundaryPosition = leftmostPositionInRTLBoxInLTRBlock(box, previousLeaf, nextLeaf);
&gt; +    else if (box-&gt;direction() == LTR &amp;&amp; !hasLTRNextBox)
&gt; +        boundaryPosition = rightmostPositionInLTRBoxInRTLBlock(box, previousLeaf, nextLeaf);

These two functions don&apos;t really need to take previous/next leaf, right?  We should let those functions call nextLeafChild and prevLeafChild themselves so that we don&apos;t have to worry about the possibility of someone accidentally calling them with wrong boxes (i.e. box-&gt;nextLeafChild() != nextLeaf, etc...)

&gt; Source/WebCore/editing/visible_units.cpp:1245
&gt; +    if (!boundaryPosition.isNull()) {

Perhaps, you need to explain when this case is reached.

&gt; Source/WebCore/editing/visible_units.cpp:1281
&gt; +static VisiblePosition collectOneWordBreakInBox(const InlineBox* box, TextDirection blockDirection, const VisiblePosition&amp; previousWordBreak, int&amp; offsetOfWordBreak, bool&amp; last)
&gt; +{
&gt; +    last = false;
&gt; +    VisiblePosition wordBreak;
&gt; +    if (box-&gt;direction() == blockDirection) {
&gt; +        wordBreak = previousWordBreakInBoxInsideBlockWithSameDirectionality(box, previousWordBreak, offsetOfWordBreak);
&gt; +        if (wordBreak.isNull())
&gt; +            last = true;
&gt; +    } else
&gt; +        wordBreak = nextWordBreakInBoxInsideBlockWithDifferentDirectionality(box, previousWordBreak, offsetOfWordBreak, last);
&gt; +    return wordBreak;
&gt; +}
&gt; +    
&gt; +static void collectWordBreaksInBox(const InlineBox* box, TextDirection blockDirection, Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)
&gt; +{
&gt; +    wordBoundaries.clear();
&gt; +    int offset;
&gt; +    bool last = false;
&gt; +    VisiblePosition wordBreak = collectOneWordBreakInBox(box, blockDirection, VisiblePosition(), offset, last);
&gt; +    while (!last) {
&gt; +        wordBoundaries.append(std::make_pair(wordBreak, offset));
&gt; +        wordBreak = collectOneWordBreakInBox(box, blockDirection, wordBreak, offset, last);
&gt; +    }
&gt; +    if (!wordBreak.isNull())
&gt; +        wordBoundaries.append(std::make_pair(wordBreak, offset));
&gt; +}

I would merge these two functions since collecting &quot;one word break&quot; doesn&apos;t make much sense to me.

&gt; Source/WebCore/editing/visible_units.cpp:1299
&gt; +static int greatestLessOffset(int offset, bool boxAndBlockInSameDirection, const Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)

We should give this function a better name.  How about greatestValueUnder? (credit: leviw).

&gt; Source/WebCore/editing/visible_units.cpp:1303
&gt; +        return index;

return invalidOffset instead.

&gt; Source/WebCore/editing/visible_units.cpp:1309
&gt; +                index = i;
&gt; +                break;

You should just &quot;return index&quot; here instead of assigning i to index.

&gt; Source/WebCore/editing/visible_units.cpp:1312
&gt; +    } else {

return invalidOffset here instead so that you don&apos;t need the else clause.

&gt; Source/WebCore/editing/visible_units.cpp:1316
&gt; +                index = i;
&gt; +                break;

Early return here agian.

&gt; Source/WebCore/editing/visible_units.cpp:1320
&gt; +    return index;

Return invalidOffset here.

&gt; Source/WebCore/editing/visible_units.cpp:1323
&gt; +static int leastGreaterOffset(int offset, bool boxAndBlockInSameDirection, const Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)

smallestOffsetAbove?

&gt; Source/WebCore/editing/visible_units.cpp:1327
&gt; +        return index;

return invalidOffset

&gt; Source/WebCore/editing/visible_units.cpp:1333
&gt; +                index = i;
&gt; +                break;

Same comment about early return.

&gt; Source/WebCore/editing/visible_units.cpp:1335
&gt; +        }

return invalidOffset here as well

&gt; Source/WebCore/editing/visible_units.cpp:1336
&gt; +    } else {

so that you don&apos;t need else here.

&gt; Source/WebCore/editing/visible_units.cpp:1340
&gt; +                index = i;
&gt; +                break;

early return

&gt; Source/WebCore/editing/visible_units.cpp:1344
&gt; +    return index;

return invalidOffset

&gt; Source/WebCore/editing/visible_units.cpp:1375
&gt; +static VisiblePosition wordBreakCandidate(TextDirection boxDirection, TextDirection blockDirection, WebCore::SelectionDirection searchDirection, const VisiblePosition&amp; visiblePosition)
&gt; +{
&gt; +    VisiblePosition wordBreak;
&gt; +    if (boxDirection == blockDirection) {
&gt; +        if ((boxDirection == LTR &amp;&amp; searchDirection == WebCore::DirectionRight)
&gt; +            || (boxDirection == RTL &amp;&amp; searchDirection == WebCore::DirectionLeft)) {
&gt; +            // The word boundary at the right of space if space is used to segment words.
&gt; +            VisiblePosition next = nextWordPosition(visiblePosition);
&gt; +            VisiblePosition nextNext = nextWordPosition(next);
&gt; +            if (next == nextNext)
&gt; +                return visiblePosition;
&gt; +            wordBreak = previousWordPosition(nextNext);
&gt; +        } else
&gt; +            wordBreak = previousWordPosition(visiblePosition);
&gt; +    } else {
&gt; +        if ((boxDirection == LTR &amp;&amp; searchDirection == WebCore::DirectionLeft)
&gt; +            || (boxDirection == RTL &amp;&amp; searchDirection == WebCore::DirectionRight)) {
&gt; +            // The word boundary at the left of space if space is used to segment words.
&gt; +            VisiblePosition previous = previousWordPosition(visiblePosition);
&gt; +            VisiblePosition previousPrevious = previousWordPosition(previous);
&gt; +            if (previous == previousPrevious)
&gt; +                wordBreak = previous;
&gt; +            else
&gt; +                wordBreak = nextWordPosition(previousPrevious);
&gt; +        } else
&gt; +            wordBreak = nextWordPosition(visiblePosition);
&gt; +    }
&gt; +    return wordBreak;
&gt; +}

I&apos;d break this function into two pieces as we did last time.  In fact, I&apos;d embed the following code in rightWordPosition:
if (boxDirection == blockDirection) {
    if (boxDirection == LTR)
        wordBreakCandidate = positionAfterNextWord(visiblePosition)
    else
        wordBreakCandidate = previousWordPosition(visiblePosition);
} else {
    if (boxDirection == RTL)
        wordBreakCandidate = positionBeforePreviousWord(visiblePosition)
    else
        wordBreakCandidate = nextWordPosition(visiblePosition);
}

where

static VisiblePosition positionAfterNextWord(VisiblePosition position) {
    VisiblePosition beforeNextWord = nextWordPosition(position);
    VisiblePosition beforeWordAfterNextWord = nextWordPosition(beforeNextWord);
    if (beforeNextWord == beforeWordAfterNextWord)
        return VisiblePosition();
    return previousWordPosition(beforeWordAfterNextWord);
}

static VisiblePosition positionBeforePreviousWord(VisiblePosition position) {
    VisiblePosition afterNextWord = previousWordPosition(position);
    VisiblePosition afterWordAfterNextWord = previousWordPosition(afterNextWord);
    if (afterNextWord == afterWordAfterNextWord)
        return VisiblePosition();
    return nextWordPosition(previousPrevious);
}

for leftWordBoundary, I&apos;d add do:

if (boxDirection == blockDirection) {
    if (boxDirection == RTL)
        wordBreakCandidate = positionAfterNextWord(visiblePosition);
    else
        wordBreakCandidate = previousWordPosition(visiblePosition);
} else {
    if (boxDirection == LTR)
        wordBreakCandidate = positionBeforePreviousWord(visiblePosition);
    else
        wordBreakCandidate = nextWordPosition(visiblePosition);
}

&gt; Source/WebCore/editing/visible_units.cpp:1424
&gt; +    InlineBox* boxOfWordBreak;
&gt; +    int offsetOfWordBreak;
&gt; +    wordBreak.getInlineBoxAndOffset(boxOfWordBreak, offsetOfWordBreak);
&gt; +    if (box == boxOfWordBreak &amp;&amp; offsetOfWordBreak != boxOfWordBreak-&gt;caretMaxOffset() &amp;&amp; offsetOfWordBreak != boxOfWordBreak-&gt;caretMinOffset())

I would extract this as a function that takes a VisiblePosition and a box.  Maybe positionIsInsideBox?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379806</commentid>
    <comment_count>5</comment_count>
      <attachid>88162</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-05 12:39:14 -0700</bug_when>
    <thetext>Comment on attachment 88162
patch w/ layout test

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

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1206
&gt;&gt; +    const InlineBox* box, const VisiblePosition&amp; previousWordBreak, int&amp; offsetOfWordBreak, bool&amp; last)
&gt; 
&gt; what does last mean here?  last in the box?
&gt; 
&gt; Also, this function has very few blank lines.  It&apos;s hard to grasp the logic when there is one giant block of code.  Please insert blank lines as needed to separate blocks of logic.  I&apos;m likely to have to come back to this function again later because I&apos;m yet to fully understand how it works.  But extracting functions and refactoring a bit should help.

changed to isLastWordBreakInBox.

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1233
&gt;&gt; +        return wordBreak;
&gt; 
&gt; I&apos;d extract this condition as a function instead of adding comment here like this.

I could extract. but I&apos;d leave the comments there. Without them, it is very hard to understand why the code is doing that.

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1240
&gt;&gt; +    VisiblePosition boundaryPosition;
&gt; 
&gt; What does boundaryPosition mean? I don&apos;t think it&apos;s descriptive.

it is the leftmost or rightmost position in box. suggestion for a better name?

&gt; Source/WebCore/editing/visible_units.cpp:1282
&gt; +    

it is more about granularity. I feel split them is more clear.

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1312
&gt;&gt; +    } else {
&gt; 
&gt; return invalidOffset here instead so that you don&apos;t need the else clause.

I like the &quot;if&quot;/else branch, and I feel it is clearer. But no strong objection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379901</commentid>
    <comment_count>6</comment_count>
      <attachid>88162</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-05 15:19:40 -0700</bug_when>
    <thetext>Comment on attachment 88162
patch w/ layout test

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

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1282
&gt;&gt; +    
&gt; 
&gt; it is more about granularity. I feel split them is more clear.

I renamed collectOneWordBreakInBox as wordBreakInBox

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1375
&gt;&gt; +}
&gt; 
&gt; I&apos;d break this function into two pieces as we did last time.  In fact, I&apos;d embed the following code in rightWordPosition:
&gt; if (boxDirection == blockDirection) {
&gt;     if (boxDirection == LTR)
&gt;         wordBreakCandidate = positionAfterNextWord(visiblePosition)
&gt;     else
&gt;         wordBreakCandidate = previousWordPosition(visiblePosition);
&gt; } else {
&gt;     if (boxDirection == RTL)
&gt;         wordBreakCandidate = positionBeforePreviousWord(visiblePosition)
&gt;     else
&gt;         wordBreakCandidate = nextWordPosition(visiblePosition);
&gt; }
&gt; 
&gt; where
&gt; 
&gt; static VisiblePosition positionAfterNextWord(VisiblePosition position) {
&gt;     VisiblePosition beforeNextWord = nextWordPosition(position);
&gt;     VisiblePosition beforeWordAfterNextWord = nextWordPosition(beforeNextWord);
&gt;     if (beforeNextWord == beforeWordAfterNextWord)
&gt;         return VisiblePosition();
&gt;     return previousWordPosition(beforeWordAfterNextWord);
&gt; }
&gt; 
&gt; static VisiblePosition positionBeforePreviousWord(VisiblePosition position) {
&gt;     VisiblePosition afterNextWord = previousWordPosition(position);
&gt;     VisiblePosition afterWordAfterNextWord = previousWordPosition(afterNextWord);
&gt;     if (afterNextWord == afterWordAfterNextWord)
&gt;         return VisiblePosition();
&gt;     return nextWordPosition(previousPrevious);
&gt; }
&gt; 
&gt; for leftWordBoundary, I&apos;d add do:
&gt; 
&gt; if (boxDirection == blockDirection) {
&gt;     if (boxDirection == RTL)
&gt;         wordBreakCandidate = positionAfterNextWord(visiblePosition);
&gt;     else
&gt;         wordBreakCandidate = previousWordPosition(visiblePosition);
&gt; } else {
&gt;     if (boxDirection == LTR)
&gt;         wordBreakCandidate = positionBeforePreviousWord(visiblePosition);
&gt;     else
&gt;         wordBreakCandidate = nextWordPosition(visiblePosition);
&gt; }

I kept the name &quot;next&quot;/&quot;nextNext&quot; and &quot;previous&quot;/previousPrevious since it is hard for me to understand what beforeNextWord, beforeWordAfterNextWord, afterNextWord, afterWordAfterNextWord mean.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>379909</commentid>
    <comment_count>7</comment_count>
      <attachid>88319</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-05 15:29:01 -0700</bug_when>
    <thetext>Created attachment 88319
patch w/ layout test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380326</commentid>
    <comment_count>8</comment_count>
      <attachid>88319</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-06 06:58:13 -0700</bug_when>
    <thetext>Comment on attachment 88319
patch w/ layout test

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

Okay, I think leftmostPositionInRTLBoxInLTRBlock, rightmostPositionInLTRBoxInRTLBlock, &amp; lastWordBreakInBox look pretty sane to me. They should be good to go after this iteration. The rest seems to require a couple more iterations.  Thanks for patiently improving the patch :)

&gt; Source/WebCore/editing/visible_units.cpp:1179
&gt; +    VisiblePosition leftmost;

This variable doesn&apos;t seem to be ever used.  Please remove.

&gt; Source/WebCore/editing/visible_units.cpp:1183
&gt; +    if (previousLeaf &amp;&amp; !previousLeaf-&gt;isLeftToRightDirection())

Let&apos;s put a blank line right above this line to improve the readability.

&gt; Source/WebCore/editing/visible_units.cpp:1196
&gt; +    VisiblePosition rightmost;

Ditto; can&apos;t find any reference.

&gt; Source/WebCore/editing/visible_units.cpp:1200
&gt; +    if (nextLeaf &amp;&amp; nextLeaf-&gt;isLeftToRightDirection())    

Ditto about inserting a blank line here.

&gt; Source/WebCore/editing/visible_units.cpp:1220
&gt; +    if (boundaryPosition.isNotNull()) { // boundaryPosition is not null only in the above 2 cases.

Please do an early return instead.

&gt; Source/WebCore/editing/visible_units.cpp:1232
&gt; +static bool positionIsVisuallyOrderedInBox(const VisiblePosition&amp; wordBreak, const InlineBox* box, int&amp; offsetOfWordBreak)

I don&apos;t think positionIsVisuallyOrderedInBox is a descriptive name here.  It explains what the function is checking but it doesn&apos;t explain anything in the context of nextWordBreakInBoxInsideBlockWithDifferentDirectionality.  Please rename.

&gt; Source/WebCore/editing/visible_units.cpp:1237
&gt; +    // &quot;previousOffset &lt; offsetOfWordBreak&quot; is to guarantee that the word breaks collected are visually ordered.

I don&apos;t think this comment is helpful.  It doesn&apos;t explain why &quot;previousOffset &lt; offsetOfWordBreak&quot; guarantees that the words breaks are visually ordered.

&gt; Source/WebCore/editing/visible_units.cpp:1262
&gt; +    isLastWordBreakInBox = false;
&gt; +    if (wordBreak == previousWordBreak) {
&gt; +        isLastWordBreakInBox = true;

It seems redundant to set isLastWordBreakInBox to false if we&apos;re immediately setting it back to true.  I&apos;d move isLastWordBreakInBox = false below the if clause.

&gt; Source/WebCore/editing/visible_units.cpp:1304
&gt; +static VisiblePosition wordBreakInBox(const InlineBox* box, TextDirection blockDirection, const VisiblePosition&amp; previousWordBreak, int&amp; offsetOfWordBreak, bool&amp; isLastWordBreakInBox)
&gt; +{
&gt; +    isLastWordBreakInBox = false;
&gt; +    VisiblePosition wordBreak;
&gt; +    if (box-&gt;direction() == blockDirection) {
&gt; +        wordBreak = previousWordBreakInBoxInsideBlockWithSameDirectionality(box, previousWordBreak, offsetOfWordBreak);
&gt; +        if (wordBreak.isNull())
&gt; +            isLastWordBreakInBox = true;
&gt; +    } else
&gt; +        wordBreak = nextWordBreakInBoxInsideBlockWithDifferentDirectionality(box, previousWordBreak, offsetOfWordBreak, isLastWordBreakInBox);
&gt; +    return wordBreak;
&gt; +}
&gt; +    
&gt; +static void collectWordBreaksInBox(const InlineBox* box, TextDirection blockDirection, Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)
&gt; +{
&gt; +    wordBoundaries.clear();
&gt; +    int offset = invalidOffset;
&gt; +    bool isLastWordBreakInBox = false;
&gt; +    VisiblePosition wordBreak = wordBreakInBox(box, blockDirection, VisiblePosition(), offset, isLastWordBreakInBox);
&gt; +    while (!isLastWordBreakInBox) {
&gt; +        wordBoundaries.append(std::make_pair(wordBreak, offset));
&gt; +        wordBreak = wordBreakInBox(box, blockDirection, wordBreak, offset, isLastWordBreakInBox);
&gt; +    }
&gt; +    if (!wordBreak.isNull())
&gt; +        wordBoundaries.append(std::make_pair(wordBreak, offset));
&gt; +}

As I said in the previous comment, I don&apos;t see why these two functions can&apos;t be merged.  In fact, I just did it for you (please verify):

static void collectWordBreaksInBox(const InlineBox* box, TextDirection blockDirection, Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)
{
    wordBoundaries.clear();

    VisiblePosition wordBreak;
    int offsetOfWordBreak = invalidOffset;
    while (1) {
        if (box-&gt;direction() == blockDirection) {
            wordBreak = previousWordBreakInBoxInsideBlockWithSameDirectionality(box, wordBreak, offsetOfWordBreak);
            if (wordBreak.isNull())
                break;
            wordBoundaries.append(std::make_pair(wordBreak, offset));
        } else {
            bool isLastWordBreakInBox = false;
            wordBreak = nextWordBreakInBoxInsideBlockWithDifferentDirectionality(box, wordBreak, offsetOfWordBreak, isLastWordBreakInBox);
            if (wordBreak.isNotNull())
                wordBoundaries.append(std::make_pair(wordBreak, offset));
            if (isLastWordBreakInBox)
                break;
        }
    }
}

Once I did that, it was obvious to me that we should have two different functions for same directionality and different directionality as in:
static void collectWordBreaksInBoxInsideBlockWithSameDirectionality(const InlineBox* box, Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)
{
    wordBoundaries.clear();

    VisiblePosition wordBreak;
    int offsetOfWordBreak = invalidOffset;
    while (1) {
        wordBreak = previousWordBreakInBoxInsideBlockWithSameDirectionality(box, wordBreak, offsetOfWordBreak);
        if (wordBreak.isNull())
            break;
        wordBoundaries.append(std::make_pair(wordBreak, offset));
    }
}

static void collectWordBreaksInBoxInsideBlockWithDifferntDirectionality(const InlineBox* box, Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)
{
    wordBoundaries.clear();

    VisiblePosition wordBreak;
    int offsetOfWordBreak = invalidOffset;
    while (1) {
        bool isLastWordBreakInBox = false;
        wordBreak = nextWordBreakInBoxInsideBlockWithDifferentDirectionality(box, wordBreak, offsetOfWordBreak, isLastWordBreakInBox);
        if (wordBreak.isNotNull())
            wordBoundaries.append(std::make_pair(wordBreak, offset));
        if (isLastWordBreakInBox)
            break;
    }
}

&gt; Source/WebCore/editing/visible_units.cpp:1322
&gt; +static int greatestValueUnder(int offset, bool boxAndBlockInSameDirection, const Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt;&amp; wordBoundaries)

You should rename wordBoundaries to something like orderedWordBoundaries to signify the fact they&apos;re ordered.  Or otherwise things doesn&apos;t make sense.
Also I would have much preferred if you defined a struct instead of using a pair here so that I know what a pair represents.

Nit: s/boxAndBlockInSameDirection/boxAndBlockAreInSameDirection/.

&gt; Source/WebCore/editing/visible_units.cpp:1394
&gt; +    if (box == boxOfWordBreak &amp;&amp; offsetOfWordBreak != box-&gt;caretMaxOffset() &amp;&amp; offsetOfWordBreak != box-&gt;caretMinOffset())
&gt; +        return true;        
&gt; +    return false;

Nit: we should do:
return box == boxOfWordBreak &amp;&amp; offsetOfWordBreak != box-&gt;caretMaxOffset() &amp;&amp; offsetOfWordBreak != box-&gt;caretMinOffset();
instead.

&gt; Source/WebCore/editing/visible_units.cpp:1397
&gt; +static VisiblePosition positionAfterNextWord(const VisiblePosition&amp; position)

Oops, this should probably named as positionAfterWord instead.  Since if we&apos;re in &quot;he^llo world&quot;, then this function will return &quot;hello^ world&quot;.

&gt; Source/WebCore/editing/visible_units.cpp:1400
&gt; +    VisiblePosition next = nextWordPosition(position);
&gt; +    VisiblePosition nextNext = nextWordPosition(next);

next and nextNext don&apos;t make any sense to me.  Next what?  It&apos;s much clearer to call next as beforeNextWord because it signifies the fact nextWordPosition returns the position between the next word and the whitespace immediately before the next word.  It then becomes clear from your other comment that we must move forward again to obtain beforeWordAfterNextWord or afterNextWord &amp; backward in order obtain the position after the current word.

&gt; Source/WebCore/editing/visible_units.cpp:1406
&gt; +static VisiblePosition positionBeforePreviousWord(const VisiblePosition&amp; position)

Ditto. This should be named as positionBeforeWord

&gt; Source/WebCore/editing/visible_units.cpp:1409
&gt; +    VisiblePosition previous = previousWordPosition(position);
&gt; +    VisiblePosition previousPrevious = previousWordPosition(previous);

Ditto about local variable names here.

&gt; Source/WebCore/editing/visible_units.cpp:1446
&gt; +    // Otherwise, first collect all word breaks in terms of (VisiblePosition, offset) inside the box.

Please get rid of this comment.  It repeats the function name collectWordBreaksInBox.

&gt; Source/WebCore/editing/visible_units.cpp:1447
&gt; +    Vector&lt;std::pair&lt;VisiblePosition, int&gt;, 50&gt; wordBoundaries;

Why 50?  That sounds like an arbitrary limit to me.  I&apos;d rather not to specify any number here.

&gt; Source/WebCore/editing/visible_units.cpp:1449
&gt; +    // Then, search for word boundaries inside the box.

Please remove this comment.  It repeats what code says.

&gt; Source/WebCore/editing/visible_units.cpp:1455
&gt; +    // If not found, search for word boundaries in visually adjacent boxes.

Please remove this comment.  It repeats the code.

&gt; Source/WebCore/editing/visible_units.cpp:1456
&gt; +    return leftWordBoundary(box-&gt;prevLeafChild(), invalidOffset, blockDirection);

Mn... this is a tail recursion. I wonder if we can make it iterative in a some followup patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380518</commentid>
    <comment_count>9</comment_count>
      <attachid>88319</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-06 10:00:25 -0700</bug_when>
    <thetext>Comment on attachment 88319
patch w/ layout test

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

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1232
&gt;&gt; +static bool positionIsVisuallyOrderedInBox(const VisiblePosition&amp; wordBreak, const InlineBox* box, int&amp; offsetOfWordBreak)
&gt; 
&gt; I don&apos;t think positionIsVisuallyOrderedInBox is a descriptive name here.  It explains what the function is checking but it doesn&apos;t explain anything in the context of nextWordBreakInBoxInsideBlockWithDifferentDirectionality.  Please rename.

The function is named as what it does, does not matter what the context is. As to it is only needed when block and box has different directionality, I think that should be explained in the caller, as in the current code.
Or suggestion on a better name?

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1400
&gt;&gt; +    VisiblePosition nextNext = nextWordPosition(next);
&gt; 
&gt; next and nextNext don&apos;t make any sense to me.  Next what?  It&apos;s much clearer to call next as beforeNextWord because it signifies the fact nextWordPosition returns the position between the next word and the whitespace immediately before the next word.  It then becomes clear from your other comment that we must move forward again to obtain beforeWordAfterNextWord or afterNextWord &amp; backward in order obtain the position after the current word.

nextWordPosition does not return the position between the next word and the white space immediately before the next word. It returns the position after the current word, before the white space immediately before the next word.

This function returns the position between the next word and the white space immediately before the next word.

Then, the function name should be &quot;positionBeforeNextWord&quot;? 
and suggestion on &quot;next&quot;/&quot;nextNext&quot;? Themselves are nothing special. If follows your naming convention, they probably should be named as &quot;positionAfterWord&quot; and &quot;positionAfterNextWord&quot;.

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1406
&gt;&gt; +static VisiblePosition positionBeforePreviousWord(const VisiblePosition&amp; position)
&gt; 
&gt; Ditto. This should be named as positionBeforeWord

the function returns position after previous word, by after, I mean logically. should it be named as &quot;positionAfterPreviousWord&quot;?
how about &quot;previous&quot; and &quot;previousPrevious&quot;? any suggestion? &quot;positionBeforeWord&quot; and &quot;positionBeforePreviousWord&quot;?

&gt; Source/WebCore/editing/visible_units.cpp:1448
&gt; +    collectWordBreaksInBox(box, blockDirection, wordBoundaries);

Mitz suggested inline capacity to avoid heap allocation in most cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380531</commentid>
    <comment_count>10</comment_count>
      <attachid>88319</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-06 10:11:40 -0700</bug_when>
    <thetext>Comment on attachment 88319
patch w/ layout test

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

&gt;&gt;&gt; Source/WebCore/editing/visible_units.cpp:1232
&gt;&gt;&gt; +static bool positionIsVisuallyOrderedInBox(const VisiblePosition&amp; wordBreak, const InlineBox* box, int&amp; offsetOfWordBreak)
&gt;&gt; 
&gt;&gt; I don&apos;t think positionIsVisuallyOrderedInBox is a descriptive name here.  It explains what the function is checking but it doesn&apos;t explain anything in the context of nextWordBreakInBoxInsideBlockWithDifferentDirectionality.  Please rename.
&gt; 
&gt; The function is named as what it does, does not matter what the context is. As to it is only needed when block and box has different directionality, I think that should be explained in the caller, as in the current code.
&gt; Or suggestion on a better name?

I disagree. We should name a function to explain for what purpose the function is used especially because this function is only used in one place.

&gt;&gt;&gt; Source/WebCore/editing/visible_units.cpp:1400
&gt;&gt;&gt; +    VisiblePosition nextNext = nextWordPosition(next);
&gt;&gt; 
&gt;&gt; next and nextNext don&apos;t make any sense to me.  Next what?  It&apos;s much clearer to call next as beforeNextWord because it signifies the fact nextWordPosition returns the position between the next word and the whitespace immediately before the next word.  It then becomes clear from your other comment that we must move forward again to obtain beforeWordAfterNextWord or afterNextWord &amp; backward in order obtain the position after the current word.
&gt; 
&gt; nextWordPosition does not return the position between the next word and the white space immediately before the next word. It returns the position after the current word, before the white space immediately before the next word.
&gt; 
&gt; This function returns the position between the next word and the white space immediately before the next word.
&gt; 
&gt; Then, the function name should be &quot;positionBeforeNextWord&quot;? 
&gt; and suggestion on &quot;next&quot;/&quot;nextNext&quot;? Themselves are nothing special. If follows your naming convention, they probably should be named as &quot;positionAfterWord&quot; and &quot;positionAfterNextWord&quot;.

Ah, I see. Thanks for the clarification.  Yes, the function name should be positionBeforeNextWord and variables should be named along the lines of positionAfterCurrentWord and positionAfterNextWord respectively.

&gt;&gt;&gt; Source/WebCore/editing/visible_units.cpp:1406
&gt;&gt;&gt; +static VisiblePosition positionBeforePreviousWord(const VisiblePosition&amp; position)
&gt;&gt; 
&gt;&gt; Ditto. This should be named as positionBeforeWord
&gt; 
&gt; the function returns position after previous word, by after, I mean logically. should it be named as &quot;positionAfterPreviousWord&quot;?
&gt; how about &quot;previous&quot; and &quot;previousPrevious&quot;? any suggestion? &quot;positionBeforeWord&quot; and &quot;positionBeforePreviousWord&quot;?

I&apos;d name them positionAfterPreviousWord, positionBeforeCurrentWord, and positionBeforePreviousWord respectively.

&gt;&gt; Source/WebCore/editing/visible_units.cpp:1448
&gt;&gt; +    collectWordBreaksInBox(box, blockDirection, wordBoundaries);
&gt; 
&gt; Mitz suggested inline capacity to avoid heap allocation in most cases.

I feel like that&apos;s a pre-mature optimization.  If anything, we should make a benchmark and figure out if that&apos;ll affect the performance at all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380581</commentid>
    <comment_count>11</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-06 10:38:18 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 88319 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=88319&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/WebCore/editing/visible_units.cpp:1232
&gt; &gt;&gt;&gt; +static bool positionIsVisuallyOrderedInBox(const VisiblePosition&amp; wordBreak, const InlineBox* box, int&amp; offsetOfWordBreak)
&gt; &gt;&gt; 
&gt; &gt;&gt; I don&apos;t think positionIsVisuallyOrderedInBox is a descriptive name here.  It explains what the function is checking but it doesn&apos;t explain anything in the context of nextWordBreakInBoxInsideBlockWithDifferentDirectionality.  Please rename.
&gt; &gt; 
&gt; &gt; The function is named as what it does, does not matter what the context is. As to it is only needed when block and box has different directionality, I think that should be explained in the caller, as in the current code.
&gt; &gt; Or suggestion on a better name?
&gt; 
&gt; I disagree. We should name a function to explain for what purpose the function is used especially because this function is only used in one place.

suggestion for a better name?
positionIsVisuallyOrderedInBoxInBlockWithDifferentDirectionality?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380851</commentid>
    <comment_count>12</comment_count>
      <attachid>88319</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-06 14:39:56 -0700</bug_when>
    <thetext>Comment on attachment 88319
patch w/ layout test

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

&gt; Source/WebCore/editing/visible_units.cpp:1272
&gt; +    // Given RTL box &quot;ABC DEF&quot; either follows a LTR box or is the first visual box in an LTR block as an example,
&gt; +    // the visual display of the RTL box is: &quot;(0)J(10)I(9)H(8) (7)F(6)E(5)D(4) (3)C(2)B(1)A(11)&quot;,
&gt; +    // where the number in parenthesis represents offset in visiblePosition. 
&gt; +    // Start at offset 0, the first word break is at offset 3, the 2nd word break is at offset 7, and the 3rd word break should be at offset 0.
&gt; +    // But nextWordPosition() of offset 7 is offset 11, which should be ignored, 
&gt; +    // and the position at offset 0 should be manually added as the last word break within the box.
&gt; +    if (positionIsVisuallyOrderedInBox(wordBreak, box, offsetOfWordBreak))

It&apos;s not great that we need this giant chunk of comment to explain what&apos;s happening here.  positionIsVisuallyOrderedInBox should be named such that you can reduce the amount of comment here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380939</commentid>
    <comment_count>13</comment_count>
      <attachid>88319</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-06 16:08:20 -0700</bug_when>
    <thetext>Comment on attachment 88319
patch w/ layout test

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

&gt; Source/WebCore/editing/visible_units.cpp:1273
&gt; +        return wordBreak;

I am out of idea on how to rename   positionIsVisuallyOrderedInBox so that the comments could be removed. Any suggestion?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380945</commentid>
    <comment_count>14</comment_count>
      <attachid>88540</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-06 16:14:01 -0700</bug_when>
    <thetext>Created attachment 88540
patch w/ layout test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>380949</commentid>
    <comment_count>15</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-06 16:18:33 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 88319 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=88319&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/visible_units.cpp:1273
&gt; &gt; +        return wordBreak;
&gt; 
&gt; I am out of idea on how to rename   positionIsVisuallyOrderedInBox so that the comments could be removed. Any suggestion?

Comment doesn&apos;t need to be entirely removed.  I&apos;m simply saying that the name should complement the comment.  Well, I can&apos;t think of a better name for now so it&apos;s fine if you left the name as is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>381405</commentid>
    <comment_count>16</comment_count>
      <attachid>88540</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-07 09:29:41 -0700</bug_when>
    <thetext>Comment on attachment 88540
patch w/ layout test

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

&gt; Source/WebCore/editing/visible_units.cpp:1188
&gt; +        return Position(node, 0, Position::PositionIsOffsetInAnchor);

What if there was node extended for multiple lines?   Would this be still correct?

&gt; Source/WebCore/editing/visible_units.cpp:1230
&gt; +static VisiblePosition lastWordBreakInBox(const InlineBox* box, int&amp; offsetOfWordBreak)
&gt; +{
&gt; +    // Add the leftmost word break for RTL box or rightmost word break for LTR box.
&gt; +    InlineBox* previousLeaf = box-&gt;prevLeafChild();
&gt; +    InlineBox* nextLeaf = box-&gt;nextLeafChild();
&gt; +    VisiblePosition boundaryPosition;
&gt; +    if (box-&gt;direction() == RTL &amp;&amp; (!previousLeaf || previousLeaf-&gt;isLeftToRightDirection()))
&gt; +        boundaryPosition = leftmostPositionInRTLBoxInLTRBlock(box);
&gt; +    else if (box-&gt;direction() == LTR &amp;&amp; (!nextLeaf || !nextLeaf-&gt;isLeftToRightDirection()))
&gt; +        boundaryPosition = rightmostPositionInLTRBoxInRTLBlock(box);
&gt; +    if (boundaryPosition.isNull())
&gt; +        return VisiblePosition();            
&gt; +    VisiblePosition wordBreak = nextWordPosition(boundaryPosition);
&gt; +    if (wordBreak != boundaryPosition)
&gt; +        wordBreak = previousWordPosition(wordBreak);
&gt; +    InlineBox* boxOfWordBreak;
&gt; +    wordBreak.getInlineBoxAndOffset(boxOfWordBreak, offsetOfWordBreak);
&gt; +    if (boxOfWordBreak == box)
&gt; +        return wordBreak;
&gt; +    return VisiblePosition();    
&gt; +}

Please insert blank lines as appropriate.

&gt; Source/WebCore/editing/visible_units.cpp:1281
&gt; +    WordBoundaryEntry(): visiblePosition(VisiblePosition()), offset(invalidOffset) {}
&gt; +    WordBoundaryEntry(const VisiblePosition&amp; position, int offset): visiblePosition(position), offset(offset) {}

Please follow WebKit style for constructors here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>381445</commentid>
    <comment_count>17</comment_count>
      <attachid>88654</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-07 10:06:24 -0700</bug_when>
    <thetext>Created attachment 88654
patch w/ layout test

updated per comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>381451</commentid>
    <comment_count>18</comment_count>
      <attachid>88654</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-07 10:16:29 -0700</bug_when>
    <thetext>Comment on attachment 88654
patch w/ layout test

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

&gt; Source/WebCore/editing/visible_units.cpp:1195
&gt; +        InlineBox* lastRTLLeaf;
&gt; +        do {
&gt; +            lastRTLLeaf = nextLeaf;
&gt; +            nextLeaf = nextLeaf-&gt;nextLeafChild();
&gt; +        } while (nextLeaf &amp;&amp; !nextLeaf-&gt;isLeftToRightDirection());
&gt; +        return Position(lastRTLLeaf-&gt;renderer()-&gt;node(), lastRTLLeaf-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);

I see you fixed this code per my comment. Could you add a test case as well?

&gt; Source/WebCore/editing/visible_units.cpp:1300
&gt; +        : visiblePosition(VisiblePosition())

I don&apos;t think you need to explicitly call VisiblePosition() like this.

&gt; Source/WebCore/editing/visible_units.cpp:1307
&gt; +    : visiblePosition(position)
&gt; +    , offset(offset) 

Please indent these.

&gt; Source/WebCore/editing/visible_units.cpp:1312
&gt; +    int offset; // offset returned from visiblePosition.getInlineBoxAndOffset() and is used in comparison to find the visually closest word break.

Please rename offset to something more explicit and remove the comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>381892</commentid>
    <comment_count>19</comment_count>
      <attachid>88744</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-07 17:53:16 -0700</bug_when>
    <thetext>Created attachment 88744
patch w/ layout test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>382731</commentid>
    <comment_count>20</comment_count>
      <attachid>88744</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-08 23:26:54 -0700</bug_when>
    <thetext>Comment on attachment 88744
patch w/ layout test

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

r=me provided you address the following comments.  I&apos;m excited for this patch!

&gt; Source/WebCore/editing/visible_units.cpp:1292
&gt; +    isLastWordBreakInBox = false;
&gt; +
&gt; +    // Given RTL box &quot;ABC DEF&quot; either follows a LTR box or is the first visual box in an LTR block as an example,
&gt; +    // the visual display of the RTL box is: &quot;(0)J(10)I(9)H(8) (7)F(6)E(5)D(4) (3)C(2)B(1)A(11)&quot;,
&gt; +    // where the number in parenthesis represents offset in visiblePosition. 
&gt; +    // Start at offset 0, the first word break is at offset 3, the 2nd word break is at offset 7, and the 3rd word break should be at offset 0.
&gt; +    // But nextWordPosition() of offset 7 is offset 11, which should be ignored, 
&gt; +    // and the position at offset 0 should be manually added as the last word break within the box.
&gt; +    if (positionIsVisuallyOrderedInBoxInBlockWithDifferentDirectionality(wordBreak, box, offsetOfWordBreak))
&gt; +        return wordBreak;

Can we set isLastWordBreakInBox false right above the return statement? i.e.
if (positionIsVisuallyOrderedInBoxInBlockWithDifferentDirectionality(wordBreak, box, offsetOfWordBreak)) {
    isLastWordBreakInBox = false;
    return wordBreak
}

&gt; Source/WebCore/editing/visible_units.cpp:1326
&gt; +        struct WordBoundaryEntry wordBoundaryEntry(wordBreak, offsetOfWordBreak);

You shouldn&apos;t put &quot;struct&quot; in front of a struct name. Please remove.

&gt; Source/WebCore/editing/visible_units.cpp:1341
&gt; +            struct WordBoundaryEntry wordBoundaryEntry(wordBreak, offsetOfWordBreak);

Ditto.

&gt; Source/WebCore/editing/visible_units.cpp:1494
&gt; +    int index = box-&gt;isLeftToRightDirection() ? greatestValueUnder(offset, blockDirection == LTR, orderedWordBoundaries) :
&gt; +                                                smallestOffsetAbove(offset, blockDirection == RTL, orderedWordBoundaries);

I don&apos;t think we normally align function calls like that.  Please do:
int index = box-&gt;isLeftToRightDirection() ? greatestValueUnder(offset, blockDirection == LTR, orderedWordBoundaries) :
    smallestOffsetAbove(offset, blockDirection == RTL, orderedWordBoundaries);

&gt; Source/WebCore/editing/visible_units.cpp:1534
&gt; +    int index = box-&gt;isLeftToRightDirection() ? smallestOffsetAbove(offset, blockDirection == LTR, orderedWordBoundaries) :
&gt; +                                                greatestValueUnder(offset, blockDirection == RTL, orderedWordBoundaries);

Ditto.

&gt; LayoutTests/ChangeLog:7
&gt; +

Please explain changes happened in the expected result and what test case you&apos;re adding.

&gt; LayoutTests/editing/selection/move-by-word-visually-expected.txt:43
&gt; -&quot;ZQB abc RIG&quot;[8, 8, 0, 0]    FAIL expected: [8, 4, 0, 0]
&gt; +&quot;ZQB abc RIG&quot;[8, 0, 0, 0]    FAIL expected: [8, 4, 0, 0]
&gt;  

I don&apos;t see new test result added here.  Did you forget to rebaseline?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>383325</commentid>
    <comment_count>21</comment_count>
      <attachid>88744</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-11 11:50:06 -0700</bug_when>
    <thetext>Comment on attachment 88744
patch w/ layout test

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

&gt;&gt; LayoutTests/editing/selection/move-by-word-visually-expected.txt:43
&gt;&gt;  
&gt; 
&gt; I don&apos;t see new test result added here.  Did you forget to rebaseline?

The new test tests word break stops at a  position given a specific position. It only printed out information when the test failed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>383327</commentid>
    <comment_count>22</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-04-11 11:51:47 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (From update of attachment 88744 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=88744&amp;action=review
&gt; The new test tests word break stops at a  position given a specific position. It only printed out information when the test failed.

That seems like a bad test. We should print something when the test passes so that not having that output causes the test to fail as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>383406</commentid>
    <comment_count>23</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-11 13:02:37 -0700</bug_when>
    <thetext>Committed r83483: &lt;http://trac.webkit.org/changeset/83483&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>383407</commentid>
    <comment_count>24</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-04-11 13:03:53 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (In reply to comment #21)
&gt; &gt; (From update of attachment 88744 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=88744&amp;action=review
&gt; &gt; The new test tests word break stops at a  position given a specific position. It only printed out information when the test failed.
&gt; 
&gt; That seems like a bad test. We should print something when the test passes so that not having that output causes the test to fail as well.

Changed the format to be simliar to existing format. Printed the result, and if failed, printed &quot;FAIL&quot; + expectation.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88157</attachid>
            <date>2011-04-04 16:42:41 -0700</date>
            <delta_ts>2011-04-04 16:57:28 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v1</filename>
            <type>text/plain</type>
            <size>17388</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyODkxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjcgQEAKKzIwMTEtMDQtMDQgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dp
dGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0T25l
V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdFdvcmRCcmVha3NJbkJv
eCk6CisgICAgICAgIChXZWJDb3JlOjpncmVhdGVzdExlc3NPZmZzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6bGVhc3RHcmVhdGVyT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OndvcmRCcmVha0Nh
bmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OnJpZ2h0V29yZFBvc2l0aW9uKToKKwogMjAxMS0wNC0wNCAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0g
QmFydGguCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHJl
dmlzaW9uIDgyODQ4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw2ICsxMTczLDExMyBAQCBzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIHdvcmRCcmVhazsKIH0KIAorc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKGNv
bnN0IElubGluZUJveCogYm94LCBjb25zdCBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiwgY29uc3Qg
SW5saW5lQm94KiBuZXh0TGVhZikKK3sKKyAgICAvLyBGSVhNRTogUHJvYmFibHkgbmVlZCB0byB0
YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCisgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0
OworICAgIE5vZGUqIG5vZGUgPSBib3gtPnJlbmRlcmVyKCktPm5vZGUoKTsKKyAgICBpZiAocHJl
dmlvdXNMZWFmICYmICFwcmV2aW91c0xlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAg
ICAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKG5leHRMZWFmICYmICFuZXh0
TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgIHJldHVybiBwcmV2aW91
c0xlYWYgPyBQb3NpdGlvbihwcmV2aW91c0xlYWYtPnJlbmRlcmVyKCktPm5vZGUoKSwgcHJldmlv
dXNMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yKSA6CisgICAgICAgIFBvc2l0aW9uKG5vZGUsIDAsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOworICAgIH0KKyAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJl
dE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKK30KKwor
c3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9j
ayhjb25zdCBJbmxpbmVCb3gqIGJveCwgY29uc3QgSW5saW5lQm94KiBwcmV2aW91c0xlYWYsIGNv
bnN0IElubGluZUJveCogbmV4dExlYWYpCit7CisgICAgLy8gRklYTUU6IFByb2JhYmx5IG5lZWQg
dG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgorICAgIFZpc2libGVQb3NpdGlvbiByaWdo
dG1vc3Q7CisgICAgTm9kZSogbm9kZSA9IGJveC0+cmVuZGVyZXIoKS0+bm9kZSgpOworICAgIGlm
IChuZXh0TGVhZiAmJiBuZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSAgICAKKyAg
ICAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKHByZXZpb3VzTGVhZiAmJiBw
cmV2aW91c0xlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkgeworICAgICAgICByZXR1cm4g
bmV4dExlYWYgPyBQb3NpdGlvbihuZXh0TGVhZi0+cmVuZGVyZXIoKS0+bm9kZSgpLCBuZXh0TGVh
Zi0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikg
OgorICAgICAgICBQb3NpdGlvbihub2RlLCAwLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKTsKKyAgICB9CisgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNaW5P
ZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cit9CisgICAgCisg
ICAgCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KAorICAgIGNvbnN0IElubGluZUJveCogYm94LCBj
b25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29y
ZEJyZWFrLCBib29sJiBsYXN0KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRh
a2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICAKKyAgICAvLyBJbiBhIExUUiBibG9jaywg
dGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEgd29yZC4K
KyAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBy
aWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCisgICAgLy8gQmVjYXVzZSBwcmV2aW91c1dvcmRQb3Np
dGlvbigpIHJldHVybnMgdGhlIHdvcmQgYnJlYWsgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IG9mIHRo
ZSB3b3JkIGZvciBSVEwgdGV4dCwKKyAgICAvLyB3ZSBuZWVkIHRvIHVzZSBuZXh0V29yZFBvc2l0
aW9uKCkgdG8gdHJhdmVyc2Ugd29yZHMgd2l0aGluIHRoZSBpbmxpbmUgYm94ZXMgZnJvbSByaWdo
dCB0byBsZWZ0IHRvIGZpbmQgdGhlIG5leHQgd29yZCBicmVhay4KKyAgICAvLyBUaGUgc2FtZSBh
cHBsaWVzIHRvIExUUiB0ZXh0LCBpbiB3aGljaCB3b3JkcyBhcmUgdHJhdmVyc2VkIHdpdGhpbiB0
aGUgaW5saW5lIGJveGVzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAKKyAgICAvLyBGSVhNRTog
aGFuZGxlIG11bHRpLXNwYWNlcyAoaHR0cDovL3dlYmtpdC5vcmcvYi81NzU0MykuCisgICAgCisg
ICAgYm9vbCBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID0gcHJldmlvdXNXb3JkQnJlYWsuaXNO
b3ROdWxsKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhayA9IGhhc1NlZW5Xb3JkQnJl
YWtJblRoaXNCb3ggPyBwcmV2aW91c1dvcmRCcmVhayA6IFBvc2l0aW9uKGJveC0+cmVuZGVyZXIo
KS0+bm9kZSgpLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOworICAgIHdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24od29yZEJyZWFr
KTsKKyAgICBsYXN0ID0gZmFsc2U7CisgICAgaWYgKHdvcmRCcmVhayA9PSBwcmV2aW91c1dvcmRC
cmVhaykgeworICAgICAgICBsYXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3Np
dGlvbigpOworICAgIH0KKyAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBvZmZzZXRPZldvcmRCcmVh
azsKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOworICAgIHdvcmRCcmVhay5nZXRJbmxp
bmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAv
LyAicHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhayIgaXMgdG8gY2hlY2sgdGhlIG9m
ZnNldCB2YWx1ZXMgYXJlIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwg
UlRMIGJveCAiRkVEIENCQSIgKGluIHZpc3VhbCBkaXNwbGF5KSBpbiBMVFIgYmxvY2ssIHdoZW4g
Y3Vyc29yIGlzIGF0IHRoZSBsZWZ0IG9mICJDQkEiLAorICAgIC8vIG5leHRXb3JkUG9zaXRpb24g
cmV0dXJucyBwb3NpdGlvbiByaWdodCBvZiAiQ0JBIiwgd2hpY2ggbmVlZHMgdG8gYmUgc2tpcHBl
ZCB0byBrZWVwIHRoZSB0aGUgb2Zmc2V0cyBvcmRlcmVkIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAg
ICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94ICYmICghaGFzU2VlbldvcmRCcmVha0luVGhpc0Jv
eCB8fCBwcmV2aW91c09mZnNldCA8IG9mZnNldE9mV29yZEJyZWFrKSkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKKyAgICBsYXN0ID0gdHJ1ZTsKKyAgICAvLyBBZGQgdGhlIGxlZnRtb3N0IHdv
cmQgYnJlYWsgZm9yIFJUTCBib3ggb3IgcmlnaHRtb3N0IHdvcmQgYnJlYWsgZm9yIExUUiBib3gu
CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAg
ICBib29sIGhhc1JUTFByZXZpb3VzQm94ID0gcHJldmlvdXNMZWFmICYmICFwcmV2aW91c0xlYWYt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94
LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgYm9vbCBoYXNMVFJOZXh0Qm94ID0gbmV4dExlYWYgJiYg
bmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBWaXNpYmxlUG9zaXRpb24g
Ym91bmRhcnlQb3NpdGlvbjsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgIWhh
c1JUTFByZXZpb3VzQm94KQorICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gbGVmdG1vc3RQb3Np
dGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gsIHByZXZpb3VzTGVhZiwgbmV4dExlYWYpOworICAg
IGVsc2UgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICFoYXNMVFJOZXh0Qm94KQorICAg
ICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxv
Y2soYm94LCBwcmV2aW91c0xlYWYsIG5leHRMZWFmKTsKKyAgICBpZiAoIWJvdW5kYXJ5UG9zaXRp
b24uaXNOdWxsKCkpIHsKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbihib3Vu
ZGFyeVBvc2l0aW9uKTsKKyAgICAgICAgaWYgKHdvcmRCcmVhayAhPSBib3VuZGFyeVBvc2l0aW9u
KQorICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24od29yZEJyZWFr
KTsKKyAgICAgICAgd29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVh
aywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94
KQorICAgICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICB9CisgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbigpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGNvbGxlY3RPbmVXb3Jk
QnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVj
dGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaywgYm9vbCYgbGFzdCkKK3sKKyAgICBsYXN0ID0gZmFsc2U7CisgICAgVmlz
aWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9j
a0RpcmVjdGlvbikgeworICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgcHJldmlvdXNXb3JkQnJlYWss
IG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgaWYgKHdvcmRCcmVhay5pc051bGwoKSkKKyAg
ICAgICAgICAgIGxhc3QgPSB0cnVlOworICAgIH0gZWxzZQorICAgICAgICB3b3JkQnJlYWsgPSBu
ZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShi
b3gsIHByZXZpb3VzV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgbGFzdCk7CisgICAgcmV0
dXJuIHdvcmRCcmVhazsKK30KKyAgICAKK3N0YXRpYyB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5C
b3goY29uc3QgSW5saW5lQm94KiBib3gsIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24sIFZl
Y3RvcjxzdGQ6OnBhaXI8VmlzaWJsZVBvc2l0aW9uLCBpbnQ+LCA1MD4mIHdvcmRCb3VuZGFyaWVz
KQoreworICAgIHdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAgaW50IG9mZnNldDsKKyAgICBi
b29sIGxhc3QgPSBmYWxzZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gY29sbGVj
dE9uZVdvcmRCcmVha0luQm94KGJveCwgYmxvY2tEaXJlY3Rpb24sIFZpc2libGVQb3NpdGlvbigp
LCBvZmZzZXQsIGxhc3QpOworICAgIHdoaWxlICghbGFzdCkgeworICAgICAgICB3b3JkQm91bmRh
cmllcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIod29yZEJyZWFrLCBvZmZzZXQpKTsKKyAgICAgICAg
d29yZEJyZWFrID0gY29sbGVjdE9uZVdvcmRCcmVha0luQm94KGJveCwgYmxvY2tEaXJlY3Rpb24s
IHdvcmRCcmVhaywgb2Zmc2V0LCBsYXN0KTsKKyAgICB9CisgICAgaWYgKCF3b3JkQnJlYWsuaXNO
dWxsKCkpCisgICAgICAgIHdvcmRCb3VuZGFyaWVzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcih3b3Jk
QnJlYWssIG9mZnNldCkpOworfQorICAgIAogc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91
c1dvcmRCcmVha0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0RGly
ZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQogewogICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IDA7
CkBAIC0xMTg5LDYgKzEyOTYsODUgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dv
cmRCcmVhawogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KIAorc3RhdGljIGludCBn
cmVhdGVzdExlc3NPZmZzZXQoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0luU2FtZURpcmVj
dGlvbiwgY29uc3QgVmVjdG9yPHN0ZDo6cGFpcjxWaXNpYmxlUG9zaXRpb24sIGludD4sIDUwPiYg
d29yZEJvdW5kYXJpZXMpCit7CisgICAgaW50IGluZGV4ID0gaW52YWxpZE9mZnNldDsgLy8gTm90
IEZvdW5kCisgICAgaWYgKCF3b3JkQm91bmRhcmllcy5zaXplKCkpCisgICAgICAgIHJldHVybiBp
bmRleDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBpZiAoYm94QW5kQmxvY2tJ
blNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRC
b3VuZGFyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNb
aV0uc2Vjb25kIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgICAgZm9yIChpbnQgaSA9IHdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsg
LS1pKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNbaV0uc2Vjb25kIDwgb2Zmc2V0
KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKwor
c3RhdGljIGludCBsZWFzdEdyZWF0ZXJPZmZzZXQoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9j
a0luU2FtZURpcmVjdGlvbiwgY29uc3QgVmVjdG9yPHN0ZDo6cGFpcjxWaXNpYmxlUG9zaXRpb24s
IGludD4sIDUwPiYgd29yZEJvdW5kYXJpZXMpCit7CisgICAgaW50IGluZGV4ID0gaW52YWxpZE9m
ZnNldDsgLy8gTm90IEZvdW5kCisgICAgaWYgKCF3b3JkQm91bmRhcmllcy5zaXplKCkpCisgICAg
ICAgIHJldHVybiBpbmRleDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBpZiAo
Ym94QW5kQmxvY2tJblNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHdvcmRC
b3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAod29y
ZEJvdW5kYXJpZXNbaV0uc2Vjb25kID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXgg
PSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRCb3VuZGFy
aWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNbaV0uc2Vj
b25kID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBp
bmRleDsKK30KKwkKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrQ2FuZGlkYXRlKFRl
eHREaXJlY3Rpb24gYm94RGlyZWN0aW9uLCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uLCBX
ZWJDb3JlOjpTZWxlY3Rpb25EaXJlY3Rpb24gc2VhcmNoRGlyZWN0aW9uLCBjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK3sKKwlWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFr
OworCWlmIChib3hEaXJlY3Rpb24gPT0gYmxvY2tEaXJlY3Rpb24pIHsKKwkJaWYgKChib3hEaXJl
Y3Rpb24gPT0gTFRSICYmIHNlYXJjaERpcmVjdGlvbiA9PSBXZWJDb3JlOjpEaXJlY3Rpb25SaWdo
dCkKKwkJCXx8IChib3hEaXJlY3Rpb24gPT0gUlRMICYmIHNlYXJjaERpcmVjdGlvbiA9PSBXZWJD
b3JlOjpEaXJlY3Rpb25MZWZ0KSkgeworCQkJLy8gVGhlIHdvcmQgYm91bmRhcnkgYXQgdGhlIHJp
Z2h0IG9mIHNwYWNlIGlmIHNwYWNlIGlzIHVzZWQgdG8gc2VnbWVudCB3b3Jkcy4KKwkJCVZpc2li
bGVQb3NpdGlvbiBuZXh0ID0gbmV4dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworCQkJ
VmlzaWJsZVBvc2l0aW9uIG5leHROZXh0ID0gbmV4dFdvcmRQb3NpdGlvbihuZXh0KTsKKwkJCWlm
IChuZXh0ID09IG5leHROZXh0KQorCQkJCXJldHVybiB2aXNpYmxlUG9zaXRpb247CisJCQl3b3Jk
QnJlYWsgPSBwcmV2aW91c1dvcmRQb3NpdGlvbihuZXh0TmV4dCk7CisJCX0gZWxzZQorCQkJd29y
ZEJyZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKwl9IGVsc2Ug
eworCQlpZiAoKGJveERpcmVjdGlvbiA9PSBMVFIgJiYgc2VhcmNoRGlyZWN0aW9uID09IFdlYkNv
cmU6OkRpcmVjdGlvbkxlZnQpCisJCQl8fCAoYm94RGlyZWN0aW9uID09IFJUTCAmJiBzZWFyY2hE
aXJlY3Rpb24gPT0gV2ViQ29yZTo6RGlyZWN0aW9uUmlnaHQpKSB7CisJCQkvLyBUaGUgd29yZCBi
b3VuZGFyeSBhdCB0aGUgbGVmdCBvZiBzcGFjZSBpZiBzcGFjZSBpcyB1c2VkIHRvIHNlZ21lbnQg
d29yZHMuCisJCQlWaXNpYmxlUG9zaXRpb24gcHJldmlvdXMgPSBwcmV2aW91c1dvcmRQb3NpdGlv
bih2aXNpYmxlUG9zaXRpb24pOworCQkJVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzUHJldmlvdXMg
PSBwcmV2aW91c1dvcmRQb3NpdGlvbihwcmV2aW91cyk7CisJCQlpZiAocHJldmlvdXMgPT0gcHJl
dmlvdXNQcmV2aW91cykKKwkJCQl3b3JkQnJlYWsgPSBwcmV2aW91czsKKwkJCWVsc2UKKwkJCQl3
b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKHByZXZpb3VzUHJldmlvdXMpOworCQl9IGVsc2UK
KwkJCXdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKwl9CisJ
cmV0dXJuIHdvcmRCcmVhazsKK30KKwkKKwkKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdFdv
cmRCb3VuZGFyeShjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlv
biBibG9ja0RpcmVjdGlvbikKIHsKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwpAQCAt
MTIzMSw4ICsxNDE3LDIyIEBAIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0
IFYKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKICAgICAg
ICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsK
ICAgICAKLSAgICAvLyBGSVhNRTogTm90IGltcGxlbWVudGVkLgotICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oKTsKKwlWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gd29yZEJyZWFrQ2FuZGlk
YXRlKGJveC0+ZGlyZWN0aW9uKCksIGJsb2NrRGlyZWN0aW9uLCBXZWJDb3JlOjpEaXJlY3Rpb25M
ZWZ0LCB2aXNpYmxlUG9zaXRpb24pOworICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7Cisg
ICAgaW50IG9mZnNldE9mV29yZEJyZWFrOworICAgIHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRP
ZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICBpZiAoYm94ID09
IGJveE9mV29yZEJyZWFrICYmIG9mZnNldE9mV29yZEJyZWFrICE9IGJveE9mV29yZEJyZWFrLT5j
YXJldE1heE9mZnNldCgpICYmIG9mZnNldE9mV29yZEJyZWFrICE9IGJveE9mV29yZEJyZWFrLT5j
YXJldE1pbk9mZnNldCgpKQorICAgICAgICByZXR1cm4gd29yZEJyZWFrOworICAgIC8vIE90aGVy
d2lzZSwgZmlyc3QgY29sbGVjdCBhbGwgd29yZCBicmVha3MgaW4gdGVybXMgb2YgKFZpc2libGVQ
b3NpdGlvbiwgb2Zmc2V0KSBpbnNpZGUgdGhlIGJveC4KKyAgICBWZWN0b3I8c3RkOjpwYWlyPFZp
c2libGVQb3NpdGlvbiwgaW50PiwgNTA+IHdvcmRCb3VuZGFyaWVzOworICAgIGNvbGxlY3RXb3Jk
QnJlYWtzSW5Cb3goYm94LCBibG9ja0RpcmVjdGlvbiwgd29yZEJvdW5kYXJpZXMpOworCS8vIFRo
ZW4sIHNlYXJjaCBmb3Igd29yZCBib3VuZGFyaWVzIGluc2lkZSB0aGUgYm94LgorCWludCBpbmRl
eCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gZ3JlYXRlc3RMZXNzT2Zmc2V0KG9m
ZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCB3b3JkQm91bmRhcmllcykgOgorCSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhc3RHcmVhdGVyT2Zmc2V0KG9m
ZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gUlRMLCB3b3JkQm91bmRhcmllcyk7CisJaWYgKGluZGV4
ICE9IGludmFsaWRPZmZzZXQpCisJCXJldHVybiB3b3JkQm91bmRhcmllc1tpbmRleF0uZmlyc3Q7
CisJLy8gSWYgbm90IGZvdW5kLCBzZWFyY2ggZm9yIHdvcmQgYm91bmRhcmllcyBpbiB2aXN1YWxs
eSBhZGphY2VudCBib3hlcy4KKwlyZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gtPnByZXZMZWFm
Q2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwogfQogCiBWaXNpYmxlUG9z
aXRpb24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9z
aXRpb24pCkBAIC0xMjQ1LDEwICsxNDQ1LDIxIEBAIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQ
b3NpdGlvbihjb25zdCAKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNl
dCgpKQogICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2Nr
RGlyZWN0aW9uKTsKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSkKLSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgp
LCAtMSwgYmxvY2tEaXJlY3Rpb24pOwotICAgIAotICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50
ZWQuCi0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgICAgICByZXR1cm4gcmlnaHRX
b3JkQm91bmRhcnkoYm94LT5uZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGly
ZWN0aW9uKTsKKyAKKwlWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gd29yZEJyZWFrQ2FuZGlk
YXRlKGJveC0+ZGlyZWN0aW9uKCksIGJsb2NrRGlyZWN0aW9uLCBXZWJDb3JlOjpEaXJlY3Rpb25S
aWdodCwgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOwor
ICAgIGludCBvZmZzZXRPZldvcmRCcmVhazsKKyAgICB3b3JkQnJlYWsuZ2V0SW5saW5lQm94QW5k
T2Zmc2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgaWYgKGJveCA9
PSBib3hPZldvcmRCcmVhayAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3hPZldvcmRCcmVhay0+
Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3hPZldvcmRCcmVhay0+
Y2FyZXRNaW5PZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICBWZWN0b3I8
c3RkOjpwYWlyPFZpc2libGVQb3NpdGlvbiwgaW50PiwgNTA+IHdvcmRCb3VuZGFyaWVzOworICAg
IGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goYm94LCBibG9ja0RpcmVjdGlvbiwgd29yZEJvdW5kYXJp
ZXMpOworICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gbGVh
c3RHcmVhdGVyT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCB3b3JkQm91bmRh
cmllcykgOgorCQkJCQkJCQkJCQkJZ3JlYXRlc3RMZXNzT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJl
Y3Rpb24gPT0gUlRMLCB3b3JkQm91bmRhcmllcyk7CisgICAgaWYgKGluZGV4ICE9IGludmFsaWRP
ZmZzZXQpCisgICAgICAgIHJldHVybiB3b3JkQm91bmRhcmllc1tpbmRleF0uZmlyc3Q7CisgICAg
cmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zm
c2V0LCBibG9ja0RpcmVjdGlvbik7CiB9CiAKIH0KSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxv
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyODkxKQor
KysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAK
KzIwMTEtMDQtMDQgIFhpYW9tZWkgSmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQg
d2l0aCBtb3ZpbmcgY2FyZXQgYnkgd29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgICogZWRp
dGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVjdGVkLnR4dDoKKwogMjAx
MS0wNC0wNCAgQWRyaWVubmUgV2Fsa2VyICA8ZW5uZUBnb29nbGUuY29tPgogCiAgICAgICAgIFVu
cmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI4Mjg4MC4KSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcv
c2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gODI4NDgpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVj
dGlvbi9tb3ZlLWJ5LXdvcmQtdmlzdWFsbHktZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC0yLDM0ICsyLDM0IEBACiA9PT09PT09PSBNb3ZlIEJ5IFdvcmQgPT09PQogVGVzdCAxLCBMVFI6
CiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgNCwgOCwg
MTIsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5XQorImFi
YyBkZWYgaGlqIG9wcSByc3QiWzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVk
OiBbNCwgOCwgMTIsIDE2LCAxOSwgMTldCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJhYmMgZGVm
IGhpaiBvcHEgcnN0IlsxNiwgMTYsIDEyLCA4LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTYs
IDEyLCA4LCA0LCAwLCAwXQorImFiYyBkZWYgaGlqIG9wcSByc3QiWzE2LCAxMiwgOCwgNCwgMCwg
MF0KIFRlc3QgMiwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3Bx
IHJzdCJbMCwgMTUsIDExLCA3LCAzLCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywg
MywgMTksIDE5XQorImFiYyBkZWYgaGlqIG9wcSByc3QiWzAsIDExLCA3LCAzLCAzLCAxOV0gICAg
RkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywgMywgMTksIDE5XQogTW92ZSByaWdodCBieSBvbmUg
d29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwg
ZXhwZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCisiYWJjIGRlZiBoaWogb3BxIHJzdCJbMTks
IDcsIDExLCAxNSwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0K
IFRlc3QgMywgTFRSOgogTW92ZSByaWdodCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIENDQyBY
WFgiWzAsIDE1LCAxMSwgNywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMs
IDE5LCAxOV0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlswLCAxMSwgNywgMywgMywgMTldICAgIEZB
SUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KIE1vdmUgbGVmdCBieSBvbmUgd29y
ZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTksIDcs
IDExLCAxNSwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KIFRl
c3QgNCwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJb
MCwgNCwgOCwgMTIsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTks
IDE5XQorIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlM
IGV4cGVjdGVkOiBbNCwgOCwgMTIsIDE2LCAxOSwgMTldCiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3Jk
Ci0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTYsIDE2LCAxMiwgOCwgNCwgMF0gICAgRkFJTCBleHBl
Y3RlZDogWzE2LCAxMiwgOCwgNCwgMCwgMF0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlsxNiwgMTIs
IDgsIDQsIDAsIDBdCiBUZXN0IDUsIExUUjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMg
ZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMCwgNCwgOCwgMTEsIDE2LCAyMCwgMjNdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFs0LCA4LCAxMSwgMTYsIDIwLCAyMywgMjNdCisiYWJjIGRlZiBaUUIgUklHIHV2dyB4
eXoiWzAsIDQsIDgsIDExLCAyMCwgMjAsIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEs
IDE2LCAyMCwgMjMsIDIzXQogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklH
IHV2dyB4eXoiWzIwLCAyMCwgMTYsIDExLCA0LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMjAs
IDE2LCAxMSwgOCwgNCwgMCwgMF0KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMjAsIDE2LCA0
LCA4LCA0LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMjAsIDE2LCAxMSwgOCwgNCwgMCwgMF0K
IFRlc3QgNiwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2
dyB4eXoiWzAsIDMsIDgsIDEyLCAxNiwgMTksIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgOCwg
MTIsIDE2LCAxOSwgMjMsIDIzXQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCAzLCAxMiwg
MTIsIDE2LCAxOSwgMjNdICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA4LCAxMiwgMTYsIDE5LCAyMywg
MjNdCiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzEy
LCAxOSwgMTIsIDEyLCA4LCAzLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTksIDE2LCAxMiwgOCwg
MywgMCwgMF0KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMTIsIDE2LCAxMiwgOCwgOCwgMCwg
MF0gICAgRkFJTCBleHBlY3RlZDogWzE5LCAxNiwgMTIsIDgsIDMsIDAsIDBdCiBUZXN0IDcsIExU
UjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKICJaUUIgYWJjIFJJRyJbMCwgNCwgOCwgMTFdICAg
IEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMSwgMTFdCkBAIC0zOSw1ICszOSw1IEBAIFRlc3QgOCwg
UlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCiAiWlFCIGFiYyBSSUciWzAsIDQsIDgsIDExXSAg
ICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEsIDExXQogTW92ZSByaWdodCBieSBvbmUgd29yZAot
IlpRQiBhYmMgUklHIls4LCA4LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbOCwgNCwgMCwgMF0K
KyJaUUIgYWJjIFJJRyJbOCwgMCwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzgsIDQsIDAsIDBd
CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88162</attachid>
            <date>2011-04-04 16:57:14 -0700</date>
            <delta_ts>2011-04-05 15:29:01 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v1</filename>
            <type>text/plain</type>
            <size>17616</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyODkxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjcgQEAKKzIwMTEtMDQtMDQgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dp
dGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0T25l
V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdFdvcmRCcmVha3NJbkJv
eCk6CisgICAgICAgIChXZWJDb3JlOjpncmVhdGVzdExlc3NPZmZzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6bGVhc3RHcmVhdGVyT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OndvcmRCcmVha0Nh
bmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OnJpZ2h0V29yZFBvc2l0aW9uKToKKwogMjAxMS0wNC0wNCAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0g
QmFydGguCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHJl
dmlzaW9uIDgyODQ4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw2ICsxMTczLDExMyBAQCBzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIHdvcmRCcmVhazsKIH0KIAorc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKGNv
bnN0IElubGluZUJveCogYm94LCBjb25zdCBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiwgY29uc3Qg
SW5saW5lQm94KiBuZXh0TGVhZikKK3sKKyAgICAvLyBGSVhNRTogUHJvYmFibHkgbmVlZCB0byB0
YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCisgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0
OworICAgIE5vZGUqIG5vZGUgPSBib3gtPnJlbmRlcmVyKCktPm5vZGUoKTsKKyAgICBpZiAocHJl
dmlvdXNMZWFmICYmICFwcmV2aW91c0xlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAg
ICAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKG5leHRMZWFmICYmICFuZXh0
TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgIHJldHVybiBwcmV2aW91
c0xlYWYgPyBQb3NpdGlvbihwcmV2aW91c0xlYWYtPnJlbmRlcmVyKCktPm5vZGUoKSwgcHJldmlv
dXNMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yKSA6CisgICAgICAgIFBvc2l0aW9uKG5vZGUsIDAsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOworICAgIH0KKyAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJl
dE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKK30KKwor
c3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9j
ayhjb25zdCBJbmxpbmVCb3gqIGJveCwgY29uc3QgSW5saW5lQm94KiBwcmV2aW91c0xlYWYsIGNv
bnN0IElubGluZUJveCogbmV4dExlYWYpCit7CisgICAgLy8gRklYTUU6IFByb2JhYmx5IG5lZWQg
dG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgorICAgIFZpc2libGVQb3NpdGlvbiByaWdo
dG1vc3Q7CisgICAgTm9kZSogbm9kZSA9IGJveC0+cmVuZGVyZXIoKS0+bm9kZSgpOworICAgIGlm
IChuZXh0TGVhZiAmJiBuZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSAgICAKKyAg
ICAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKHByZXZpb3VzTGVhZiAmJiBw
cmV2aW91c0xlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkgeworICAgICAgICByZXR1cm4g
bmV4dExlYWYgPyBQb3NpdGlvbihuZXh0TGVhZi0+cmVuZGVyZXIoKS0+bm9kZSgpLCBuZXh0TGVh
Zi0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikg
OgorICAgICAgICBQb3NpdGlvbihub2RlLCAwLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKTsKKyAgICB9CisgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNaW5P
ZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cit9CisgICAgCisg
ICAgCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KAorICAgIGNvbnN0IElubGluZUJveCogYm94LCBj
b25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29y
ZEJyZWFrLCBib29sJiBsYXN0KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRh
a2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICAKKyAgICAvLyBJbiBhIExUUiBibG9jaywg
dGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEgd29yZC4K
KyAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBy
aWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCisgICAgLy8gQmVjYXVzZSBwcmV2aW91c1dvcmRQb3Np
dGlvbigpIHJldHVybnMgdGhlIHdvcmQgYnJlYWsgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IG9mIHRo
ZSB3b3JkIGZvciBSVEwgdGV4dCwKKyAgICAvLyB3ZSBuZWVkIHRvIHVzZSBuZXh0V29yZFBvc2l0
aW9uKCkgdG8gdHJhdmVyc2Ugd29yZHMgd2l0aGluIHRoZSBpbmxpbmUgYm94ZXMgZnJvbSByaWdo
dCB0byBsZWZ0IHRvIGZpbmQgdGhlIG5leHQgd29yZCBicmVhay4KKyAgICAvLyBUaGUgc2FtZSBh
cHBsaWVzIHRvIExUUiB0ZXh0LCBpbiB3aGljaCB3b3JkcyBhcmUgdHJhdmVyc2VkIHdpdGhpbiB0
aGUgaW5saW5lIGJveGVzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAKKyAgICAvLyBGSVhNRTog
aGFuZGxlIG11bHRpLXNwYWNlcyAoaHR0cDovL3dlYmtpdC5vcmcvYi81NzU0MykuCisgICAgCisg
ICAgYm9vbCBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID0gcHJldmlvdXNXb3JkQnJlYWsuaXNO
b3ROdWxsKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhayA9IGhhc1NlZW5Xb3JkQnJl
YWtJblRoaXNCb3ggPyBwcmV2aW91c1dvcmRCcmVhayA6IFBvc2l0aW9uKGJveC0+cmVuZGVyZXIo
KS0+bm9kZSgpLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOworICAgIHdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24od29yZEJyZWFr
KTsKKyAgICBsYXN0ID0gZmFsc2U7CisgICAgaWYgKHdvcmRCcmVhayA9PSBwcmV2aW91c1dvcmRC
cmVhaykgeworICAgICAgICBsYXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3Np
dGlvbigpOworICAgIH0KKyAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBvZmZzZXRPZldvcmRCcmVh
azsKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOworICAgIHdvcmRCcmVhay5nZXRJbmxp
bmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAv
LyAicHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhayIgaXMgdG8gY2hlY2sgdGhlIG9m
ZnNldCB2YWx1ZXMgYXJlIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwg
UlRMIGJveCAiRkVEIENCQSIgKGluIHZpc3VhbCBkaXNwbGF5KSBpbiBMVFIgYmxvY2ssIHdoZW4g
Y3Vyc29yIGlzIGF0IHRoZSBsZWZ0IG9mICJDQkEiLAorICAgIC8vIG5leHRXb3JkUG9zaXRpb24g
cmV0dXJucyBwb3NpdGlvbiByaWdodCBvZiAiQ0JBIiwgd2hpY2ggbmVlZHMgdG8gYmUgc2tpcHBl
ZCB0byBrZWVwIHRoZSB0aGUgb2Zmc2V0cyBvcmRlcmVkIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAg
ICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94ICYmICghaGFzU2VlbldvcmRCcmVha0luVGhpc0Jv
eCB8fCBwcmV2aW91c09mZnNldCA8IG9mZnNldE9mV29yZEJyZWFrKSkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKKyAgICBsYXN0ID0gdHJ1ZTsKKyAgICAvLyBBZGQgdGhlIGxlZnRtb3N0IHdv
cmQgYnJlYWsgZm9yIFJUTCBib3ggb3IgcmlnaHRtb3N0IHdvcmQgYnJlYWsgZm9yIExUUiBib3gu
CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAg
ICBib29sIGhhc1JUTFByZXZpb3VzQm94ID0gcHJldmlvdXNMZWFmICYmICFwcmV2aW91c0xlYWYt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94
LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgYm9vbCBoYXNMVFJOZXh0Qm94ID0gbmV4dExlYWYgJiYg
bmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBWaXNpYmxlUG9zaXRpb24g
Ym91bmRhcnlQb3NpdGlvbjsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgIWhh
c1JUTFByZXZpb3VzQm94KQorICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gbGVmdG1vc3RQb3Np
dGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gsIHByZXZpb3VzTGVhZiwgbmV4dExlYWYpOworICAg
IGVsc2UgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICFoYXNMVFJOZXh0Qm94KQorICAg
ICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxv
Y2soYm94LCBwcmV2aW91c0xlYWYsIG5leHRMZWFmKTsKKyAgICBpZiAoIWJvdW5kYXJ5UG9zaXRp
b24uaXNOdWxsKCkpIHsKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbihib3Vu
ZGFyeVBvc2l0aW9uKTsKKyAgICAgICAgaWYgKHdvcmRCcmVhayAhPSBib3VuZGFyeVBvc2l0aW9u
KQorICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24od29yZEJyZWFr
KTsKKyAgICAgICAgd29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVh
aywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94
KQorICAgICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICB9CisgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbigpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGNvbGxlY3RPbmVXb3Jk
QnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVj
dGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaywgYm9vbCYgbGFzdCkKK3sKKyAgICBsYXN0ID0gZmFsc2U7CisgICAgVmlz
aWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9j
a0RpcmVjdGlvbikgeworICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgcHJldmlvdXNXb3JkQnJlYWss
IG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgaWYgKHdvcmRCcmVhay5pc051bGwoKSkKKyAg
ICAgICAgICAgIGxhc3QgPSB0cnVlOworICAgIH0gZWxzZQorICAgICAgICB3b3JkQnJlYWsgPSBu
ZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShi
b3gsIHByZXZpb3VzV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgbGFzdCk7CisgICAgcmV0
dXJuIHdvcmRCcmVhazsKK30KKyAgICAKK3N0YXRpYyB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5C
b3goY29uc3QgSW5saW5lQm94KiBib3gsIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24sIFZl
Y3RvcjxzdGQ6OnBhaXI8VmlzaWJsZVBvc2l0aW9uLCBpbnQ+LCA1MD4mIHdvcmRCb3VuZGFyaWVz
KQoreworICAgIHdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAgaW50IG9mZnNldDsKKyAgICBi
b29sIGxhc3QgPSBmYWxzZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gY29sbGVj
dE9uZVdvcmRCcmVha0luQm94KGJveCwgYmxvY2tEaXJlY3Rpb24sIFZpc2libGVQb3NpdGlvbigp
LCBvZmZzZXQsIGxhc3QpOworICAgIHdoaWxlICghbGFzdCkgeworICAgICAgICB3b3JkQm91bmRh
cmllcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIod29yZEJyZWFrLCBvZmZzZXQpKTsKKyAgICAgICAg
d29yZEJyZWFrID0gY29sbGVjdE9uZVdvcmRCcmVha0luQm94KGJveCwgYmxvY2tEaXJlY3Rpb24s
IHdvcmRCcmVhaywgb2Zmc2V0LCBsYXN0KTsKKyAgICB9CisgICAgaWYgKCF3b3JkQnJlYWsuaXNO
dWxsKCkpCisgICAgICAgIHdvcmRCb3VuZGFyaWVzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcih3b3Jk
QnJlYWssIG9mZnNldCkpOworfQorICAgIAogc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91
c1dvcmRCcmVha0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0RGly
ZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQogewogICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IDA7
CkBAIC0xMTg5LDYgKzEyOTYsODUgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dv
cmRCcmVhawogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KIAorc3RhdGljIGludCBn
cmVhdGVzdExlc3NPZmZzZXQoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0luU2FtZURpcmVj
dGlvbiwgY29uc3QgVmVjdG9yPHN0ZDo6cGFpcjxWaXNpYmxlUG9zaXRpb24sIGludD4sIDUwPiYg
d29yZEJvdW5kYXJpZXMpCit7CisgICAgaW50IGluZGV4ID0gaW52YWxpZE9mZnNldDsgLy8gTm90
IEZvdW5kCisgICAgaWYgKCF3b3JkQm91bmRhcmllcy5zaXplKCkpCisgICAgICAgIHJldHVybiBp
bmRleDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBpZiAoYm94QW5kQmxvY2tJ
blNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRC
b3VuZGFyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNb
aV0uc2Vjb25kIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgICAgZm9yIChpbnQgaSA9IHdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsg
LS1pKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNbaV0uc2Vjb25kIDwgb2Zmc2V0
KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKwor
c3RhdGljIGludCBsZWFzdEdyZWF0ZXJPZmZzZXQoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9j
a0luU2FtZURpcmVjdGlvbiwgY29uc3QgVmVjdG9yPHN0ZDo6cGFpcjxWaXNpYmxlUG9zaXRpb24s
IGludD4sIDUwPiYgd29yZEJvdW5kYXJpZXMpCit7CisgICAgaW50IGluZGV4ID0gaW52YWxpZE9m
ZnNldDsgLy8gTm90IEZvdW5kCisgICAgaWYgKCF3b3JkQm91bmRhcmllcy5zaXplKCkpCisgICAg
ICAgIHJldHVybiBpbmRleDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBpZiAo
Ym94QW5kQmxvY2tJblNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHdvcmRC
b3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAod29y
ZEJvdW5kYXJpZXNbaV0uc2Vjb25kID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXgg
PSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRCb3VuZGFy
aWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNbaV0uc2Vj
b25kID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBp
bmRleDsKK30KKyAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrQ2FuZGlkYXRlKFRl
eHREaXJlY3Rpb24gYm94RGlyZWN0aW9uLCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uLCBX
ZWJDb3JlOjpTZWxlY3Rpb25EaXJlY3Rpb24gc2VhcmNoRGlyZWN0aW9uLCBjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK3sKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJy
ZWFrOworICAgIGlmIChib3hEaXJlY3Rpb24gPT0gYmxvY2tEaXJlY3Rpb24pIHsKKyAgICAgICAg
aWYgKChib3hEaXJlY3Rpb24gPT0gTFRSICYmIHNlYXJjaERpcmVjdGlvbiA9PSBXZWJDb3JlOjpE
aXJlY3Rpb25SaWdodCkKKyAgICAgICAgICAgIHx8IChib3hEaXJlY3Rpb24gPT0gUlRMICYmIHNl
YXJjaERpcmVjdGlvbiA9PSBXZWJDb3JlOjpEaXJlY3Rpb25MZWZ0KSkgeworICAgICAgICAgICAg
Ly8gVGhlIHdvcmQgYm91bmRhcnkgYXQgdGhlIHJpZ2h0IG9mIHNwYWNlIGlmIHNwYWNlIGlzIHVz
ZWQgdG8gc2VnbWVudCB3b3Jkcy4KKyAgICAgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXh0ID0g
bmV4dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworICAgICAgICAgICAgVmlzaWJsZVBv
c2l0aW9uIG5leHROZXh0ID0gbmV4dFdvcmRQb3NpdGlvbihuZXh0KTsKKyAgICAgICAgICAgIGlm
IChuZXh0ID09IG5leHROZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiB2aXNpYmxlUG9zaXRp
b247CisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRQb3NpdGlvbihuZXh0TmV4
dCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3Jk
UG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGJv
eERpcmVjdGlvbiA9PSBMVFIgJiYgc2VhcmNoRGlyZWN0aW9uID09IFdlYkNvcmU6OkRpcmVjdGlv
bkxlZnQpCisgICAgICAgICAgICB8fCAoYm94RGlyZWN0aW9uID09IFJUTCAmJiBzZWFyY2hEaXJl
Y3Rpb24gPT0gV2ViQ29yZTo6RGlyZWN0aW9uUmlnaHQpKSB7CisgICAgICAgICAgICAvLyBUaGUg
d29yZCBib3VuZGFyeSBhdCB0aGUgbGVmdCBvZiBzcGFjZSBpZiBzcGFjZSBpcyB1c2VkIHRvIHNl
Z21lbnQgd29yZHMuCisgICAgICAgICAgICBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXMgPSBwcmV2
aW91c1dvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworICAgICAgICAgICAgVmlzaWJsZVBv
c2l0aW9uIHByZXZpb3VzUHJldmlvdXMgPSBwcmV2aW91c1dvcmRQb3NpdGlvbihwcmV2aW91cyk7
CisgICAgICAgICAgICBpZiAocHJldmlvdXMgPT0gcHJldmlvdXNQcmV2aW91cykKKyAgICAgICAg
ICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91czsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKHByZXZpb3VzUHJldmlvdXMpOwor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24o
dmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHdvcmRCcmVhazsKK30KKyAKKyAK
IHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRCb3VuZGFyeShjb25zdCBJbmxpbmVCb3gq
IGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKIHsKICAgICBW
aXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwpAQCAtMTIzMSw4ICsxNDE3LDIyIEBAIFZpc2libGVQ
b3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFYKICAgICBpZiAob2Zmc2V0ID09IGJveC0+
Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKICAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnko
Ym94LCBvZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKICAgICAKLSAgICAvLyBGSVhNRTogTm90IGlt
cGxlbWVudGVkLgotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICBWaXNpYmxlUG9z
aXRpb24gd29yZEJyZWFrID0gd29yZEJyZWFrQ2FuZGlkYXRlKGJveC0+ZGlyZWN0aW9uKCksIGJs
b2NrRGlyZWN0aW9uLCBXZWJDb3JlOjpEaXJlY3Rpb25MZWZ0LCB2aXNpYmxlUG9zaXRpb24pOwor
ICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7CisgICAgaW50IG9mZnNldE9mV29yZEJyZWFr
OworICAgIHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9m
ZnNldE9mV29yZEJyZWFrKTsKKyAgICBpZiAoYm94ID09IGJveE9mV29yZEJyZWFrICYmIG9mZnNl
dE9mV29yZEJyZWFrICE9IGJveE9mV29yZEJyZWFrLT5jYXJldE1heE9mZnNldCgpICYmIG9mZnNl
dE9mV29yZEJyZWFrICE9IGJveE9mV29yZEJyZWFrLT5jYXJldE1pbk9mZnNldCgpKQorICAgICAg
ICByZXR1cm4gd29yZEJyZWFrOworICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgY29sbGVjdCBhbGwg
d29yZCBicmVha3MgaW4gdGVybXMgb2YgKFZpc2libGVQb3NpdGlvbiwgb2Zmc2V0KSBpbnNpZGUg
dGhlIGJveC4KKyAgICBWZWN0b3I8c3RkOjpwYWlyPFZpc2libGVQb3NpdGlvbiwgaW50PiwgNTA+
IHdvcmRCb3VuZGFyaWVzOworICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goYm94LCBibG9ja0Rp
cmVjdGlvbiwgd29yZEJvdW5kYXJpZXMpOworICAgIC8vIFRoZW4sIHNlYXJjaCBmb3Igd29yZCBi
b3VuZGFyaWVzIGluc2lkZSB0aGUgYm94LgorICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpID8gZ3JlYXRlc3RMZXNzT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJlY3Rp
b24gPT0gTFRSLCB3b3JkQm91bmRhcmllcykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbGVhc3RHcmVhdGVyT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJlY3Rp
b24gPT0gUlRMLCB3b3JkQm91bmRhcmllcyk7CisgICAgaWYgKGluZGV4ICE9IGludmFsaWRPZmZz
ZXQpCisgICAgICAgIHJldHVybiB3b3JkQm91bmRhcmllc1tpbmRleF0uZmlyc3Q7CisgICAgLy8g
SWYgbm90IGZvdW5kLCBzZWFyY2ggZm9yIHdvcmQgYm91bmRhcmllcyBpbiB2aXN1YWxseSBhZGph
Y2VudCBib3hlcy4KKyAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gtPnByZXZMZWFmQ2hp
bGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwogfQogCiBWaXNpYmxlUG9zaXRp
b24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRp
b24pCkBAIC0xMjQ1LDEwICsxNDQ1LDIxIEBAIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3Np
dGlvbihjb25zdCAKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgp
KQogICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uKTsKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkK
LSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCAt
MSwgYmxvY2tEaXJlY3Rpb24pOwotICAgIAotICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQu
Ci0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgICAgICByZXR1cm4gcmlnaHRXb3Jk
Qm91bmRhcnkoYm94LT5uZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0
aW9uKTsKKyAKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gd29yZEJyZWFrQ2FuZGlk
YXRlKGJveC0+ZGlyZWN0aW9uKCksIGJsb2NrRGlyZWN0aW9uLCBXZWJDb3JlOjpEaXJlY3Rpb25S
aWdodCwgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOwor
ICAgIGludCBvZmZzZXRPZldvcmRCcmVhazsKKyAgICB3b3JkQnJlYWsuZ2V0SW5saW5lQm94QW5k
T2Zmc2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgaWYgKGJveCA9
PSBib3hPZldvcmRCcmVhayAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3hPZldvcmRCcmVhay0+
Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3hPZldvcmRCcmVhay0+
Y2FyZXRNaW5PZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICBWZWN0b3I8
c3RkOjpwYWlyPFZpc2libGVQb3NpdGlvbiwgaW50PiwgNTA+IHdvcmRCb3VuZGFyaWVzOworICAg
IGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goYm94LCBibG9ja0RpcmVjdGlvbiwgd29yZEJvdW5kYXJp
ZXMpOworICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gbGVh
c3RHcmVhdGVyT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCB3b3JkQm91bmRh
cmllcykgOgorICAgICAgICAgICAgZ3JlYXRlc3RMZXNzT2Zmc2V0KG9mZnNldCwgYmxvY2tEaXJl
Y3Rpb24gPT0gUlRMLCB3b3JkQm91bmRhcmllcyk7CisgICAgaWYgKGluZGV4ICE9IGludmFsaWRP
ZmZzZXQpCisgICAgICAgIHJldHVybiB3b3JkQm91bmRhcmllc1tpbmRleF0uZmlyc3Q7CisgICAg
cmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zm
c2V0LCBibG9ja0RpcmVjdGlvbik7CiB9CiAKIH0KSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxv
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyODkxKQor
KysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAK
KzIwMTEtMDQtMDQgIFhpYW9tZWkgSmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQg
d2l0aCBtb3ZpbmcgY2FyZXQgYnkgd29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgICogZWRp
dGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVjdGVkLnR4dDoKKwogMjAx
MS0wNC0wNCAgQWRyaWVubmUgV2Fsa2VyICA8ZW5uZUBnb29nbGUuY29tPgogCiAgICAgICAgIFVu
cmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI4Mjg4MC4KSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcv
c2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gODI4NDgpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVj
dGlvbi9tb3ZlLWJ5LXdvcmQtdmlzdWFsbHktZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC0yLDM0ICsyLDM0IEBACiA9PT09PT09PSBNb3ZlIEJ5IFdvcmQgPT09PQogVGVzdCAxLCBMVFI6
CiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgNCwgOCwg
MTIsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5XQorImFi
YyBkZWYgaGlqIG9wcSByc3QiWzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVk
OiBbNCwgOCwgMTIsIDE2LCAxOSwgMTldCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJhYmMgZGVm
IGhpaiBvcHEgcnN0IlsxNiwgMTYsIDEyLCA4LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTYs
IDEyLCA4LCA0LCAwLCAwXQorImFiYyBkZWYgaGlqIG9wcSByc3QiWzE2LCAxMiwgOCwgNCwgMCwg
MF0KIFRlc3QgMiwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3Bx
IHJzdCJbMCwgMTUsIDExLCA3LCAzLCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywg
MywgMTksIDE5XQorImFiYyBkZWYgaGlqIG9wcSByc3QiWzAsIDExLCA3LCAzLCAzLCAxOV0gICAg
RkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywgMywgMTksIDE5XQogTW92ZSByaWdodCBieSBvbmUg
d29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwg
ZXhwZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCisiYWJjIGRlZiBoaWogb3BxIHJzdCJbMTks
IDcsIDExLCAxNSwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0K
IFRlc3QgMywgTFRSOgogTW92ZSByaWdodCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIENDQyBY
WFgiWzAsIDE1LCAxMSwgNywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMs
IDE5LCAxOV0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlswLCAxMSwgNywgMywgMywgMTldICAgIEZB
SUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KIE1vdmUgbGVmdCBieSBvbmUgd29y
ZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTksIDcs
IDExLCAxNSwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KIFRl
c3QgNCwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJb
MCwgNCwgOCwgMTIsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTks
IDE5XQorIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlM
IGV4cGVjdGVkOiBbNCwgOCwgMTIsIDE2LCAxOSwgMTldCiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3Jk
Ci0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTYsIDE2LCAxMiwgOCwgNCwgMF0gICAgRkFJTCBleHBl
Y3RlZDogWzE2LCAxMiwgOCwgNCwgMCwgMF0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlsxNiwgMTIs
IDgsIDQsIDAsIDBdCiBUZXN0IDUsIExUUjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMg
ZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMCwgNCwgOCwgMTEsIDE2LCAyMCwgMjNdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFs0LCA4LCAxMSwgMTYsIDIwLCAyMywgMjNdCisiYWJjIGRlZiBaUUIgUklHIHV2dyB4
eXoiWzAsIDQsIDgsIDExLCAyMCwgMjAsIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEs
IDE2LCAyMCwgMjMsIDIzXQogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklH
IHV2dyB4eXoiWzIwLCAyMCwgMTYsIDExLCA0LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMjAs
IDE2LCAxMSwgOCwgNCwgMCwgMF0KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMjAsIDE2LCA0
LCA4LCA0LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMjAsIDE2LCAxMSwgOCwgNCwgMCwgMF0K
IFRlc3QgNiwgUlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2
dyB4eXoiWzAsIDMsIDgsIDEyLCAxNiwgMTksIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgOCwg
MTIsIDE2LCAxOSwgMjMsIDIzXQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCAzLCAxMiwg
MTIsIDE2LCAxOSwgMjNdICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA4LCAxMiwgMTYsIDE5LCAyMywg
MjNdCiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzEy
LCAxOSwgMTIsIDEyLCA4LCAzLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTksIDE2LCAxMiwgOCwg
MywgMCwgMF0KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMTIsIDE2LCAxMiwgOCwgOCwgMCwg
MF0gICAgRkFJTCBleHBlY3RlZDogWzE5LCAxNiwgMTIsIDgsIDMsIDAsIDBdCiBUZXN0IDcsIExU
UjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKICJaUUIgYWJjIFJJRyJbMCwgNCwgOCwgMTFdICAg
IEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMSwgMTFdCkBAIC0zOSw1ICszOSw1IEBAIFRlc3QgOCwg
UlRMOgogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCiAiWlFCIGFiYyBSSUciWzAsIDQsIDgsIDExXSAg
ICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEsIDExXQogTW92ZSByaWdodCBieSBvbmUgd29yZAot
IlpRQiBhYmMgUklHIls4LCA4LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbOCwgNCwgMCwgMF0K
KyJaUUIgYWJjIFJJRyJbOCwgMCwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzgsIDQsIDAsIDBd
CiAK
</data>
<flag name="review"
          id="80638"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88319</attachid>
            <date>2011-04-05 15:29:01 -0700</date>
            <delta_ts>2011-04-06 16:14:01 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v2</filename>
            <type>text/plain</type>
            <size>18628</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyOTkwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDQtMDUgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpsYXN0V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAo
V2ViQ29yZTo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94KToKKyAgICAgICAgKFdlYkNv
cmU6Om5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFs
aXR5KToKKyAgICAgICAgKFdlYkNvcmU6OndvcmRCcmVha0luQm94KToKKyAgICAgICAgKFdlYkNv
cmU6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6Z3JlYXRlc3RW
YWx1ZVVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnNtYWxsZXN0T2Zmc2V0QWJvdmUpOgorICAg
ICAgICAoV2ViQ29yZTo6cG9zaXRpb25Jc0luc2lkZUJveCk6CisgICAgICAgIChXZWJDb3JlOjpw
b3NpdGlvbkFmdGVyTmV4dFdvcmQpOgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpb25CZWZvcmVQ
cmV2aW91c1dvcmQpOgorICAgICAgICAoV2ViQ29yZTo6bGVmdFdvcmRQb3NpdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpyaWdodFdvcmRQb3NpdGlvbik6CisKIDIwMTEtMDQtMDUgIFZzZXZvbG9k
IFZsYXNvdiAgPHZzZXZpa0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgUGF2
ZWwgRmVsZG1hbi4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNw
cAkocmV2aXNpb24gODI4NDgpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTczLDYgKzExNzMsMTM2IEBAIHN0YXRpYyBWaXNp
YmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWsKICAgICByZXR1cm4gd29yZEJyZWFrOwogfQog
CitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxv
Y2soY29uc3QgSW5saW5lQm94KiBib3gpCit7CisgICAgLy8gRklYTUU6IFByb2JhYmx5IG5lZWQg
dG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgorICAgIFZpc2libGVQb3NpdGlvbiBsZWZ0
bW9zdDsKKyAgICBOb2RlKiBub2RlID0gYm94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAgSW5s
aW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVC
b3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7ICAgIAorICAgIGlmIChwcmV2aW91
c0xlYWYgJiYgIXByZXZpb3VzTGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAg
ICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBpZiAobmV4dExlYWYgJiYgIW5leHRMZWFm
LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgaWYgKHByZXZpb3VzTGVhZikK
KyAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbihwcmV2aW91c0xlYWYtPnJlbmRlcmVyKCktPm5v
ZGUoKSwgcHJldmlvdXNMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25J
c09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIDAsIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIH0KKyAgICByZXR1cm4gUG9zaXRp
b24obm9kZSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNl
dEluQW5jaG9yKTsKK30KKworc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlv
bkluTFRSQm94SW5SVExCbG9jayhjb25zdCBJbmxpbmVCb3gqIGJveCkKK3sKKyAgICAvLyBGSVhN
RTogUHJvYmFibHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCisgICAgVmlz
aWJsZVBvc2l0aW9uIHJpZ2h0bW9zdDsKKyAgICBOb2RlKiBub2RlID0gYm94LT5yZW5kZXJlcigp
LT5ub2RlKCk7CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hp
bGQoKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7ICAg
ICAgICAKKyAgICBpZiAobmV4dExlYWYgJiYgbmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSkgICAgCisgICAgICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0TWF4T2Zm
c2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIGlmIChwcmV2
aW91c0xlYWYgJiYgcHJldmlvdXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAg
ICAgICAgaWYgKG5leHRMZWFmKQorICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uKG5leHRMZWFm
LT5yZW5kZXJlcigpLT5ub2RlKCksIG5leHRMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgcmV0dXJuIFBvc2l0aW9uKG5v
ZGUsIDAsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIH0KKyAgICBy
ZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9z
aXRpb25Jc09mZnNldEluQW5jaG9yKTsKK30KKyAgICAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24g
bGFzdFdvcmRCcmVha0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29y
ZEJyZWFrKQoreworICAgIC8vIEFkZCB0aGUgbGVmdG1vc3Qgd29yZCBicmVhayBmb3IgUlRMIGJv
eCBvciByaWdodG1vc3Qgd29yZCBicmVhayBmb3IgTFRSIGJveC4KKyAgICBJbmxpbmVCb3gqIHBy
ZXZpb3VzTGVhZiA9IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAgIElubGluZUJveCogbmV4dExl
YWYgPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gYm91bmRhcnlQ
b3NpdGlvbjsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgKCFwcmV2aW91c0xl
YWYgfHwgcHJldmlvdXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBi
b3VuZGFyeVBvc2l0aW9uID0gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gp
OworICAgIGVsc2UgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICghbmV4dExlYWYgfHwg
IW5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBib3VuZGFyeVBv
c2l0aW9uID0gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soYm94KTsKKyAgICBp
ZiAoYm91bmRhcnlQb3NpdGlvbi5pc05vdE51bGwoKSkgeyAvLyBib3VuZGFyeVBvc2l0aW9uIGlz
IG5vdCBudWxsIG9ubHkgaW4gdGhlIGFib3ZlIDIgY2FzZXMuCisgICAgICAgIFZpc2libGVQb3Np
dGlvbiB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKGJvdW5kYXJ5UG9zaXRpb24pOworICAg
ICAgICBpZiAod29yZEJyZWFrICE9IGJvdW5kYXJ5UG9zaXRpb24pCisgICAgICAgICAgICB3b3Jk
QnJlYWsgPSBwcmV2aW91c1dvcmRQb3NpdGlvbih3b3JkQnJlYWspOworICAgICAgICBJbmxpbmVC
b3gqIGJveE9mV29yZEJyZWFrOworICAgICAgICB3b3JkQnJlYWsuZ2V0SW5saW5lQm94QW5kT2Zm
c2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgICAgIGlmIChib3hP
ZldvcmRCcmVhayA9PSBib3gpCisgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOworICAgIH0K
KyAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7ICAgIAorfQorCitzdGF0aWMgYm9vbCBwb3Np
dGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJl
YWssIGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQoreworICAg
IGludCBwcmV2aW91c09mZnNldCA9IG9mZnNldE9mV29yZEJyZWFrOworICAgIElubGluZUJveCog
Ym94T2ZXb3JkQnJlYWs7CisgICAgd29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hP
ZldvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgIC8vICJwcmV2aW91c09mZnNldCA8
IG9mZnNldE9mV29yZEJyZWFrIiBpcyB0byBndWFyYW50ZWUgdGhhdCB0aGUgd29yZCBicmVha3Mg
Y29sbGVjdGVkIGFyZSB2aXN1YWxseSBvcmRlcmVkLgorICAgIGlmIChib3hPZldvcmRCcmVhayA9
PSBib3ggJiYgKHByZXZpb3VzT2Zmc2V0ID09IGludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZz
ZXQgPCBvZmZzZXRPZldvcmRCcmVhaykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVy
biBmYWxzZTsKK30KKyAgICAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCcmVha0lu
Qm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoCisgICAgY29uc3QgSW5s
aW5lQm94KiBib3gsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGlu
dCYgb2Zmc2V0T2ZXb3JkQnJlYWssIGJvb2wmIGlzTGFzdFdvcmRCcmVha0luQm94KQoreworICAg
IC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4K
KyAgICAKKyAgICAvLyBJbiBhIExUUiBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9u
IHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEgd29yZC4KKyAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhl
IHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSByaWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCisg
ICAgLy8gQmVjYXVzZSBwcmV2aW91c1dvcmRQb3NpdGlvbigpIHJldHVybnMgdGhlIHdvcmQgYnJl
YWsgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IG9mIHRoZSB3b3JkIGZvciBSVEwgdGV4dCwKKyAgICAv
LyB3ZSBuZWVkIHRvIHVzZSBuZXh0V29yZFBvc2l0aW9uKCkgdG8gdHJhdmVyc2Ugd29yZHMgd2l0
aGluIHRoZSBpbmxpbmUgYm94ZXMgZnJvbSByaWdodCB0byBsZWZ0IHRvIGZpbmQgdGhlIG5leHQg
d29yZCBicmVhay4KKyAgICAvLyBUaGUgc2FtZSBhcHBsaWVzIHRvIExUUiB0ZXh0LCBpbiB3aGlj
aCB3b3JkcyBhcmUgdHJhdmVyc2VkIHdpdGhpbiB0aGUgaW5saW5lIGJveGVzIGZyb20gbGVmdCB0
byByaWdodC4KKyAgICAKKyAgICAvLyBGSVhNRTogaGFuZGxlIG11bHRpLXNwYWNlcyAoaHR0cDov
L3dlYmtpdC5vcmcvYi81NzU0MykuCisgICAgCisgICAgYm9vbCBoYXNTZWVuV29yZEJyZWFrSW5U
aGlzQm94ID0gcHJldmlvdXNXb3JkQnJlYWsuaXNOb3ROdWxsKCk7CisgICAgVmlzaWJsZVBvc2l0
aW9uIHdvcmRCcmVhayA9IGhhc1NlZW5Xb3JkQnJlYWtJblRoaXNCb3ggPyBwcmV2aW91c1dvcmRC
cmVhayA6IFBvc2l0aW9uKGJveC0+cmVuZGVyZXIoKS0+bm9kZSgpLCBib3gtPmNhcmV0TWluT2Zm
c2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIHdvcmRCcmVh
ayA9IG5leHRXb3JkUG9zaXRpb24od29yZEJyZWFrKTsKKyAgICAKKyAgICBpc0xhc3RXb3JkQnJl
YWtJbkJveCA9IGZhbHNlOworICAgIGlmICh3b3JkQnJlYWsgPT0gcHJldmlvdXNXb3JkQnJlYWsp
IHsKKyAgICAgICAgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSB0cnVlOworICAgICAgICByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLy8gR2l2ZW4gUlRMIGJveCAiQUJDIERF
RiIgZWl0aGVyIGZvbGxvd3MgYSBMVFIgYm94IG9yIGlzIHRoZSBmaXJzdCB2aXN1YWwgYm94IGlu
IGFuIExUUiBibG9jayBhcyBhbiBleGFtcGxlLAorICAgIC8vIHRoZSB2aXN1YWwgZGlzcGxheSBv
ZiB0aGUgUlRMIGJveCBpczogIigwKUooMTApSSg5KUgoOCkgKDcpRig2KUUoNSlEKDQpICgzKUMo
MilCKDEpQSgxMSkiLAorICAgIC8vIHdoZXJlIHRoZSBudW1iZXIgaW4gcGFyZW50aGVzaXMgcmVw
cmVzZW50cyBvZmZzZXQgaW4gdmlzaWJsZVBvc2l0aW9uLiAKKyAgICAvLyBTdGFydCBhdCBvZmZz
ZXQgMCwgdGhlIGZpcnN0IHdvcmQgYnJlYWsgaXMgYXQgb2Zmc2V0IDMsIHRoZSAybmQgd29yZCBi
cmVhayBpcyBhdCBvZmZzZXQgNywgYW5kIHRoZSAzcmQgd29yZCBicmVhayBzaG91bGQgYmUgYXQg
b2Zmc2V0IDAuCisgICAgLy8gQnV0IG5leHRXb3JkUG9zaXRpb24oKSBvZiBvZmZzZXQgNyBpcyBv
ZmZzZXQgMTEsIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLCAKKyAgICAvLyBhbmQgdGhlIHBvc2l0
aW9uIGF0IG9mZnNldCAwIHNob3VsZCBiZSBtYW51YWxseSBhZGRlZCBhcyB0aGUgbGFzdCB3b3Jk
IGJyZWFrIHdpdGhpbiB0aGUgYm94LgorICAgIGlmIChwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVk
SW5Cb3god29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKKyAgICAKKyAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IHRydWU7CisgICAg
cmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9mV29yZEJyZWFrKTsKK30KKwor
c3RhdGljIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJv
eCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBw
cmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhaywgYm9vbCYgaXNMYXN0V29y
ZEJyZWFrSW5Cb3gpCit7CisgICAgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKKyAgICBW
aXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOworICAgIGlmIChib3gtPmRpcmVjdGlvbigpID09IGJs
b2NrRGlyZWN0aW9uKSB7CisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJyZWFrSW5C
b3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoYm94LCBwcmV2aW91c1dvcmRCcmVh
aywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQor
ICAgICAgICAgICAgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSB0cnVlOworICAgIH0gZWxzZQorICAg
ICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJl
bnREaXJlY3Rpb25hbGl0eShib3gsIHByZXZpb3VzV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVh
aywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgIHJldHVybiB3b3JkQnJlYWs7Cit9CisgICAg
CitzdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94KGNvbnN0IElubGluZUJveCogYm94
LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uLCBWZWN0b3I8c3RkOjpwYWlyPFZpc2libGVQ
b3NpdGlvbiwgaW50PiwgNTA+JiB3b3JkQm91bmRhcmllcykKK3sKKyAgICB3b3JkQm91bmRhcmll
cy5jbGVhcigpOworICAgIGludCBvZmZzZXQgPSBpbnZhbGlkT2Zmc2V0OworICAgIGJvb2wgaXNM
YXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFr
ID0gd29yZEJyZWFrSW5Cb3goYm94LCBibG9ja0RpcmVjdGlvbiwgVmlzaWJsZVBvc2l0aW9uKCks
IG9mZnNldCwgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgIHdoaWxlICghaXNMYXN0V29yZEJy
ZWFrSW5Cb3gpIHsKKyAgICAgICAgd29yZEJvdW5kYXJpZXMuYXBwZW5kKHN0ZDo6bWFrZV9wYWly
KHdvcmRCcmVhaywgb2Zmc2V0KSk7CisgICAgICAgIHdvcmRCcmVhayA9IHdvcmRCcmVha0luQm94
KGJveCwgYmxvY2tEaXJlY3Rpb24sIHdvcmRCcmVhaywgb2Zmc2V0LCBpc0xhc3RXb3JkQnJlYWtJ
bkJveCk7CisgICAgfQorICAgIGlmICghd29yZEJyZWFrLmlzTnVsbCgpKQorICAgICAgICB3b3Jk
Qm91bmRhcmllcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIod29yZEJyZWFrLCBvZmZzZXQpKTsKK30K
KyAgICAKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWtJbkJveChjb25z
dCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlv
bikKIHsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSAwOwpAQCAtMTE4OSw2ICsxMzE5LDQ0
IEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWsKICAgICByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAKK3N0YXRpYyBpbnQgZ3JlYXRlc3RWYWx1ZVVuZGVyKGlu
dCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFZlY3Rvcjxz
dGQ6OnBhaXI8VmlzaWJsZVBvc2l0aW9uLCBpbnQ+LCA1MD4mIHdvcmRCb3VuZGFyaWVzKQorewor
ICAgIGlmICghd29yZEJvdW5kYXJpZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gaW52YWxpZE9m
ZnNldDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBpZiAoYm94QW5kQmxvY2tJ
blNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHdvcmRC
b3VuZGFyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAod29yZEJvdW5kYXJpZXNb
aV0uc2Vjb25kIDwgb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIH0KKyAgICBmb3IgKGludCBpID0g
d29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgaWYgKHdv
cmRCb3VuZGFyaWVzW2ldLnNlY29uZCA8IG9mZnNldCkKKyAgICAgICAgICAgIHJldHVybiBpOwor
ICAgIH0KKyAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKK30KKworc3RhdGljIGludCBzbWFsbGVz
dE9mZnNldEFib3ZlKGludCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tJblNhbWVEaXJlY3Rpb24s
IGNvbnN0IFZlY3RvcjxzdGQ6OnBhaXI8VmlzaWJsZVBvc2l0aW9uLCBpbnQ+LCA1MD4mIHdvcmRC
b3VuZGFyaWVzKQoreworICAgIGlmICghd29yZEJvdW5kYXJpZXMuc2l6ZSgpKQorICAgICAgICBy
ZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KKyAgICBp
ZiAoYm94QW5kQmxvY2tJblNhbWVEaXJlY3Rpb24pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHdv
cmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAo
d29yZEJvdW5kYXJpZXNbaV0uc2Vjb25kID4gb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVy
biBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIH0KKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgd29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKHdvcmRCb3VuZGFyaWVzW2ldLnNlY29uZCA+IG9mZnNldCkKKyAgICAgICAg
ICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKK30KKyAKIHN0
YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRCb3VuZGFyeShjb25zdCBJbmxpbmVCb3gqIGJv
eCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKIHsKICAgICBWaXNp
YmxlUG9zaXRpb24gd29yZEJyZWFrOwpAQCAtMTIxNSw3ICsxMzgzLDM1IEBAIHN0YXRpYyBWaXNp
YmxlUG9zaXRpb24gcmlnaHRXb3JkQm91bmRhcnkKICAgICB9CiAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOwogfQorICAgIAorc3RhdGljIGJvb2wgcG9zaXRpb25Jc0luc2lkZUJveChjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gpCit7Cisg
ICAgSW5saW5lQm94KiBib3hPZldvcmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWs7
CisgICAgd29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zm
c2V0T2ZXb3JkQnJlYWspOworICAgIGlmIChib3ggPT0gYm94T2ZXb3JkQnJlYWsgJiYgb2Zmc2V0
T2ZXb3JkQnJlYWsgIT0gYm94LT5jYXJldE1heE9mZnNldCgpICYmIG9mZnNldE9mV29yZEJyZWFr
ICE9IGJveC0+Y2FyZXRNaW5PZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAK
KyAgICByZXR1cm4gZmFsc2U7Cit9CiAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25B
ZnRlck5leHRXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24pCit7CisgICAgVmlz
aWJsZVBvc2l0aW9uIG5leHQgPSBuZXh0V29yZFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICBWaXNp
YmxlUG9zaXRpb24gbmV4dE5leHQgPSBuZXh0V29yZFBvc2l0aW9uKG5leHQpOworICAgIGlmIChu
ZXh0ID09IG5leHROZXh0KQorICAgICAgICByZXR1cm4gbmV4dDsKKyAgICByZXR1cm4gcHJldmlv
dXNXb3JkUG9zaXRpb24obmV4dE5leHQpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHBv
c2l0aW9uQmVmb3JlUHJldmlvdXNXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24p
Cit7CisgICAgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzID0gcHJldmlvdXNXb3JkUG9zaXRpb24o
cG9zaXRpb24pOworICAgIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1ByZXZpb3VzID0gcHJldmlv
dXNXb3JkUG9zaXRpb24ocHJldmlvdXMpOworICAgIGlmIChwcmV2aW91cyA9PSBwcmV2aW91c1By
ZXZpb3VzKQorICAgICAgICByZXR1cm4gcHJldmlvdXM7CisgICAgcmV0dXJuIG5leHRXb3JkUG9z
aXRpb24ocHJldmlvdXNQcmV2aW91cyk7Cit9CisgICAgCiBWaXNpYmxlUG9zaXRpb24gbGVmdFdv
cmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsKICAg
ICBJbmxpbmVCb3gqIGJveDsKQEAgLTEyMzEsOCArMTQyNywzMyBAQCBWaXNpYmxlUG9zaXRpb24g
bGVmdFdvcmRQb3NpdGlvbihjb25zdCBWCiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0Umln
aHRtb3N0T2Zmc2V0KCkpCiAgICAgICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5KGJveCwgb2Zm
c2V0LCBibG9ja0RpcmVjdGlvbik7CiAgICAgCi0gICAgLy8gRklYTUU6IE5vdCBpbXBsZW1lbnRl
ZC4KLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgCisgICAgVmlzaWJsZVBvc2l0
aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlv
bikgeworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKQorICAgICAgICAgICAgd29y
ZEJyZWFrID0gcG9zaXRpb25BZnRlck5leHRXb3JkKHZpc2libGVQb3NpdGlvbik7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBvc2l0aW9uKHZpc2li
bGVQb3NpdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09
IFJUTCkKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHBvc2l0aW9uQmVmb3JlUHJldmlvdXNXb3Jk
KHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9
IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9CisgICAgaWYgKHBvc2l0
aW9uSXNJbnNpZGVCb3god29yZEJyZWFrLCBib3gpKQorICAgICAgICByZXR1cm4gd29yZEJyZWFr
OworICAgIAorICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgY29sbGVjdCBhbGwgd29yZCBicmVha3Mg
aW4gdGVybXMgb2YgKFZpc2libGVQb3NpdGlvbiwgb2Zmc2V0KSBpbnNpZGUgdGhlIGJveC4KKyAg
ICBWZWN0b3I8c3RkOjpwYWlyPFZpc2libGVQb3NpdGlvbiwgaW50PiwgNTA+IHdvcmRCb3VuZGFy
aWVzOworICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goYm94LCBibG9ja0RpcmVjdGlvbiwgd29y
ZEJvdW5kYXJpZXMpOworICAgIC8vIFRoZW4sIHNlYXJjaCBmb3Igd29yZCBib3VuZGFyaWVzIGlu
c2lkZSB0aGUgYm94LgorICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpID8gZ3JlYXRlc3RWYWx1ZVVuZGVyKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCB3
b3JkQm91bmRhcmllcykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc21hbGxlc3RPZmZzZXRBYm92ZShvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwg
d29yZEJvdW5kYXJpZXMpOworICAgIGlmIChpbmRleCAhPSBpbnZhbGlkT2Zmc2V0KQorICAgICAg
ICByZXR1cm4gd29yZEJvdW5kYXJpZXNbaW5kZXhdLmZpcnN0OworICAgIAorICAgIC8vIElmIG5v
dCBmb3VuZCwgc2VhcmNoIGZvciB3b3JkIGJvdW5kYXJpZXMgaW4gdmlzdWFsbHkgYWRqYWNlbnQg
Ym94ZXMuCisgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCks
IGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKIH0KIAogVmlzaWJsZVBvc2l0aW9uIHJp
Z2h0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQpA
QCAtMTI0NSwxMCArMTQ2NiwzMSBAQCBWaXNpYmxlUG9zaXRpb24gcmlnaHRXb3JkUG9zaXRpb24o
Y29uc3QgCiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKICAg
ICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveCwgb2Zmc2V0LCBibG9ja0RpcmVjdGlv
bik7CiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpCi0gICAg
ICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgLTEsIGJs
b2NrRGlyZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4
dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7CisgCisgICAgVmlz
aWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9j
a0RpcmVjdGlvbikgeworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gTFRSKQorICAgICAg
ICAgICAgd29yZEJyZWFrID0gcG9zaXRpb25BZnRlck5leHRXb3JkKHZpc2libGVQb3NpdGlvbik7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBvc2l0
aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJsb2NrRGly
ZWN0aW9uID09IExUUikKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHBvc2l0aW9uQmVmb3JlUHJl
dmlvdXNXb3JkKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdv
cmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9IAorICAg
IGlmIChwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaywgYm94KSkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKICAgICAKLSAgICAvLyBGSVhNRTogTm90IGltcGxlbWVudGVkLgotICAgIHJl
dHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICBWZWN0b3I8c3RkOjpwYWlyPFZpc2libGVQb3Np
dGlvbiwgaW50PiwgNTA+IHdvcmRCb3VuZGFyaWVzOworICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5C
b3goYm94LCBibG9ja0RpcmVjdGlvbiwgd29yZEJvdW5kYXJpZXMpOworICAgIGludCBpbmRleCA9
IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZShvZmZz
ZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgd29yZEJvdW5kYXJpZXMpIDoKKyAgICAgICAgICAg
IGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwgd29yZEJv
dW5kYXJpZXMpOworICAgIGlmIChpbmRleCAhPSBpbnZhbGlkT2Zmc2V0KQorICAgICAgICByZXR1
cm4gd29yZEJvdW5kYXJpZXNbaW5kZXhdLmZpcnN0OworICAgIAorICAgIHJldHVybiByaWdodFdv
cmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJl
Y3Rpb24pOwogfQogCiB9CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA4Mjk5MCkKKysrIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDExLTA0LTA1ICBY
aWFvbWVpIEppICA8eGppQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBDb250aW51ZSBleHBlcmltZW50IHdpdGggbW92aW5nIGNh
cmV0IGJ5IHdvcmQgaW4gdmlzdWFsIG9yZGVyLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc4MDYKKworICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9u
L21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQ6CisKIDIwMTEtMDQtMDUgIEplc3Np
ZSBCZXJsaW4gIDxqYmVybGluQGFwcGxlLmNvbT4KIAogICAgICAgICAzIHRlc3RzIGZhaWwgb24g
YXBwbGUtbWFjcHJvLTYgKGR1ZSB0byBkaWZmZXJlbnQgSlMgTUlNRSB0eXBlKSBidXQgbm90IGFu
eSBvdGhlciBMZW9wYXJkCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9tb3Zl
LWJ5LXdvcmQtdmlzdWFsbHktZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L2VkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQJKHJl
dmlzaW9uIDgyODQ4KQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1ieS13
b3JkLXZpc3VhbGx5LWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMiwzNCArMiwzNCBA
QAogPT09PT09PT0gTW92ZSBCeSBXb3JkID09PT0KIFRlc3QgMSwgTFRSOgogTW92ZSByaWdodCBi
eSBvbmUgd29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzAsIDQsIDgsIDEyLCAxNiwgMTldICAg
IEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMiwgMTYsIDE5LCAxOV0KKyJhYmMgZGVmIGhpaiBvcHEg
cnN0IlswLCA4LCAxMiwgMTYsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAx
NiwgMTksIDE5XQogTW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJb
MTYsIDE2LCAxMiwgOCwgNCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzE2LCAxMiwgOCwgNCwgMCwg
MF0KKyJhYmMgZGVmIGhpaiBvcHEgcnN0IlsxNiwgMTIsIDgsIDQsIDAsIDBdCiBUZXN0IDIsIFJU
TDoKIE1vdmUgbGVmdCBieSBvbmUgd29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzAsIDE1LCAx
MSwgNywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KKyJh
YmMgZGVmIGhpaiBvcHEgcnN0IlswLCAxMSwgNywgMywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6
IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMgZGVm
IGhpaiBvcHEgcnN0IlsxOSwgMywgNywgMTEsIDE1LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywg
NywgMTEsIDE1LCAwLCAwXQorImFiYyBkZWYgaGlqIG9wcSByc3QiWzE5LCA3LCAxMSwgMTUsIDAs
IDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCiBUZXN0IDMsIExUUjoK
IE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJaWlogUVFRIEJCQiBDQ0MgWFhYIlswLCAxNSwgMTEs
IDcsIDMsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbMTUsIDExLCA3LCAzLCAxOSwgMTldCisiWlpa
IFFRUSBCQkIgQ0NDIFhYWCJbMCwgMTEsIDcsIDMsIDMsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBb
MTUsIDExLCA3LCAzLCAxOSwgMTldCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJaWlogUVFRIEJC
QiBDQ0MgWFhYIlsxOSwgMywgNywgMTEsIDE1LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgNywg
MTEsIDE1LCAwLCAwXQorIlpaWiBRUVEgQkJCIENDQyBYWFgiWzE5LCA3LCAxMSwgMTUsIDAsIDBd
ICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCiBUZXN0IDQsIFJUTDoKIE1v
dmUgbGVmdCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDQsIDgsIDEyLCAx
NiwgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMiwgMTYsIDE5LCAxOV0KKyJaWlogUVFR
IEJCQiBDQ0MgWFhYIlswLCA4LCAxMiwgMTYsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQs
IDgsIDEyLCAxNiwgMTksIDE5XQogTW92ZSByaWdodCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJC
IENDQyBYWFgiWzE2LCAxNiwgMTIsIDgsIDQsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNiwgMTIs
IDgsIDQsIDAsIDBdCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTYsIDEyLCA4LCA0LCAwLCAwXQog
VGVzdCA1LCBMVFI6CiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2
dyB4eXoiWzAsIDQsIDgsIDExLCAxNiwgMjAsIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwg
MTEsIDE2LCAyMCwgMjMsIDIzXQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCA0LCA4LCAx
MSwgMjAsIDIwLCAyM10gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDExLCAxNiwgMjAsIDIzLCAy
M10KIE1vdmUgbGVmdCBieSBvbmUgd29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlsyMCwg
MjAsIDE2LCAxMSwgNCwgNCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzIwLCAxNiwgMTEsIDgsIDQs
IDAsIDBdCisiYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzIwLCAxNiwgNCwgOCwgNCwgMCwgMF0g
ICAgRkFJTCBleHBlY3RlZDogWzIwLCAxNiwgMTEsIDgsIDQsIDAsIDBdCiBUZXN0IDYsIFJUTDoK
IE1vdmUgbGVmdCBieSBvbmUgd29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCAzLCA4
LCAxMiwgMTYsIDE5LCAyM10gICAgRkFJTCBleHBlY3RlZDogWzMsIDgsIDEyLCAxNiwgMTksIDIz
LCAyM10KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMCwgMywgMTIsIDEyLCAxNiwgMTksIDIz
XSAgICBGQUlMIGV4cGVjdGVkOiBbMywgOCwgMTIsIDE2LCAxOSwgMjMsIDIzXQogTW92ZSByaWdo
dCBieSBvbmUgd29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlsxMiwgMTksIDEyLCAxMiwg
OCwgMywgMF0gICAgRkFJTCBleHBlY3RlZDogWzE5LCAxNiwgMTIsIDgsIDMsIDAsIDBdCisiYWJj
IGRlZiBaUUIgUklHIHV2dyB4eXoiWzEyLCAxNiwgMTIsIDgsIDgsIDAsIDBdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFsxOSwgMTYsIDEyLCA4LCAzLCAwLCAwXQogVGVzdCA3LCBMVFI6CiBNb3ZlIHJpZ2h0
IGJ5IG9uZSB3b3JkCiAiWlFCIGFiYyBSSUciWzAsIDQsIDgsIDExXSAgICBGQUlMIGV4cGVjdGVk
OiBbNCwgOCwgMTEsIDExXQpAQCAtMzksNSArMzksNSBAQCBUZXN0IDgsIFJUTDoKIE1vdmUgbGVm
dCBieSBvbmUgd29yZAogIlpRQiBhYmMgUklHIlswLCA0LCA4LCAxMV0gICAgRkFJTCBleHBlY3Rl
ZDogWzQsIDgsIDExLCAxMV0KIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJaUUIgYWJjIFJJRyJb
OCwgOCwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzgsIDQsIDAsIDBdCisiWlFCIGFiYyBSSUci
WzgsIDAsIDAsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFs4LCA0LCAwLCAwXQogCg==
</data>
<flag name="review"
          id="80814"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88540</attachid>
            <date>2011-04-06 16:14:01 -0700</date>
            <delta_ts>2011-04-07 10:06:24 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v3</filename>
            <type>text/plain</type>
            <size>19465</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgzMTE3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTEtMDQtMDYgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpsYXN0V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAo
V2ViQ29yZTo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9ja1dpdGhEaWZmZXJl
bnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0V29yZEJyZWFrSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3Jl
OjpXb3JkQm91bmRhcnlFbnRyeTo6V29yZEJvdW5kYXJ5RW50cnkpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpncmVhdGVzdFZh
bHVlVW5kZXIpOgorICAgICAgICAoV2ViQ29yZTo6c21hbGxlc3RPZmZzZXRBYm92ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnBv
c2l0aW9uQmVmb3JlTmV4dFdvcmQpOgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpb25BZnRlclBy
ZXZpb3VzV29yZCk6CisgICAgICAgIChXZWJDb3JlOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OnJpZ2h0V29yZFBvc2l0aW9uKToKKwogMjAxMS0wNC0wNiAgTGVhbmRybyBH
cmFjaWEgR2lsICA8bGVhbmRyb2dyYWNpYUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgU3RldmUgQmxvY2suCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91
bml0cy5jcHAJKHJldmlzaW9uIDgyODQ4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNp
YmxlX3VuaXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw2ICsxMTczLDE1MSBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIHdvcmRCcmVh
azsKIH0KIAorc3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJ
bkxUUkJsb2NrKGNvbnN0IElubGluZUJveCogYm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJs
eSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0g
Ym94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBi
b3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0
TGVhZkNoaWxkKCk7ICAgCisgICAgCisgICAgaWYgKHByZXZpb3VzTGVhZiAmJiAhcHJldmlvdXNM
ZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIHJldHVybiBQb3NpdGlvbihu
b2RlLCBib3gtPmNhcmV0TWF4T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworICAgIGlmIChuZXh0TGVhZiAmJiAhbmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSkgeworICAgICAgICBpZiAocHJldmlvdXNMZWFmKQorICAgICAgICAgICAgcmV0dXJu
IFBvc2l0aW9uKHByZXZpb3VzTGVhZi0+cmVuZGVyZXIoKS0+bm9kZSgpLCBwcmV2aW91c0xlYWYt
PmNhcmV0TWF4T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwor
ICAgICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgMCwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgfQorICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0
TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworfQorCitz
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2Nr
KGNvbnN0IElubGluZUJveCogYm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRv
IHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0gYm94LT5yZW5k
ZXJlcigpLT5ub2RlKCk7CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZM
ZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxk
KCk7ICAgCisgICAgCisgICAgaWYgKG5leHRMZWFmICYmIG5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkpICAgIAorICAgICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJl
dE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBp
ZiAocHJldmlvdXNMZWFmICYmIHByZXZpb3VzTGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KSB7CisgICAgICAgIGlmIChuZXh0TGVhZikKKyAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbihu
ZXh0TGVhZi0+cmVuZGVyZXIoKS0+bm9kZSgpLCBuZXh0TGVhZi0+Y2FyZXRNYXhPZmZzZXQoKSwg
UG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHJldHVybiBQb3Np
dGlvbihub2RlLCAwLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICB9
CisgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNaW5PZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cit9CisgICAgCitzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIGxhc3RXb3JkQnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaykKK3sKKyAgICAvLyBBZGQgdGhlIGxlZnRtb3N0IHdvcmQgYnJlYWsgZm9y
IFJUTCBib3ggb3IgcmlnaHRtb3N0IHdvcmQgYnJlYWsgZm9yIExUUiBib3guCisgICAgSW5saW5l
Qm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVCb3gq
IG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIGJv
dW5kYXJ5UG9zaXRpb247CisgICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gUlRMICYmICghcHJl
dmlvdXNMZWFmIHx8IHByZXZpb3VzTGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSkKKyAg
ICAgICAgYm91bmRhcnlQb3NpdGlvbiA9IGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxv
Y2soYm94KTsKKyAgICBlbHNlIGlmIChib3gtPmRpcmVjdGlvbigpID09IExUUiAmJiAoIW5leHRM
ZWFmIHx8ICFuZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSkKKyAgICAgICAgYm91
bmRhcnlQb3NpdGlvbiA9IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGJveCk7
CisgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24uaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBWaXNp
YmxlUG9zaXRpb24oKTsgICAgICAgICAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFr
ID0gbmV4dFdvcmRQb3NpdGlvbihib3VuZGFyeVBvc2l0aW9uKTsKKyAgICBpZiAod29yZEJyZWFr
ICE9IGJvdW5kYXJ5UG9zaXRpb24pCisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBv
c2l0aW9uKHdvcmRCcmVhayk7CisgICAgSW5saW5lQm94KiBib3hPZldvcmRCcmVhazsKKyAgICB3
b3JkQnJlYWsuZ2V0SW5saW5lQm94QW5kT2Zmc2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldv
cmRCcmVhayk7CisgICAgaWYgKGJveE9mV29yZEJyZWFrID09IGJveCkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKKyAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7ICAgIAorfQorCitzdGF0
aWMgYm9vbCBwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVu
dERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFrLCBjb25zdCBJ
bmxpbmVCb3gqIGJveCwgaW50JiBvZmZzZXRPZldvcmRCcmVhaykKK3sKKyAgICBpbnQgcHJldmlv
dXNPZmZzZXQgPSBvZmZzZXRPZldvcmRCcmVhazsKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJy
ZWFrOworICAgIHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWss
IG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94ICYmIChw
cmV2aW91c09mZnNldCA9PSBpbnZhbGlkT2Zmc2V0IHx8IHByZXZpb3VzT2Zmc2V0IDwgb2Zmc2V0
T2ZXb3JkQnJlYWspKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisgICAgCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJs
b2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KAorICAgIGNvbnN0IElubGluZUJveCogYm94
LCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9m
V29yZEJyZWFrLCBib29sJiBpc0xhc3RXb3JkQnJlYWtJbkJveCkKK3sKKyAgICAvLyBGSVhNRTog
UHJvYmFibHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCisgICAgCisgICAg
Ly8gSW4gYSBMVFIgYmxvY2ssIHRoZSB3b3JkIGJyZWFrIHNob3VsZCBiZSBvbiB0aGUgbGVmdCBi
b3VuZGFyeSBvZiBhIHdvcmQuCisgICAgLy8gSW4gYSBSVEwgYmxvY2ssIHRoZSB3b3JkIGJyZWFr
IHNob3VsZCBiZSBvbiB0aGUgcmlnaHQgYm91bmRhcnkgb2YgYSB3b3JkLgorICAgIC8vIEJlY2F1
c2UgcHJldmlvdXNXb3JkUG9zaXRpb24oKSByZXR1cm5zIHRoZSB3b3JkIGJyZWFrIG9uIHRoZSBy
aWdodCBib3VuZGFyeSBvZiB0aGUgd29yZCBmb3IgUlRMIHRleHQsCisgICAgLy8gd2UgbmVlZCB0
byB1c2UgbmV4dFdvcmRQb3NpdGlvbigpIHRvIHRyYXZlcnNlIHdvcmRzIHdpdGhpbiB0aGUgaW5s
aW5lIGJveGVzIGZyb20gcmlnaHQgdG8gbGVmdCB0byBmaW5kIHRoZSBuZXh0IHdvcmQgYnJlYWsu
CisgICAgLy8gVGhlIHNhbWUgYXBwbGllcyB0byBMVFIgdGV4dCwgaW4gd2hpY2ggd29yZHMgYXJl
IHRyYXZlcnNlZCB3aXRoaW4gdGhlIGlubGluZSBib3hlcyBmcm9tIGxlZnQgdG8gcmlnaHQuCisg
ICAgCisgICAgLy8gRklYTUU6IGhhbmRsZSBtdWx0aS1zcGFjZXMgKGh0dHA6Ly93ZWJraXQub3Jn
L2IvNTc1NDMpLgorICAgIAorICAgIGJvb2wgaGFzU2VlbldvcmRCcmVha0luVGhpc0JveCA9IHBy
ZXZpb3VzV29yZEJyZWFrLmlzTm90TnVsbCgpOworICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJl
YWsgPSBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID8gcHJldmlvdXNXb3JkQnJlYWsgOiBQb3Np
dGlvbihib3gtPnJlbmRlcmVyKCktPm5vZGUoKSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICB3b3JkQnJlYWsgPSBuZXh0V29y
ZFBvc2l0aW9uKHdvcmRCcmVhayk7CisgICAgCisgICAgaWYgKHdvcmRCcmVhayA9PSBwcmV2aW91
c1dvcmRCcmVhaykgeworICAgICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IHRydWU7CisgICAg
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBpc0xhc3RXb3JkQnJl
YWtJbkJveCA9IGZhbHNlOworCisgICAgLy8gR2l2ZW4gUlRMIGJveCAiQUJDIERFRiIgZWl0aGVy
IGZvbGxvd3MgYSBMVFIgYm94IG9yIGlzIHRoZSBmaXJzdCB2aXN1YWwgYm94IGluIGFuIExUUiBi
bG9jayBhcyBhbiBleGFtcGxlLAorICAgIC8vIHRoZSB2aXN1YWwgZGlzcGxheSBvZiB0aGUgUlRM
IGJveCBpczogIigwKUooMTApSSg5KUgoOCkgKDcpRig2KUUoNSlEKDQpICgzKUMoMilCKDEpQSgx
MSkiLAorICAgIC8vIHdoZXJlIHRoZSBudW1iZXIgaW4gcGFyZW50aGVzaXMgcmVwcmVzZW50cyBv
ZmZzZXQgaW4gdmlzaWJsZVBvc2l0aW9uLiAKKyAgICAvLyBTdGFydCBhdCBvZmZzZXQgMCwgdGhl
IGZpcnN0IHdvcmQgYnJlYWsgaXMgYXQgb2Zmc2V0IDMsIHRoZSAybmQgd29yZCBicmVhayBpcyBh
dCBvZmZzZXQgNywgYW5kIHRoZSAzcmQgd29yZCBicmVhayBzaG91bGQgYmUgYXQgb2Zmc2V0IDAu
CisgICAgLy8gQnV0IG5leHRXb3JkUG9zaXRpb24oKSBvZiBvZmZzZXQgNyBpcyBvZmZzZXQgMTEs
IHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLCAKKyAgICAvLyBhbmQgdGhlIHBvc2l0aW9uIGF0IG9m
ZnNldCAwIHNob3VsZCBiZSBtYW51YWxseSBhZGRlZCBhcyB0aGUgbGFzdCB3b3JkIGJyZWFrIHdp
dGhpbiB0aGUgYm94LgorICAgIGlmIChwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJs
b2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgYm94LCBvZmZzZXRPZldv
cmRCcmVhaykpCisgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CisgICAgCisgICAgaXNMYXN0V29y
ZEJyZWFrSW5Cb3ggPSB0cnVlOworICAgIHJldHVybiBsYXN0V29yZEJyZWFrSW5Cb3goYm94LCBv
ZmZzZXRPZldvcmRCcmVhayk7Cit9CisKK3N0cnVjdCBXb3JkQm91bmRhcnlFbnRyeSB7CisgICAg
V29yZEJvdW5kYXJ5RW50cnkoKTogdmlzaWJsZVBvc2l0aW9uKFZpc2libGVQb3NpdGlvbigpKSwg
b2Zmc2V0KGludmFsaWRPZmZzZXQpIHt9CisgICAgV29yZEJvdW5kYXJ5RW50cnkoY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBwb3NpdGlvbiwgaW50IG9mZnNldCk6IHZpc2libGVQb3NpdGlvbihwb3Np
dGlvbiksIG9mZnNldChvZmZzZXQpIHt9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3Np
dGlvbjsKKyAgICBpbnQgb2Zmc2V0OyAvLyBvZmZzZXQgcmV0dXJuZWQgZnJvbSB2aXNpYmxlUG9z
aXRpb24uZ2V0SW5saW5lQm94QW5kT2Zmc2V0KCkgYW5kIGlzIHVzZWQgaW4gY29tcGFyaXNvbiB0
byBmaW5kIHRoZSB2aXN1YWxseSBjbG9zZXN0IHdvcmQgYnJlYWsuCit9OworICAgIAordHlwZWRl
ZiBWZWN0b3I8V29yZEJvdW5kYXJ5RW50cnksIDUwPiBXb3JkQm91bmRhcnlWZWN0b3I7CisgICAg
CitzdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURp
cmVjdGlvbmFsaXR5KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91bmRhcnlWZWN0b3ImIG9y
ZGVyZWRXb3JkQm91bmRhcmllcykKK3sKKyAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMuY2xlYXIo
KTsKKyAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOworICAgIGludCBvZmZzZXRP
ZldvcmRCcmVhayA9IGludmFsaWRPZmZzZXQ7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd29y
ZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rp
b25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBpZiAo
d29yZEJyZWFrLmlzTnVsbCgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0cnVjdCBX
b3JkQm91bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlFbnRyeSh3b3JkQnJlYWssIG9mZnNldE9mV29y
ZEJyZWFrKTsKKyAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91bmRh
cnlFbnRyeSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94
SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eShjb25zdCBJbmxpbmVCb3gqIGJv
eCwgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCit7CisgICAgb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAgCisgICAgVmlzaWJsZVBvc2l0aW9uIHdv
cmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBpbnZhbGlkT2Zmc2V0OworICAg
IHdoaWxlICgxKSB7CisgICAgICAgIGJvb2wgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsK
KyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlm
ZmVyZW50RGlyZWN0aW9uYWxpdHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBp
c0xhc3RXb3JkQnJlYWtJbkJveCk7CisgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkp
IHsKKyAgICAgICAgICAgIHN0cnVjdCBXb3JkQm91bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlFbnRy
eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgICAgIG9yZGVyZWRXb3Jk
Qm91bmRhcmllcy5hcHBlbmQod29yZEJvdW5kYXJ5RW50cnkpOworICAgICAgICB9CisgICAgICAg
IGlmIChpc0xhc3RXb3JkQnJlYWtJbkJveCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30K
KyAgICAKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWtJbkJveChjb25z
dCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlv
bikKIHsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSAwOwpAQCAtMTE4OSw2ICsxMzM0LDQ0
IEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWsKICAgICByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAKK3N0YXRpYyBpbnQgZ3JlYXRlc3RWYWx1ZVVuZGVyKGlu
dCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRC
b3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQoreworICAgIGlmICghb3JkZXJl
ZFdvcmRCb3VuZGFyaWVzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7Cisg
ICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2guCisgICAgaWYgKGJveEFuZEJsb2NrQXJlSW5TYW1l
RGlyZWN0aW9uKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChvcmRlcmVkV29yZEJv
dW5kYXJpZXNbaV0ub2Zmc2V0IDwgb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiBpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIH0KKyAgICBmb3Ig
KGludCBpID0gb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7
CisgICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0IDwgb2Zmc2V0KQor
ICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0Owor
fQorCitzdGF0aWMgaW50IHNtYWxsZXN0T2Zmc2V0QWJvdmUoaW50IG9mZnNldCwgYm9vbCBib3hB
bmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiwgY29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRl
cmVkV29yZEJvdW5kYXJpZXMpCit7CisgICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6
ZSgpKQorICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICAvLyBGSVhNRTogYmluYXJ5
IHNlYXJjaC4KKyAgICBpZiAoYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24pIHsKKyAgICAg
ICAgZm9yIChpbnQgaSA9IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxOyBpID49IDA7
IC0taSkgeworICAgICAgICAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXQg
PiBvZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG9yZGVy
ZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXQgPiBvZmZzZXQpCisgICAgICAgICAgICByZXR1cm4g
aTsKKyAgICB9CisgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7Cit9CisgCiBzdGF0aWMgVmlzaWJs
ZVBvc2l0aW9uIGxlZnRXb3JkQm91bmRhcnkoY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZz
ZXQsIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCiB7CiAgICAgVmlzaWJsZVBvc2l0aW9u
IHdvcmRCcmVhazsKQEAgLTEyMTUsNyArMTM5OCwzMyBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IHJpZ2h0V29yZEJvdW5kYXJ5CiAgICAgfQogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsK
IH0KKyAgICAKK3N0YXRpYyBib29sIHBvc2l0aW9uSXNJbnNpZGVCb3goY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiB3b3JkQnJlYWssIGNvbnN0IElubGluZUJveCogYm94KQoreworICAgIElubGluZUJv
eCogYm94T2ZXb3JkQnJlYWs7CisgICAgaW50IG9mZnNldE9mV29yZEJyZWFrOworICAgIHdvcmRC
cmVhay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJy
ZWFrKTsKKyAgICByZXR1cm4gYm94ID09IGJveE9mV29yZEJyZWFrICYmIG9mZnNldE9mV29yZEJy
ZWFrICE9IGJveC0+Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3gt
PmNhcmV0TWluT2Zmc2V0KCk7Cit9CiAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25C
ZWZvcmVOZXh0V29yZChjb25zdCBWaXNpYmxlUG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIFZp
c2libGVQb3NpdGlvbiBwb3NpdGlvbkFmdGVyQ3VycmVudFdvcmQgPSBuZXh0V29yZFBvc2l0aW9u
KHBvc2l0aW9uKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25BZnRlck5leHRXb3JkID0g
bmV4dFdvcmRQb3NpdGlvbihwb3NpdGlvbkFmdGVyQ3VycmVudFdvcmQpOworICAgIGlmIChwb3Np
dGlvbkFmdGVyQ3VycmVudFdvcmQgPT0gcG9zaXRpb25BZnRlck5leHRXb3JkKQorICAgICAgICBy
ZXR1cm4gcG9zaXRpb25BZnRlckN1cnJlbnRXb3JkOworICAgIHJldHVybiBwcmV2aW91c1dvcmRQ
b3NpdGlvbihwb3NpdGlvbkFmdGVyTmV4dFdvcmQpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0
aW9uIHBvc2l0aW9uQWZ0ZXJQcmV2aW91c1dvcmQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3Np
dGlvbikKK3sKKyAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25CZWZvcmVDdXJyZW50V29yZCA9
IHByZXZpb3VzV29yZFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gcG9z
aXRpb25CZWZvcmVQcmV2aW91c1dvcmQgPSBwcmV2aW91c1dvcmRQb3NpdGlvbihwb3NpdGlvbkJl
Zm9yZUN1cnJlbnRXb3JkKTsKKyAgICBpZiAocG9zaXRpb25CZWZvcmVDdXJyZW50V29yZCA9PSBw
b3NpdGlvbkJlZm9yZVByZXZpb3VzV29yZCkKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uQmVmb3Jl
Q3VycmVudFdvcmQ7CisgICAgcmV0dXJuIG5leHRXb3JkUG9zaXRpb24ocG9zaXRpb25CZWZvcmVQ
cmV2aW91c1dvcmQpOworfQorICAgIAogVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb24o
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCiB7CiAgICAgSW5saW5lQm94
KiBib3g7CkBAIC0xMjMxLDggKzE0NDAsMzQgQEAgVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9z
aXRpb24oY29uc3QgVgogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNl
dCgpKQogICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gsIG9mZnNldCwgYmxvY2tE
aXJlY3Rpb24pOwogICAgIAotICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuCi0gICAgcmV0
dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJl
YWs7CisgICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb24pIHsKKyAgICAg
ICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IFJUTCkKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHBv
c2l0aW9uQmVmb3JlTmV4dFdvcmQodmlzaWJsZVBvc2l0aW9uKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9u
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKQorICAg
ICAgICAgICAgd29yZEJyZWFrID0gcG9zaXRpb25BZnRlclByZXZpb3VzV29yZCh2aXNpYmxlUG9z
aXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBv
c2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgfQorICAgIGlmIChwb3NpdGlvbklzSW5zaWRl
Qm94KHdvcmRCcmVhaywgYm94KSkKKyAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICAKKyAg
ICBXb3JkQm91bmRhcnlWZWN0b3Igb3JkZXJlZFdvcmRCb3VuZGFyaWVzOworICAgIGlmIChib3gt
PmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKQorICAgICAgICBjb2xsZWN0V29yZEJyZWFr
c0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzKTsKKyAgICBlbHNlCisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNp
ZGVCbG9ja1dpdGhEaWZmZXJudERpcmVjdGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFy
aWVzKTsKKworICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8g
Z3JlYXRlc3RWYWx1ZVVuZGVyKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCBvcmRlcmVk
V29yZEJvdW5kYXJpZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNtYWxsZXN0T2Zmc2V0QWJvdmUob2Zmc2V0LCBibG9ja0RpcmVjdGlvbiA9PSBS
VEwsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgaWYgKGluZGV4ICE9IGludmFsaWRPZmZz
ZXQpCisgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbaW5kZXhdLnZpc2libGVQ
b3NpdGlvbjsKKyAgICAKKyAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gtPnByZXZMZWFm
Q2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwogfQogCiBWaXNpYmxlUG9z
aXRpb24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9z
aXRpb24pCkBAIC0xMjQ1LDEwICsxNDgwLDM0IEBAIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQ
b3NpdGlvbihjb25zdCAKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNl
dCgpKQogICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2Nr
RGlyZWN0aW9uKTsKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSkKLSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgp
LCAtMSwgYmxvY2tEaXJlY3Rpb24pOworICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnko
Ym94LT5uZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAK
KyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOworICAgIGlmIChib3gtPmRpcmVjdGlvbigp
ID09IGJsb2NrRGlyZWN0aW9uKSB7CisgICAgICAgIGlmIChibG9ja0RpcmVjdGlvbiA9PSBMVFIp
CisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwb3NpdGlvbkJlZm9yZU5leHRXb3JkKHZpc2libGVQ
b3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3Vz
V29yZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYg
KGJsb2NrRGlyZWN0aW9uID09IExUUikKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHBvc2l0aW9u
QWZ0ZXJQcmV2aW91c1dvcmQodmlzaWJsZVBvc2l0aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworICAg
IH0gCisgICAgaWYgKHBvc2l0aW9uSXNJbnNpZGVCb3god29yZEJyZWFrLCBib3gpKQorICAgICAg
ICByZXR1cm4gd29yZEJyZWFrOwogICAgIAotICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQu
Ci0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgIFdvcmRCb3VuZGFyeVZlY3RvciBv
cmRlcmVkV29yZEJvdW5kYXJpZXM7CisgICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tE
aXJlY3Rpb24pCisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhT
YW1lRGlyZWN0aW9uYWxpdHkoYm94LCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOworICAgIGVsc2UK
KyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGly
ZWN0aW9uYWxpdHkoYm94LCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOworICAgIGludCBpbmRleCA9
IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZShvZmZz
ZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKSA6CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVzdFZhbHVl
VW5kZXIob2Zmc2V0LCBibG9ja0RpcmVjdGlvbiA9PSBSVEwsIG9yZGVyZWRXb3JkQm91bmRhcmll
cyk7CisgICAgaWYgKGluZGV4ICE9IGludmFsaWRPZmZzZXQpCisgICAgICAgIHJldHVybiBvcmRl
cmVkV29yZEJvdW5kYXJpZXNbaW5kZXhdLnZpc2libGVQb3NpdGlvbjsKKyAgICAKKyAgICByZXR1
cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LT5uZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQs
IGJsb2NrRGlyZWN0aW9uKTsKIH0KIAogfQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gODMxMTcpCisrKyBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMiBAQAorMjAx
MS0wNC0wNiAgWGlhb21laSBKaSAgPHhqaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udGludWUgZXhwZXJpbWVudCB3aXRo
IG1vdmluZyBjYXJldCBieSB3b3JkIGluIHZpc3VhbCBvcmRlci4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3ODA2CisKKyAgICAgICAgKiBlZGl0aW5n
L3NlbGVjdGlvbi9tb3ZlLWJ5LXdvcmQtdmlzdWFsbHktZXhwZWN0ZWQudHh0OgorCiAyMDExLTA0
LTA2ICBBZHJpZW5uZSBXYWxrZXIgIDxlbm5lQGdvb2dsZS5jb20+CiAKICAgICAgICAgVW5yZXZp
ZXdlZCwgcmViYXNlbGluZSBtb3JlIENocm9taXVtIG1hYyB0ZXN0cyBhZnRlciByODMwNzUuCklu
ZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9tb3ZlLWJ5LXdvcmQtdmlzdWFsbHkt
ZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9u
L21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDgyODQ4KQorKysg
TGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVj
dGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMiwzNCArMiwzNCBAQAogPT09PT09PT0gTW92ZSBC
eSBXb3JkID09PT0KIFRlc3QgMSwgTFRSOgogTW92ZSByaWdodCBieSBvbmUgd29yZAotImFiYyBk
ZWYgaGlqIG9wcSByc3QiWzAsIDQsIDgsIDEyLCAxNiwgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFs0
LCA4LCAxMiwgMTYsIDE5LCAxOV0KKyJhYmMgZGVmIGhpaiBvcHEgcnN0IlswLCA4LCAxMiwgMTYs
IDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5XQogTW92ZSBs
ZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMTYsIDE2LCAxMiwgOCwgNCwg
MF0gICAgRkFJTCBleHBlY3RlZDogWzE2LCAxMiwgOCwgNCwgMCwgMF0KKyJhYmMgZGVmIGhpaiBv
cHEgcnN0IlsxNiwgMTIsIDgsIDQsIDAsIDBdCiBUZXN0IDIsIFJUTDoKIE1vdmUgbGVmdCBieSBv
bmUgd29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzAsIDE1LCAxMSwgNywgMywgMTldICAgIEZB
SUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KKyJhYmMgZGVmIGhpaiBvcHEgcnN0
IlswLCAxMSwgNywgMywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5
LCAxOV0KIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMgZGVmIGhpaiBvcHEgcnN0IlsxOSwg
MywgNywgMTEsIDE1LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgNywgMTEsIDE1LCAwLCAwXQor
ImFiYyBkZWYgaGlqIG9wcSByc3QiWzE5LCA3LCAxMSwgMTUsIDAsIDBdICAgIEZBSUwgZXhwZWN0
ZWQ6IFszLCA3LCAxMSwgMTUsIDAsIDBdCiBUZXN0IDMsIExUUjoKIE1vdmUgcmlnaHQgYnkgb25l
IHdvcmQKLSJaWlogUVFRIEJCQiBDQ0MgWFhYIlswLCAxNSwgMTEsIDcsIDMsIDE5XSAgICBGQUlM
IGV4cGVjdGVkOiBbMTUsIDExLCA3LCAzLCAxOSwgMTldCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJb
MCwgMTEsIDcsIDMsIDMsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbMTUsIDExLCA3LCAzLCAxOSwg
MTldCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJaWlogUVFRIEJCQiBDQ0MgWFhYIlsxOSwgMywg
NywgMTEsIDE1LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgNywgMTEsIDE1LCAwLCAwXQorIlpa
WiBRUVEgQkJCIENDQyBYWFgiWzE5LCA3LCAxMSwgMTUsIDAsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6
IFszLCA3LCAxMSwgMTUsIDAsIDBdCiBUZXN0IDQsIFJUTDoKIE1vdmUgbGVmdCBieSBvbmUgd29y
ZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDQsIDgsIDEyLCAxNiwgMTldICAgIEZBSUwgZXhw
ZWN0ZWQ6IFs0LCA4LCAxMiwgMTYsIDE5LCAxOV0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlswLCA4
LCAxMiwgMTYsIDE2LCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5
XQogTW92ZSByaWdodCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzE2LCAxNiwg
MTIsIDgsIDQsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNiwgMTIsIDgsIDQsIDAsIDBdCisiWlpa
IFFRUSBCQkIgQ0NDIFhYWCJbMTYsIDEyLCA4LCA0LCAwLCAwXQogVGVzdCA1LCBMVFI6CiBNb3Zl
IHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzAsIDQsIDgsIDEx
LCAxNiwgMjAsIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEsIDE2LCAyMCwgMjMsIDIz
XQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCA0LCA4LCAxMSwgMjAsIDIwLCAyM10gICAg
RkFJTCBleHBlY3RlZDogWzQsIDgsIDExLCAxNiwgMjAsIDIzLCAyM10KIE1vdmUgbGVmdCBieSBv
bmUgd29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlsyMCwgMjAsIDE2LCAxMSwgNCwgNCwg
MF0gICAgRkFJTCBleHBlY3RlZDogWzIwLCAxNiwgMTEsIDgsIDQsIDAsIDBdCisiYWJjIGRlZiBa
UUIgUklHIHV2dyB4eXoiWzIwLCAxNiwgNCwgOCwgNCwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDog
WzIwLCAxNiwgMTEsIDgsIDQsIDAsIDBdCiBUZXN0IDYsIFJUTDoKIE1vdmUgbGVmdCBieSBvbmUg
d29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCAzLCA4LCAxMiwgMTYsIDE5LCAyM10g
ICAgRkFJTCBleHBlY3RlZDogWzMsIDgsIDEyLCAxNiwgMTksIDIzLCAyM10KKyJhYmMgZGVmIFpR
QiBSSUcgdXZ3IHh5eiJbMCwgMywgMTIsIDEyLCAxNiwgMTksIDIzXSAgICBGQUlMIGV4cGVjdGVk
OiBbMywgOCwgMTIsIDE2LCAxOSwgMjMsIDIzXQogTW92ZSByaWdodCBieSBvbmUgd29yZAotImFi
YyBkZWYgWlFCIFJJRyB1dncgeHl6IlsxMiwgMTksIDEyLCAxMiwgOCwgMywgMF0gICAgRkFJTCBl
eHBlY3RlZDogWzE5LCAxNiwgMTIsIDgsIDMsIDAsIDBdCisiYWJjIGRlZiBaUUIgUklHIHV2dyB4
eXoiWzEyLCAxNiwgMTIsIDgsIDgsIDAsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFsxOSwgMTYsIDEy
LCA4LCAzLCAwLCAwXQogVGVzdCA3LCBMVFI6CiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCiAiWlFC
IGFiYyBSSUciWzAsIDQsIDgsIDExXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEsIDExXQpA
QCAtMzksNSArMzksNSBAQCBUZXN0IDgsIFJUTDoKIE1vdmUgbGVmdCBieSBvbmUgd29yZAogIlpR
QiBhYmMgUklHIlswLCA0LCA4LCAxMV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDExLCAxMV0K
IE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJaUUIgYWJjIFJJRyJbOCwgOCwgMCwgMF0gICAgRkFJ
TCBleHBlY3RlZDogWzgsIDQsIDAsIDBdCisiWlFCIGFiYyBSSUciWzgsIDAsIDAsIDBdICAgIEZB
SUwgZXhwZWN0ZWQ6IFs4LCA0LCAwLCAwXQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88654</attachid>
            <date>2011-04-07 10:06:24 -0700</date>
            <delta_ts>2011-04-07 17:53:16 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v4</filename>
            <type>text/plain</type>
            <size>20084</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgzMTE3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTEtMDQtMDYgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpsYXN0V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAo
V2ViQ29yZTo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9ja1dpdGhEaWZmZXJl
bnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0V29yZEJyZWFrSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3Jl
OjpXb3JkQm91bmRhcnlFbnRyeTo6V29yZEJvdW5kYXJ5RW50cnkpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpncmVhdGVzdFZh
bHVlVW5kZXIpOgorICAgICAgICAoV2ViQ29yZTo6c21hbGxlc3RPZmZzZXRBYm92ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnBv
c2l0aW9uQmVmb3JlTmV4dFdvcmQpOgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpb25BZnRlclBy
ZXZpb3VzV29yZCk6CisgICAgICAgIChXZWJDb3JlOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OnJpZ2h0V29yZFBvc2l0aW9uKToKKwogMjAxMS0wNC0wNiAgTGVhbmRybyBH
cmFjaWEgR2lsICA8bGVhbmRyb2dyYWNpYUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgU3RldmUgQmxvY2suCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91
bml0cy5jcHAJKHJldmlzaW9uIDgyODQ4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNp
YmxlX3VuaXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw2ICsxMTczLDE4MCBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIHdvcmRCcmVh
azsKIH0KIAorc3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJ
bkxUUkJsb2NrKGNvbnN0IElubGluZUJveCogYm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJs
eSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0g
Ym94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBi
b3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0
TGVhZkNoaWxkKCk7ICAgCisgICAgCisgICAgaWYgKHByZXZpb3VzTGVhZiAmJiAhcHJldmlvdXNM
ZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIHJldHVybiBQb3NpdGlvbihu
b2RlLCBib3gtPmNhcmV0TWF4T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworCisgICAgaWYgKG5leHRMZWFmICYmICFuZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpKSB7CisgICAgICAgIGlmIChwcmV2aW91c0xlYWYpCisgICAgICAgICAgICByZXR1
cm4gUG9zaXRpb24ocHJldmlvdXNMZWFmLT5yZW5kZXJlcigpLT5ub2RlKCksIHByZXZpb3VzTGVh
Zi0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7
CisKKyAgICAgICAgSW5saW5lQm94KiBsYXN0UlRMTGVhZjsKKyAgICAgICAgZG8geworICAgICAg
ICAgICAgbGFzdFJUTExlYWYgPSBuZXh0TGVhZjsKKyAgICAgICAgICAgIG5leHRMZWFmID0gbmV4
dExlYWYtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgfSB3aGlsZSAobmV4dExlYWYgJiYgIW5l
eHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpOworICAgICAgICByZXR1cm4gUG9zaXRp
b24obGFzdFJUTExlYWYtPnJlbmRlcmVyKCktPm5vZGUoKSwgbGFzdFJUTExlYWYtPmNhcmV0TWlu
T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIH0KKwor
ICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGNvbnN0IElubGluZUJveCogYm94
KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxl
dmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0gYm94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAg
SW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxp
bmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7ICAgCisgICAgCisgICAgaWYg
KG5leHRMZWFmICYmIG5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpICAgIAorICAg
ICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKworICAgIGlmIChwcmV2aW91c0xlYWYgJiYg
cHJldmlvdXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgaWYgKG5l
eHRMZWFmKQorICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uKG5leHRMZWFmLT5yZW5kZXJlcigp
LT5ub2RlKCksIG5leHRMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25J
c09mZnNldEluQW5jaG9yKTsKKworICAgICAgICBJbmxpbmVCb3gqIGZpcnN0TFRSTGVhZjsKKyAg
ICAgICAgZG8geworICAgICAgICAgICAgZmlyc3RMVFJMZWFmID0gcHJldmlvdXNMZWFmOworICAg
ICAgICAgICAgcHJldmlvdXNMZWFmID0gcHJldmlvdXNMZWFmLT5wcmV2TGVhZkNoaWxkKCk7Cisg
ICAgICAgIH0gd2hpbGUgKHByZXZpb3VzTGVhZiAmJiBwcmV2aW91c0xlYWYtPmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSk7CisgICAgICAgIHJldHVybiBQb3NpdGlvbihmaXJzdExUUkxlYWYtPnJl
bmRlcmVyKCktPm5vZGUoKSwgZmlyc3RMVFJMZWFmLT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICB9CisKKyAgICByZXR1cm4gUG9zaXRp
b24obm9kZSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNl
dEluQW5jaG9yKTsKK30KKyAgICAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGFzdFdvcmRCcmVh
a0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorewor
ICAgIC8vIEFkZCB0aGUgbGVmdG1vc3Qgd29yZCBicmVhayBmb3IgUlRMIGJveCBvciByaWdodG1v
c3Qgd29yZCBicmVhayBmb3IgTFRSIGJveC4KKyAgICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9
IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAgIElubGluZUJveCogbmV4dExlYWYgPSBib3gtPm5l
eHRMZWFmQ2hpbGQoKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gYm91bmRhcnlQb3NpdGlvbjsKKyAg
ICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgKCFwcmV2aW91c0xlYWYgfHwgcHJldmlv
dXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBib3VuZGFyeVBvc2l0
aW9uID0gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gpOworICAgIGVsc2Ug
aWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICghbmV4dExlYWYgfHwgIW5leHRMZWFmLT5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmln
aHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soYm94KTsKKworICAgIGlmIChib3VuZGFy
eVBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7ICAg
ICAgICAgICAgCisKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gbmV4dFdvcmRQb3Np
dGlvbihib3VuZGFyeVBvc2l0aW9uKTsKKyAgICBpZiAod29yZEJyZWFrICE9IGJvdW5kYXJ5UG9z
aXRpb24pCisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBvc2l0aW9uKHdvcmRCcmVh
ayk7CisKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOworICAgIHdvcmRCcmVhay5nZXRJ
bmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAg
ICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94KQorICAgICAgICByZXR1cm4gd29yZEJyZWFrOwor
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsgICAgCit9CisKK3N0YXRpYyBib29sIHBvc2l0
aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxp
dHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWssIGNvbnN0IElubGluZUJveCogYm94
LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQoreworICAgIGludCBwcmV2aW91c09mZnNldCA9IG9m
ZnNldE9mV29yZEJyZWFrOworICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7CisgICAgd29y
ZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWspOworICAgIGlmIChib3hPZldvcmRCcmVhayA9PSBib3ggJiYgKHByZXZpb3VzT2Zmc2V0
ID09IGludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhaykp
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKyAgICAKK3N0YXRp
YyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkoCisgICAgY29uc3QgSW5saW5lQm94KiBib3gsIGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWssIGJv
b2wmIGlzTGFzdFdvcmRCcmVha0luQm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVk
IHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICAKKyAgICAvLyBJbiBhIExUUiBi
bG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEg
d29yZC4KKyAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9u
IHRoZSByaWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCisgICAgLy8gQmVjYXVzZSBwcmV2aW91c1dv
cmRQb3NpdGlvbigpIHJldHVybnMgdGhlIHdvcmQgYnJlYWsgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5
IG9mIHRoZSB3b3JkIGZvciBSVEwgdGV4dCwKKyAgICAvLyB3ZSBuZWVkIHRvIHVzZSBuZXh0V29y
ZFBvc2l0aW9uKCkgdG8gdHJhdmVyc2Ugd29yZHMgd2l0aGluIHRoZSBpbmxpbmUgYm94ZXMgZnJv
bSByaWdodCB0byBsZWZ0IHRvIGZpbmQgdGhlIG5leHQgd29yZCBicmVhay4KKyAgICAvLyBUaGUg
c2FtZSBhcHBsaWVzIHRvIExUUiB0ZXh0LCBpbiB3aGljaCB3b3JkcyBhcmUgdHJhdmVyc2VkIHdp
dGhpbiB0aGUgaW5saW5lIGJveGVzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAKKyAgICAvLyBG
SVhNRTogaGFuZGxlIG11bHRpLXNwYWNlcyAoaHR0cDovL3dlYmtpdC5vcmcvYi81NzU0MykuCisg
ICAgCisgICAgYm9vbCBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID0gcHJldmlvdXNXb3JkQnJl
YWsuaXNOb3ROdWxsKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhayA9IGhhc1NlZW5X
b3JkQnJlYWtJblRoaXNCb3ggPyBwcmV2aW91c1dvcmRCcmVhayA6IFBvc2l0aW9uKGJveC0+cmVu
ZGVyZXIoKS0+bm9kZSgpLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlv
bklzT2Zmc2V0SW5BbmNob3IpOworICAgIHdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24od29y
ZEJyZWFrKTsKKyAgICAKKyAgICBpZiAod29yZEJyZWFrID09IHByZXZpb3VzV29yZEJyZWFrKSB7
CisgICAgICAgIGlzTGFzdFdvcmRCcmVha0luQm94ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFZp
c2libGVQb3NpdGlvbigpOworICAgIH0KKworICAgIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFs
c2U7CisKKyAgICAvLyBHaXZlbiBSVEwgYm94ICJBQkMgREVGIiBlaXRoZXIgZm9sbG93cyBhIExU
UiBib3ggb3IgaXMgdGhlIGZpcnN0IHZpc3VhbCBib3ggaW4gYW4gTFRSIGJsb2NrIGFzIGFuIGV4
YW1wbGUsCisgICAgLy8gdGhlIHZpc3VhbCBkaXNwbGF5IG9mIHRoZSBSVEwgYm94IGlzOiAiKDAp
SigxMClJKDkpSCg4KSAoNylGKDYpRSg1KUQoNCkgKDMpQygyKUIoMSlBKDExKSIsCisgICAgLy8g
d2hlcmUgdGhlIG51bWJlciBpbiBwYXJlbnRoZXNpcyByZXByZXNlbnRzIG9mZnNldCBpbiB2aXNp
YmxlUG9zaXRpb24uIAorICAgIC8vIFN0YXJ0IGF0IG9mZnNldCAwLCB0aGUgZmlyc3Qgd29yZCBi
cmVhayBpcyBhdCBvZmZzZXQgMywgdGhlIDJuZCB3b3JkIGJyZWFrIGlzIGF0IG9mZnNldCA3LCBh
bmQgdGhlIDNyZCB3b3JkIGJyZWFrIHNob3VsZCBiZSBhdCBvZmZzZXQgMC4KKyAgICAvLyBCdXQg
bmV4dFdvcmRQb3NpdGlvbigpIG9mIG9mZnNldCA3IGlzIG9mZnNldCAxMSwgd2hpY2ggc2hvdWxk
IGJlIGlnbm9yZWQsIAorICAgIC8vIGFuZCB0aGUgcG9zaXRpb24gYXQgb2Zmc2V0IDAgc2hvdWxk
IGJlIG1hbnVhbGx5IGFkZGVkIGFzIHRoZSBsYXN0IHdvcmQgYnJlYWsgd2l0aGluIHRoZSBib3gu
CisgICAgaWYgKHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkKKyAg
ICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICAKKyAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9
IHRydWU7CisgICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9mV29yZEJy
ZWFrKTsKK30KKworc3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKKyAgICBXb3JkQm91bmRhcnlF
bnRyeSgpCisgICAgICAgIDogdmlzaWJsZVBvc2l0aW9uKFZpc2libGVQb3NpdGlvbigpKQorICAg
ICAgICAsIG9mZnNldChpbnZhbGlkT2Zmc2V0KSAKKyAgICB7IAorICAgIH0KKworICAgIFdvcmRC
b3VuZGFyeUVudHJ5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24sIGludCBvZmZzZXQp
CisgICAgOiB2aXNpYmxlUG9zaXRpb24ocG9zaXRpb24pCisgICAgLCBvZmZzZXQob2Zmc2V0KSAK
KyAgICB7IAorICAgIH0KKworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb247Cisg
ICAgaW50IG9mZnNldDsgLy8gb2Zmc2V0IHJldHVybmVkIGZyb20gdmlzaWJsZVBvc2l0aW9uLmdl
dElubGluZUJveEFuZE9mZnNldCgpIGFuZCBpcyB1c2VkIGluIGNvbXBhcmlzb24gdG8gZmluZCB0
aGUgdmlzdWFsbHkgY2xvc2VzdCB3b3JkIGJyZWFrLgorfTsKKyAgICAKK3R5cGVkZWYgVmVjdG9y
PFdvcmRCb3VuZGFyeUVudHJ5LCA1MD4gV29yZEJvdW5kYXJ5VmVjdG9yOworICAgIAorc3RhdGlj
IHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25h
bGl0eShjb25zdCBJbmxpbmVCb3gqIGJveCwgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMpCit7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAg
CisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJl
YWsgPSBpbnZhbGlkT2Zmc2V0OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdvcmRCcmVhayA9
IHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHko
Ym94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgaWYgKHdvcmRCcmVh
ay5pc051bGwoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdHJ1Y3QgV29yZEJvdW5k
YXJ5RW50cnkgd29yZEJvdW5kYXJ5RW50cnkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7
CisgICAgICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy5hcHBlbmQod29yZEJvdW5kYXJ5RW50cnkp
OworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJs
b2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoY29uc3QgSW5saW5lQm94KiBib3gsIFdvcmRC
b3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQoreworICAgIG9yZGVyZWRXb3Jk
Qm91bmRhcmllcy5jbGVhcigpOworICAgIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7
CisgICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gaW52YWxpZE9mZnNldDsKKyAgICB3aGlsZSAo
MSkgeworICAgICAgICBib29sIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFsc2U7CisgICAgICAg
IHdvcmRCcmVhayA9IG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERp
cmVjdGlvbmFsaXR5KGJveCwgd29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgaXNMYXN0V29y
ZEJyZWFrSW5Cb3gpOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpKSB7CisgICAg
ICAgICAgICBzdHJ1Y3QgV29yZEJvdW5kYXJ5RW50cnkgd29yZEJvdW5kYXJ5RW50cnkod29yZEJy
ZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJp
ZXMuYXBwZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNM
YXN0V29yZEJyZWFrSW5Cb3gpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisgICAgCiBz
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrSW5Cb3goY29uc3QgSW5saW5l
Qm94KiBib3gsIGludCBvZmZzZXQsIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCiB7CiAg
ICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gMDsKQEAgLTExODksNiArMTM2Myw0NCBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOwogfQogCitzdGF0aWMgaW50IGdyZWF0ZXN0VmFsdWVVbmRlcihpbnQgb2Zmc2V0
LCBib29sIGJveEFuZEJsb2NrQXJlSW5TYW1lRGlyZWN0aW9uLCBjb25zdCBXb3JkQm91bmRhcnlW
ZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcykKK3sKKyAgICBpZiAoIW9yZGVyZWRXb3JkQm91
bmRhcmllcy5zaXplKCkpCisgICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIC8vIEZJ
WE1FOiBiaW5hcnkgc2VhcmNoLgorICAgIGlmIChib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlv
bikgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3VuZGFy
aWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVz
W2ldLm9mZnNldCA8IG9mZnNldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9
IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAg
ICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldCA8IG9mZnNldCkKKyAgICAgICAg
ICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKK30KKworc3Rh
dGljIGludCBzbWFsbGVzdE9mZnNldEFib3ZlKGludCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tB
cmVJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzKQoreworICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSkKKyAg
ICAgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2gu
CisgICAgaWYgKGJveEFuZEJsb2NrQXJlSW5TYW1lRGlyZWN0aW9uKSB7CisgICAgICAgIGZvciAo
aW50IGkgPSBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsK
KyAgICAgICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0ID4gb2Zmc2V0
KQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBp
bnZhbGlkT2Zmc2V0OworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJl
ZFdvcmRCb3VuZGFyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChvcmRlcmVkV29yZEJv
dW5kYXJpZXNbaV0ub2Zmc2V0ID4gb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAg
fQorICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworfQorIAogc3RhdGljIFZpc2libGVQb3NpdGlv
biBsZWZ0V29yZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0
RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQogewogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJl
YWs7CkBAIC0xMjE1LDcgKzE0MjcsMzMgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodFdv
cmRCb3VuZGFyeQogICAgIH0KICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CisgICAg
CitzdGF0aWMgYm9vbCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
d29yZEJyZWFrLCBjb25zdCBJbmxpbmVCb3gqIGJveCkKK3sKKyAgICBJbmxpbmVCb3gqIGJveE9m
V29yZEJyZWFrOworICAgIGludCBvZmZzZXRPZldvcmRCcmVhazsKKyAgICB3b3JkQnJlYWsuZ2V0
SW5saW5lQm94QW5kT2Zmc2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7Cisg
ICAgcmV0dXJuIGJveCA9PSBib3hPZldvcmRCcmVhayAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBi
b3gtPmNhcmV0TWF4T2Zmc2V0KCkgJiYgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gYm94LT5jYXJldE1p
bk9mZnNldCgpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uQmVmb3JlTmV4
dFdvcmQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBWaXNpYmxlUG9z
aXRpb24gcG9zaXRpb25BZnRlckN1cnJlbnRXb3JkID0gbmV4dFdvcmRQb3NpdGlvbihwb3NpdGlv
bik7CisgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uQWZ0ZXJOZXh0V29yZCA9IG5leHRXb3Jk
UG9zaXRpb24ocG9zaXRpb25BZnRlckN1cnJlbnRXb3JkKTsKKyAgICBpZiAocG9zaXRpb25BZnRl
ckN1cnJlbnRXb3JkID09IHBvc2l0aW9uQWZ0ZXJOZXh0V29yZCkKKyAgICAgICAgcmV0dXJuIHBv
c2l0aW9uQWZ0ZXJDdXJyZW50V29yZDsKKyAgICByZXR1cm4gcHJldmlvdXNXb3JkUG9zaXRpb24o
cG9zaXRpb25BZnRlck5leHRXb3JkKTsKK30KIAorc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3Np
dGlvbkFmdGVyUHJldmlvdXNXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24pCit7
CisgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uQmVmb3JlQ3VycmVudFdvcmQgPSBwcmV2aW91
c1dvcmRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uQmVm
b3JlUHJldmlvdXNXb3JkID0gcHJldmlvdXNXb3JkUG9zaXRpb24ocG9zaXRpb25CZWZvcmVDdXJy
ZW50V29yZCk7CisgICAgaWYgKHBvc2l0aW9uQmVmb3JlQ3VycmVudFdvcmQgPT0gcG9zaXRpb25C
ZWZvcmVQcmV2aW91c1dvcmQpCisgICAgICAgIHJldHVybiBwb3NpdGlvbkJlZm9yZUN1cnJlbnRX
b3JkOworICAgIHJldHVybiBuZXh0V29yZFBvc2l0aW9uKHBvc2l0aW9uQmVmb3JlUHJldmlvdXNX
b3JkKTsKK30KKyAgICAKIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZp
c2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQogewogICAgIElubGluZUJveCogYm94OwpA
QCAtMTIzMSw4ICsxNDY5LDM0IEBAIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNv
bnN0IFYKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKICAg
ICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGlyZWN0aW9u
KTsKICAgICAKLSAgICAvLyBGSVhNRTogTm90IGltcGxlbWVudGVkLgotICAgIHJldHVybiBWaXNp
YmxlUG9zaXRpb24oKTsKKyAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOworICAg
IGlmIChib3gtPmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKSB7CisgICAgICAgIGlmIChi
bG9ja0RpcmVjdGlvbiA9PSBSVEwpCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwb3NpdGlvbkJl
Zm9yZU5leHRXb3JkKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IFJUTCkKKyAgICAgICAgICAg
IHdvcmRCcmVhayA9IHBvc2l0aW9uQWZ0ZXJQcmV2aW91c1dvcmQodmlzaWJsZVBvc2l0aW9uKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbih2
aXNpYmxlUG9zaXRpb24pOworICAgIH0KKyAgICBpZiAocG9zaXRpb25Jc0luc2lkZUJveCh3b3Jk
QnJlYWssIGJveCkpCisgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CisgICAgCisgICAgV29yZEJv
dW5kYXJ5VmVjdG9yIG9yZGVyZWRXb3JkQm91bmRhcmllczsKKyAgICBpZiAoYm94LT5kaXJlY3Rp
b24oKSA9PSBibG9ja0RpcmVjdGlvbikKKyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveElu
c2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmll
cyk7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisK
KyAgICBpbnQgaW5kZXggPSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IGdyZWF0ZXN0
VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzbWFsbGVzdE9mZnNldEFib3ZlKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gUlRMLCBvcmRl
cmVkV29yZEJvdW5kYXJpZXMpOworICAgIGlmIChpbmRleCAhPSBpbnZhbGlkT2Zmc2V0KQorICAg
ICAgICByZXR1cm4gb3JkZXJlZFdvcmRCb3VuZGFyaWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247
CisgICAgCisgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCks
IGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKIH0KIAogVmlzaWJsZVBvc2l0aW9uIHJp
Z2h0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQpA
QCAtMTI0NSwxMCArMTUwOSwzNCBAQCBWaXNpYmxlUG9zaXRpb24gcmlnaHRXb3JkUG9zaXRpb24o
Y29uc3QgCiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKICAg
ICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveCwgb2Zmc2V0LCBibG9ja0RpcmVjdGlv
bik7CiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpCi0gICAg
ICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgLTEsIGJs
b2NrRGlyZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4
dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7CisgCisgICAgVmlz
aWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9j
a0RpcmVjdGlvbikgeworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gTFRSKQorICAgICAg
ICAgICAgd29yZEJyZWFrID0gcG9zaXRpb25CZWZvcmVOZXh0V29yZCh2aXNpYmxlUG9zaXRpb24p
OworICAgICAgICBlbHNlCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRQb3Np
dGlvbih2aXNpYmxlUG9zaXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChibG9ja0Rp
cmVjdGlvbiA9PSBMVFIpCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwb3NpdGlvbkFmdGVyUHJl
dmlvdXNXb3JkKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdv
cmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9IAorICAg
IGlmIChwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaywgYm94KSkKKyAgICAgICAgcmV0dXJu
IHdvcmRCcmVhazsKICAgICAKLSAgICAvLyBGSVhNRTogTm90IGltcGxlbWVudGVkLgotICAgIHJl
dHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICBXb3JkQm91bmRhcnlWZWN0b3Igb3JkZXJlZFdv
cmRCb3VuZGFyaWVzOworICAgIGlmIChib3gtPmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9u
KQorICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVj
dGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBlbHNlCisgICAgICAg
IGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJudERpcmVjdGlvbmFs
aXR5KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBpbnQgaW5kZXggPSBib3gtPmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHNtYWxsZXN0T2Zmc2V0QWJvdmUob2Zmc2V0LCBibG9j
a0RpcmVjdGlvbiA9PSBMVFIsIG9yZGVyZWRXb3JkQm91bmRhcmllcykgOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlc3RWYWx1ZVVuZGVyKG9m
ZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gUlRMLCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOworICAg
IGlmIChpbmRleCAhPSBpbnZhbGlkT2Zmc2V0KQorICAgICAgICByZXR1cm4gb3JkZXJlZFdvcmRC
b3VuZGFyaWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247CisgICAgCisgICAgcmV0dXJuIHJpZ2h0
V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0Rp
cmVjdGlvbik7CiB9CiAKIH0KSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDgzMTE3KQorKysgTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAKKzIwMTEtMDQtMDYg
IFhpYW9tZWkgSmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3Zpbmcg
Y2FyZXQgYnkgd29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgICogZWRpdGluZy9zZWxlY3Rp
b24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVjdGVkLnR4dDoKKwogMjAxMS0wNC0wNiAgQWRy
aWVubmUgV2Fsa2VyICA8ZW5uZUBnb29nbGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJl
YmFzZWxpbmUgbW9yZSBDaHJvbWl1bSBtYWMgdGVzdHMgYWZ0ZXIgcjgzMDc1LgpJbmRleDogTGF5
b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVjdGVk
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9tb3ZlLWJ5
LXdvcmQtdmlzdWFsbHktZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA4Mjg0OCkKKysrIExheW91dFRl
c3RzL2VkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTIsMzQgKzIsMzQgQEAKID09PT09PT09IE1vdmUgQnkgV29yZCA9
PT09CiBUZXN0IDEsIExUUjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMgZGVmIGhpaiBv
cHEgcnN0IlswLCA0LCA4LCAxMiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTIs
IDE2LCAxOSwgMTldCisiYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgOCwgMTIsIDE2LCAxNiwgMTld
ICAgIEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMiwgMTYsIDE5LCAxOV0KIE1vdmUgbGVmdCBieSBv
bmUgd29yZAotImFiYyBkZWYgaGlqIG9wcSByc3QiWzE2LCAxNiwgMTIsIDgsIDQsIDBdICAgIEZB
SUwgZXhwZWN0ZWQ6IFsxNiwgMTIsIDgsIDQsIDAsIDBdCisiYWJjIGRlZiBoaWogb3BxIHJzdCJb
MTYsIDEyLCA4LCA0LCAwLCAwXQogVGVzdCAyLCBSVEw6CiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQK
LSJhYmMgZGVmIGhpaiBvcHEgcnN0IlswLCAxNSwgMTEsIDcsIDMsIDE5XSAgICBGQUlMIGV4cGVj
dGVkOiBbMTUsIDExLCA3LCAzLCAxOSwgMTldCisiYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgMTEs
IDcsIDMsIDMsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbMTUsIDExLCA3LCAzLCAxOSwgMTldCiBN
b3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMTksIDMsIDcsIDEx
LCAxNSwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KKyJhYmMgZGVm
IGhpaiBvcHEgcnN0IlsxOSwgNywgMTEsIDE1LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywg
NywgMTEsIDE1LCAwLCAwXQogVGVzdCAzLCBMVFI6CiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0i
WlpaIFFRUSBCQkIgQ0NDIFhYWCJbMCwgMTUsIDExLCA3LCAzLCAxOV0gICAgRkFJTCBleHBlY3Rl
ZDogWzE1LCAxMSwgNywgMywgMTksIDE5XQorIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDExLCA3
LCAzLCAzLCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywgMywgMTksIDE5XQogTW92
ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTksIDMsIDcsIDExLCAx
NSwgMF0gICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KKyJaWlogUVFRIEJC
QiBDQ0MgWFhYIlsxOSwgNywgMTEsIDE1LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgNywg
MTEsIDE1LCAwLCAwXQogVGVzdCA0LCBSVEw6CiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJaWlog
UVFRIEJCQiBDQ0MgWFhYIlswLCA0LCA4LCAxMiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBb
NCwgOCwgMTIsIDE2LCAxOSwgMTldCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMCwgOCwgMTIsIDE2
LCAxNiwgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMiwgMTYsIDE5LCAxOV0KIE1vdmUg
cmlnaHQgYnkgb25lIHdvcmQKLSJaWlogUVFRIEJCQiBDQ0MgWFhYIlsxNiwgMTYsIDEyLCA4LCA0
LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTYsIDEyLCA4LCA0LCAwLCAwXQorIlpaWiBRUVEgQkJC
IENDQyBYWFgiWzE2LCAxMiwgOCwgNCwgMCwgMF0KIFRlc3QgNSwgTFRSOgogTW92ZSByaWdodCBi
eSBvbmUgd29yZAotImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCA0LCA4LCAxMSwgMTYsIDIw
LCAyM10gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDExLCAxNiwgMjAsIDIzLCAyM10KKyJhYmMg
ZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMCwgNCwgOCwgMTEsIDIwLCAyMCwgMjNdICAgIEZBSUwgZXhw
ZWN0ZWQ6IFs0LCA4LCAxMSwgMTYsIDIwLCAyMywgMjNdCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQK
LSJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMjAsIDIwLCAxNiwgMTEsIDQsIDQsIDBdICAgIEZB
SUwgZXhwZWN0ZWQ6IFsyMCwgMTYsIDExLCA4LCA0LCAwLCAwXQorImFiYyBkZWYgWlFCIFJJRyB1
dncgeHl6IlsyMCwgMTYsIDQsIDgsIDQsIDAsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFsyMCwgMTYs
IDExLCA4LCA0LCAwLCAwXQogVGVzdCA2LCBSVEw6CiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJh
YmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMCwgMywgOCwgMTIsIDE2LCAxOSwgMjNdICAgIEZBSUwg
ZXhwZWN0ZWQ6IFszLCA4LCAxMiwgMTYsIDE5LCAyMywgMjNdCisiYWJjIGRlZiBaUUIgUklHIHV2
dyB4eXoiWzAsIDMsIDEyLCAxMiwgMTYsIDE5LCAyM10gICAgRkFJTCBleHBlY3RlZDogWzMsIDgs
IDEyLCAxNiwgMTksIDIzLCAyM10KIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMgZGVmIFpR
QiBSSUcgdXZ3IHh5eiJbMTIsIDE5LCAxMiwgMTIsIDgsIDMsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6
IFsxOSwgMTYsIDEyLCA4LCAzLCAwLCAwXQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlsxMiwg
MTYsIDEyLCA4LCA4LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTksIDE2LCAxMiwgOCwgMywg
MCwgMF0KIFRlc3QgNywgTFRSOgogTW92ZSByaWdodCBieSBvbmUgd29yZAogIlpRQiBhYmMgUklH
IlswLCA0LCA4LCAxMV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDExLCAxMV0KQEAgLTM5LDUg
KzM5LDUgQEAgVGVzdCA4LCBSVEw6CiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKICJaUUIgYWJjIFJJ
RyJbMCwgNCwgOCwgMTFdICAgIEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMSwgMTFdCiBNb3ZlIHJp
Z2h0IGJ5IG9uZSB3b3JkCi0iWlFCIGFiYyBSSUciWzgsIDgsIDAsIDBdICAgIEZBSUwgZXhwZWN0
ZWQ6IFs4LCA0LCAwLCAwXQorIlpRQiBhYmMgUklHIls4LCAwLCAwLCAwXSAgICBGQUlMIGV4cGVj
dGVkOiBbOCwgNCwgMCwgMF0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>88744</attachid>
            <date>2011-04-07 17:53:16 -0700</date>
            <delta_ts>2011-04-11 11:50:06 -0700</delta_ts>
            <desc>patch w/ layout test</desc>
            <filename>57806.v5</filename>
            <type>text/plain</type>
            <size>22327</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgzMTE3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTEtMDQtMDYgIFhpYW9tZWkg
SmkgIDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENvbnRpbnVlIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgY2FyZXQgYnkg
d29yZCBpbiB2aXN1YWwgb3JkZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzgwNgorCisgICAgICAgIFRoaXMgaXMgdGhlIDJuZCBwYXRjaCwgd2hp
Y2ggYWRkcyBpbXBsZW1lbnRhdGlvbiB3aGVuIGNhcmV0IGlzIGluc2lkZSBib3gKKyAgICAgICAg
KG5vdCBhdCBib3VuZGFyaWVzKS4gSWYgdGhlIHdvcmQgYnJlYWsgaXMgaW5zaWRlIHRoZSBzYW1l
IGJveCBhbmQgbm90IGF0IHRoZSBib3VuZGFyaWVzCisgICAgICAgIGVpdGhlciwgdGhlIHdvcmQg
YnJlYWsgd2lsbCBiZSByZXR1cm5lZC4gSWYgbmVlZCB0byBzZWFyY2ggdGhlIGFkamFjZW50IGJv
eGVzIGZvciB3b3JkCisgICAgICAgIGJyZWFrcywgdGhlbiwgb25seSB0aGUgY2FzZXMgaW1wbGVt
ZW50ZWQgaW4gYnVnIDU3MzM2IHdvcmsuCisKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpsYXN0V29yZEJyZWFrSW5Cb3gpOgorICAgICAgICAo
V2ViQ29yZTo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9ja1dpdGhEaWZmZXJl
bnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0V29yZEJyZWFrSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3Jl
OjpXb3JkQm91bmRhcnlFbnRyeTo6V29yZEJvdW5kYXJ5RW50cnkpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpncmVhdGVzdFZh
bHVlVW5kZXIpOgorICAgICAgICAoV2ViQ29yZTo6c21hbGxlc3RPZmZzZXRBYm92ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnBv
c2l0aW9uQmVmb3JlTmV4dFdvcmQpOgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpb25BZnRlclBy
ZXZpb3VzV29yZCk6CisgICAgICAgIChXZWJDb3JlOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OnJpZ2h0V29yZFBvc2l0aW9uKToKKwogMjAxMS0wNC0wNiAgTGVhbmRybyBH
cmFjaWEgR2lsICA8bGVhbmRyb2dyYWNpYUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgU3RldmUgQmxvY2suCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91
bml0cy5jcHAJKHJldmlzaW9uIDgyODQ4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNp
YmxlX3VuaXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw2ICsxMTczLDE3OSBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgcmV0dXJuIHdvcmRCcmVh
azsKIH0KIAorc3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJ
bkxUUkJsb2NrKGNvbnN0IElubGluZUJveCogYm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJs
eSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0g
Ym94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBi
b3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0
TGVhZkNoaWxkKCk7ICAgCisgICAgCisgICAgaWYgKHByZXZpb3VzTGVhZiAmJiAhcHJldmlvdXNM
ZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIHJldHVybiBQb3NpdGlvbihu
b2RlLCBib3gtPmNhcmV0TWF4T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworCisgICAgaWYgKG5leHRMZWFmICYmICFuZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpKSB7CisgICAgICAgIGlmIChwcmV2aW91c0xlYWYpCisgICAgICAgICAgICByZXR1
cm4gUG9zaXRpb24ocHJldmlvdXNMZWFmLT5yZW5kZXJlcigpLT5ub2RlKCksIHByZXZpb3VzTGVh
Zi0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7
CisKKyAgICAgICAgSW5saW5lQm94KiBsYXN0UlRMTGVhZjsKKyAgICAgICAgZG8geworICAgICAg
ICAgICAgbGFzdFJUTExlYWYgPSBuZXh0TGVhZjsKKyAgICAgICAgICAgIG5leHRMZWFmID0gbmV4
dExlYWYtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgfSB3aGlsZSAobmV4dExlYWYgJiYgIW5l
eHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpOworICAgICAgICByZXR1cm4gUG9zaXRp
b24obGFzdFJUTExlYWYtPnJlbmRlcmVyKCktPm5vZGUoKSwgbGFzdFJUTExlYWYtPmNhcmV0TWlu
T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIH0KKwor
ICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGNvbnN0IElubGluZUJveCogYm94
KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxl
dmVsIHRvby4KKyAgICBOb2RlKiBub2RlID0gYm94LT5yZW5kZXJlcigpLT5ub2RlKCk7CisgICAg
SW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICBJbmxp
bmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7ICAgCisgICAgCisgICAgaWYg
KG5leHRMZWFmICYmIG5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpICAgIAorICAg
ICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKworICAgIGlmIChwcmV2aW91c0xlYWYgJiYg
cHJldmlvdXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgaWYgKG5l
eHRMZWFmKQorICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uKG5leHRMZWFmLT5yZW5kZXJlcigp
LT5ub2RlKCksIG5leHRMZWFmLT5jYXJldE1heE9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25J
c09mZnNldEluQW5jaG9yKTsKKworICAgICAgICBJbmxpbmVCb3gqIGZpcnN0TFRSTGVhZjsKKyAg
ICAgICAgZG8geworICAgICAgICAgICAgZmlyc3RMVFJMZWFmID0gcHJldmlvdXNMZWFmOworICAg
ICAgICAgICAgcHJldmlvdXNMZWFmID0gcHJldmlvdXNMZWFmLT5wcmV2TGVhZkNoaWxkKCk7Cisg
ICAgICAgIH0gd2hpbGUgKHByZXZpb3VzTGVhZiAmJiBwcmV2aW91c0xlYWYtPmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSk7CisgICAgICAgIHJldHVybiBQb3NpdGlvbihmaXJzdExUUkxlYWYtPnJl
bmRlcmVyKCktPm5vZGUoKSwgZmlyc3RMVFJMZWFmLT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICB9CisKKyAgICByZXR1cm4gUG9zaXRp
b24obm9kZSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNl
dEluQW5jaG9yKTsKK30KKyAgICAKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGFzdFdvcmRCcmVh
a0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorewor
ICAgIC8vIEFkZCB0aGUgbGVmdG1vc3Qgd29yZCBicmVhayBmb3IgUlRMIGJveCBvciByaWdodG1v
c3Qgd29yZCBicmVhayBmb3IgTFRSIGJveC4KKyAgICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9
IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAgIElubGluZUJveCogbmV4dExlYWYgPSBib3gtPm5l
eHRMZWFmQ2hpbGQoKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gYm91bmRhcnlQb3NpdGlvbjsKKyAg
ICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgKCFwcmV2aW91c0xlYWYgfHwgcHJldmlv
dXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBib3VuZGFyeVBvc2l0
aW9uID0gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gpOworICAgIGVsc2Ug
aWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICghbmV4dExlYWYgfHwgIW5leHRMZWFmLT5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQorICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmln
aHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soYm94KTsKKworICAgIGlmIChib3VuZGFy
eVBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7ICAg
ICAgICAgICAgCisKKyAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrID0gbmV4dFdvcmRQb3Np
dGlvbihib3VuZGFyeVBvc2l0aW9uKTsKKyAgICBpZiAod29yZEJyZWFrICE9IGJvdW5kYXJ5UG9z
aXRpb24pCisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBvc2l0aW9uKHdvcmRCcmVh
ayk7CisKKyAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJyZWFrOworICAgIHdvcmRCcmVhay5nZXRJ
bmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAg
ICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94KQorICAgICAgICByZXR1cm4gd29yZEJyZWFrOwor
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsgICAgCit9CisKK3N0YXRpYyBib29sIHBvc2l0
aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxp
dHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWssIGNvbnN0IElubGluZUJveCogYm94
LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQoreworICAgIGludCBwcmV2aW91c09mZnNldCA9IG9m
ZnNldE9mV29yZEJyZWFrOworICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7CisgICAgd29y
ZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWspOworICAgIGlmIChib3hPZldvcmRCcmVhayA9PSBib3ggJiYgKHByZXZpb3VzT2Zmc2V0
ID09IGludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhaykp
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKyAgICAKK3N0YXRp
YyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkoCisgICAgY29uc3QgSW5saW5lQm94KiBib3gsIGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWssIGJv
b2wmIGlzTGFzdFdvcmRCcmVha0luQm94KQoreworICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVk
IHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KKyAgICAKKyAgICAvLyBJbiBhIExUUiBi
bG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEg
d29yZC4KKyAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9u
IHRoZSByaWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCisgICAgLy8gQmVjYXVzZSBwcmV2aW91c1dv
cmRQb3NpdGlvbigpIHJldHVybnMgdGhlIHdvcmQgYnJlYWsgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5
IG9mIHRoZSB3b3JkIGZvciBSVEwgdGV4dCwKKyAgICAvLyB3ZSBuZWVkIHRvIHVzZSBuZXh0V29y
ZFBvc2l0aW9uKCkgdG8gdHJhdmVyc2Ugd29yZHMgd2l0aGluIHRoZSBpbmxpbmUgYm94ZXMgZnJv
bSByaWdodCB0byBsZWZ0IHRvIGZpbmQgdGhlIG5leHQgd29yZCBicmVhay4KKyAgICAvLyBUaGUg
c2FtZSBhcHBsaWVzIHRvIExUUiB0ZXh0LCBpbiB3aGljaCB3b3JkcyBhcmUgdHJhdmVyc2VkIHdp
dGhpbiB0aGUgaW5saW5lIGJveGVzIGZyb20gbGVmdCB0byByaWdodC4KKyAgICAKKyAgICAvLyBG
SVhNRTogaGFuZGxlIG11bHRpLXNwYWNlcyAoaHR0cDovL3dlYmtpdC5vcmcvYi81NzU0MykuCisg
ICAgCisgICAgYm9vbCBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID0gcHJldmlvdXNXb3JkQnJl
YWsuaXNOb3ROdWxsKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhayA9IGhhc1NlZW5X
b3JkQnJlYWtJblRoaXNCb3ggPyBwcmV2aW91c1dvcmRCcmVhayA6IFBvc2l0aW9uKGJveC0+cmVu
ZGVyZXIoKS0+bm9kZSgpLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlv
bklzT2Zmc2V0SW5BbmNob3IpOworICAgIHdvcmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24od29y
ZEJyZWFrKTsKKyAgICAKKyAgICBpZiAod29yZEJyZWFrID09IHByZXZpb3VzV29yZEJyZWFrKSB7
CisgICAgICAgIGlzTGFzdFdvcmRCcmVha0luQm94ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFZp
c2libGVQb3NpdGlvbigpOworICAgIH0KKworICAgIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFs
c2U7CisKKyAgICAvLyBHaXZlbiBSVEwgYm94ICJBQkMgREVGIiBlaXRoZXIgZm9sbG93cyBhIExU
UiBib3ggb3IgaXMgdGhlIGZpcnN0IHZpc3VhbCBib3ggaW4gYW4gTFRSIGJsb2NrIGFzIGFuIGV4
YW1wbGUsCisgICAgLy8gdGhlIHZpc3VhbCBkaXNwbGF5IG9mIHRoZSBSVEwgYm94IGlzOiAiKDAp
SigxMClJKDkpSCg4KSAoNylGKDYpRSg1KUQoNCkgKDMpQygyKUIoMSlBKDExKSIsCisgICAgLy8g
d2hlcmUgdGhlIG51bWJlciBpbiBwYXJlbnRoZXNpcyByZXByZXNlbnRzIG9mZnNldCBpbiB2aXNp
YmxlUG9zaXRpb24uIAorICAgIC8vIFN0YXJ0IGF0IG9mZnNldCAwLCB0aGUgZmlyc3Qgd29yZCBi
cmVhayBpcyBhdCBvZmZzZXQgMywgdGhlIDJuZCB3b3JkIGJyZWFrIGlzIGF0IG9mZnNldCA3LCBh
bmQgdGhlIDNyZCB3b3JkIGJyZWFrIHNob3VsZCBiZSBhdCBvZmZzZXQgMC4KKyAgICAvLyBCdXQg
bmV4dFdvcmRQb3NpdGlvbigpIG9mIG9mZnNldCA3IGlzIG9mZnNldCAxMSwgd2hpY2ggc2hvdWxk
IGJlIGlnbm9yZWQsIAorICAgIC8vIGFuZCB0aGUgcG9zaXRpb24gYXQgb2Zmc2V0IDAgc2hvdWxk
IGJlIG1hbnVhbGx5IGFkZGVkIGFzIHRoZSBsYXN0IHdvcmQgYnJlYWsgd2l0aGluIHRoZSBib3gu
CisgICAgaWYgKHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkKKyAg
ICAgICAgcmV0dXJuIHdvcmRCcmVhazsKKyAgICAKKyAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9
IHRydWU7CisgICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9mV29yZEJy
ZWFrKTsKK30KKworc3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKKyAgICBXb3JkQm91bmRhcnlF
bnRyeSgpCisgICAgICAgIDogb2Zmc2V0SW5JbmxpbmVCb3goaW52YWxpZE9mZnNldCkgCisgICAg
eyAKKyAgICB9CisKKyAgICBXb3JkQm91bmRhcnlFbnRyeShjb25zdCBWaXNpYmxlUG9zaXRpb24m
IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KQorICAgICAgICA6IHZpc2libGVQb3NpdGlvbihwb3NpdGlv
bikKKyAgICAgICAgLCBvZmZzZXRJbklubGluZUJveChvZmZzZXQpIAorICAgIHsgCisgICAgfQor
CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbjsKKyAgICBpbnQgb2Zmc2V0SW5J
bmxpbmVCb3g7Cit9OworICAgIAordHlwZWRlZiBWZWN0b3I8V29yZEJvdW5kYXJ5RW50cnksIDUw
PiBXb3JkQm91bmRhcnlWZWN0b3I7CisgICAgCitzdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFr
c0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IElubGluZUJveCog
Ym94LCBXb3JkQm91bmRhcnlWZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcykKK3sKKyAgICBv
cmRlcmVkV29yZEJvdW5kYXJpZXMuY2xlYXIoKTsKKyAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24g
d29yZEJyZWFrOworICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IGludmFsaWRPZmZzZXQ7Cisg
ICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJv
eEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0
T2ZXb3JkQnJlYWspOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIHN0cnVjdCBXb3JkQm91bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlF
bnRyeSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91bmRhcnlFbnRyeSk7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rp
b25hbGl0eShjb25zdCBJbmxpbmVCb3gqIGJveCwgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVk
V29yZEJvdW5kYXJpZXMpCit7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7Cisg
ICAgCisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3Jk
QnJlYWsgPSBpbnZhbGlkT2Zmc2V0OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGJvb2wgaXNM
YXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRC
cmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoYm94LCB3b3Jk
QnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJveCk7CisgICAgICAg
IGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBXb3JkQm91
bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlFbnRyeSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFr
KTsKKyAgICAgICAgICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy5hcHBlbmQod29yZEJvdW5kYXJ5
RW50cnkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0xhc3RXb3JkQnJlYWtJbkJveCkKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKyAgICAKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24g
cHJldmlvdXNXb3JkQnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwg
VGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKIHsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJl
YWsgPSAwOwpAQCAtMTE4OSw2ICsxMzYyLDQ0IEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJl
dmlvdXNXb3JkQnJlYWsKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAKK3N0YXRp
YyBpbnQgZ3JlYXRlc3RWYWx1ZVVuZGVyKGludCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tBcmVJ
blNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzKQoreworICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSkKKyAgICAg
ICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2guCisg
ICAgaWYgKGJveEFuZEJsb2NrQXJlSW5TYW1lRGlyZWN0aW9uKSB7CisgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3gg
PCBvZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgfQorICAgIGZvciAoaW50IGkgPSBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgaWYgKG9yZGVy
ZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXRJbklubGluZUJveCA8IG9mZnNldCkKKyAgICAgICAg
ICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKK30KKworc3Rh
dGljIGludCBzbWFsbGVzdE9mZnNldEFib3ZlKGludCBvZmZzZXQsIGJvb2wgYm94QW5kQmxvY2tB
cmVJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzKQoreworICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSkKKyAg
ICAgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2gu
CisgICAgaWYgKGJveEFuZEJsb2NrQXJlSW5TYW1lRGlyZWN0aW9uKSB7CisgICAgICAgIGZvciAo
aW50IGkgPSBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsK
KyAgICAgICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVC
b3ggPiBvZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG9y
ZGVyZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXRJbklubGluZUJveCA+IG9mZnNldCkKKyAgICAg
ICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKK30KKyAK
IHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRCb3VuZGFyeShjb25zdCBJbmxpbmVCb3gq
IGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKIHsKICAgICBW
aXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwpAQCAtMTIxNSw3ICsxNDI2LDMzIEBAIHN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gcmlnaHRXb3JkQm91bmRhcnkKICAgICB9CiAgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbigpOwogfQorICAgIAorc3RhdGljIGJvb2wgcG9zaXRpb25Jc0luc2lkZUJveChj
b25zdCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gpCit7
CisgICAgSW5saW5lQm94KiBib3hPZldvcmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJl
YWs7CisgICAgd29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywg
b2Zmc2V0T2ZXb3JkQnJlYWspOworICAgIHJldHVybiBib3ggPT0gYm94T2ZXb3JkQnJlYWsgJiYg
b2Zmc2V0T2ZXb3JkQnJlYWsgIT0gYm94LT5jYXJldE1heE9mZnNldCgpICYmIG9mZnNldE9mV29y
ZEJyZWFrICE9IGJveC0+Y2FyZXRNaW5PZmZzZXQoKTsKK30KKworc3RhdGljIFZpc2libGVQb3Np
dGlvbiBwb3NpdGlvbkJlZm9yZU5leHRXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zaXRp
b24pCit7CisgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uQWZ0ZXJDdXJyZW50V29yZCA9IG5l
eHRXb3JkUG9zaXRpb24ocG9zaXRpb24pOworICAgIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkFm
dGVyTmV4dFdvcmQgPSBuZXh0V29yZFBvc2l0aW9uKHBvc2l0aW9uQWZ0ZXJDdXJyZW50V29yZCk7
CisgICAgaWYgKHBvc2l0aW9uQWZ0ZXJDdXJyZW50V29yZCA9PSBwb3NpdGlvbkFmdGVyTmV4dFdv
cmQpCisgICAgICAgIHJldHVybiBwb3NpdGlvbkFmdGVyQ3VycmVudFdvcmQ7CisgICAgcmV0dXJu
IHByZXZpb3VzV29yZFBvc2l0aW9uKHBvc2l0aW9uQWZ0ZXJOZXh0V29yZCk7Cit9CiAKK3N0YXRp
YyBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25BZnRlclByZXZpb3VzV29yZChjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkJlZm9y
ZUN1cnJlbnRXb3JkID0gcHJldmlvdXNXb3JkUG9zaXRpb24ocG9zaXRpb24pOworICAgIFZpc2li
bGVQb3NpdGlvbiBwb3NpdGlvbkJlZm9yZVByZXZpb3VzV29yZCA9IHByZXZpb3VzV29yZFBvc2l0
aW9uKHBvc2l0aW9uQmVmb3JlQ3VycmVudFdvcmQpOworICAgIGlmIChwb3NpdGlvbkJlZm9yZUN1
cnJlbnRXb3JkID09IHBvc2l0aW9uQmVmb3JlUHJldmlvdXNXb3JkKQorICAgICAgICByZXR1cm4g
cG9zaXRpb25CZWZvcmVDdXJyZW50V29yZDsKKyAgICByZXR1cm4gbmV4dFdvcmRQb3NpdGlvbihw
b3NpdGlvbkJlZm9yZVByZXZpb3VzV29yZCk7Cit9CisgICAgCiBWaXNpYmxlUG9zaXRpb24gbGVm
dFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsK
ICAgICBJbmxpbmVCb3gqIGJveDsKQEAgLTEyMzEsOCArMTQ2OCwzNCBAQCBWaXNpYmxlUG9zaXRp
b24gbGVmdFdvcmRQb3NpdGlvbihjb25zdCBWCiAgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0
UmlnaHRtb3N0T2Zmc2V0KCkpCiAgICAgICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5KGJveCwg
b2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7CiAgICAgCi0gICAgLy8gRklYTUU6IE5vdCBpbXBsZW1l
bnRlZC4KLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgCisgICAgVmlzaWJsZVBv
c2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVj
dGlvbikgeworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKQorICAgICAgICAgICAg
d29yZEJyZWFrID0gcG9zaXRpb25CZWZvcmVOZXh0V29yZCh2aXNpYmxlUG9zaXRpb24pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRQb3NpdGlvbih2
aXNpYmxlUG9zaXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChibG9ja0RpcmVjdGlv
biA9PSBSVEwpCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBwb3NpdGlvbkFmdGVyUHJldmlvdXNX
b3JkKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVh
ayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9CisgICAgaWYgKHBv
c2l0aW9uSXNJbnNpZGVCb3god29yZEJyZWFrLCBib3gpKQorICAgICAgICByZXR1cm4gd29yZEJy
ZWFrOworICAgIAorICAgIFdvcmRCb3VuZGFyeVZlY3RvciBvcmRlcmVkV29yZEJvdW5kYXJpZXM7
CisgICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb24pCisgICAgICAgIGNv
bGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoYm94
LCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOworICAgIGVsc2UKKyAgICAgICAgY29sbGVjdFdvcmRC
cmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoYm94LCBvcmRl
cmVkV29yZEJvdW5kYXJpZXMpOworCisgICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkgPyBncmVhdGVzdFZhbHVlVW5kZXIob2Zmc2V0LCBibG9ja0RpcmVjdGlvbiA9
PSBMVFIsIG9yZGVyZWRXb3JkQm91bmRhcmllcykgOgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlc3RPZmZzZXRBYm92ZShvZmZzZXQsIGJsb2Nr
RGlyZWN0aW9uID09IFJUTCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBpZiAoaW5kZXgg
IT0gaW52YWxpZE9mZnNldCkKKyAgICAgICAgcmV0dXJuIG9yZGVyZWRXb3JkQm91bmRhcmllc1tp
bmRleF0udmlzaWJsZVBvc2l0aW9uOworICAgIAorICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5
KGJveC0+cHJldkxlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7CiB9
CiAKIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRp
b24mIHZpc2libGVQb3NpdGlvbikKQEAgLTEyNDUsMTAgKzE1MDgsMzQgQEAgVmlzaWJsZVBvc2l0
aW9uIHJpZ2h0V29yZFBvc2l0aW9uKGNvbnN0IAogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJl
dExlZnRtb3N0T2Zmc2V0KCkpCiAgICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gs
IG9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJp
Z2h0bW9zdE9mZnNldCgpKQotICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LT5u
ZXh0TGVhZkNoaWxkKCksIC0xLCBibG9ja0RpcmVjdGlvbik7CisgICAgICAgIHJldHVybiByaWdo
dFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tE
aXJlY3Rpb24pOworIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CisgICAgaWYgKGJv
eC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb24pIHsKKyAgICAgICAgaWYgKGJsb2NrRGly
ZWN0aW9uID09IExUUikKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHBvc2l0aW9uQmVmb3JlTmV4
dFdvcmQodmlzaWJsZVBvc2l0aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd29yZEJy
ZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gTFRSKQorICAgICAgICAgICAgd29yZEJy
ZWFrID0gcG9zaXRpb25BZnRlclByZXZpb3VzV29yZCh2aXNpYmxlUG9zaXRpb24pOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKHZpc2libGVQ
b3NpdGlvbik7CisgICAgfSAKKyAgICBpZiAocG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWss
IGJveCkpCisgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCi0gICAgLy8gRklYTUU6IE5v
dCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgV29yZEJv
dW5kYXJ5VmVjdG9yIG9yZGVyZWRXb3JkQm91bmRhcmllczsKKyAgICBpZiAoYm94LT5kaXJlY3Rp
b24oKSA9PSBibG9ja0RpcmVjdGlvbikKKyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveElu
c2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmll
cyk7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7Cisg
ICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBzbWFsbGVzdE9m
ZnNldEFib3ZlKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCBvcmRlcmVkV29yZEJvdW5k
YXJpZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwgb3JkZXJl
ZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBpZiAoaW5kZXggIT0gaW52YWxpZE9mZnNldCkKKyAgICAg
ICAgcmV0dXJuIG9yZGVyZWRXb3JkQm91bmRhcmllc1tpbmRleF0udmlzaWJsZVBvc2l0aW9uOwor
ICAgIAorICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwg
aW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwogfQogCiB9CkluZGV4OiBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lv
biA4MzExNykKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDEyIEBACisyMDExLTA0LTA2ICBYaWFvbWVpIEppICA8eGppQGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDb250aW51ZSBl
eHBlcmltZW50IHdpdGggbW92aW5nIGNhcmV0IGJ5IHdvcmQgaW4gdmlzdWFsIG9yZGVyLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc4MDYKKworICAg
ICAgICAqIGVkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS1leHBlY3RlZC50
eHQ6CisKIDIwMTEtMDQtMDYgIEFkcmllbm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KIAog
ICAgICAgICBVbnJldmlld2VkLCByZWJhc2VsaW5lIG1vcmUgQ2hyb21pdW0gbWFjIHRlc3RzIGFm
dGVyIHI4MzA3NS4KSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnkt
d29yZC12aXN1YWxseS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRp
dGluZy9zZWxlY3Rpb24vbW92ZS1ieS13b3JkLXZpc3VhbGx5LWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gODI4NDgpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9tb3ZlLWJ5LXdvcmQt
dmlzdWFsbHktZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0yLDM0ICsyLDM0IEBACiA9
PT09PT09PSBNb3ZlIEJ5IFdvcmQgPT09PQogVGVzdCAxLCBMVFI6CiBNb3ZlIHJpZ2h0IGJ5IG9u
ZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgNCwgOCwgMTIsIDE2LCAxOV0gICAgRkFJ
TCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5XQorImFiYyBkZWYgaGlqIG9wcSByc3Qi
WzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTIsIDE2LCAx
OSwgMTldCiBNb3ZlIGxlZnQgYnkgb25lIHdvcmQKLSJhYmMgZGVmIGhpaiBvcHEgcnN0IlsxNiwg
MTYsIDEyLCA4LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTYsIDEyLCA4LCA0LCAwLCAwXQor
ImFiYyBkZWYgaGlqIG9wcSByc3QiWzE2LCAxMiwgOCwgNCwgMCwgMF0KIFRlc3QgMiwgUlRMOgog
TW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBoaWogb3BxIHJzdCJbMCwgMTUsIDExLCA3
LCAzLCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzE1LCAxMSwgNywgMywgMTksIDE5XQorImFiYyBk
ZWYgaGlqIG9wcSByc3QiWzAsIDExLCA3LCAzLCAzLCAxOV0gICAgRkFJTCBleHBlY3RlZDogWzE1
LCAxMSwgNywgMywgMTksIDE5XQogTW92ZSByaWdodCBieSBvbmUgd29yZAotImFiYyBkZWYgaGlq
IG9wcSByc3QiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA3LCAx
MSwgMTUsIDAsIDBdCisiYWJjIGRlZiBoaWogb3BxIHJzdCJbMTksIDcsIDExLCAxNSwgMCwgMF0g
ICAgRkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KIFRlc3QgMywgTFRSOgogTW92
ZSByaWdodCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIENDQyBYWFgiWzAsIDE1LCAxMSwgNywg
MywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwgMTEsIDcsIDMsIDE5LCAxOV0KKyJaWlogUVFR
IEJCQiBDQ0MgWFhYIlswLCAxMSwgNywgMywgMywgMTldICAgIEZBSUwgZXhwZWN0ZWQ6IFsxNSwg
MTEsIDcsIDMsIDE5LCAxOV0KIE1vdmUgbGVmdCBieSBvbmUgd29yZAotIlpaWiBRUVEgQkJCIEND
QyBYWFgiWzE5LCAzLCA3LCAxMSwgMTUsIDBdICAgIEZBSUwgZXhwZWN0ZWQ6IFszLCA3LCAxMSwg
MTUsIDAsIDBdCisiWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMTksIDcsIDExLCAxNSwgMCwgMF0gICAg
RkFJTCBleHBlY3RlZDogWzMsIDcsIDExLCAxNSwgMCwgMF0KIFRlc3QgNCwgUlRMOgogTW92ZSBs
ZWZ0IGJ5IG9uZSB3b3JkCi0iWlpaIFFRUSBCQkIgQ0NDIFhYWCJbMCwgNCwgOCwgMTIsIDE2LCAx
OV0gICAgRkFJTCBleHBlY3RlZDogWzQsIDgsIDEyLCAxNiwgMTksIDE5XQorIlpaWiBRUVEgQkJC
IENDQyBYWFgiWzAsIDgsIDEyLCAxNiwgMTYsIDE5XSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwg
MTIsIDE2LCAxOSwgMTldCiBNb3ZlIHJpZ2h0IGJ5IG9uZSB3b3JkCi0iWlpaIFFRUSBCQkIgQ0ND
IFhYWCJbMTYsIDE2LCAxMiwgOCwgNCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzE2LCAxMiwgOCwg
NCwgMCwgMF0KKyJaWlogUVFRIEJCQiBDQ0MgWFhYIlsxNiwgMTIsIDgsIDQsIDAsIDBdCiBUZXN0
IDUsIExUUjoKIE1vdmUgcmlnaHQgYnkgb25lIHdvcmQKLSJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5
eiJbMCwgNCwgOCwgMTEsIDE2LCAyMCwgMjNdICAgIEZBSUwgZXhwZWN0ZWQ6IFs0LCA4LCAxMSwg
MTYsIDIwLCAyMywgMjNdCisiYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzAsIDQsIDgsIDExLCAy
MCwgMjAsIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbNCwgOCwgMTEsIDE2LCAyMCwgMjMsIDIzXQog
TW92ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzIwLCAyMCwg
MTYsIDExLCA0LCA0LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMjAsIDE2LCAxMSwgOCwgNCwgMCwg
MF0KKyJhYmMgZGVmIFpRQiBSSUcgdXZ3IHh5eiJbMjAsIDE2LCA0LCA4LCA0LCAwLCAwXSAgICBG
QUlMIGV4cGVjdGVkOiBbMjAsIDE2LCAxMSwgOCwgNCwgMCwgMF0KIFRlc3QgNiwgUlRMOgogTW92
ZSBsZWZ0IGJ5IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzAsIDMsIDgsIDEy
LCAxNiwgMTksIDIzXSAgICBGQUlMIGV4cGVjdGVkOiBbMywgOCwgMTIsIDE2LCAxOSwgMjMsIDIz
XQorImFiYyBkZWYgWlFCIFJJRyB1dncgeHl6IlswLCAzLCAxMiwgMTIsIDE2LCAxOSwgMjNdICAg
IEZBSUwgZXhwZWN0ZWQ6IFszLCA4LCAxMiwgMTYsIDE5LCAyMywgMjNdCiBNb3ZlIHJpZ2h0IGJ5
IG9uZSB3b3JkCi0iYWJjIGRlZiBaUUIgUklHIHV2dyB4eXoiWzEyLCAxOSwgMTIsIDEyLCA4LCAz
LCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbMTksIDE2LCAxMiwgOCwgMywgMCwgMF0KKyJhYmMgZGVm
IFpRQiBSSUcgdXZ3IHh5eiJbMTIsIDE2LCAxMiwgOCwgOCwgMCwgMF0gICAgRkFJTCBleHBlY3Rl
ZDogWzE5LCAxNiwgMTIsIDgsIDMsIDAsIDBdCiBUZXN0IDcsIExUUjoKIE1vdmUgcmlnaHQgYnkg
b25lIHdvcmQKICJaUUIgYWJjIFJJRyJbMCwgNCwgOCwgMTFdICAgIEZBSUwgZXhwZWN0ZWQ6IFs0
LCA4LCAxMSwgMTFdCkBAIC0zOSw1ICszOSw1IEBAIFRlc3QgOCwgUlRMOgogTW92ZSBsZWZ0IGJ5
IG9uZSB3b3JkCiAiWlFCIGFiYyBSSUciWzAsIDQsIDgsIDExXSAgICBGQUlMIGV4cGVjdGVkOiBb
NCwgOCwgMTEsIDExXQogTW92ZSByaWdodCBieSBvbmUgd29yZAotIlpRQiBhYmMgUklHIls4LCA4
LCAwLCAwXSAgICBGQUlMIGV4cGVjdGVkOiBbOCwgNCwgMCwgMF0KKyJaUUIgYWJjIFJJRyJbOCwg
MCwgMCwgMF0gICAgRkFJTCBleHBlY3RlZDogWzgsIDQsIDAsIDBdCiAKSW5kZXg6IExheW91dFRl
c3RzL2VkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxseS5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL21vdmUtYnktd29yZC12aXN1YWxs
eS5odG1sCShyZXZpc2lvbiA4Mjg0OCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9u
L21vdmUtYnktd29yZC12aXN1YWxseS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xNTgsNiArMTU4
LDI2IEBAIGZ1bmN0aW9uIHJ1bk1vdmVMZWZ0UmlnaHQodGVzdHMsIHVuaXQpCiAgICAgICAgIH0K
IAogICAgIH0KK30KKworZnVuY3Rpb24gcnVuU3BlY2lmaWNUZXN0KHRlc3RzKQoreworICAgIHZh
ciBzZWwgPSBnZXRTZWxlY3Rpb24oKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxl
bmd0aDsgKytpKSB7CisgICAgICAgIHZhciBjb21wb25lbnRzID0gdGVzdHNbaV0udGl0bGUuc3Bs
aXQoIiAiKTsKKyAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gY29tcG9uZW50c1swXTsKKyAgICAg
ICAgdmFyIG1vdmluZ0RpcmVjdGlvbiA9IGNvbXBvbmVudHNbMV07CisgICAgICAgIHZhciBlbmRp
bmdOb2RlID0gY29tcG9uZW50c1syXTsKKyAgICAgICAgdmFyIGVuZGluZ09mZnNldCA9IGNvbXBv
bmVudHNbM107CisKKyAgICAgICAgc2VsLnNldFBvc2l0aW9uKHRlc3RzW2ldLmZpcnN0Q2hpbGQs
IHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgc2VsLm1vZGlmeSgibW92ZSIsIG1vdmluZ0RpcmVjdGlv
biwgIi13ZWJraXQtdmlzdWFsLXdvcmQiKTsKKyAgICAgICAgaWYgKHNlbC5hbmNob3JOb2RlLnBh
cmVudE5vZGUgIT0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZW5kaW5nTm9kZSkgfHwgc2VsLmFu
Y2hvck9mZnNldCAhPSBlbmRpbmdPZmZzZXQpIHsKKyAgICAgICAgICAgIGxvZygiRkFJTDogc3Rh
cnQgIiArIHRlc3RzW2ldLmlkICsgIiBvZmZzZXQgIiArIHN0YXJ0T2Zmc2V0ICsgIiBtb3Zpbmcg
IiArIG1vdmluZ0RpcmVjdGlvbiArICI6ICIpOworICAgICAgICAgICAgbG9nKCJbIiArIHNlbC5h
bmNob3JOb2RlLnBhcmVudE5vZGUuaWQgKyAiLCAiICsgc2VsLmFuY2hvck9mZnNldCArICJdOyAi
KTsKKyAgICAgICAgICAgIGxvZygiZXhwZWN0ZWQgWyIgKyBlbmRpbmdOb2RlICsgIiwgIiArIGVu
ZGluZ09mZnNldCArICJdIik7CisgICAgICAgIH0KKyAgICB9CiAgICAgZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoInRlc3RNb3ZlQnlXb3JkIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKIH0KIApA
QCAtMTY1LDYgKzE4NSw5IEBAIGZ1bmN0aW9uIHJ1blRlc3QoKSB7CiAgICAgbG9nKCJcbj09PT09
PT09IE1vdmUgQnkgV29yZCA9PT09XG4iKTsKICAgICB2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKCJ0ZXN0X21vdmVfYnlfd29yZCIpOwogICAgIHJ1bk1vdmVMZWZ0
UmlnaHQodGVzdHMsICJ3b3JkIik7CisgICAgCisgICAgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVt
ZW50c0J5Q2xhc3NOYW1lKCJzcGVjaWZpY190ZXN0Iik7CisgICAgcnVuU3BlY2lmaWNUZXN0KHRl
c3RzKTsKIH0KIAogb25sb2FkID0gZnVuY3Rpb24oKSB7CkBAIC0xOTEsNiArMjE0LDkgQEAgVGhl
IG51bWJlcnMgcHJpbnRlZCBvdXQgaW4gdGhlIG91dHB1dCBhcgogPGRpdiBkaXI9cnRsIGNsYXNz
PSJ0ZXN0X21vdmVfYnlfd29yZCIgdGl0bGU9IjAgMyA4IDEyIDE2IDE5IDIzfDIzIDE5IDE2IDEy
IDggMyAwIiBjb250ZW50ZWRpdGFibGU+YWJjIGRlZiDXqdeg15Eg16HXmNeWIHV2dyB4eXo8L2Rp
dj4KIDxkaXYgZGlyPWx0ciBjbGFzcz0idGVzdF9tb3ZlX2J5X3dvcmQiIHRpdGxlPSIwIDQgOCAx
MXwxMSA4IDQgMCIgY29udGVudGVkaXRhYmxlPtep16DXkSBhYmMg16HXmNeWPC9kaXY+CiA8ZGl2
IGRpcj1ydGwgY2xhc3M9InRlc3RfbW92ZV9ieV93b3JkIiB0aXRsZT0iMCA0IDggMTF8MTEgOCA0
IDAiIGNvbnRlbnRlZGl0YWJsZT7Xqdeg15EgYWJjINeh15jXljwvZGl2PgorCis8IS0tIFRoZSBj
b250ZW50IGluIHRpdGxlIG1lYW5zICJzdGFydE9mZnNldEluQ3VycmVudE5vZGUgbW92aW5nRGly
ZWN0aW9uQnlXb3JkIGVuZGluZ05vZGUgZW5kaW5nT2Zmc2V0SW5FbmRpbmdOb2RlIiAtLT4KKzxk
aXYgaWQ9ImRpdl8xIiBjb250ZW50ZWRpdGFibGU+15DXkNeQIDxzcGFuIGlkPSJzcGFuXzEiIGNs
YXNzPSJzcGVjaWZpY190ZXN0IiB0aXRsZT0iMSBsZWZ0IGRpdl8xIDAiPteR15E8L3NwYW4+PC9k
aXY+CiA8L2Rpdj4KIAogPHByZSBpZD0iY29uc29sZSI+PC9wcmU+Cg==
</data>
<flag name="review"
          id="81304"
          type_id="1"
          status="+"
          setter="rniwa"
    />
          </attachment>
      

    </bug>

</bugzilla>