<?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>74592</bug_id>
          
          <creation_ts>2011-12-15 00:09:27 -0800</creation_ts>
          <short_desc>Optimize AudioBufferSourceNode process by avoiding interpolation when pitchRate==1</short_desc>
          <delta_ts>2012-01-03 17:28:46 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Audio</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Wei James (wistoch)">james.wei</reporter>
          <assigned_to name="Wei James (wistoch)">james.wei</assigned_to>
          <cc>crogers</cc>
    
    <cc>eric</cc>
    
    <cc>james.wei</cc>
    
    <cc>kbr</cc>
    
    <cc>rtoy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>521708</commentid>
    <comment_count>0</comment_count>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-15 00:09:27 -0800</bug_when>
    <thetext>Optimize AudioBufferSourceNode process by avoiding interpolation when pitchRate==1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>521714</commentid>
    <comment_count>1</comment_count>
      <attachid>119389</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-15 00:19:45 -0800</bug_when>
    <thetext>Created attachment 119389
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>521720</commentid>
    <comment_count>2</comment_count>
      <attachid>119391</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-15 00:52:01 -0800</bug_when>
    <thetext>Created attachment 119391
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522824</commentid>
    <comment_count>3</comment_count>
      <attachid>119391</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-12-16 10:25:03 -0800</bug_when>
    <thetext>Comment on attachment 119391
Patch

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

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:255
&gt; +    if (!needInterpolation) {

needInterpolation isn&apos;t used anywhere else, so remove it, and change to if (pitchRate == 1).

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:258
&gt; +        virtualReadIndex += framesToProcess;

virtualReadIndex isn&apos;t used in the if block below.  It would be nice to move this down near line 298 where it&apos;s actually used.

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:261
&gt; +            memcpy(destinationL, sourceL + readIndex, sizeof(float) * framesToProcess);

I think sizeof(*sourceL) or sizeof(*destinationL) is better than sizeof(float).  Same applies to other memcpy places below.

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:273
&gt; +            framesToProcess -= framesToEnd;

Maybe add ASSERT(framesToProcess &gt;= 0) here?  Currently, this is always true, but this is an important invariant for the memcpy&apos;s below so we don&apos;t suddenly copy a huge number of samples to the destination.

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:277
&gt; +                for (unsigned k = 0; k &lt; rounds; ++k) {

Why not just use a while loop:

while (framesToProcess &gt; 0) {
 ...
|

instead of the for loop with rounds?

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:279
&gt; +                    destinationL += deltaFrames;

Is this right?  sourceL and startFrame are not modified in the for loop so we keep copying the same data from sourceL+startFrame to consecutive places in destinationL.

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:298
&gt;          if (virtualReadIndex &gt;= endFrame) {

Maybe move this into the else case of the if above (place near line 295)?  I think this condition can only happen in that case.

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:300
&gt; +            virtualReadIndex -= ((virtualReadIndex - endFrame) / deltaFrames + 1) * deltaFrames;

Is this correct?  If virtualReadIndex - endFrame = 1, we get (1/deltaFrames + 1)*deltaFrames = deltaFrames + 1 (because virtualReadIndex is a float and ignoring roundoff).  I think we want to subtract just deltaFrames in this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523282</commentid>
    <comment_count>4</comment_count>
      <attachid>119391</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-17 01:39:58 -0800</bug_when>
    <thetext>Comment on attachment 119391
Patch

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

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:255
&gt;&gt; +    if (!needInterpolation) {
&gt; 
&gt; needInterpolation isn&apos;t used anywhere else, so remove it, and change to if (pitchRate == 1).

got it. thanks.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:258
&gt;&gt; +        virtualReadIndex += framesToProcess;
&gt; 
&gt; virtualReadIndex isn&apos;t used in the if block below.  It would be nice to move this down near line 298 where it&apos;s actually used.

thanks. will modify it.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:261
&gt;&gt; +            memcpy(destinationL, sourceL + readIndex, sizeof(float) * framesToProcess);
&gt; 
&gt; I think sizeof(*sourceL) or sizeof(*destinationL) is better than sizeof(float).  Same applies to other memcpy places below.

ok.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:273
&gt;&gt; +            framesToProcess -= framesToEnd;
&gt; 
&gt; Maybe add ASSERT(framesToProcess &gt;= 0) here?  Currently, this is always true, but this is an important invariant for the memcpy&apos;s below so we don&apos;t suddenly copy a huge number of samples to the destination.

got it.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:277
&gt;&gt; +                for (unsigned k = 0; k &lt; rounds; ++k) {
&gt; 
&gt; Why not just use a while loop:
&gt; 
&gt; while (framesToProcess &gt; 0) {
&gt;  ...
&gt; |
&gt; 
&gt; instead of the for loop with rounds?

if the deltaFrames is small enough. we have to copy them repeatly. it will be more than once.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:279
&gt;&gt; +                    destinationL += deltaFrames;
&gt; 
&gt; Is this right?  sourceL and startFrame are not modified in the for loop so we keep copying the same data from sourceL+startFrame to consecutive places in destinationL.

it is for the case that the deltaFrame is small enough. We have to copy the frames frome startFrame to endFrame more than once. we can not just wrap around once to get enought data. 

correct me if I misunderstanding the underlying algorithm.

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:298
&gt;&gt;          if (virtualReadIndex &gt;= endFrame) {
&gt; 
&gt; Maybe move this into the else case of the if above (place near line 295)?  I think this condition can only happen in that case.

the case virtualReadIndex == endFrame will hit both blocks. in this case, we also need to finish the playing. correct me if I am wrong. thanks

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:300
&gt;&gt; +            virtualReadIndex -= ((virtualReadIndex - endFrame) / deltaFrames + 1) * deltaFrames;
&gt; 
&gt; Is this correct?  If virtualReadIndex - endFrame = 1, we get (1/deltaFrames + 1)*deltaFrames = deltaFrames + 1 (because virtualReadIndex is a float and ignoring roundoff).  I think we want to subtract just deltaFrames in this case.

the reason for using this statement is to resolve the issue that deltaFrame may be very small. Substracting deltaFrames once might still exceed endFrame. 

I will check the math again for float issue. thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523934</commentid>
    <comment_count>5</comment_count>
      <attachid>119391</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-12-19 09:17:12 -0800</bug_when>
    <thetext>Comment on attachment 119391
Patch

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

&gt;&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:277
&gt;&gt;&gt; +                for (unsigned k = 0; k &lt; rounds; ++k) {
&gt;&gt; 
&gt;&gt; Why not just use a while loop:
&gt;&gt; 
&gt;&gt; while (framesToProcess &gt; 0) {
&gt;&gt;  ...
&gt;&gt; |
&gt;&gt; 
&gt;&gt; instead of the for loop with rounds?
&gt; 
&gt; if the deltaFrames is small enough. we have to copy them repeatly. it will be more than once.

Agreed.  I missed that case.

&gt;&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:279
&gt;&gt;&gt; +                    destinationL += deltaFrames;
&gt;&gt; 
&gt;&gt; Is this right?  sourceL and startFrame are not modified in the for loop so we keep copying the same data from sourceL+startFrame to consecutive places in destinationL.
&gt; 
&gt; it is for the case that the deltaFrame is small enough. We have to copy the frames frome startFrame to endFrame more than once. we can not just wrap around once to get enought data. 
&gt; 
&gt; correct me if I misunderstanding the underlying algorithm.

You are right.

&gt;&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:300
&gt;&gt;&gt; +            virtualReadIndex -= ((virtualReadIndex - endFrame) / deltaFrames + 1) * deltaFrames;
&gt;&gt; 
&gt;&gt; Is this correct?  If virtualReadIndex - endFrame = 1, we get (1/deltaFrames + 1)*deltaFrames = deltaFrames + 1 (because virtualReadIndex is a float and ignoring roundoff).  I think we want to subtract just deltaFrames in this case.
&gt; 
&gt; the reason for using this statement is to resolve the issue that deltaFrame may be very small. Substracting deltaFrames once might still exceed endFrame. 
&gt; 
&gt; I will check the math again for float issue. thanks

I didn&apos;t mean that we should always just subtract deltaFrames; just deltaFrames in this example.

Perhaps you meant to truncate (virtualReadIndex - endFrame)/deltaFrames to an integer first before adding one?  This will tell us how many deltaFrames past the endFrame that have been processed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>524268</commentid>
    <comment_count>6</comment_count>
      <attachid>119391</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-12-19 16:21:14 -0800</bug_when>
    <thetext>Comment on attachment 119391
Patch

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

Hi James, it&apos;ll be good to get this optimization.  I&apos;m sure we&apos;ll hit this case quite a bit (maybe majority of the time).

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:254
&gt; +    bool needInterpolation = (pitchRate != 1);

The entire codeblock within &quot;if (!needInterpolation) {&quot; can be significantly simplified I believe.

In the current patch, there are 4 separate memcpy() sections (line 261, 266, 278, 286).  It should be possible to reduce this down to a single memcpy() section with the appropriate use of a &quot;while()&quot; loop, and by getting rid of the &quot;for()&quot; loop:

                unsigned rounds = framesToProcess / deltaFrames;
                for (unsigned k = 0; k &lt; rounds; ++k) {

For example, you could use a &quot;framesRemaining&quot; variable which is initialized to &quot;framesToProcess&quot;:

int framesRemaining = framesToProcess;
while (framesRemaining &gt; ) {
    int framesThisTime = ....;
    memcpy() stuff...
    framesRemaining -= framesThisTime;
}

You&apos;ll have to add appropriate checking for end of buffer and looping, but I&apos;m quite sure the whole codeblock can be a lot simpler than it currently is...

&gt;&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:255
&gt;&gt;&gt; +    if (!needInterpolation) {
&gt;&gt; 
&gt;&gt; needInterpolation isn&apos;t used anywhere else, so remove it, and change to if (pitchRate == 1).
&gt; 
&gt; got it. thanks.

We can&apos;t *just* check (pitchRate == 1).  We also need to check that virtualReadIndex is an integer.  I think in the normal case where this optimization will be used, we&apos;re talking about simply loading up a buffer at the default playback rate (of 1) and playing it with noteOn().  In this case virtualReadIndex will be an integer.  But, if we&apos;re in the middle of fiddling with the playbackRate (tweaking it with a slider to change pitch), then we could hit a case where playback rate is (temporarily) 1, but the virtualReadIndex is at a sub-sample position.  We don&apos;t want to do a simple memcpy then.

So please check both that (pitchRate == 1 ) and that virtualReadIndex is an integer (has no fractional portion).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525046</commentid>
    <comment_count>7</comment_count>
      <attachid>120134</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-20 18:51:33 -0800</bug_when>
    <thetext>Created attachment 120134
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525049</commentid>
    <comment_count>8</comment_count>
      <attachid>119391</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-20 18:59:41 -0800</bug_when>
    <thetext>Comment on attachment 119391
Patch

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

thanks for the comments. I have updated the patch according to your feedback. please help to review. thanks

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:254
&gt;&gt; +    bool needInterpolation = (pitchRate != 1);
&gt; 
&gt; The entire codeblock within &quot;if (!needInterpolation) {&quot; can be significantly simplified I believe.
&gt; 
&gt; In the current patch, there are 4 separate memcpy() sections (line 261, 266, 278, 286).  It should be possible to reduce this down to a single memcpy() section with the appropriate use of a &quot;while()&quot; loop, and by getting rid of the &quot;for()&quot; loop:
&gt; 
&gt;                 unsigned rounds = framesToProcess / deltaFrames;
&gt;                 for (unsigned k = 0; k &lt; rounds; ++k) {
&gt; 
&gt; For example, you could use a &quot;framesRemaining&quot; variable which is initialized to &quot;framesToProcess&quot;:
&gt; 
&gt; int framesRemaining = framesToProcess;
&gt; while (framesRemaining &gt; ) {
&gt;     int framesThisTime = ....;
&gt;     memcpy() stuff...
&gt;     framesRemaining -= framesThisTime;
&gt; }
&gt; 
&gt; You&apos;ll have to add appropriate checking for end of buffer and looping, but I&apos;m quite sure the whole codeblock can be a lot simpler than it currently is...

roger. thanks for the feedback. I have updated the patch according to your comments.

&gt;&gt;&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:255
&gt;&gt;&gt;&gt; +    if (!needInterpolation) {
&gt;&gt;&gt; 
&gt;&gt;&gt; needInterpolation isn&apos;t used anywhere else, so remove it, and change to if (pitchRate == 1).
&gt;&gt; 
&gt;&gt; got it. thanks.
&gt; 
&gt; We can&apos;t *just* check (pitchRate == 1).  We also need to check that virtualReadIndex is an integer.  I think in the normal case where this optimization will be used, we&apos;re talking about simply loading up a buffer at the default playback rate (of 1) and playing it with noteOn().  In this case virtualReadIndex will be an integer.  But, if we&apos;re in the middle of fiddling with the playbackRate (tweaking it with a slider to change pitch), then we could hit a case where playback rate is (temporarily) 1, but the virtualReadIndex is at a sub-sample position.  We don&apos;t want to do a simple memcpy then.
&gt; 
&gt; So please check both that (pitchRate == 1 ) and that virtualReadIndex is an integer (has no fractional portion).

thanks. added.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525300</commentid>
    <comment_count>9</comment_count>
      <attachid>120134</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-12-21 09:55:28 -0800</bug_when>
    <thetext>Comment on attachment 120134
Patch

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

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:258
&gt; +            int framesThisTime = framesToProcess &lt; framesToEnd ? framesToProcess : framesToEnd;

Could we say min(framesToProcess, framesToEnd)?

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:260
&gt; +            ASSERT(framesThisTime &gt;= 0);

Maybe it&apos;s enough to say framesThisTime = max(0, framesThisTime).  I think we&apos;re still guaranteed to make progress because this implies framesToEnd &lt;= 0 which means readIndex &gt;= endFrame, and the code at line 273 will make sure we exit the loop or make readIndex eventually less than endFrame.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525400</commentid>
    <comment_count>10</comment_count>
      <attachid>120134</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-12-21 11:42:09 -0800</bug_when>
    <thetext>Comment on attachment 120134
Patch

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

Once crogers/other audio folk are OK with this I&apos;m happy to pull the r+ trigger.

&gt; Source/WebCore/ChangeLog:8
&gt; +        No new tests. (OOPS!)

Can we test this?

&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:295
&gt; +        while (framesToProcess--) {

This is a horribly long loop/function.  would be better to break this up into static inline helper functions in a second pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525837</commentid>
    <comment_count>11</comment_count>
      <attachid>120134</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-21 16:45:25 -0800</bug_when>
    <thetext>Comment on attachment 120134
Patch

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

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:258
&gt;&gt; +            int framesThisTime = framesToProcess &lt; framesToEnd ? framesToProcess : framesToEnd;
&gt; 
&gt; Could we say min(framesToProcess, framesToEnd)?

ok. will update it. thanks

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:260
&gt;&gt; +            ASSERT(framesThisTime &gt;= 0);
&gt; 
&gt; Maybe it&apos;s enough to say framesThisTime = max(0, framesThisTime).  I think we&apos;re still guaranteed to make progress because this implies framesToEnd &lt;= 0 which means readIndex &gt;= endFrame, and the code at line 273 will make sure we exit the loop or make readIndex eventually less than endFrame.

got it. thanks

&gt;&gt; Source/WebCore/webaudio/AudioBufferSourceNode.cpp:295
&gt;&gt; +        while (framesToProcess--) {
&gt; 
&gt; This is a horribly long loop/function.  would be better to break this up into static inline helper functions in a second pass.

this block is from the original source code. I didn&apos;t touch it. maybe we can optimize it later. thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>525926</commentid>
    <comment_count>12</comment_count>
      <attachid>120256</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-21 19:00:41 -0800</bug_when>
    <thetext>Created attachment 120256
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526284</commentid>
    <comment_count>13</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-12-22 08:53:32 -0800</bug_when>
    <thetext>Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526663</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-12-22 17:31:30 -0800</bug_when>
    <thetext>Hi James, sorry it&apos;s taken a little while to really look at this.  I&apos;ve been swamped :)

AudioBufferSourceNode is at the heart of many of the layout tests, so is getting pretty heavy testing Your patch is passing the existing layout tests (especially in webaudio/audiobuffersource-playbackrate.html).  So it shouldn&apos;t be necessary to write another layout test.  So in the ChangeLog, I would change:

No new tests. (OOPS!)

to:

Covered by existing webaudio layout tests, especially webaudio/audiobuffersource-playbackrate.html


I also applied and ran many web audio pages using your patch, so I&apos;m confident it&apos;s ok.

But I agree with Eric&apos;s comment about the method being very long.  There&apos;s a very long code section which is copied/pasted: 
The following identical code exists in two different places:


if (!loop()) {
    // If we&apos;re not looping, then stop playing when we get to the end.
    m_isPlaying = false;

    if (framesToProcess &gt; 0) {
        // We&apos;re not looping and we&apos;ve reached the end of the sample data, but we still need to provide more output,
        // so generate silence for the remaining.
        memset(destinationL, 0, sizeof(float) * framesToProcess);

        if (isStereo)
            memset(destinationR, 0, sizeof(float) * framesToProcess);
    }

    finish();
    break;
}


Can we please create a separate method (possibly inline if you think that matters) something like this:

// Returns true if we&apos;re finished.
bool AudioBufferSourceNode::renderSilenceAndFinishIfNotLooping(float* destinationL, float* destinationR, size_t framesToProcess)
{
    if (!loop()) {
        // If we&apos;re not looping, then stop playing when we get to the end.
        m_isPlaying = false;

        if (framesToProcess &gt; 0) {
            // We&apos;re not looping and we&apos;ve reached the end of the sample data, but we still need to provide more output,
            // so generate silence for the remaining.
            memset(destinationL, 0, sizeof(float) * framesToProcess);

            if (destinationR)
                memset(destinationR, 0, sizeof(float) * framesToProcess);
        }

        finish();
        return true;
    }
    return false;
}


And then in the two places where it&apos;s used, something like:

    if (renderSilenceAndFinishIfNotLooping(destinationL, destinationR, framesToProcess))
        break;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526741</commentid>
    <comment_count>15</comment_count>
      <attachid>120435</attachid>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-22 22:10:34 -0800</bug_when>
    <thetext>Created attachment 120435
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>526743</commentid>
    <comment_count>16</comment_count>
    <who name="Wei James (wistoch)">james.wei</who>
    <bug_when>2011-12-22 22:12:58 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Hi James, sorry it&apos;s taken a little while to really look at this.  I&apos;ve been swamped :)
&gt; 
&gt; AudioBufferSourceNode is at the heart of many of the layout tests, so is getting pretty heavy testing Your patch is passing the existing layout tests (especially in webaudio/audiobuffersource-playbackrate.html).  So it shouldn&apos;t be necessary to write another layout test.  So in the ChangeLog, I would change:
&gt; 
&gt; No new tests. (OOPS!)
&gt; 
&gt; to:
&gt; 
&gt; Covered by existing webaudio layout tests, especially webaudio/audiobuffersource-playbackrate.html
&gt; 
&gt; 
&gt; I also applied and ran many web audio pages using your patch, so I&apos;m confident it&apos;s ok.
&gt; 
&gt; But I agree with Eric&apos;s comment about the method being very long.  There&apos;s a very long code section which is copied/pasted: 
&gt; The following identical code exists in two different places:
&gt; 
&gt; 
&gt; if (!loop()) {
&gt;     // If we&apos;re not looping, then stop playing when we get to the end.
&gt;     m_isPlaying = false;
&gt; 
&gt;     if (framesToProcess &gt; 0) {
&gt;         // We&apos;re not looping and we&apos;ve reached the end of the sample data, but we still need to provide more output,
&gt;         // so generate silence for the remaining.
&gt;         memset(destinationL, 0, sizeof(float) * framesToProcess);
&gt; 
&gt;         if (isStereo)
&gt;             memset(destinationR, 0, sizeof(float) * framesToProcess);
&gt;     }
&gt; 
&gt;     finish();
&gt;     break;
&gt; }
&gt; 
&gt; 
&gt; Can we please create a separate method (possibly inline if you think that matters) something like this:
&gt; 
&gt; // Returns true if we&apos;re finished.
&gt; bool AudioBufferSourceNode::renderSilenceAndFinishIfNotLooping(float* destinationL, float* destinationR, size_t framesToProcess)
&gt; {
&gt;     if (!loop()) {
&gt;         // If we&apos;re not looping, then stop playing when we get to the end.
&gt;         m_isPlaying = false;
&gt; 
&gt;         if (framesToProcess &gt; 0) {
&gt;             // We&apos;re not looping and we&apos;ve reached the end of the sample data, but we still need to provide more output,
&gt;             // so generate silence for the remaining.
&gt;             memset(destinationL, 0, sizeof(float) * framesToProcess);
&gt; 
&gt;             if (destinationR)
&gt;                 memset(destinationR, 0, sizeof(float) * framesToProcess);
&gt;         }
&gt; 
&gt;         finish();
&gt;         return true;
&gt;     }
&gt;     return false;
&gt; }
&gt; 
&gt; 
&gt; And then in the two places where it&apos;s used, something like:
&gt; 
&gt;     if (renderSilenceAndFinishIfNotLooping(destinationL, destinationR, framesToProcess))
&gt;         break;

thanks. I have updated the patch based on your comments. thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>528997</commentid>
    <comment_count>17</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2012-01-03 13:22:31 -0800</bug_when>
    <thetext>If Chris gives an unofficial LGTM on this I&apos;ll be happy to r+ it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529078</commentid>
    <comment_count>18</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-01-03 14:35:13 -0800</bug_when>
    <thetext>Looks good.  Thanks James!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529091</commentid>
    <comment_count>19</comment_count>
      <attachid>120435</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2012-01-03 15:16:28 -0800</bug_when>
    <thetext>Comment on attachment 120435
Patch

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529199</commentid>
    <comment_count>20</comment_count>
      <attachid>120435</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-03 17:28:41 -0800</bug_when>
    <thetext>Comment on attachment 120435
Patch

Clearing flags on attachment: 120435

Committed r103994: &lt;http://trac.webkit.org/changeset/103994&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529200</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-03 17:28:46 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119389</attachid>
            <date>2011-12-15 00:19:45 -0800</date>
            <delta_ts>2011-12-15 00:31:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74592-20111215162021.patch</filename>
            <type>text/plain</type>
            <size>8917</size>
            <attacher name="Wei James (wistoch)">james.wei</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyODk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGY0MDhmMDZhZjYyMDVi
N2I0OWViMjI4ZDgwOTc5YzQ3NDk4ODI2Ni4uOGY4NmRlODAxMDVmMzlkMTg4MzIzNWQ2ZjEyMDZj
NWYzMzgxNDJmNyAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDExLTEyLTE1ICBXZWkg
SmFtZXMgIDxqYW1lcy53ZWlAaW50ZWwuY29tPgorCisgICAgICAgIE9wdGltaXplIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZSBwcm9jZXNzIGJ5IGF2b2lkaW5nIGludGVycG9sYXRpb24gd2hlbiBwaXRj
aFJhdGU9PTEKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTc0NTkyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNv
dXJjZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpy
ZW5kZXJGcm9tQnVmZmVyKToKKwogMjAxMS0xMS0wMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgQSBzcGluIGJ1dHRvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBpbmNv
cnJlY3RseSBpZiBpdCBpcyBjbGlja2VkIGFmdGVyIHRvdWNoIGV2ZW50cy4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCmluZGV4IDBmMGQ3
YjMxOTA0MWNiNzcyZDg1MDU3ZTE3MGEyMzZkZjlhNjQ2MzIuLjUyMmQ0NGZiNDNhZGI1OTZjYjEw
OTE1MjJkODQ2NjI1OGQ5MWY4YWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlv
L0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8v
QXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcApAQCAtMjQ3LDY2ICsyNDcsMTIxIEBAIHZvaWQgQXVk
aW9CdWZmZXJTb3VyY2VOb2RlOjpyZW5kZXJGcm9tQnVmZmVyKEF1ZGlvQnVzKiBidXMsIHVuc2ln
bmVkIGRlc3RpbmF0aW9uCiAgICAgZG91YmxlIHZpcnR1YWxSZWFkSW5kZXggPSBtX3ZpcnR1YWxS
ZWFkSW5kZXg7CiAKICAgICAvLyBSZW5kZXIgbG9vcCAtIHJlYWRpbmcgZnJvbSB0aGUgc291cmNl
IGJ1ZmZlciB0byB0aGUgZGVzdGluYXRpb24gdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24uCi0g
ICAgLy8gRklYTUU6IG9wdGltaXplIGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5n
IGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0gMS4KLSAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVh
ciBpbnRlcnBvbGF0aW9uLgogICAgIGludCBmcmFtZXNUb1Byb2Nlc3MgPSBudW1iZXJPZkZyYW1l
czsKLSAgICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzLS0pIHsKKworICAgIC8vIE9wdGltaXplIGZv
ciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5nIGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0g
MS4KKyAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgIGJv
b2wgbmVlZEludGVycG9sYXRpb24gPSAocGl0Y2hSYXRlICE9IDEpOworICAgIGlmICghbmVlZElu
dGVycG9sYXRpb24pIHsKICAgICAgICAgdW5zaWduZWQgcmVhZEluZGV4ID0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KHZpcnR1YWxSZWFkSW5kZXgpOwotICAgICAgICBkb3VibGUgaW50ZXJwb2xhdGlv
bkZhY3RvciA9IHZpcnR1YWxSZWFkSW5kZXggLSByZWFkSW5kZXg7Ci0gICAgICAgIAotICAgICAg
ICAvLyBGb3IgbGluZWFyIGludGVycG9sYXRpb24gd2UgbmVlZCB0aGUgbmV4dCBzYW1wbGUtZnJh
bWUgdG9vLgotICAgICAgICB1bnNpZ25lZCByZWFkSW5kZXgyID0gcmVhZEluZGV4ICsgMTsKLSAg
ICAgICAgaWYgKHJlYWRJbmRleDIgPj0gZW5kRnJhbWUpIHsKKyAgICAgICAgdW5zaWduZWQgZnJh
bWVzVG9FbmQgPSBlbmRGcmFtZSAtIHJlYWRJbmRleDsKKyAgICAgICAgdmlydHVhbFJlYWRJbmRl
eCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgICAgIC8vIENvcHkgZnJvbSBzb3VyY2UgdG8gZGVz
dGluYXRpb24gZGlyZWN0bHkgaWYgbm90IHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4K
KyAgICAgICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA8PSBmcmFtZXNUb0VuZCkgeworICAgICAgICAg
ICAgbWVtY3B5KGRlc3RpbmF0aW9uTCwgc291cmNlTCArIHJlYWRJbmRleCwgc2l6ZW9mKGZsb2F0
KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgICAgICBpZiAoaXNTdGVyZW8pIAorICAgICAg
ICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvblIsIHNvdXJjZVIgKyByZWFkSW5kZXgsIHNpemVv
ZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gQ29weSB0aGUgZnJhbWVzIGZyb20gcmVhZEluZGV4IHRvIGVuZEZyYW1lIHRvIGRlc3Rp
bmF0aW9uLgorICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uTCwgc291cmNlTCArIHJlYWRJ
bmRleCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvRW5kKTsKKyAgICAgICAgICAgIGRlc3RpbmF0
aW9uTCArPSBmcmFtZXNUb0VuZDsKKworICAgICAgICAgICAgaWYgKGlzU3RlcmVvKSB7CisgICAg
ICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uUiwgc291cmNlUiArIHJlYWRJbmRleCwgc2l6
ZW9mKGZsb2F0KSAqIGZyYW1lc1RvRW5kKTsKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblIg
Kz0gZnJhbWVzVG9FbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZXNUb1Byb2Nl
c3MgLT0gZnJhbWVzVG9FbmQ7CiAgICAgICAgICAgICBpZiAobG9vcCgpKSB7CiAgICAgICAgICAg
ICAgICAgLy8gTWFrZSBzdXJlIHRvIHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZl
ci4KLSAgICAgICAgICAgICAgICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOwotICAgICAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmVhZEluZGV4MiA9IHJlYWRJbmRleDsKLSAgICAg
ICAgfQotCi0gICAgICAgIC8vIEZpbmFsIHNhbml0eSBjaGVjayBvbiBidWZmZXIgYWNjZXNzLgot
ICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0aW1pemF0aW9uLCB0cnkgdG8gZ2V0IHJpZCBvZiB0
aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1dCBhc3NlcnRpb25zIGFuZCBndWFyZHMgYmVmb3Jl
IHRoZSBsb29wLgotICAgICAgICBpZiAocmVhZEluZGV4ID49IGJ1ZmZlckxlbmd0aCB8fCByZWFk
SW5kZXgyID49IGJ1ZmZlckxlbmd0aCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8v
IExpbmVhciBpbnRlcnBvbGF0aW9uLgotICAgICAgICBkb3VibGUgc2FtcGxlTDEgPSBzb3VyY2VM
W3JlYWRJbmRleF07Ci0gICAgICAgIGRvdWJsZSBzYW1wbGVMMiA9IHNvdXJjZUxbcmVhZEluZGV4
Ml07Ci0gICAgICAgIGRvdWJsZSBzYW1wbGVMID0gKDEuMCAtIGludGVycG9sYXRpb25GYWN0b3Ip
ICogc2FtcGxlTDEgKyBpbnRlcnBvbGF0aW9uRmFjdG9yICogc2FtcGxlTDI7Ci0gICAgICAgICpk
ZXN0aW5hdGlvbkwrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2FtcGxlTCk7Ci0KLSAgICAg
ICAgaWYgKGlzU3RlcmVvKSB7Ci0gICAgICAgICAgICBkb3VibGUgc2FtcGxlUjEgPSBzb3VyY2VS
W3JlYWRJbmRleF07Ci0gICAgICAgICAgICBkb3VibGUgc2FtcGxlUjIgPSBzb3VyY2VSW3JlYWRJ
bmRleDJdOwotICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIgPSAoMS4wIC0gaW50ZXJwb2xhdGlv
bkZhY3RvcikgKiBzYW1wbGVSMSArIGludGVycG9sYXRpb25GYWN0b3IgKiBzYW1wbGVSMjsKLSAg
ICAgICAgICAgICpkZXN0aW5hdGlvblIrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2FtcGxl
Uik7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcm91bmRzID0gZnJhbWVzVG9Qcm9jZXNzIC8g
ZGVsdGFGcmFtZXM7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IHJv
dW5kczsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkwsIHNv
dXJjZUwgKyBzdGFydEZyYW1lLCBzaXplb2YoZmxvYXQpICogZGVsdGFGcmFtZXMpOworICAgICAg
ICAgICAgICAgICAgICBkZXN0aW5hdGlvbkwgKz0gZGVsdGFGcmFtZXM7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChpc1N0ZXJlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRl
c3RpbmF0aW9uUiwgc291cmNlUiArIHN0YXJ0RnJhbWUsIHNpemVvZihmbG9hdCkgKiBkZWx0YUZy
YW1lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblIgKz0gZGVsdGFGcmFt
ZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9Q
cm9jZXNzIC09IGRlbHRhRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBtZW1jcHkoZGVzdGluYXRpb25MLCBzb3VyY2VMICsgc3RhcnRGcmFtZSwgc2l6ZW9mKGZsb2F0
KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgaWYgKGlzU3RlcmVvKSAKKyAg
ICAgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uUiwgc291cmNlUiArIHN0YXJ0RnJh
bWUsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbG9vcGluZyBhbmQgd2UndmUgcmVhY2hl
ZCB0aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlk
ZSBtb3JlIG91dHB1dCwgCisgICAgICAgICAgICAgICAgLy8gc28gZ2VuZXJhdGUgc2lsZW5jZSBm
b3IgdGhlIHJlbWFpbmluZy4KKyAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25MLCAw
LCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgICAgICAgICBpZiAo
aXNTdGVyZW8pCisgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlvblIsIDAsIHNp
emVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgfQogICAgICAgICB9
CiAKLSAgICAgICAgdmlydHVhbFJlYWRJbmRleCArPSBwaXRjaFJhdGU7Ci0KLSAgICAgICAgLy8g
V3JhcC1hcm91bmQsIHJldGFpbmluZyBzdWItc2FtcGxlIHBvc2l0aW9uIHNpbmNlIHZpcnR1YWxS
ZWFkSW5kZXggaXMgZmxvYXRpbmctcG9pbnQuCiAgICAgICAgIGlmICh2aXJ0dWFsUmVhZEluZGV4
ID49IGVuZEZyYW1lKSB7Ci0gICAgICAgICAgICB2aXJ0dWFsUmVhZEluZGV4IC09IGRlbHRhRnJh
bWVzOwotCisgICAgICAgICAgICAvLyBXcmFwIGFyb3VuZAorICAgICAgICAgICAgdmlydHVhbFJl
YWRJbmRleCAtPSAoKHZpcnR1YWxSZWFkSW5kZXggLSBlbmRGcmFtZSkgLyBkZWx0YUZyYW1lcyAr
IDEpICogZGVsdGFGcmFtZXM7CiAgICAgICAgICAgICBpZiAoIWxvb3AoKSkgewogICAgICAgICAg
ICAgICAgIC8vIElmIHdlJ3JlIG5vdCBsb29waW5nLCB0aGVuIHN0b3AgcGxheWluZyB3aGVuIHdl
IGdldCB0byB0aGUgZW5kLgogICAgICAgICAgICAgICAgIG1faXNQbGF5aW5nID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
IGVsc2UgeworICAgICAgICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzLS0pIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih2aXJ0dWFsUmVhZElu
ZGV4KTsKKyAgICAgICAgICAgIGRvdWJsZSBpbnRlcnBvbGF0aW9uRmFjdG9yID0gdmlydHVhbFJl
YWRJbmRleCAtIHJlYWRJbmRleDsKKworICAgICAgICAgICAgLy8gRm9yIGxpbmVhciBpbnRlcnBv
bGF0aW9uIHdlIG5lZWQgdGhlIG5leHQgc2FtcGxlLWZyYW1lIHRvby4KKyAgICAgICAgICAgIHVu
c2lnbmVkIHJlYWRJbmRleDIgPSByZWFkSW5kZXggKyAxOworICAgICAgICAgICAgaWYgKHJlYWRJ
bmRleDIgPj0gZW5kRnJhbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9vcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byB3cmFwIGFyb3VuZCBhdCB0aGUgZW5kIG9m
IHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIHJlYWRJbmRleDIgLT0gZGVsdGFGcmFt
ZXM7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlYWRJbmRl
eDIgPSByZWFkSW5kZXg7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZnJh
bWVzVG9Qcm9jZXNzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbG9v
cGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IHdl
IHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3JlIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAg
Ly8gc28gZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIHJlbWFpbmluZy4KLSAgICAgICAgICAgICAg
ICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJv
Y2Vzcyk7CisgICAgICAgICAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2sgb24gYnVmZmVyIGFjY2Vz
cy4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBhcyBhbiBvcHRpbWl6YXRpb24sIHRyeSB0byBnZXQg
cmlkIG9mIHRoaXMgaW5uZXItbG9vcCBjaGVjayBhbmQgcHV0IGFzc2VydGlvbnMgYW5kIGd1YXJk
cyBiZWZvcmUgdGhlIGxvb3AuCisgICAgICAgICAgICBpZiAocmVhZEluZGV4ID49IGJ1ZmZlckxl
bmd0aCB8fCByZWFkSW5kZXgyID49IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgICAgICAgICBicmVh
azsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGVyZW8pCi0gICAgICAgICAgICAgICAg
ICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25SLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Q
cm9jZXNzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBMaW5lYXIgaW50ZXJw
b2xhdGlvbi4KKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVMMSA9IHNvdXJjZUxbcmVhZEluZGV4
XTsKKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVMMiA9IHNvdXJjZUxbcmVhZEluZGV4Ml07Cisg
ICAgICAgICAgICBkb3VibGUgc2FtcGxlTCA9ICgxLjAgLSBpbnRlcnBvbGF0aW9uRmFjdG9yKSAq
IHNhbXBsZUwxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNhbXBsZUwyOworICAgICAgICAgICAg
KmRlc3RpbmF0aW9uTCsrID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdChzYW1wbGVMKTsKKworICAg
ICAgICAgICAgaWYgKGlzU3RlcmVvKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIx
ID0gc291cmNlUltyZWFkSW5kZXhdOworICAgICAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVSMiA9
IHNvdXJjZVJbcmVhZEluZGV4Ml07CisgICAgICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIgPSAo
MS4wIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1wbGVSMSArIGludGVycG9sYXRpb25GYWN0
b3IgKiBzYW1wbGVSMjsKKyAgICAgICAgICAgICAgICAqZGVzdGluYXRpb25SKysgPSBuYXJyb3dQ
cmVjaXNpb25Ub0Zsb2F0KHNhbXBsZVIpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAg
ICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2aXJ0dWFs
UmVhZEluZGV4ICs9IHBpdGNoUmF0ZTsKKworICAgICAgICAgICAgLy8gV3JhcC1hcm91bmQsIHJl
dGFpbmluZyBzdWItc2FtcGxlIHBvc2l0aW9uIHNpbmNlIHZpcnR1YWxSZWFkSW5kZXggaXMgZmxv
YXRpbmctcG9pbnQuCisgICAgICAgICAgICBpZiAodmlydHVhbFJlYWRJbmRleCA+PSBlbmRGcmFt
ZSkgeworICAgICAgICAgICAgICAgIHZpcnR1YWxSZWFkSW5kZXggLT0gZGVsdGFGcmFtZXM7CisK
KyAgICAgICAgICAgICAgICBpZiAoIWxvb3AoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiB3ZSdyZSBub3QgbG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQgdG8gdGhl
IGVuZC4KKyAgICAgICAgICAgICAgICAgICAgbV9pc1BsYXlpbmcgPSBmYWxzZTsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gV2UncmUgbm90IGxvb3BpbmcgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBv
ZiB0aGUgc2FtcGxlIGRhdGEsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgbW9yZSBvdXRw
dXQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBnZW5lcmF0ZSBzaWxlbmNlIGZvciB0
aGUgcmVtYWluaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9u
TCwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChpc1N0ZXJlbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1z
ZXQoZGVzdGluYXRpb25SLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9
CiAgICAgICAgIH0KLSAgICB9Ci0gICAgCisgICAgfSAKICAgICBtX3ZpcnR1YWxSZWFkSW5kZXgg
PSB2aXJ0dWFsUmVhZEluZGV4OwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119391</attachid>
            <date>2011-12-15 00:52:01 -0800</date>
            <delta_ts>2011-12-20 18:59:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74592-20111215165241.patch</filename>
            <type>text/plain</type>
            <size>8912</size>
            <attacher name="Wei James (wistoch)">james.wei</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyODk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGY0MDhmMDZhZjYyMDVi
N2I0OWViMjI4ZDgwOTc5YzQ3NDk4ODI2Ni4uOGY4NmRlODAxMDVmMzlkMTg4MzIzNWQ2ZjEyMDZj
NWYzMzgxNDJmNyAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDExLTEyLTE1ICBXZWkg
SmFtZXMgIDxqYW1lcy53ZWlAaW50ZWwuY29tPgorCisgICAgICAgIE9wdGltaXplIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZSBwcm9jZXNzIGJ5IGF2b2lkaW5nIGludGVycG9sYXRpb24gd2hlbiBwaXRj
aFJhdGU9PTEKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTc0NTkyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNv
dXJjZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpy
ZW5kZXJGcm9tQnVmZmVyKToKKwogMjAxMS0xMS0wMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgQSBzcGluIGJ1dHRvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBpbmNv
cnJlY3RseSBpZiBpdCBpcyBjbGlja2VkIGFmdGVyIHRvdWNoIGV2ZW50cy4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCmluZGV4IDBmMGQ3
YjMxOTA0MWNiNzcyZDg1MDU3ZTE3MGEyMzZkZjlhNjQ2MzIuLjE5MDZkMzAwNGIxNDYzMTJlN2Rh
NGFiODhlMmNmMGQ2ZmJhMzA4NDAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlv
L0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8v
QXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcApAQCAtMjQ3LDY2ICsyNDcsMTIxIEBAIHZvaWQgQXVk
aW9CdWZmZXJTb3VyY2VOb2RlOjpyZW5kZXJGcm9tQnVmZmVyKEF1ZGlvQnVzKiBidXMsIHVuc2ln
bmVkIGRlc3RpbmF0aW9uCiAgICAgZG91YmxlIHZpcnR1YWxSZWFkSW5kZXggPSBtX3ZpcnR1YWxS
ZWFkSW5kZXg7CiAKICAgICAvLyBSZW5kZXIgbG9vcCAtIHJlYWRpbmcgZnJvbSB0aGUgc291cmNl
IGJ1ZmZlciB0byB0aGUgZGVzdGluYXRpb24gdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24uCi0g
ICAgLy8gRklYTUU6IG9wdGltaXplIGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5n
IGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0gMS4KLSAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVh
ciBpbnRlcnBvbGF0aW9uLgogICAgIGludCBmcmFtZXNUb1Byb2Nlc3MgPSBudW1iZXJPZkZyYW1l
czsKLSAgICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzLS0pIHsKKworICAgIC8vIE9wdGltaXplIGZv
ciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5nIGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0g
MS4KKyAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgIGJv
b2wgbmVlZEludGVycG9sYXRpb24gPSAocGl0Y2hSYXRlICE9IDEpOworICAgIGlmICghbmVlZElu
dGVycG9sYXRpb24pIHsKICAgICAgICAgdW5zaWduZWQgcmVhZEluZGV4ID0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KHZpcnR1YWxSZWFkSW5kZXgpOwotICAgICAgICBkb3VibGUgaW50ZXJwb2xhdGlv
bkZhY3RvciA9IHZpcnR1YWxSZWFkSW5kZXggLSByZWFkSW5kZXg7Ci0gICAgICAgIAotICAgICAg
ICAvLyBGb3IgbGluZWFyIGludGVycG9sYXRpb24gd2UgbmVlZCB0aGUgbmV4dCBzYW1wbGUtZnJh
bWUgdG9vLgotICAgICAgICB1bnNpZ25lZCByZWFkSW5kZXgyID0gcmVhZEluZGV4ICsgMTsKLSAg
ICAgICAgaWYgKHJlYWRJbmRleDIgPj0gZW5kRnJhbWUpIHsKKyAgICAgICAgaW50IGZyYW1lc1Rv
RW5kID0gZW5kRnJhbWUgLSByZWFkSW5kZXg7CisgICAgICAgIHZpcnR1YWxSZWFkSW5kZXggKz0g
ZnJhbWVzVG9Qcm9jZXNzOworICAgICAgICAvLyBDb3B5IGZyb20gc291cmNlIHRvIGRlc3RpbmF0
aW9uIGRpcmVjdGx5IGlmIG5vdCByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAg
ICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPD0gZnJhbWVzVG9FbmQpIHsKKyAgICAgICAgICAgIG1l
bWNweShkZXN0aW5hdGlvbkwsIHNvdXJjZUwgKyByZWFkSW5kZXgsIHNpemVvZihmbG9hdCkgKiBm
cmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgaWYgKGlzU3RlcmVvKSAKKyAgICAgICAgICAg
ICAgICBtZW1jcHkoZGVzdGluYXRpb25SLCBzb3VyY2VSICsgcmVhZEluZGV4LCBzaXplb2YoZmxv
YXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8v
IENvcHkgdGhlIGZyYW1lcyBmcm9tIHJlYWRJbmRleCB0byBlbmRGcmFtZSB0byBkZXN0aW5hdGlv
bi4KKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkwsIHNvdXJjZUwgKyByZWFkSW5kZXgs
IHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb0VuZCk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbkwg
Kz0gZnJhbWVzVG9FbmQ7CisKKyAgICAgICAgICAgIGlmIChpc1N0ZXJlbykgeworICAgICAgICAg
ICAgICAgIG1lbWNweShkZXN0aW5hdGlvblIsIHNvdXJjZVIgKyByZWFkSW5kZXgsIHNpemVvZihm
bG9hdCkgKiBmcmFtZXNUb0VuZCk7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SICs9IGZy
YW1lc1RvRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWVzVG9Qcm9jZXNzIC09
IGZyYW1lc1RvRW5kOwogICAgICAgICAgICAgaWYgKGxvb3AoKSkgewogICAgICAgICAgICAgICAg
IC8vIE1ha2Ugc3VyZSB0byB3cmFwIGFyb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0g
ICAgICAgICAgICAgICAgcmVhZEluZGV4MiAtPSBkZWx0YUZyYW1lczsKLSAgICAgICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgICAgIHJlYWRJbmRleDIgPSByZWFkSW5kZXg7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2sgb24gYnVmZmVyIGFjY2Vzcy4KLSAgICAg
ICAgLy8gRklYTUU6IGFzIGFuIG9wdGltaXphdGlvbiwgdHJ5IHRvIGdldCByaWQgb2YgdGhpcyBp
bm5lci1sb29wIGNoZWNrIGFuZCBwdXQgYXNzZXJ0aW9ucyBhbmQgZ3VhcmRzIGJlZm9yZSB0aGUg
bG9vcC4KLSAgICAgICAgaWYgKHJlYWRJbmRleCA+PSBidWZmZXJMZW5ndGggfHwgcmVhZEluZGV4
MiA+PSBidWZmZXJMZW5ndGgpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBMaW5l
YXIgaW50ZXJwb2xhdGlvbi4KLSAgICAgICAgZG91YmxlIHNhbXBsZUwxID0gc291cmNlTFtyZWFk
SW5kZXhdOwotICAgICAgICBkb3VibGUgc2FtcGxlTDIgPSBzb3VyY2VMW3JlYWRJbmRleDJdOwot
ICAgICAgICBkb3VibGUgc2FtcGxlTCA9ICgxLjAgLSBpbnRlcnBvbGF0aW9uRmFjdG9yKSAqIHNh
bXBsZUwxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNhbXBsZUwyOwotICAgICAgICAqZGVzdGlu
YXRpb25MKysgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHNhbXBsZUwpOwotCi0gICAgICAgIGlm
IChpc1N0ZXJlbykgewotICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIxID0gc291cmNlUltyZWFk
SW5kZXhdOwotICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIyID0gc291cmNlUltyZWFkSW5kZXgy
XTsKLSAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVSID0gKDEuMCAtIGludGVycG9sYXRpb25GYWN0
b3IpICogc2FtcGxlUjEgKyBpbnRlcnBvbGF0aW9uRmFjdG9yICogc2FtcGxlUjI7Ci0gICAgICAg
ICAgICAqZGVzdGluYXRpb25SKysgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHNhbXBsZVIpOwor
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdW5kcyA9IGZyYW1lc1RvUHJvY2VzcyAvIGRlbHRh
RnJhbWVzOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCByb3VuZHM7
ICsraykgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25MLCBzb3VyY2VM
ICsgc3RhcnRGcmFtZSwgc2l6ZW9mKGZsb2F0KSAqIGRlbHRhRnJhbWVzKTsKKyAgICAgICAgICAg
ICAgICAgICAgZGVzdGluYXRpb25MICs9IGRlbHRhRnJhbWVzOworICAgICAgICAgICAgICAgICAg
ICBpZiAoaXNTdGVyZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0aW5h
dGlvblIsIHNvdXJjZVIgKyBzdGFydEZyYW1lLCBzaXplb2YoZmxvYXQpICogZGVsdGFGcmFtZXMp
OworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SICs9IGRlbHRhRnJhbWVzOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvUHJvY2Vz
cyAtPSBkZWx0YUZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVt
Y3B5KGRlc3RpbmF0aW9uTCwgc291cmNlTCArIHN0YXJ0RnJhbWUsIHNpemVvZihmbG9hdCkgKiBm
cmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgICAgIGlmIChpc1N0ZXJlbykgCisgICAgICAg
ICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvblIsIHNvdXJjZVIgKyBzdGFydEZyYW1lLCBz
aXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGxvb3BpbmcgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhl
IGVuZCBvZiB0aGUgc2FtcGxlIGRhdGEsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgbW9y
ZSBvdXRwdXQsIAorICAgICAgICAgICAgICAgIC8vIHNvIGdlbmVyYXRlIHNpbGVuY2UgZm9yIHRo
ZSByZW1haW5pbmcuCisgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6
ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgaWYgKGlzU3Rl
cmVvKQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25SLCAwLCBzaXplb2Yo
ZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0g
ICAgICAgIHZpcnR1YWxSZWFkSW5kZXggKz0gcGl0Y2hSYXRlOwotCi0gICAgICAgIC8vIFdyYXAt
YXJvdW5kLCByZXRhaW5pbmcgc3ViLXNhbXBsZSBwb3NpdGlvbiBzaW5jZSB2aXJ0dWFsUmVhZElu
ZGV4IGlzIGZsb2F0aW5nLXBvaW50LgogICAgICAgICBpZiAodmlydHVhbFJlYWRJbmRleCA+PSBl
bmRGcmFtZSkgewotICAgICAgICAgICAgdmlydHVhbFJlYWRJbmRleCAtPSBkZWx0YUZyYW1lczsK
LQorICAgICAgICAgICAgLy8gV3JhcCBhcm91bmQKKyAgICAgICAgICAgIHZpcnR1YWxSZWFkSW5k
ZXggLT0gKCh2aXJ0dWFsUmVhZEluZGV4IC0gZW5kRnJhbWUpIC8gZGVsdGFGcmFtZXMgKyAxKSAq
IGRlbHRhRnJhbWVzOwogICAgICAgICAgICAgaWYgKCFsb29wKCkpIHsKICAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSdyZSBub3QgbG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQg
dG8gdGhlIGVuZC4KICAgICAgICAgICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNl
IHsKKyAgICAgICAgd2hpbGUgKGZyYW1lc1RvUHJvY2Vzcy0tKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCByZWFkSW5kZXggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odmlydHVhbFJlYWRJbmRleCk7
CisgICAgICAgICAgICBkb3VibGUgaW50ZXJwb2xhdGlvbkZhY3RvciA9IHZpcnR1YWxSZWFkSW5k
ZXggLSByZWFkSW5kZXg7CisKKyAgICAgICAgICAgIC8vIEZvciBsaW5lYXIgaW50ZXJwb2xhdGlv
biB3ZSBuZWVkIHRoZSBuZXh0IHNhbXBsZS1mcmFtZSB0b28uCisgICAgICAgICAgICB1bnNpZ25l
ZCByZWFkSW5kZXgyID0gcmVhZEluZGV4ICsgMTsKKyAgICAgICAgICAgIGlmIChyZWFkSW5kZXgy
ID49IGVuZEZyYW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvb3AoKSkgeworICAgICAgICAg
ICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gd3JhcCBhcm91bmQgYXQgdGhlIGVuZCBvZiB0aGUg
YnVmZmVyLgorICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOwor
ICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXgyID0g
cmVhZEluZGV4OworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc1Rv
UHJvY2VzcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGxvb3Bpbmcg
YW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2FtcGxlIGRhdGEsIGJ1dCB3ZSBzdGls
bCBuZWVkIHRvIHByb3ZpZGUgbW9yZSBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNv
IGdlbmVyYXRlIHNpbGVuY2UgZm9yIHRoZSByZW1haW5pbmcuCi0gICAgICAgICAgICAgICAgICAg
IG1lbXNldChkZXN0aW5hdGlvbkwsIDAsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3Mp
OworICAgICAgICAgICAgLy8gRmluYWwgc2FuaXR5IGNoZWNrIG9uIGJ1ZmZlciBhY2Nlc3MuCisg
ICAgICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0aW1pemF0aW9uLCB0cnkgdG8gZ2V0IHJpZCBv
ZiB0aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1dCBhc3NlcnRpb25zIGFuZCBndWFyZHMgYmVm
b3JlIHRoZSBsb29wLgorICAgICAgICAgICAgaWYgKHJlYWRJbmRleCA+PSBidWZmZXJMZW5ndGgg
fHwgcmVhZEluZGV4MiA+PSBidWZmZXJMZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RlcmVvKQotICAgICAgICAgICAgICAgICAgICAg
ICAgbWVtc2V0KGRlc3RpbmF0aW9uUiwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vz
cyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTGluZWFyIGludGVycG9sYXRp
b24uCisgICAgICAgICAgICBkb3VibGUgc2FtcGxlTDEgPSBzb3VyY2VMW3JlYWRJbmRleF07Cisg
ICAgICAgICAgICBkb3VibGUgc2FtcGxlTDIgPSBzb3VyY2VMW3JlYWRJbmRleDJdOworICAgICAg
ICAgICAgZG91YmxlIHNhbXBsZUwgPSAoMS4wIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1w
bGVMMSArIGludGVycG9sYXRpb25GYWN0b3IgKiBzYW1wbGVMMjsKKyAgICAgICAgICAgICpkZXN0
aW5hdGlvbkwrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2FtcGxlTCk7CisKKyAgICAgICAg
ICAgIGlmIChpc1N0ZXJlbykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVSMSA9IHNv
dXJjZVJbcmVhZEluZGV4XTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlUjIgPSBzb3Vy
Y2VSW3JlYWRJbmRleDJdOworICAgICAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVSID0gKDEuMCAt
IGludGVycG9sYXRpb25GYWN0b3IpICogc2FtcGxlUjEgKyBpbnRlcnBvbGF0aW9uRmFjdG9yICog
c2FtcGxlUjI7CisgICAgICAgICAgICAgICAgKmRlc3RpbmF0aW9uUisrID0gbmFycm93UHJlY2lz
aW9uVG9GbG9hdChzYW1wbGVSKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZp
bmlzaCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmlydHVhbFJlYWRJ
bmRleCArPSBwaXRjaFJhdGU7CisKKyAgICAgICAgICAgIC8vIFdyYXAtYXJvdW5kLCByZXRhaW5p
bmcgc3ViLXNhbXBsZSBwb3NpdGlvbiBzaW5jZSB2aXJ0dWFsUmVhZEluZGV4IGlzIGZsb2F0aW5n
LXBvaW50LgorICAgICAgICAgICAgaWYgKHZpcnR1YWxSZWFkSW5kZXggPj0gZW5kRnJhbWUpIHsK
KyAgICAgICAgICAgICAgICB2aXJ0dWFsUmVhZEluZGV4IC09IGRlbHRhRnJhbWVzOworCisgICAg
ICAgICAgICAgICAgaWYgKCFsb29wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Un
cmUgbm90IGxvb3BpbmcsIHRoZW4gc3RvcCBwbGF5aW5nIHdoZW4gd2UgZ2V0IHRvIHRoZSBlbmQu
CisgICAgICAgICAgICAgICAgICAgIG1faXNQbGF5aW5nID0gZmFsc2U7CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFdlJ3JlIG5vdCBsb29waW5nIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhl
IHNhbXBsZSBkYXRhLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBwcm92aWRlIG1vcmUgb3V0cHV0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIHJl
bWFpbmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlvbkwsIDAs
IHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoaXNTdGVyZW8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRl
c3RpbmF0aW9uUiwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAg
ICAgICB9Ci0gICAgfQotICAgIAorICAgIH0gCiAgICAgbV92aXJ0dWFsUmVhZEluZGV4ID0gdmly
dHVhbFJlYWRJbmRleDsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120134</attachid>
            <date>2011-12-20 18:51:33 -0800</date>
            <delta_ts>2011-12-21 18:59:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74592-20111221105214.patch</filename>
            <type>text/plain</type>
            <size>8157</size>
            <attacher name="Wei James (wistoch)">james.wei</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMzY2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZDA1N2M5ZDQ0YmZlZDkw
YzFiMTJhNmU3ZjlmMTVhYmY5ZDU2YjMxZS4uMmU3YmQ2ZDg3NTNlYThiYjVhMGM2MjNiYzVmZDQ2
MDg0MTdjZDAzYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDExLTEyLTIwICBXZWkg
SmFtZXMgIDxqYW1lcy53ZWlAaW50ZWwuY29tPgorCisgICAgICAgIE9wdGltaXplIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZSBwcm9jZXNzIGJ5IGF2b2lkaW5nIGludGVycG9sYXRpb24gd2hlbiBwaXRj
aFJhdGU9PTEKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTc0NTkyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNv
dXJjZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpy
ZW5kZXJGcm9tQnVmZmVyKToKKwogMjAxMS0xMi0yMCAgU2NvdHQgR3JhaGFtICA8c2NvdHRtZ0Bj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgd291bGRUYWludE9yaWdpbiBtX2NsZWFuVVJMcyBjYWNo
ZSBncm93cyB2ZXJ5IGxhcmdlIHdoZW4gZGF0YSB1cmxzIHVzZWQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCmluZGV4IDBmMGQ3YjMxOTA0
MWNiNzcyZDg1MDU3ZTE3MGEyMzZkZjlhNjQ2MzIuLmY4ZWU4YTVhZDEwMTJlYzYyZmYyZTJlNzdj
MDdiOGQzZjc0NDJmMDIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlv
QnVmZmVyU291cmNlTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9C
dWZmZXJTb3VyY2VOb2RlLmNwcApAQCAtMjQ3LDY2ICsyNDcsMTA4IEBAIHZvaWQgQXVkaW9CdWZm
ZXJTb3VyY2VOb2RlOjpyZW5kZXJGcm9tQnVmZmVyKEF1ZGlvQnVzKiBidXMsIHVuc2lnbmVkIGRl
c3RpbmF0aW9uCiAgICAgZG91YmxlIHZpcnR1YWxSZWFkSW5kZXggPSBtX3ZpcnR1YWxSZWFkSW5k
ZXg7CiAKICAgICAvLyBSZW5kZXIgbG9vcCAtIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGJ1ZmZl
ciB0byB0aGUgZGVzdGluYXRpb24gdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24uCi0gICAgLy8g
RklYTUU6IG9wdGltaXplIGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5nIGJhY2sg
d2l0aCBwaXRjaFJhdGUgPT0gMS4KLSAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVhciBpbnRl
cnBvbGF0aW9uLgogICAgIGludCBmcmFtZXNUb1Byb2Nlc3MgPSBudW1iZXJPZkZyYW1lczsKLSAg
ICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzLS0pIHsKKworICAgIC8vIE9wdGltaXplIGZvciB0aGUg
dmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5nIGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0gMS4KKyAg
ICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgIGlmIChwaXRj
aFJhdGUgPT0gMSAmJiB2aXJ0dWFsUmVhZEluZGV4ID09IGZsb29yKHZpcnR1YWxSZWFkSW5kZXgp
KSB7CiAgICAgICAgIHVuc2lnbmVkIHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih2
aXJ0dWFsUmVhZEluZGV4KTsKLSAgICAgICAgZG91YmxlIGludGVycG9sYXRpb25GYWN0b3IgPSB2
aXJ0dWFsUmVhZEluZGV4IC0gcmVhZEluZGV4OwotICAgICAgICAKLSAgICAgICAgLy8gRm9yIGxp
bmVhciBpbnRlcnBvbGF0aW9uIHdlIG5lZWQgdGhlIG5leHQgc2FtcGxlLWZyYW1lIHRvby4KLSAg
ICAgICAgdW5zaWduZWQgcmVhZEluZGV4MiA9IHJlYWRJbmRleCArIDE7Ci0gICAgICAgIGlmIChy
ZWFkSW5kZXgyID49IGVuZEZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAobG9vcCgpKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQgb2YgdGhl
IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOwotICAg
ICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmVhZEluZGV4MiA9IHJlYWRJbmRleDsK
LSAgICAgICAgfQorICAgICAgICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAg
ICAgICAgaW50IGZyYW1lc1RvRW5kID0gZW5kRnJhbWUgLSByZWFkSW5kZXg7CisgICAgICAgICAg
ICBpbnQgZnJhbWVzVGhpc1RpbWUgPSBmcmFtZXNUb1Byb2Nlc3MgPCBmcmFtZXNUb0VuZCA/IGZy
YW1lc1RvUHJvY2VzcyA6IGZyYW1lc1RvRW5kOwogCi0gICAgICAgIC8vIEZpbmFsIHNhbml0eSBj
aGVjayBvbiBidWZmZXIgYWNjZXNzLgotICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0aW1pemF0
aW9uLCB0cnkgdG8gZ2V0IHJpZCBvZiB0aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1dCBhc3Nl
cnRpb25zIGFuZCBndWFyZHMgYmVmb3JlIHRoZSBsb29wLgotICAgICAgICBpZiAocmVhZEluZGV4
ID49IGJ1ZmZlckxlbmd0aCB8fCByZWFkSW5kZXgyID49IGJ1ZmZlckxlbmd0aCkKLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uLgotICAgICAgICBk
b3VibGUgc2FtcGxlTDEgPSBzb3VyY2VMW3JlYWRJbmRleF07Ci0gICAgICAgIGRvdWJsZSBzYW1w
bGVMMiA9IHNvdXJjZUxbcmVhZEluZGV4Ml07Ci0gICAgICAgIGRvdWJsZSBzYW1wbGVMID0gKDEu
MCAtIGludGVycG9sYXRpb25GYWN0b3IpICogc2FtcGxlTDEgKyBpbnRlcnBvbGF0aW9uRmFjdG9y
ICogc2FtcGxlTDI7Ci0gICAgICAgICpkZXN0aW5hdGlvbkwrKyA9IG5hcnJvd1ByZWNpc2lvblRv
RmxvYXQoc2FtcGxlTCk7Ci0KLSAgICAgICAgaWYgKGlzU3RlcmVvKSB7Ci0gICAgICAgICAgICBk
b3VibGUgc2FtcGxlUjEgPSBzb3VyY2VSW3JlYWRJbmRleF07Ci0gICAgICAgICAgICBkb3VibGUg
c2FtcGxlUjIgPSBzb3VyY2VSW3JlYWRJbmRleDJdOwotICAgICAgICAgICAgZG91YmxlIHNhbXBs
ZVIgPSAoMS4wIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1wbGVSMSArIGludGVycG9sYXRp
b25GYWN0b3IgKiBzYW1wbGVSMjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvblIrKyA9IG5hcnJv
d1ByZWNpc2lvblRvRmxvYXQoc2FtcGxlUik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VS
VChmcmFtZXNUaGlzVGltZSA+PSAwKTsKIAotICAgICAgICB2aXJ0dWFsUmVhZEluZGV4ICs9IHBp
dGNoUmF0ZTsKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkwsIHNvdXJjZUwgKyByZWFk
SW5kZXgsIHNpemVvZigqc291cmNlTCkgKiBmcmFtZXNUaGlzVGltZSk7CisgICAgICAgICAgICBk
ZXN0aW5hdGlvbkwgKz0gZnJhbWVzVGhpc1RpbWU7CisgICAgICAgICAgICBpZiAoaXNTdGVyZW8p
IHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25SLCBzb3VyY2VSICsgcmVhZElu
ZGV4LCBzaXplb2YoKnNvdXJjZVIpICogZnJhbWVzVGhpc1RpbWUpOworICAgICAgICAgICAgICAg
IGRlc3RpbmF0aW9uUiArPSBmcmFtZXNUaGlzVGltZTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgcmVhZEluZGV4ICs9IGZyYW1lc1RoaXNUaW1lOworICAgICAgICAgICAgZnJhbWVzVG9Q
cm9jZXNzIC09IGZyYW1lc1RoaXNUaW1lOwogCi0gICAgICAgIC8vIFdyYXAtYXJvdW5kLCByZXRh
aW5pbmcgc3ViLXNhbXBsZSBwb3NpdGlvbiBzaW5jZSB2aXJ0dWFsUmVhZEluZGV4IGlzIGZsb2F0
aW5nLXBvaW50LgotICAgICAgICBpZiAodmlydHVhbFJlYWRJbmRleCA+PSBlbmRGcmFtZSkgewot
ICAgICAgICAgICAgdmlydHVhbFJlYWRJbmRleCAtPSBkZWx0YUZyYW1lczsKKyAgICAgICAgICAg
IC8vIFdyYXAtYXJvdW5kLgorICAgICAgICAgICAgaWYgKHJlYWRJbmRleCA+PSBlbmRGcmFtZSkg
eworICAgICAgICAgICAgICAgIHJlYWRJbmRleCAtPSBkZWx0YUZyYW1lczsKKyAgICAgICAgICAg
ICAgICBpZiAoIWxvb3AoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3Qg
bG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQgdG8gdGhlIGVuZC4KKyAgICAg
ICAgICAgICAgICAgICAgbV9pc1BsYXlpbmcgPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKCFs
b29wKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgbG9vcGluZywgdGhlbiBz
dG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQgdG8gdGhlIGVuZC4KLSAgICAgICAgICAgICAgICBtX2lz
UGxheWluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNz
ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGxvb3BpbmcgYW5k
IHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2FtcGxlIGRhdGEsIGJ1dCB3ZSBzdGlsbCBu
ZWVkIHRvIHByb3ZpZGUgbW9yZSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBz
byBnZW5lcmF0ZSBzaWxlbmNlIGZvciB0aGUgcmVtYWluaW5nLgorICAgICAgICAgICAgICAgICAg
ICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJv
Y2Vzcyk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgewotICAg
ICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbG9vcGluZyBhbmQgd2UndmUgcmVhY2hlZCB0
aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBt
b3JlIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gZ2VuZXJhdGUgc2lsZW5jZSBm
b3IgdGhlIHJlbWFpbmluZy4KLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9u
TCwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoaXNTdGVyZW8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0
KGRlc3RpbmF0aW9uUiwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAg
ICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGVyZW8pCi0g
ICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25SLCAwLCBzaXplb2YoZmxv
YXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsUmVhZEluZGV4ID0gcmVhZEluZGV4OworICAg
IH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChmcmFtZXNUb1Byb2Nlc3MtLSkgeworICAgICAgICAg
ICAgdW5zaWduZWQgcmVhZEluZGV4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHZpcnR1YWxSZWFk
SW5kZXgpOworICAgICAgICAgICAgZG91YmxlIGludGVycG9sYXRpb25GYWN0b3IgPSB2aXJ0dWFs
UmVhZEluZGV4IC0gcmVhZEluZGV4OworCisgICAgICAgICAgICAvLyBGb3IgbGluZWFyIGludGVy
cG9sYXRpb24gd2UgbmVlZCB0aGUgbmV4dCBzYW1wbGUtZnJhbWUgdG9vLgorICAgICAgICAgICAg
dW5zaWduZWQgcmVhZEluZGV4MiA9IHJlYWRJbmRleCArIDE7CisgICAgICAgICAgICBpZiAocmVh
ZEluZGV4MiA+PSBlbmRGcmFtZSkgeworICAgICAgICAgICAgICAgIGlmIChsb29wKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQg
b2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgcmVhZEluZGV4MiAtPSBkZWx0YUZy
YW1lczsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVhZElu
ZGV4MiA9IHJlYWRJbmRleDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZpbmlz
aCgpOworICAgICAgICAgICAgLy8gRmluYWwgc2FuaXR5IGNoZWNrIG9uIGJ1ZmZlciBhY2Nlc3Mu
CisgICAgICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0aW1pemF0aW9uLCB0cnkgdG8gZ2V0IHJp
ZCBvZiB0aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1dCBhc3NlcnRpb25zIGFuZCBndWFyZHMg
YmVmb3JlIHRoZSBsb29wLgorICAgICAgICAgICAgaWYgKHJlYWRJbmRleCA+PSBidWZmZXJMZW5n
dGggfHwgcmVhZEluZGV4MiA+PSBidWZmZXJMZW5ndGgpCiAgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAgICAgICAgZG91
YmxlIHNhbXBsZUwxID0gc291cmNlTFtyZWFkSW5kZXhdOworICAgICAgICAgICAgZG91YmxlIHNh
bXBsZUwyID0gc291cmNlTFtyZWFkSW5kZXgyXTsKKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVM
ID0gKDEuMCAtIGludGVycG9sYXRpb25GYWN0b3IpICogc2FtcGxlTDEgKyBpbnRlcnBvbGF0aW9u
RmFjdG9yICogc2FtcGxlTDI7CisgICAgICAgICAgICAqZGVzdGluYXRpb25MKysgPSBuYXJyb3dQ
cmVjaXNpb25Ub0Zsb2F0KHNhbXBsZUwpOworCisgICAgICAgICAgICBpZiAoaXNTdGVyZW8pIHsK
KyAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlUjEgPSBzb3VyY2VSW3JlYWRJbmRleF07Cisg
ICAgICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIyID0gc291cmNlUltyZWFkSW5kZXgyXTsKKyAg
ICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlUiA9ICgxLjAgLSBpbnRlcnBvbGF0aW9uRmFjdG9y
KSAqIHNhbXBsZVIxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNhbXBsZVIyOworICAgICAgICAg
ICAgICAgICpkZXN0aW5hdGlvblIrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2FtcGxlUik7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWxSZWFkSW5kZXggKz0gcGl0Y2hS
YXRlOworCisgICAgICAgICAgICAvLyBXcmFwLWFyb3VuZCwgcmV0YWluaW5nIHN1Yi1zYW1wbGUg
cG9zaXRpb24gc2luY2UgdmlydHVhbFJlYWRJbmRleCBpcyBmbG9hdGluZy1wb2ludC4KKyAgICAg
ICAgICAgIGlmICh2aXJ0dWFsUmVhZEluZGV4ID49IGVuZEZyYW1lKSB7CisgICAgICAgICAgICAg
ICAgdmlydHVhbFJlYWRJbmRleCAtPSBkZWx0YUZyYW1lczsKKworICAgICAgICAgICAgICAgIGlm
ICghbG9vcCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBsb29waW5n
LCB0aGVuIHN0b3AgcGxheWluZyB3aGVuIHdlIGdldCB0byB0aGUgZW5kLgorICAgICAgICAgICAg
ICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChm
cmFtZXNUb1Byb2Nlc3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBu
b3QgbG9vcGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwg
YnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3JlIG91dHB1dCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIHNvIGdlbmVyYXRlIHNpbGVuY2UgZm9yIHRoZSByZW1haW5pbmcuCisgICAg
ICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25MLCAwLCBzaXplb2YoZmxvYXQp
ICogZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3Rl
cmVvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlvblIsIDAs
IHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0K
LSAgICAKKyAgICB9IAogICAgIG1fdmlydHVhbFJlYWRJbmRleCA9IHZpcnR1YWxSZWFkSW5kZXg7
CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120256</attachid>
            <date>2011-12-21 19:00:41 -0800</date>
            <delta_ts>2011-12-22 21:55:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74592-20111222110120.patch</filename>
            <type>text/plain</type>
            <size>8238</size>
            <attacher name="Wei James (wistoch)">james.wei</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzNDc0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzg5MWQ1YTk0ZWE5ZmFi
NmM0MDdjOGQ1NmJmZDQ5ZDU4YmFiYTFhOC4uYTM1MTQ1MGY0Y2Y2YjU5NzViYzQxYWYyMTBhNjdm
MzU0MDk0ZWQzNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDExLTEyLTIxICBXZWkg
SmFtZXMgIDxqYW1lcy53ZWlAaW50ZWwuY29tPgorCisgICAgICAgIE9wdGltaXplIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZSBwcm9jZXNzIGJ5IGF2b2lkaW5nIGludGVycG9sYXRpb24gd2hlbiBwaXRj
aFJhdGU9PTEKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTc0NTkyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNv
dXJjZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpy
ZW5kZXJGcm9tQnVmZmVyKToKKwogMjAxMS0xMi0yMSAgUGVyLUVyaWsgQnJvZGluICA8cGVyLWVy
aWsuYnJvZGluQGVyaWNzc29uLmNvbT4KIAogICAgICAgICBEaXNjYXJkIGV2ZW50IGRhdGEgbm90
IGZvbGxvd2VkIGJ5IGFuIGVtcHR5IGxpbmUgYmVmb3JlIGVvZiB3aGVuIHBhcnNpbmcgYW4gZXZl
bnQtc3RyZWFtCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZl
clNvdXJjZU5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3Vy
Y2VOb2RlLmNwcAppbmRleCAwZjBkN2IzMTkwNDFjYjc3MmQ4NTA1N2UxNzBhMjM2ZGY5YTY0NjMy
Li5hNGY2ODJjZmYyZDAzNTQzNzVjNjkwZWRmYTY0MTE0MTMzMDU4ODkzIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKQEAgLTI0Nyw2
NiArMjQ3LDEwNyBAQCB2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVuZGVyRnJvbUJ1ZmZl
cihBdWRpb0J1cyogYnVzLCB1bnNpZ25lZCBkZXN0aW5hdGlvbgogICAgIGRvdWJsZSB2aXJ0dWFs
UmVhZEluZGV4ID0gbV92aXJ0dWFsUmVhZEluZGV4OwogCiAgICAgLy8gUmVuZGVyIGxvb3AgLSBy
ZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHVzaW5nIGxp
bmVhciBpbnRlcnBvbGF0aW9uLgotICAgIC8vIEZJWE1FOiBvcHRpbWl6ZSBmb3IgdGhlIHZlcnkg
Y29tbW9uIGNhc2Ugb2YgcGxheWluZyBiYWNrIHdpdGggcGl0Y2hSYXRlID09IDEuCi0gICAgLy8g
V2UgY2FuIGF2b2lkIHRoZSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KICAgICBpbnQgZnJhbWVzVG9Q
cm9jZXNzID0gbnVtYmVyT2ZGcmFtZXM7Ci0gICAgd2hpbGUgKGZyYW1lc1RvUHJvY2Vzcy0tKSB7
Ci0gICAgICAgIHVuc2lnbmVkIHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih2aXJ0
dWFsUmVhZEluZGV4KTsKLSAgICAgICAgZG91YmxlIGludGVycG9sYXRpb25GYWN0b3IgPSB2aXJ0
dWFsUmVhZEluZGV4IC0gcmVhZEluZGV4OwotICAgICAgICAKLSAgICAgICAgLy8gRm9yIGxpbmVh
ciBpbnRlcnBvbGF0aW9uIHdlIG5lZWQgdGhlIG5leHQgc2FtcGxlLWZyYW1lIHRvby4KLSAgICAg
ICAgdW5zaWduZWQgcmVhZEluZGV4MiA9IHJlYWRJbmRleCArIDE7Ci0gICAgICAgIGlmIChyZWFk
SW5kZXgyID49IGVuZEZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAobG9vcCgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1
ZmZlci4KLSAgICAgICAgICAgICAgICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOwotICAgICAg
ICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmVhZEluZGV4MiA9IHJlYWRJbmRleDsKLSAg
ICAgICAgfQogCi0gICAgICAgIC8vIEZpbmFsIHNhbml0eSBjaGVjayBvbiBidWZmZXIgYWNjZXNz
LgotICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0aW1pemF0aW9uLCB0cnkgdG8gZ2V0IHJpZCBv
ZiB0aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1dCBhc3NlcnRpb25zIGFuZCBndWFyZHMgYmVm
b3JlIHRoZSBsb29wLgotICAgICAgICBpZiAocmVhZEluZGV4ID49IGJ1ZmZlckxlbmd0aCB8fCBy
ZWFkSW5kZXgyID49IGJ1ZmZlckxlbmd0aCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAg
IC8vIExpbmVhciBpbnRlcnBvbGF0aW9uLgotICAgICAgICBkb3VibGUgc2FtcGxlTDEgPSBzb3Vy
Y2VMW3JlYWRJbmRleF07Ci0gICAgICAgIGRvdWJsZSBzYW1wbGVMMiA9IHNvdXJjZUxbcmVhZElu
ZGV4Ml07Ci0gICAgICAgIGRvdWJsZSBzYW1wbGVMID0gKDEuMCAtIGludGVycG9sYXRpb25GYWN0
b3IpICogc2FtcGxlTDEgKyBpbnRlcnBvbGF0aW9uRmFjdG9yICogc2FtcGxlTDI7Ci0gICAgICAg
ICpkZXN0aW5hdGlvbkwrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2FtcGxlTCk7Ci0KLSAg
ICAgICAgaWYgKGlzU3RlcmVvKSB7Ci0gICAgICAgICAgICBkb3VibGUgc2FtcGxlUjEgPSBzb3Vy
Y2VSW3JlYWRJbmRleF07Ci0gICAgICAgICAgICBkb3VibGUgc2FtcGxlUjIgPSBzb3VyY2VSW3Jl
YWRJbmRleDJdOwotICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIgPSAoMS4wIC0gaW50ZXJwb2xh
dGlvbkZhY3RvcikgKiBzYW1wbGVSMSArIGludGVycG9sYXRpb25GYWN0b3IgKiBzYW1wbGVSMjsK
LSAgICAgICAgICAgICpkZXN0aW5hdGlvblIrKyA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoc2Ft
cGxlUik7Ci0gICAgICAgIH0KKyAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIHZlcnkgY29tbW9uIGNh
c2Ugb2YgcGxheWluZyBiYWNrIHdpdGggcGl0Y2hSYXRlID09IDEuCisgICAgLy8gV2UgY2FuIGF2
b2lkIHRoZSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICBpZiAocGl0Y2hSYXRlID09IDEgJiYg
dmlydHVhbFJlYWRJbmRleCA9PSBmbG9vcih2aXJ0dWFsUmVhZEluZGV4KSkgeworICAgICAgICB1
bnNpZ25lZCByZWFkSW5kZXggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odmlydHVhbFJlYWRJbmRl
eCk7CisgICAgICAgIHdoaWxlIChmcmFtZXNUb1Byb2Nlc3MgPiAwKSB7CisgICAgICAgICAgICBp
bnQgZnJhbWVzVG9FbmQgPSBlbmRGcmFtZSAtIHJlYWRJbmRleDsKKyAgICAgICAgICAgIGludCBm
cmFtZXNUaGlzVGltZSA9IG1pbihmcmFtZXNUb1Byb2Nlc3MsIGZyYW1lc1RvRW5kKTsKKyAgICAg
ICAgICAgIGZyYW1lc1RoaXNUaW1lID0gbWF4KDAsIGZyYW1lc1RoaXNUaW1lKTsKKworICAgICAg
ICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uTCwgc291cmNlTCArIHJlYWRJbmRleCwgc2l6ZW9mKCpz
b3VyY2VMKSAqIGZyYW1lc1RoaXNUaW1lKTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uTCArPSBm
cmFtZXNUaGlzVGltZTsKKyAgICAgICAgICAgIGlmIChpc1N0ZXJlbykgeworICAgICAgICAgICAg
ICAgIG1lbWNweShkZXN0aW5hdGlvblIsIHNvdXJjZVIgKyByZWFkSW5kZXgsIHNpemVvZigqc291
cmNlUikgKiBmcmFtZXNUaGlzVGltZSk7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SICs9
IGZyYW1lc1RoaXNUaW1lOworICAgICAgICAgICAgfQogCi0gICAgICAgIHZpcnR1YWxSZWFkSW5k
ZXggKz0gcGl0Y2hSYXRlOworICAgICAgICAgICAgcmVhZEluZGV4ICs9IGZyYW1lc1RoaXNUaW1l
OworICAgICAgICAgICAgZnJhbWVzVG9Qcm9jZXNzIC09IGZyYW1lc1RoaXNUaW1lOwogCi0gICAg
ICAgIC8vIFdyYXAtYXJvdW5kLCByZXRhaW5pbmcgc3ViLXNhbXBsZSBwb3NpdGlvbiBzaW5jZSB2
aXJ0dWFsUmVhZEluZGV4IGlzIGZsb2F0aW5nLXBvaW50LgotICAgICAgICBpZiAodmlydHVhbFJl
YWRJbmRleCA+PSBlbmRGcmFtZSkgewotICAgICAgICAgICAgdmlydHVhbFJlYWRJbmRleCAtPSBk
ZWx0YUZyYW1lczsKKyAgICAgICAgICAgIC8vIFdyYXAtYXJvdW5kLgorICAgICAgICAgICAgaWYg
KHJlYWRJbmRleCA+PSBlbmRGcmFtZSkgeworICAgICAgICAgICAgICAgIHJlYWRJbmRleCAtPSBk
ZWx0YUZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAoIWxvb3AoKSkgeworICAgICAgICAgICAg
ICAgICAgICAvLyBJZiB3ZSdyZSBub3QgbG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3
ZSBnZXQgdG8gdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgbV9pc1BsYXlpbmcgPSBmYWxz
ZTsKIAotICAgICAgICAgICAgaWYgKCFsb29wKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3
ZSdyZSBub3QgbG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQgdG8gdGhlIGVu
ZC4KLSAgICAgICAgICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworICAgICAgICAgICAgICAg
ICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gV2UncmUgbm90IGxvb3BpbmcgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2Ft
cGxlIGRhdGEsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgbW9yZSBvdXRwdXQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBzbyBnZW5lcmF0ZSBzaWxlbmNlIGZvciB0aGUgcmVtYWlu
aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6
ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZnJh
bWVzVG9Qcm9jZXNzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbG9v
cGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IHdl
IHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3JlIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAg
Ly8gc28gZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIHJlbWFpbmluZy4KLSAgICAgICAgICAgICAg
ICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJv
Y2Vzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGVyZW8pCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uUiwgMCwgc2l6ZW9mKGZsb2F0KSAq
IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAg
ICAgICAgICBpZiAoaXNTdGVyZW8pCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVz
dGluYXRpb25SLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAg
ICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsUmVh
ZEluZGV4ID0gcmVhZEluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChmcmFtZXNU
b1Byb2Nlc3MtLSkgeworICAgICAgICAgICAgdW5zaWduZWQgcmVhZEluZGV4ID0gc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KHZpcnR1YWxSZWFkSW5kZXgpOworICAgICAgICAgICAgZG91YmxlIGludGVy
cG9sYXRpb25GYWN0b3IgPSB2aXJ0dWFsUmVhZEluZGV4IC0gcmVhZEluZGV4OworCisgICAgICAg
ICAgICAvLyBGb3IgbGluZWFyIGludGVycG9sYXRpb24gd2UgbmVlZCB0aGUgbmV4dCBzYW1wbGUt
ZnJhbWUgdG9vLgorICAgICAgICAgICAgdW5zaWduZWQgcmVhZEluZGV4MiA9IHJlYWRJbmRleCAr
IDE7CisgICAgICAgICAgICBpZiAocmVhZEluZGV4MiA+PSBlbmRGcmFtZSkgeworICAgICAgICAg
ICAgICAgIGlmIChsb29wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRv
IHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAg
ICAgcmVhZEluZGV4MiAtPSBkZWx0YUZyYW1lczsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgcmVhZEluZGV4MiA9IHJlYWRJbmRleDsKKyAgICAgICAgICAgIH0K
IAotICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgLy8gRmluYWwgc2FuaXR5
IGNoZWNrIG9uIGJ1ZmZlciBhY2Nlc3MuCisgICAgICAgICAgICAvLyBGSVhNRTogYXMgYW4gb3B0
aW1pemF0aW9uLCB0cnkgdG8gZ2V0IHJpZCBvZiB0aGlzIGlubmVyLWxvb3AgY2hlY2sgYW5kIHB1
dCBhc3NlcnRpb25zIGFuZCBndWFyZHMgYmVmb3JlIHRoZSBsb29wLgorICAgICAgICAgICAgaWYg
KHJlYWRJbmRleCA+PSBidWZmZXJMZW5ndGggfHwgcmVhZEluZGV4MiA+PSBidWZmZXJMZW5ndGgp
CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIExpbmVhciBpbnRlcnBv
bGF0aW9uLgorICAgICAgICAgICAgZG91YmxlIHNhbXBsZUwxID0gc291cmNlTFtyZWFkSW5kZXhd
OworICAgICAgICAgICAgZG91YmxlIHNhbXBsZUwyID0gc291cmNlTFtyZWFkSW5kZXgyXTsKKyAg
ICAgICAgICAgIGRvdWJsZSBzYW1wbGVMID0gKDEuMCAtIGludGVycG9sYXRpb25GYWN0b3IpICog
c2FtcGxlTDEgKyBpbnRlcnBvbGF0aW9uRmFjdG9yICogc2FtcGxlTDI7CisgICAgICAgICAgICAq
ZGVzdGluYXRpb25MKysgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHNhbXBsZUwpOworCisgICAg
ICAgICAgICBpZiAoaXNTdGVyZW8pIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlUjEg
PSBzb3VyY2VSW3JlYWRJbmRleF07CisgICAgICAgICAgICAgICAgZG91YmxlIHNhbXBsZVIyID0g
c291cmNlUltyZWFkSW5kZXgyXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2FtcGxlUiA9ICgx
LjAgLSBpbnRlcnBvbGF0aW9uRmFjdG9yKSAqIHNhbXBsZVIxICsgaW50ZXJwb2xhdGlvbkZhY3Rv
ciAqIHNhbXBsZVIyOworICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvblIrKyA9IG5hcnJvd1By
ZWNpc2lvblRvRmxvYXQoc2FtcGxlUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZp
cnR1YWxSZWFkSW5kZXggKz0gcGl0Y2hSYXRlOworCisgICAgICAgICAgICAvLyBXcmFwLWFyb3Vu
ZCwgcmV0YWluaW5nIHN1Yi1zYW1wbGUgcG9zaXRpb24gc2luY2UgdmlydHVhbFJlYWRJbmRleCBp
cyBmbG9hdGluZy1wb2ludC4KKyAgICAgICAgICAgIGlmICh2aXJ0dWFsUmVhZEluZGV4ID49IGVu
ZEZyYW1lKSB7CisgICAgICAgICAgICAgICAgdmlydHVhbFJlYWRJbmRleCAtPSBkZWx0YUZyYW1l
czsKKworICAgICAgICAgICAgICAgIGlmICghbG9vcCgpKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIElmIHdlJ3JlIG5vdCBsb29waW5nLCB0aGVuIHN0b3AgcGxheWluZyB3aGVuIHdlIGdldCB0
byB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworCisg
ICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiAwKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbG9vcGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUg
ZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3Jl
IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGdlbmVyYXRlIHNpbGVuY2Ug
Zm9yIHRoZSByZW1haW5pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGlu
YXRpb25MLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGlzU3RlcmVvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1lbXNldChkZXN0aW5hdGlvblIsIDAsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3Mp
OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICAKKyAgICB9IAogICAgIG1fdmlydHVhbFJlYWRJ
bmRleCA9IHZpcnR1YWxSZWFkSW5kZXg7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120435</attachid>
            <date>2011-12-22 22:10:34 -0800</date>
            <delta_ts>2012-01-03 17:28:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74592-20111223141115.patch</filename>
            <type>text/plain</type>
            <size>8961</size>
            <attacher name="Wei James (wistoch)">james.wei</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzNjAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDllMzE1YWQwMDkzODMz
MzliZTAwYWRiYjVjZWQ2MzdiOTQwZTExMi4uYzFjZjMzYWM4Yzc5N2Q1YzQ4MDZiNDAwYzNhY2Yw
ZmMwNmY2NTg1ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDExLTEyLTIyICBXZWkg
SmFtZXMgIDxqYW1lcy53ZWlAaW50ZWwuY29tPgorCisgICAgICAgIE9wdGltaXplIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZSBwcm9jZXNzIGJ5IGF2b2lkaW5nIGludGVycG9sYXRpb24gd2hlbiBwaXRj
aFJhdGU9PTEKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTc0NTkyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Q292ZXJlZCBieSBleGlzdGluZyB3ZWJhdWRpbyBsYXlvdXQgdGVzdHMsIGVzcGVjaWFsbHkgd2Vi
YXVkaW8vYXVkaW9idWZmZXJzb3VyY2UtcGxheWJhY2tyYXRlLmh0bWwKKworICAgICAgICAqIHdl
YmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRp
b0J1ZmZlclNvdXJjZU5vZGU6OnJlbmRlclNpbGVuY2VBbmRGaW5pc2hJZk5vdExvb3BpbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpyZW5kZXJGcm9tQnVmZmVy
KToKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaDoKKwogMjAxMS0x
Mi0yMiAgQ2hyaXMgTWFycmluICA8Y21hcnJpbkBhcHBsZS5jb20+CiAKICAgICAgICAgQ3Jhc2gg
YW5kIGluY29ycmVjdCBiZWhhdmlvciB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGhhcmR3YXJlIGFu
ZCBzb2Z0d2FyZSBDU1MgZmlsdGVycwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvd2ViYXVk
aW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1
ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKaW5kZXggMGYwZDdiMzE5MDQxY2I3NzJkODUwNTdlMTcw
YTIzNmRmOWE2NDYzMi4uYzhhMTMyMjk1NTJjMmZhYTU1MWFmYjViZDQxNmQwMDUyMDc0MmIzZCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2Rl
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUu
Y3BwCkBAIC0xNTcsNiArMTU3LDI4IEBAIHZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpwcm9j
ZXNzKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCiAgICAgfQogfQogCisvLyBSZXR1cm5zIHRydWUg
aWYgd2UncmUgZmluaXNoZWQuCitib29sIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVuZGVyU2ls
ZW5jZUFuZEZpbmlzaElmTm90TG9vcGluZyhmbG9hdCogZGVzdGluYXRpb25MLCBmbG9hdCogZGVz
dGluYXRpb25SLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIGlmICghbG9vcCgpKSB7
CisgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBsb29waW5nLCB0aGVuIHN0b3AgcGxheWluZyB3aGVu
IHdlIGdldCB0byB0aGUgZW5kLgorICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworCisgICAg
ICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBub3Qg
bG9vcGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0
IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3JlIG91dHB1dCwKKyAgICAgICAgICAgIC8vIHNv
IGdlbmVyYXRlIHNpbGVuY2UgZm9yIHRoZSByZW1haW5pbmcuCisgICAgICAgICAgICBtZW1zZXQo
ZGVzdGluYXRpb25MLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKworICAg
ICAgICAgICAgaWYgKGRlc3RpbmF0aW9uUikKKyAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGlu
YXRpb25SLCAwLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgfQor
CisgICAgICAgIGZpbmlzaCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorCiB2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVuZGVyRnJvbUJ1
ZmZlcihBdWRpb0J1cyogYnVzLCB1bnNpZ25lZCBkZXN0aW5hdGlvbkZyYW1lT2Zmc2V0LCBzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMpCiB7CiAgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNBdWRpb1RocmVh
ZCgpKTsKQEAgLTI0Nyw2OSArMjY5LDgzIEBAIHZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpy
ZW5kZXJGcm9tQnVmZmVyKEF1ZGlvQnVzKiBidXMsIHVuc2lnbmVkIGRlc3RpbmF0aW9uCiAgICAg
ZG91YmxlIHZpcnR1YWxSZWFkSW5kZXggPSBtX3ZpcnR1YWxSZWFkSW5kZXg7CiAKICAgICAvLyBS
ZW5kZXIgbG9vcCAtIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciB0byB0aGUgZGVzdGlu
YXRpb24gdXNpbmcgbGluZWFyIGludGVycG9sYXRpb24uCi0gICAgLy8gRklYTUU6IG9wdGltaXpl
IGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSBvZiBwbGF5aW5nIGJhY2sgd2l0aCBwaXRjaFJhdGUg
PT0gMS4KLSAgICAvLyBXZSBjYW4gYXZvaWQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgogICAg
IGludCBmcmFtZXNUb1Byb2Nlc3MgPSBudW1iZXJPZkZyYW1lczsKLSAgICB3aGlsZSAoZnJhbWVz
VG9Qcm9jZXNzLS0pIHsKKworICAgIC8vIE9wdGltaXplIGZvciB0aGUgdmVyeSBjb21tb24gY2Fz
ZSBvZiBwbGF5aW5nIGJhY2sgd2l0aCBwaXRjaFJhdGUgPT0gMS4KKyAgICAvLyBXZSBjYW4gYXZv
aWQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgIGlmIChwaXRjaFJhdGUgPT0gMSAmJiB2
aXJ0dWFsUmVhZEluZGV4ID09IGZsb29yKHZpcnR1YWxSZWFkSW5kZXgpKSB7CiAgICAgICAgIHVu
c2lnbmVkIHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih2aXJ0dWFsUmVhZEluZGV4
KTsKLSAgICAgICAgZG91YmxlIGludGVycG9sYXRpb25GYWN0b3IgPSB2aXJ0dWFsUmVhZEluZGV4
IC0gcmVhZEluZGV4OwotICAgICAgICAKLSAgICAgICAgLy8gRm9yIGxpbmVhciBpbnRlcnBvbGF0
aW9uIHdlIG5lZWQgdGhlIG5leHQgc2FtcGxlLWZyYW1lIHRvby4KLSAgICAgICAgdW5zaWduZWQg
cmVhZEluZGV4MiA9IHJlYWRJbmRleCArIDE7Ci0gICAgICAgIGlmIChyZWFkSW5kZXgyID49IGVu
ZEZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAobG9vcCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
TWFrZSBzdXJlIHRvIHdyYXAgYXJvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgICAg
ICAgICAgICAgICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOwotICAgICAgICAgICAgfSBlbHNl
Ci0gICAgICAgICAgICAgICAgcmVhZEluZGV4MiA9IHJlYWRJbmRleDsKLSAgICAgICAgfQorICAg
ICAgICB3aGlsZSAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAgICAgICAgaW50IGZyYW1l
c1RvRW5kID0gZW5kRnJhbWUgLSByZWFkSW5kZXg7CisgICAgICAgICAgICBpbnQgZnJhbWVzVGhp
c1RpbWUgPSBtaW4oZnJhbWVzVG9Qcm9jZXNzLCBmcmFtZXNUb0VuZCk7CisgICAgICAgICAgICBm
cmFtZXNUaGlzVGltZSA9IG1heCgwLCBmcmFtZXNUaGlzVGltZSk7CisKKyAgICAgICAgICAgIG1l
bWNweShkZXN0aW5hdGlvbkwsIHNvdXJjZUwgKyByZWFkSW5kZXgsIHNpemVvZigqc291cmNlTCkg
KiBmcmFtZXNUaGlzVGltZSk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbkwgKz0gZnJhbWVzVGhp
c1RpbWU7CisgICAgICAgICAgICBpZiAoaXNTdGVyZW8pIHsKKyAgICAgICAgICAgICAgICBtZW1j
cHkoZGVzdGluYXRpb25SLCBzb3VyY2VSICsgcmVhZEluZGV4LCBzaXplb2YoKnNvdXJjZVIpICog
ZnJhbWVzVGhpc1RpbWUpOworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUiArPSBmcmFtZXNU
aGlzVGltZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2sg
b24gYnVmZmVyIGFjY2Vzcy4KLSAgICAgICAgLy8gRklYTUU6IGFzIGFuIG9wdGltaXphdGlvbiwg
dHJ5IHRvIGdldCByaWQgb2YgdGhpcyBpbm5lci1sb29wIGNoZWNrIGFuZCBwdXQgYXNzZXJ0aW9u
cyBhbmQgZ3VhcmRzIGJlZm9yZSB0aGUgbG9vcC4KLSAgICAgICAgaWYgKHJlYWRJbmRleCA+PSBi
dWZmZXJMZW5ndGggfHwgcmVhZEluZGV4MiA+PSBidWZmZXJMZW5ndGgpCi0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvbi4KLSAgICAgICAgZG91Ymxl
IHNhbXBsZUwxID0gc291cmNlTFtyZWFkSW5kZXhdOwotICAgICAgICBkb3VibGUgc2FtcGxlTDIg
PSBzb3VyY2VMW3JlYWRJbmRleDJdOwotICAgICAgICBkb3VibGUgc2FtcGxlTCA9ICgxLjAgLSBp
bnRlcnBvbGF0aW9uRmFjdG9yKSAqIHNhbXBsZUwxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNh
bXBsZUwyOwotICAgICAgICAqZGVzdGluYXRpb25MKysgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0
KHNhbXBsZUwpOwotCi0gICAgICAgIGlmIChpc1N0ZXJlbykgewotICAgICAgICAgICAgZG91Ymxl
IHNhbXBsZVIxID0gc291cmNlUltyZWFkSW5kZXhdOwotICAgICAgICAgICAgZG91YmxlIHNhbXBs
ZVIyID0gc291cmNlUltyZWFkSW5kZXgyXTsKLSAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVSID0g
KDEuMCAtIGludGVycG9sYXRpb25GYWN0b3IpICogc2FtcGxlUjEgKyBpbnRlcnBvbGF0aW9uRmFj
dG9yICogc2FtcGxlUjI7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb25SKysgPSBuYXJyb3dQcmVj
aXNpb25Ub0Zsb2F0KHNhbXBsZVIpOwotICAgICAgICB9CisgICAgICAgICAgICByZWFkSW5kZXgg
Kz0gZnJhbWVzVGhpc1RpbWU7CisgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgLT0gZnJhbWVz
VGhpc1RpbWU7CiAKLSAgICAgICAgdmlydHVhbFJlYWRJbmRleCArPSBwaXRjaFJhdGU7CisgICAg
ICAgICAgICAvLyBXcmFwLWFyb3VuZC4KKyAgICAgICAgICAgIGlmIChyZWFkSW5kZXggPj0gZW5k
RnJhbWUpIHsKKyAgICAgICAgICAgICAgICByZWFkSW5kZXggLT0gZGVsdGFGcmFtZXM7CisgICAg
ICAgICAgICAgICAgaWYgKHJlbmRlclNpbGVuY2VBbmRGaW5pc2hJZk5vdExvb3BpbmcoZGVzdGlu
YXRpb25MLCBkZXN0aW5hdGlvblIsIGZyYW1lc1RvUHJvY2VzcykpCisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWxSZWFk
SW5kZXggPSByZWFkSW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGZyYW1lc1Rv
UHJvY2Vzcy0tKSB7CisgICAgICAgICAgICB1bnNpZ25lZCByZWFkSW5kZXggPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4odmlydHVhbFJlYWRJbmRleCk7CisgICAgICAgICAgICBkb3VibGUgaW50ZXJw
b2xhdGlvbkZhY3RvciA9IHZpcnR1YWxSZWFkSW5kZXggLSByZWFkSW5kZXg7CisKKyAgICAgICAg
ICAgIC8vIEZvciBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3ZSBuZWVkIHRoZSBuZXh0IHNhbXBsZS1m
cmFtZSB0b28uCisgICAgICAgICAgICB1bnNpZ25lZCByZWFkSW5kZXgyID0gcmVhZEluZGV4ICsg
MTsKKyAgICAgICAgICAgIGlmIChyZWFkSW5kZXgyID49IGVuZEZyYW1lKSB7CisgICAgICAgICAg
ICAgICAgaWYgKGxvb3AoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8g
d3JhcCBhcm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgICAgICAg
ICByZWFkSW5kZXgyIC09IGRlbHRhRnJhbWVzOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgICAgICByZWFkSW5kZXgyID0gcmVhZEluZGV4OworICAgICAgICAgICAgfQog
Ci0gICAgICAgIC8vIFdyYXAtYXJvdW5kLCByZXRhaW5pbmcgc3ViLXNhbXBsZSBwb3NpdGlvbiBz
aW5jZSB2aXJ0dWFsUmVhZEluZGV4IGlzIGZsb2F0aW5nLXBvaW50LgotICAgICAgICBpZiAodmly
dHVhbFJlYWRJbmRleCA+PSBlbmRGcmFtZSkgewotICAgICAgICAgICAgdmlydHVhbFJlYWRJbmRl
eCAtPSBkZWx0YUZyYW1lczsKKyAgICAgICAgICAgIC8vIEZpbmFsIHNhbml0eSBjaGVjayBvbiBi
dWZmZXIgYWNjZXNzLgorICAgICAgICAgICAgLy8gRklYTUU6IGFzIGFuIG9wdGltaXphdGlvbiwg
dHJ5IHRvIGdldCByaWQgb2YgdGhpcyBpbm5lci1sb29wIGNoZWNrIGFuZCBwdXQgYXNzZXJ0aW9u
cyBhbmQgZ3VhcmRzIGJlZm9yZSB0aGUgbG9vcC4KKyAgICAgICAgICAgIGlmIChyZWFkSW5kZXgg
Pj0gYnVmZmVyTGVuZ3RoIHx8IHJlYWRJbmRleDIgPj0gYnVmZmVyTGVuZ3RoKQorICAgICAgICAg
ICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBpZiAoIWxvb3AoKSkgewotICAgICAgICAgICAg
ICAgIC8vIElmIHdlJ3JlIG5vdCBsb29waW5nLCB0aGVuIHN0b3AgcGxheWluZyB3aGVuIHdlIGdl
dCB0byB0aGUgZW5kLgotICAgICAgICAgICAgICAgIG1faXNQbGF5aW5nID0gZmFsc2U7CisgICAg
ICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgICAgICAgIGRvdWJsZSBzYW1w
bGVMMSA9IHNvdXJjZUxbcmVhZEluZGV4XTsKKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGVMMiA9
IHNvdXJjZUxbcmVhZEluZGV4Ml07CisgICAgICAgICAgICBkb3VibGUgc2FtcGxlTCA9ICgxLjAg
LSBpbnRlcnBvbGF0aW9uRmFjdG9yKSAqIHNhbXBsZUwxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAq
IHNhbXBsZUwyOworICAgICAgICAgICAgKmRlc3RpbmF0aW9uTCsrID0gbmFycm93UHJlY2lzaW9u
VG9GbG9hdChzYW1wbGVMKTsKKworICAgICAgICAgICAgaWYgKGlzU3RlcmVvKSB7CisgICAgICAg
ICAgICAgICAgZG91YmxlIHNhbXBsZVIxID0gc291cmNlUltyZWFkSW5kZXhdOworICAgICAgICAg
ICAgICAgIGRvdWJsZSBzYW1wbGVSMiA9IHNvdXJjZVJbcmVhZEluZGV4Ml07CisgICAgICAgICAg
ICAgICAgZG91YmxlIHNhbXBsZVIgPSAoMS4wIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1w
bGVSMSArIGludGVycG9sYXRpb25GYWN0b3IgKiBzYW1wbGVSMjsKKyAgICAgICAgICAgICAgICAq
ZGVzdGluYXRpb25SKysgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHNhbXBsZVIpOworICAgICAg
ICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA+IDApIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGxvb3BpbmcgYW5kIHdlJ3ZlIHJlYWNoZWQg
dGhlIGVuZCBvZiB0aGUgc2FtcGxlIGRhdGEsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUg
bW9yZSBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGdlbmVyYXRlIHNpbGVuY2Ug
Zm9yIHRoZSByZW1haW5pbmcuCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlv
bkwsIDAsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgdmly
dHVhbFJlYWRJbmRleCArPSBwaXRjaFJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlz
U3RlcmVvKQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uUiwgMCwg
c2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7Ci0gICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgLy8gV3JhcC1hcm91bmQsIHJldGFpbmluZyBzdWItc2FtcGxlIHBvc2l0aW9uIHNp
bmNlIHZpcnR1YWxSZWFkSW5kZXggaXMgZmxvYXRpbmctcG9pbnQuCisgICAgICAgICAgICBpZiAo
dmlydHVhbFJlYWRJbmRleCA+PSBlbmRGcmFtZSkgeworICAgICAgICAgICAgICAgIHZpcnR1YWxS
ZWFkSW5kZXggLT0gZGVsdGFGcmFtZXM7CiAKLSAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAocmVuZGVyU2lsZW5jZUFu
ZEZpbmlzaElmTm90TG9vcGluZyhkZXN0aW5hdGlvbkwsIGRlc3RpbmF0aW9uUiwgZnJhbWVzVG9Q
cm9jZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KLSAgICB9Ci0gICAgCisgICAgfSAKICAgICBtX3ZpcnR1YWxSZWFkSW5kZXggPSB2aXJ0
dWFsUmVhZEluZGV4OwogfQogCisKIHZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpyZXNldCgp
CiB7CiAgICAgbV92aXJ0dWFsUmVhZEluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5oIGIvU291cmNlL1dlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgKaW5kZXggZmQ3MzA4MWQ2YjNmODFiNGUxZmI3
YjJiM2NkMzhiZDgwMGU3ODNiMC4uNzc3YmE4OWUzN2YzOWVkZGJjMDU4MTE2ZjNlMmQyYjljMzhm
ZjI1NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3Vy
Y2VOb2RlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VO
b2RlLmgKQEAgLTg3LDYgKzg3LDggQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgcmVuZGVyRnJvbUJ1
ZmZlcihBdWRpb0J1cyosIHVuc2lnbmVkIGRlc3RpbmF0aW9uRnJhbWVPZmZzZXQsIHNpemVfdCBu
dW1iZXJPZkZyYW1lcyk7CiAKKyAgICBpbmxpbmUgYm9vbCByZW5kZXJTaWxlbmNlQW5kRmluaXNo
SWZOb3RMb29waW5nKGZsb2F0KiBkZXN0aW5hdGlvbkwsIGZsb2F0KiBkZXN0aW5hdGlvblIsIHNp
emVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCiAgICAgLy8gbV9idWZmZXIgaG9sZHMgdGhlIHNhbXBs
ZSBkYXRhIHdoaWNoIHRoaXMgbm9kZSBvdXRwdXRzLgogICAgIFJlZlB0cjxBdWRpb0J1ZmZlcj4g
bV9idWZmZXI7CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>