<?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>71949</bug_id>
          
          <creation_ts>2011-11-09 13:22:47 -0800</creation_ts>
          <short_desc>Add buffering to handle mismatch between hardware buffer size and webaudio render size</short_desc>
          <delta_ts>2011-11-14 16:19:04 -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>New Bugs</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>1</everconfirmed>
          <reporter name="Raymond Toy">rtoy</reporter>
          <assigned_to name="Raymond Toy">rtoy</assigned_to>
          <cc>crogers</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>499300</commentid>
    <comment_count>0</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-09 13:22:47 -0800</bug_when>
    <thetext>Add buffering to handle mismatch between hardware buffer size and webaudio render size</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499308</commentid>
    <comment_count>1</comment_count>
      <attachid>114354</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-09 13:28:05 -0800</bug_when>
    <thetext>Created attachment 114354
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499337</commentid>
    <comment_count>2</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-09 14:05:19 -0800</bug_when>
    <thetext>This patch adds buffering to support the case where the hardware buffer size is not a multiple of the webaudio render size.

For some background see http://codereview.chromium.org/8440002/.  In that CL, support for WASAPI on Windows is being added.  The hardware buffer with WASAPI works best when a 10ms buffer is used.  This corresponds to a buffer size of 480 samples (at 48kHz).  But webaudio always audio with a buffer size of 128 and this mismatch needs to be handled.  The fifo handles this by calling webaudio 4 times to generate 512 samples, and delivers the requested 480 samples.  The remaining 32 samples are left for delivery the next time.  It turns out that on the 16 call to webaudio to render data, the fifo will have a full 480 samples available, so the call to webaudio will be skipped.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499387</commentid>
    <comment_count>3</comment_count>
      <attachid>114354</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-09 15:08:42 -0800</bug_when>
    <thetext>Comment on attachment 114354
Patch

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

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:63
&gt; +    // Get the minimum usable buffer size.

I would change this comment to:

// Use the optimal buffer size recommended by the audio back-end.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:68
&gt; +

Please add a comment here describing why we&apos;re creating m_fifo

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:-58
&gt; -    AudioSourceProvider&amp; m_provider;

It would be good to have a comment describing (at least) what FIFO stands for, and why we need this class.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:59
&gt; +    class FIFO {

I&apos;d recommend moving all of the implementation for this class in the .cpp file and just have the declarations of the methods here...

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:62
&gt; +                : m_provider(provider)

too much indentation

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:65
&gt; +                , m_length(0)

I&apos;m not crazy about the name &quot;m_length&quot; -- how about &quot;m_framesInBuffer&quot; or &quot;m_bufferedFrames&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:68
&gt; +                , m_renderSize(renderSize)

Can we change &quot;m_renderSize&quot;  -&gt;  &quot;m_fillsize&quot;
(and similarly &quot;renderSize&quot; -&gt; &quot;fillSize&quot;)

&quot;render&quot; doesn&apos;t seem clear enough about whether this is at the filling side or consuming side of the FIFO

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:73
&gt; +        ~FIFO()

You can remove empty destructor

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:80
&gt; +        void consume(AudioBus* destination, size_t numberOfFrames)

how about making &quot;numberOfFrames&quot; more descriptive, like &quot;framesToConsume&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:81
&gt; +        {

just to be careful, probably should have:

ASSERT(destination);
if (!destination)
    return;

We also need a similar sanity check that (numberOfFrames &lt;= m_fifoLength)

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:98
&gt; +                float* destinationChannel = destination-&gt;channel(channelIndex)-&gt;data();

Consistency: below you simply use &quot;source&quot; as the name, so why not simply &quot;destination&quot; here instead of &quot;destinationChannel&quot;?

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:101
&gt; +                memcpy(destinationChannel,

This memcpy() and the one below should all be a single-line

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:112
&gt; +            ASSERT(m_length &gt;= 0);

m_length is size_t so can never be negative -- ASSERT can be removed

or you can change this to be a signed type

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:118
&gt; +        int updateIndex(int index, int step)

The updateIndex() method is unnecessary - it&apos;s pretty simple and more clear to simply update m_readIndex and m_writeIndex directly each on a single-line

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:126
&gt; +        {

I would add an ASSERT

ASSERT(index &lt; m_fifoLength &amp;&amp; size &lt;= m_fifoLength);

and also do the same check outside of the ASSERT and set part1Length and part2Length to harmless values if so

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:140
&gt; +        // data.

Please consolidate into a single-line comment.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:145
&gt; +            // the data into the FIFO.

Comment has typo &quot;at received at least&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:149
&gt; +                size_t numberOfChannels = m_fifoAudioBus.numberOfChannels();

Please move &quot;numberOfChannels&quot; to closest point of first use - in this case just above the for() statement

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:152
&gt; +

I&apos;d remove this blank line just before findWrapLengths()

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:161
&gt; +                           part1Length * sizeof(*destination));

I&apos;d suggest putting the memcpy() here the next one all on a single line.  It&apos;s not very WebKit-style friendly.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:180
&gt; +        // buffer.

one-line comment.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:200
&gt; +

extra blank line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500881</commentid>
    <comment_count>4</comment_count>
      <attachid>114354</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 10:18:04 -0800</bug_when>
    <thetext>Comment on attachment 114354
Patch

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

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:-78
&gt; -    

Oops.  Should probably keep the check that the callback buffer size is less than the maximum buffer size.

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:69
&gt; +    m_fifo = adoptPtr(new FIFO(provider, numberOfChannels, maximumCallbackBufferSize, renderBufferSize));

The fifo size should probably be maximumCallbackBufferSize + renderBufferSize.  Things won&apos;t work very well if the callback buffer size is very close to maximumCallbackBufferSize.  We won&apos;t have room to add an additional render block.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:68
&gt;&gt; +                , m_renderSize(renderSize)
&gt; 
&gt; Can we change &quot;m_renderSize&quot;  -&gt;  &quot;m_fillsize&quot;
&gt; (and similarly &quot;renderSize&quot; -&gt; &quot;fillSize&quot;)
&gt; 
&gt; &quot;render&quot; doesn&apos;t seem clear enough about whether this is at the filling side or consuming side of the FIFO

How about m_producerSize, since that&apos;s the size of data the producer should produce?

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:98
&gt;&gt; +                float* destinationChannel = destination-&gt;channel(channelIndex)-&gt;data();
&gt; 
&gt; Consistency: below you simply use &quot;source&quot; as the name, so why not simply &quot;destination&quot; here instead of &quot;destinationChannel&quot;?

Because &quot;destination&quot; is already a variable (input parameter) and that gets confusing.  How about if I change source to sourceChannel instead?

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:112
&gt;&gt; +            ASSERT(m_length &gt;= 0);
&gt; 
&gt; m_length is size_t so can never be negative -- ASSERT can be removed
&gt; 
&gt; or you can change this to be a signed type

Good point.  It should be an int type so that m_length -= numberOfFrames doesn&apos;t suddenly become some huge number because it was unsigned.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:118
&gt;&gt; +        int updateIndex(int index, int step)
&gt; 
&gt; The updateIndex() method is unnecessary - it&apos;s pretty simple and more clear to simply update m_readIndex and m_writeIndex directly each on a single-line

Perhaps, but I believe in OAOO (once and only once).  If we change the implementation (to say a power-of-two fifo length) we only have to modify just updateIndex, not everywhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500900</commentid>
    <comment_count>5</comment_count>
      <attachid>114354</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 10:33:02 -0800</bug_when>
    <thetext>Comment on attachment 114354
Patch

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

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:63

&gt; 
&gt; I would change this comment to:
&gt; 
&gt; // Use the optimal buffer size recommended by the audio back-end.

Done

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:-78
&gt;&gt; -    
&gt; 
&gt; Oops.  Should probably keep the check that the callback buffer size is less than the maximum buffer size.

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:68
&gt;&gt; +
&gt; 
&gt; Please add a comment here describing why we&apos;re creating m_fifo

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:69
&gt;&gt; +    m_fifo = adoptPtr(new FIFO(provider, numberOfChannels, maximumCallbackBufferSize, renderBufferSize));
&gt; 
&gt; The fifo size should probably be maximumCallbackBufferSize + renderBufferSize.  Things won&apos;t work very well if the callback buffer size is very close to maximumCallbackBufferSize.  We won&apos;t have room to add an additional render block.

Done.  But should we change the maximum to something smaller than 16K?  Maybe 4 or 8K would be better?

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:59
&gt;&gt; +    class FIFO {
&gt; 
&gt; I&apos;d recommend moving all of the implementation for this class in the .cpp file and just have the declarations of the methods here...

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:62
&gt;&gt; +                : m_provider(provider)
&gt; 
&gt; too much indentation

Fixed.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:65
&gt;&gt; +                , m_length(0)
&gt; 
&gt; I&apos;m not crazy about the name &quot;m_length&quot; -- how about &quot;m_framesInBuffer&quot; or &quot;m_bufferedFrames&quot;

Using m_framesInFifo.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:73
&gt;&gt; +        ~FIFO()
&gt; 
&gt; You can remove empty destructor

Removed.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:80
&gt;&gt; +        void consume(AudioBus* destination, size_t numberOfFrames)
&gt; 
&gt; how about making &quot;numberOfFrames&quot; more descriptive, like &quot;framesToConsume&quot;

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:81
&gt;&gt; +        {
&gt; 
&gt; just to be careful, probably should have:
&gt; 
&gt; ASSERT(destination);
&gt; if (!destination)
&gt;     return;
&gt; 
&gt; We also need a similar sanity check that (numberOfFrames &lt;= m_fifoLength)

ASSERT added.

How do you want to handle the case of numberOfFrames &gt; m_fifoLength?  Just return?  Fill the destination with zeroes?  Fill the fifo completely, return that data, and zero out the remainder?

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:101
&gt;&gt; +                memcpy(destinationChannel,
&gt; 
&gt; This memcpy() and the one below should all be a single-line

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:126
&gt;&gt; +        {
&gt; 
&gt; I would add an ASSERT
&gt; 
&gt; ASSERT(index &lt; m_fifoLength &amp;&amp; size &lt;= m_fifoLength);
&gt; 
&gt; and also do the same check outside of the ASSERT and set part1Length and part2Length to harmless values if so

Done.  part1Length and part2Length are set to 0, so nothing will get copied.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:140
&gt;&gt; +        // data.
&gt; 
&gt; Please consolidate into a single-line comment.

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:145
&gt;&gt; +            // the data into the FIFO.
&gt; 
&gt; Comment has typo &quot;at received at least&quot;

Fixed.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:149
&gt;&gt; +                size_t numberOfChannels = m_fifoAudioBus.numberOfChannels();
&gt; 
&gt; Please move &quot;numberOfChannels&quot; to closest point of first use - in this case just above the for() statement

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:152
&gt;&gt; +
&gt; 
&gt; I&apos;d remove this blank line just before findWrapLengths()

Removed.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:161
&gt;&gt; +                           part1Length * sizeof(*destination));
&gt; 
&gt; I&apos;d suggest putting the memcpy() here the next one all on a single line.  It&apos;s not very WebKit-style friendly.

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:180
&gt;&gt; +        // buffer.
&gt; 
&gt; one-line comment.

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:200
&gt;&gt; +
&gt; 
&gt; extra blank line

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500901</commentid>
    <comment_count>6</comment_count>
      <attachid>114354</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-11 10:33:20 -0800</bug_when>
    <thetext>Comment on attachment 114354
Patch

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

Hi Ray - it looks like you forgot to upload a new patch along with your comments.  I&apos;ll have a closer look when the new patch comes

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:69
&gt;&gt; +    m_fifo = adoptPtr(new FIFO(provider, numberOfChannels, maximumCallbackBufferSize, renderBufferSize));
&gt; 
&gt; The fifo size should probably be maximumCallbackBufferSize + renderBufferSize.  Things won&apos;t work very well if the callback buffer size is very close to maximumCallbackBufferSize.  We won&apos;t have room to add an additional render block.

OK - or maybe better is to rename &quot;maximumCallbackBufferSize&quot; -&gt; &quot;fifoSize&quot; and then simply ASSERT that   callbackSize + renderBufferSize &lt;= fifoSize

&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:68
&gt;&gt;&gt; +                , m_renderSize(renderSize)
&gt;&gt; 
&gt;&gt; Can we change &quot;m_renderSize&quot;  -&gt;  &quot;m_fillsize&quot;
&gt;&gt; (and similarly &quot;renderSize&quot; -&gt; &quot;fillSize&quot;)
&gt;&gt; 
&gt;&gt; &quot;render&quot; doesn&apos;t seem clear enough about whether this is at the filling side or consuming side of the FIFO
&gt; 
&gt; How about m_producerSize, since that&apos;s the size of data the producer should produce?

That sounds good.

&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:98
&gt;&gt;&gt; +                float* destinationChannel = destination-&gt;channel(channelIndex)-&gt;data();
&gt;&gt; 
&gt;&gt; Consistency: below you simply use &quot;source&quot; as the name, so why not simply &quot;destination&quot; here instead of &quot;destinationChannel&quot;?
&gt; 
&gt; Because &quot;destination&quot; is already a variable (input parameter) and that gets confusing.  How about if I change source to sourceChannel instead?

I don&apos;t like the suffix &quot;Channel&quot; because there&apos;s actually a really important Web Audio class called AudioChannel which is actually used on line 98

Looking at how line 98 reads - it makes it even more odd to call it &quot;Channel&quot; -- &quot;Data&quot; seems like an ok suffix here

&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:118
&gt;&gt;&gt; +        int updateIndex(int index, int step)
&gt;&gt; 
&gt;&gt; The updateIndex() method is unnecessary - it&apos;s pretty simple and more clear to simply update m_readIndex and m_writeIndex directly each on a single-line
&gt; 
&gt; Perhaps, but I believe in OAOO (once and only once).  If we change the implementation (to say a power-of-two fifo length) we only have to modify just updateIndex, not everywhere.

Seems like we&apos;ll never have to change updateIndex() for power-of-two since the MOD operator should work there as well as any other case.

In any case, if you do choose to keep the method, please compact it into a single-line:

return (index + step) % m_fifoLength;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500907</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-11 10:39:39 -0800</bug_when>
    <thetext>Hi Ray, I still don&apos;t see your new patch??</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500914</commentid>
    <comment_count>8</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 10:48:13 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Hi Ray, I still don&apos;t see your new patch??

I think a midair collision prevented my patch from going in.  (Prevented most of my followup comments from being sent.)

I&apos;ll make another patch incorporating your new comments and upload the patch.  Hopefully, no midair collision this time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500937</commentid>
    <comment_count>9</comment_count>
      <attachid>114735</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 11:06:48 -0800</bug_when>
    <thetext>Created attachment 114735
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500946</commentid>
    <comment_count>10</comment_count>
      <attachid>114354</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 11:12:26 -0800</bug_when>
    <thetext>Comment on attachment 114354
Patch

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

&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:63
&gt;&gt;&gt; +    // Get the minimum usable buffer size.
&gt;&gt; 
&gt;&gt; I would change this comment to:
&gt;&gt; 
&gt;&gt; // Use the optimal buffer size recommended by the audio back-end.
&gt; 
&gt; 

Done.

&gt;&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:69
&gt;&gt;&gt;&gt; +    m_fifo = adoptPtr(new FIFO(provider, numberOfChannels, maximumCallbackBufferSize, renderBufferSize));
&gt;&gt;&gt; 
&gt;&gt;&gt; The fifo size should probably be maximumCallbackBufferSize + renderBufferSize.  Things won&apos;t work very well if the callback buffer size is very close to maximumCallbackBufferSize.  We won&apos;t have room to add an additional render block.
&gt;&gt; 
&gt;&gt; Done.  But should we change the maximum to something smaller than 16K?  Maybe 4 or 8K would be better?
&gt; 
&gt; OK - or maybe better is to rename &quot;maximumCallbackBufferSize&quot; -&gt; &quot;fifoSize&quot; and then simply ASSERT that   callbackSize + renderBufferSize &lt;= fifoSize

Renamed as suggested, along with the ASSERT.

&gt;&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:98
&gt;&gt;&gt;&gt; +                float* destinationChannel = destination-&gt;channel(channelIndex)-&gt;data();
&gt;&gt;&gt; 
&gt;&gt;&gt; Consistency: below you simply use &quot;source&quot; as the name, so why not simply &quot;destination&quot; here instead of &quot;destinationChannel&quot;?
&gt;&gt; 
&gt;&gt; Because &quot;destination&quot; is already a variable (input parameter) and that gets confusing.  How about if I change source to sourceChannel instead?
&gt; 
&gt; I don&apos;t like the suffix &quot;Channel&quot; because there&apos;s actually a really important Web Audio class called AudioChannel which is actually used on line 98
&gt; 
&gt; Looking at how line 98 reads - it makes it even more odd to call it &quot;Channel&quot; -- &quot;Data&quot; seems like an ok suffix here

Renamed to Data.

&gt;&gt;&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:118
&gt;&gt;&gt;&gt; +        int updateIndex(int index, int step)
&gt;&gt;&gt; 
&gt;&gt;&gt; The updateIndex() method is unnecessary - it&apos;s pretty simple and more clear to simply update m_readIndex and m_writeIndex directly each on a single-line
&gt;&gt; 
&gt;&gt; Perhaps, but I believe in OAOO (once and only once).  If we change the implementation (to say a power-of-two fifo length) we only have to modify just updateIndex, not everywhere.
&gt; 
&gt; Seems like we&apos;ll never have to change updateIndex() for power-of-two since the MOD operator should work there as well as any other case.
&gt; 
&gt; In any case, if you do choose to keep the method, please compact it into a single-line:
&gt; 
&gt; return (index + step) % m_fifoLength;

Simplified as suggested.

I was thinking of the nano optimization of replacing the % m_fifoLength with &amp; (m_fifoLength - 1).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501098</commentid>
    <comment_count>11</comment_count>
      <attachid>114735</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-11 14:21:03 -0800</bug_when>
    <thetext>Comment on attachment 114735
Patch

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

Thanks - looking really good!  Mostly a few style nits, plus some extra paranoid checks near the memcpy() calls...

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:80
&gt; +    ASSERT(m_fifo);

This ASSERT is probably not necessary, since I believe the memory allocator will ASSERT if &quot;new&quot; fails...

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:146
&gt; +

I think we still need a sanity check that (framesToConsume &lt;= m_fifoLength) - ASSERT and early return

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:165
&gt; +

I know that findWrapLength() should be returning sane values, but we tend to be super paranoid when doing memcpy(), so I think we should add an ASSERT and early return here:

bool isCopyGood = part1Length &lt; framesToConsume &amp;&amp; part2Length &lt; framesToConsume &amp;&amp; part1Length + part2Length &lt; framesToConsume;

(the third check should guard against wrap-around)

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:214
&gt; +

Probably should have ASSERT and early return to sanity check the memcpy() similar to what I recommend above

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:60
&gt; +    // audio buffer size and the Web Audio render size.

nit: I would change &quot;audio buffer size&quot; -&gt; &quot;hardware buffer size&quot; (or even better &quot;audio back-end hardware buffer size&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:64
&gt; +        // will be large enough to hold |length| frames of data of

|length| -&gt; |fifoLength|

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:66
&gt; +        // provide data in frames of size |providerSize|.

I would reword this slightly:

&quot;The AudioSourceProvider must provide data in frames of size |providerSize|.&quot;

---&gt;

&quot;The AudioSourceProvider will be asked to produce |providerSize| frames when the FIFO needs more data.&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:69
&gt; +        // Get data from |framestoConsume| frames from the FIFO and

This sentence sounds a little awkward.  How about:

&quot;Read |framesToConsume| from the FIFO into the destination.&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:79
&gt; +        {

style nit: single-line inline method should be put on a single-line:

int updateIndex(int index, int step) { return (index + step) % m_fifoLength; }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501199</commentid>
    <comment_count>12</comment_count>
      <attachid>114795</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 16:06:54 -0800</bug_when>
    <thetext>Created attachment 114795
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501202</commentid>
    <comment_count>13</comment_count>
      <attachid>114735</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 16:09:50 -0800</bug_when>
    <thetext>Comment on attachment 114735
Patch

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

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:80
&gt;&gt; +    ASSERT(m_fifo);
&gt; 
&gt; This ASSERT is probably not necessary, since I believe the memory allocator will ASSERT if &quot;new&quot; fails...

Removed

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:146
&gt;&gt; +
&gt; 
&gt; I think we still need a sanity check that (framesToConsume &lt;= m_fifoLength) - ASSERT and early return

Check added.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:165
&gt;&gt; +
&gt; 
&gt; I know that findWrapLength() should be returning sane values, but we tend to be super paranoid when doing memcpy(), so I think we should add an ASSERT and early return here:
&gt; 
&gt; bool isCopyGood = part1Length &lt; framesToConsume &amp;&amp; part2Length &lt; framesToConsume &amp;&amp; part1Length + part2Length &lt; framesToConsume;
&gt; 
&gt; (the third check should guard against wrap-around)

Check added.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:214
&gt;&gt; +
&gt; 
&gt; Probably should have ASSERT and early return to sanity check the memcpy() similar to what I recommend above

Check added.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:60
&gt;&gt; +    // audio buffer size and the Web Audio render size.
&gt; 
&gt; nit: I would change &quot;audio buffer size&quot; -&gt; &quot;hardware buffer size&quot; (or even better &quot;audio back-end hardware buffer size&quot;

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:64
&gt;&gt; +        // will be large enough to hold |length| frames of data of
&gt; 
&gt; |length| -&gt; |fifoLength|

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:66
&gt;&gt; +        // provide data in frames of size |providerSize|.
&gt; 
&gt; I would reword this slightly:
&gt; 
&gt; &quot;The AudioSourceProvider must provide data in frames of size |providerSize|.&quot;
&gt; 
&gt; ---&gt;
&gt; 
&gt; &quot;The AudioSourceProvider will be asked to produce |providerSize| frames when the FIFO needs more data.&quot;

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:69
&gt;&gt; +        // Get data from |framestoConsume| frames from the FIFO and
&gt; 
&gt; This sentence sounds a little awkward.  How about:
&gt; 
&gt; &quot;Read |framesToConsume| from the FIFO into the destination.&quot;

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.h:79
&gt;&gt; +        {
&gt; 
&gt; style nit: single-line inline method should be put on a single-line:
&gt; 
&gt; int updateIndex(int index, int step) { return (index + step) % m_fifoLength; }

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501203</commentid>
    <comment_count>14</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-11 16:10:44 -0800</bug_when>
    <thetext>Applied suggested fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501225</commentid>
    <comment_count>15</comment_count>
      <attachid>114795</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-11 16:45:43 -0800</bug_when>
    <thetext>Comment on attachment 114795
Patch

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

A few last tweaks

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:140
&gt; +void AudioDestinationChromium::FIFO::consume(AudioBus* destination, int framesToConsume)

Can we make &quot;framesToConsume&quot; size_t instead of int and avoid the several static_cast&lt;int&gt; associated with it?

It seems a bit ugly to have these static_casts -- best to avoid them

you may need to change a few other places &quot;int&quot; -&gt; &quot;size_t&quot; to make it work

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:166
&gt; +        bool isCopyGood = (static_cast&lt;int&gt;(part1Length) &lt;= framesToConsume

This also needs to sanity check &quot;m_readIndex&quot;

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:168
&gt; +                           &amp;&amp; static_cast&lt;int&gt;(part1Length + part2Length) &lt;= framesToConsume);

See comment about static_cast&lt;int&gt; above

&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:222
&gt; +            bool isCopyGood = (part1Length &lt;= m_providerSize

Sanity check also needs to factor in m_writeIndex</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501226</commentid>
    <comment_count>16</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-11 16:47:02 -0800</bug_when>
    <thetext>Hi Ray, if you make the last few changes then this looks ready to go.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502060</commentid>
    <comment_count>17</comment_count>
      <attachid>114977</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 10:27:04 -0800</bug_when>
    <thetext>Created attachment 114977
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502063</commentid>
    <comment_count>18</comment_count>
      <attachid>114795</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 10:28:19 -0800</bug_when>
    <thetext>Comment on attachment 114795
Patch

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

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:140
&gt;&gt; +void AudioDestinationChromium::FIFO::consume(AudioBus* destination, int framesToConsume)
&gt; 
&gt; Can we make &quot;framesToConsume&quot; size_t instead of int and avoid the several static_cast&lt;int&gt; associated with it?
&gt; 
&gt; It seems a bit ugly to have these static_casts -- best to avoid them
&gt; 
&gt; you may need to change a few other places &quot;int&quot; -&gt; &quot;size_t&quot; to make it work

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:166
&gt;&gt; +        bool isCopyGood = (static_cast&lt;int&gt;(part1Length) &lt;= framesToConsume
&gt; 
&gt; This also needs to sanity check &quot;m_readIndex&quot;

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:168
&gt;&gt; +                           &amp;&amp; static_cast&lt;int&gt;(part1Length + part2Length) &lt;= framesToConsume);
&gt; 
&gt; See comment about static_cast&lt;int&gt; above

Done.

&gt;&gt; Source/WebKit/chromium/src/AudioDestinationChromium.cpp:222
&gt;&gt; +            bool isCopyGood = (part1Length &lt;= m_providerSize
&gt; 
&gt; Sanity check also needs to factor in m_writeIndex

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502144</commentid>
    <comment_count>19</comment_count>
      <attachid>114977</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 11:47:48 -0800</bug_when>
    <thetext>Comment on attachment 114977
Patch

Ken,

Can you take a look when you get a chance?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502231</commentid>
    <comment_count>20</comment_count>
      <attachid>115015</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 13:09:23 -0800</bug_when>
    <thetext>Created attachment 115015
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502254</commentid>
    <comment_count>21</comment_count>
      <attachid>115023</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 13:35:59 -0800</bug_when>
    <thetext>Created attachment 115023
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502257</commentid>
    <comment_count>22</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2011-11-14 13:38:07 -0800</bug_when>
    <thetext>Oops.  The previous patch had a couple of off-by-one errors in the code that was checking for good limits for memcpy.  This is fixed now in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502298</commentid>
    <comment_count>23</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-11-14 14:17:21 -0800</bug_when>
    <thetext>Looks fine to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502399</commentid>
    <comment_count>24</comment_count>
      <attachid>115023</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-11-14 15:44:33 -0800</bug_when>
    <thetext>Comment on attachment 115023
Patch

Looks good. rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502435</commentid>
    <comment_count>25</comment_count>
      <attachid>115023</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-14 16:18:58 -0800</bug_when>
    <thetext>Comment on attachment 115023
Patch

Clearing flags on attachment: 115023

Committed r100210: &lt;http://trac.webkit.org/changeset/100210&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502436</commentid>
    <comment_count>26</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-14 16:19:04 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114354</attachid>
            <date>2011-11-09 13:28:05 -0800</date>
            <delta_ts>2011-11-11 11:12:26 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111109132804.patch</filename>
            <type>text/plain</type>
            <size>10479</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTk2NzQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXgg
NzFkZTQ1YWI3N2M5OTliYzQ1MDVmMWZkYmM3ZGFiMDY5NzU3NTY5Yy4uYzYyYjFlNDAxOTg5MzFm
YzY3ZmJkZjBhZWIzMDE2YjY3YTZhYmRkNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAg
LTEsMyArMSwyNyBAQAorMjAxMS0xMS0wOSAgUmF5bW9uZCBUb3kgIDxydG95QGdvb2dsZS5jb20+
CisKKyAgICAgICAgQWRkIGJ1ZmZlcmluZyB0byBoYW5kbGUgbWlzbWF0Y2ggYmV0d2VlbiBoYXJk
d2FyZSBidWZmZXIgc2l6ZSBhbmQgd2ViYXVkaW8gcmVuZGVyIHNpemUKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKToKKyAgICAgICAgQ3JlYXRlIHRoZSBGSUZPIGZvciBi
dWZmZXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJl
bmRlcik6IEdldCByaWQgb2YKKyAgICAgICAgbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrIGFuZCBs
ZXQgdGhlIEZJRk8gY29uc3VtZSBmdW5jdGlvbiBwcm9kdWNlCisgICAgICAgIHRoZSBhcHByb3By
aWF0ZSBudW1iZXIgb2YgY2FsbHMgdG8gdGhlIHdlYmF1ZGlvIHJlbmRlcmVyLiAgQWxzbworICAg
ICAgICByZW1vdmUgdGhlIHJvdW5kaW5nIG9mIHRoZSBjYWxsYmFjayBzaXplLiAgVXNlIHdoYXRl
dmVyIHRoZQorICAgICAgICBoYXJkd2FyZSByZXR1cm5zLgorICAgICAgICAqIHNyYy9BdWRpb0Rl
c3RpbmF0aW9uQ2hyb21pdW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25D
aHJvbWl1bTo6RklGTzo6RklGTyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9u
Q2hyb21pdW06OkZJRk86On5GSUZPKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRp
b25DaHJvbWl1bTo6RklGTzo6Y29uc3VtZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3Rp
bmF0aW9uQ2hyb21pdW06OkZJRk86OnVwZGF0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6ZmluZFdyYXBMZW5ndGhzKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6ZmlsbEJ1ZmZlcik6Cisg
ICAgICAgIE5ldyBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIEZJRk8gYnVmZmVyLgorCiAyMDEx
LTExLTA4ICBKYXkgQ2l2ZWxsaSAgPGpjaXZlbGxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBG
aXhlcyBhbmQgcmVlbmFibGVzIHRoZSBXZWJQYWdlU2VyaWFsaXplciB0ZXN0cy4KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5j
cHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0u
Y3BwCmluZGV4IGFhOWM2ZmE2ZDczYTQ1ZDM2YjA0ZjAyMDBjOTYwYThhOWVmMzNkYTYuLjBiOWE1
NDg0N2FhZDBhNDEwZWFhY2FiMjI3YTMxMWMwNGU2ZDdlNzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAKKysrIGIvU291
cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmNwcApAQCAt
MzIsNyArMzIsNiBAQAogCiAjaW5jbHVkZSAiQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmgiCiAK
LSNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3ZpZGVyLmgiCiAjaW5jbHVkZSAiV2ViS2l0LmgiCiAj
aW5jbHVkZSAiV2ViS2l0UGxhdGZvcm1TdXBwb3J0LmgiCiAKQEAgLTYxLDIzICs2MCwxNCBAQCBB
dWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bShBdWRpb1Nv
dXJjZVByb3ZpZGVyJiBwcm92aWRlcgogICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUpCiAg
ICAgLCBtX2lzUGxheWluZyhmYWxzZSkKIHsKLSAgICAvLyBHZXQgdGhlIG1pbmltdW0gdXNhYmxl
IGJ1ZmZlciBzaXplLiBXZSdsbCByb3VuZCB0aGlzIHZhbHVlIHVwCi0gICAgLy8gdG8gYSBtdWx0
aXBsZSBvZiBvdXIgcmVuZGVyIHNpemUuCi0gICAgc2l6ZV90IGNhbGxiYWNrU2l6ZSA9IHdlYktp
dFBsYXRmb3JtU3VwcG9ydCgpLT5hdWRpb0hhcmR3YXJlQnVmZmVyU2l6ZSgpOworICAgIC8vIEdl
dCB0aGUgbWluaW11bSB1c2FibGUgYnVmZmVyIHNpemUuCisgICAgbV9jYWxsYmFja0J1ZmZlclNp
emUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsK
IAotICAgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ss
IHJvdW5kaW5nIHVwIGlmIG5lZWRlZC4KLSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAo
Y2FsbGJhY2tTaXplICsgcmVuZGVyQnVmZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsK
LQotICAgIG1fY2FsbGJhY2tCdWZmZXJTaXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICog
cmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZm
ZXJTaXplID49IHJlbmRlckJ1ZmZlclNpemUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNp
emUgPD0gbWF4aW11bUNhbGxiYWNrQnVmZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7
Ci0gICAgaWYgKCFpc1NpemVHb29kKQotICAgICAgcmV0dXJuOwotICAgIAogICAgIG1fYXVkaW9E
ZXZpY2UgPSBhZG9wdFB0cih3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+Y3JlYXRlQXVkaW9EZXZp
Y2UobV9jYWxsYmFja0J1ZmZlclNpemUsIG51bWJlck9mQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIHRo
aXMpKTsKICAgICBBU1NFUlQobV9hdWRpb0RldmljZSk7CisKKyAgICBtX2ZpZm8gPSBhZG9wdFB0
cihuZXcgRklGTyhwcm92aWRlciwgbnVtYmVyT2ZDaGFubmVscywgbWF4aW11bUNhbGxiYWNrQnVm
ZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSkpOworICAgIEFTU0VSVChtX2ZpZm8pOwogfQogCiBB
dWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06On5BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0oKQpAQCAt
MTIxLDEyICsxMTEsOSBAQCB2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6cmVuZGVyKGNv
bnN0IFdlYlZlY3RvcjxmbG9hdCo+JiBhdWRpb0RhdGEsIHNpemVfdAogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgLy8gU3BsaXQgdXAgdGhlIGNhbGxiYWNrIGJ1ZmZlciBpbnRvIHNtYWxs
ZXIgY2h1bmtzIHdoaWNoIHdlJ2xsIHJlbmRlciBvbmUgYWZ0ZXIgdGhlIG90aGVyLgotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2s7ICsraSkgewot
ICAgICAgICBtX3JlbmRlckJ1cy5zZXRDaGFubmVsTWVtb3J5KDAsIGF1ZGlvRGF0YVswXSArIGkg
KiByZW5kZXJCdWZmZXJTaXplLCByZW5kZXJCdWZmZXJTaXplKTsKLSAgICAgICAgbV9yZW5kZXJC
dXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0gKyBpICogcmVuZGVyQnVmZmVyU2l6
ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1fcHJvdmlkZXIucHJvdmlkZUlucHV0KCZt
X3JlbmRlckJ1cywgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgfQorICAgIG1fcmVuZGVyQnVzLnNl
dENoYW5uZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7CisgICAgbV9y
ZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9mRnJhbWVz
KTsKKyAgICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1lcyk7CiB9
CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oIGIvU291cmNlL1dlYktpdC9jaHJv
bWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmgKaW5kZXggMTNhM2Y1MmZkODNmN2Q3
MmJjMGYwYTRiY2ZmZDNiMDNhMGRhMTdhZC4uNzIxN2FjZTAyYjQ3NTg1YzI1YzU1NmZmY2QzNWI5
NDg4YjU4MWIxYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9E
ZXN0aW5hdGlvbkNocm9taXVtLmgKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVk
aW9EZXN0aW5hdGlvbkNocm9taXVtLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAogI2luY2x1ZGUgIkF1
ZGlvQnVzLmgiCiAjaW5jbHVkZSAiQXVkaW9EZXN0aW5hdGlvbi5oIgorI2luY2x1ZGUgIkF1ZGlv
U291cmNlUHJvdmlkZXIuaCIKICNpbmNsdWRlICJXZWJBdWRpb0RldmljZS5oIgogI2luY2x1ZGUg
IldlYlZlY3Rvci5oIgogCkBAIC01NSwxMyArNTYsMTU3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFs
IHZvaWQgcmVuZGVyKGNvbnN0IFdlYktpdDo6V2ViVmVjdG9yPGZsb2F0Kj4mIGF1ZGlvRGF0YSwg
c2l6ZV90IG51bWJlck9mRnJhbWVzKTsKIAogcHJpdmF0ZToKLSAgICBBdWRpb1NvdXJjZVByb3Zp
ZGVyJiBtX3Byb3ZpZGVyOworICAgIGNsYXNzIEZJRk8geworICAgIHB1YmxpYzoKKyAgICAgICAg
RklGTyhBdWRpb1NvdXJjZVByb3ZpZGVyJiBwcm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFu
bmVscywgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IHJlbmRlclNpemUpCisgICAgICAgICAgICAgICAg
OiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICAgICAgICAgICAgICwgbV9maWZvQXVkaW9CdXMo
bnVtYmVyT2ZDaGFubmVscywgbGVuZ3RoKQorICAgICAgICAgICAgICAgICwgbV9maWZvTGVuZ3Ro
KGxlbmd0aCkKKyAgICAgICAgICAgICAgICAsIG1fbGVuZ3RoKDApCisgICAgICAgICAgICAgICAg
LCBtX3JlYWRJbmRleCgwKQorICAgICAgICAgICAgICAgICwgbV93cml0ZUluZGV4KDApCisgICAg
ICAgICAgICAgICAgLCBtX3JlbmRlclNpemUocmVuZGVyU2l6ZSkKKyAgICAgICAgICAgICAgICAs
IG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCByZW5kZXJTaXplKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICB+RklGTygpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEdldCBkYXRhIGZyb20gdGhlIEZJRk8gYW5kIHBsYWNlIGl0IGluIHRoZSBkZXN0aW5hdGlv
bi4gSWYKKyAgICAgICAgLy8gdGhlIEZJRk8gZG9lcyBub3QgaGF2ZSBlbm91Z2ggZGF0YSwgd2Ug
YXNrIHRoZSB8cHJvdmlkZXJ8CisgICAgICAgIC8vIHRvIGdldCBtb3JlIGRhdGEgdG8gZnVsZmls
bCB0aGUgcmVxdWVzdC4KKyAgICAgICAgdm9pZCBjb25zdW1lKEF1ZGlvQnVzKiBkZXN0aW5hdGlv
biwgc2l6ZV90IG51bWJlck9mRnJhbWVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVt
YmVyT2ZGcmFtZXMgPiBtX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhh
dmUgZW5vdWdoIGRhdGEgaW4gdGhlIEZJRk8gdG8gZnVsZmlsbAorICAgICAgICAgICAgICAgIC8v
IHRoZSByZXF1ZXN0LiBBc2sgZm9yIG1vcmUgZGF0YS4KKyAgICAgICAgICAgICAgICBmaWxsQnVm
ZmVyKG51bWJlck9mRnJhbWVzIC0gbV9sZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBXZSBoYXZlIGVub3VnaCBkYXRhIG5vdy4gQ29weSB0aGUgcmVxdWVzdGVkIG51bWJl
ciBvZgorICAgICAgICAgICAgLy8gc2FtcGxlcyB0byB0aGUgZGVzdGluYXRpb24uCisKKyAgICAg
ICAgICAgIHNpemVfdCBudW1iZXJPZkNoYW5uZWxzID0gbV9maWZvQXVkaW9CdXMubnVtYmVyT2ZD
aGFubmVscygpOworICAgICAgICAgICAgc2l6ZV90IHBhcnQxTGVuZ3RoOworICAgICAgICAgICAg
c2l6ZV90IHBhcnQyTGVuZ3RoOworCisgICAgICAgICAgICBmaW5kV3JhcExlbmd0aHMobV9yZWFk
SW5kZXgsIG51bWJlck9mRnJhbWVzLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGgpOworCisgICAg
ICAgICAgICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBudW1i
ZXJPZkNoYW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICAgICAgICAgIGZsb2F0KiBk
ZXN0aW5hdGlvbkNoYW5uZWwgPSBkZXN0aW5hdGlvbi0+Y2hhbm5lbChjaGFubmVsSW5kZXgpLT5k
YXRhKCk7CisgICAgICAgICAgICAgICAgZmxvYXQqIHNvdXJjZSA9IG1fZmlmb0F1ZGlvQnVzLmNo
YW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOworCisgICAgICAgICAgICAgICAgbWVtY3B5KGRl
c3RpbmF0aW9uQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICsgbV9yZWFk
SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpzb3Vy
Y2UpKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgd3JhcCBhcm91bmQgb2YgdGhlIEZJRk8s
IGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBpZiAocGFydDJMZW5ndGggPiAwKQorICAgICAg
ICAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25DaGFubmVsICsgcGFydDFMZW5ndGgsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwYXJ0Mkxlbmd0aCAqIHNpemVvZigqc291cmNlKSk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBtX3JlYWRJbmRleCA9IHVwZGF0ZUluZGV4KG1fcmVhZEluZGV4LCBudW1iZXJPZkZy
YW1lcyk7CisgICAgICAgICAgICBtX2xlbmd0aCAtPSBudW1iZXJPZkZyYW1lczsKKyAgICAgICAg
ICAgIEFTU0VSVChtX2xlbmd0aCA+PSAwKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgLy8gVXBkYXRlIHRoZSBGSUZPIGluZGV4IGJ5IHRoZSBzdGVwLCB3aXRoIGFwcHJvcHJp
YXRlCisgICAgICAgIC8vIHdyYXBwaW5nIGFyb3VuZCB0aGUgZW5kcG9pbnQuCisgICAgICAgIGlu
dCB1cGRhdGVJbmRleChpbnQgaW5kZXgsIGludCBzdGVwKQorICAgICAgICB7CisgICAgICAgICAg
ICBpbmRleCArPSBzdGVwOworICAgICAgICAgICAgaW5kZXggPSBpbmRleCAlIG1fZmlmb0xlbmd0
aDsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQg
ZmluZFdyYXBMZW5ndGhzKHNpemVfdCBpbmRleCwgc2l6ZV90IHNpemUsIHNpemVfdCYgcGFydDFM
ZW5ndGgsIHNpemVfdCYgcGFydDJMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChp
bmRleCArIHNpemUgPiBtX2ZpZm9MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRv
IHdyYXAuIEZpZ3VyZSBvdXQgdGhlIGxlbmd0aCBvZiBlYWNoCisgICAgICAgICAgICAgICAgLy8g
cGllY2UuCisgICAgICAgICAgICAgICAgcGFydDFMZW5ndGggPSBtX2ZpZm9MZW5ndGggLSBpbmRl
eDsKKyAgICAgICAgICAgICAgICBwYXJ0Mkxlbmd0aCA9IHNpemUgLSBwYXJ0MUxlbmd0aDsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm8gd3JhcCBuZWVkZWQuCisg
ICAgICAgICAgICAgICAgcGFydDFMZW5ndGggPSBzaXplOworICAgICAgICAgICAgICAgIHBhcnQy
TGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
Ly8gRmlsbCB0aGUgRklGTyBidWZmZXIgd2l0aCBhdCBsZWFzdCB8bnVtYmVyT2ZGcmFtZXN8IG1v
cmUKKyAgICAgICAgLy8gZGF0YS4KKyAgICAgICAgdm9pZCBmaWxsQnVmZmVyKGludCBudW1iZXJP
ZkZyYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gS2VlcCBhc2tpbmcgdGhlIHByb3Zp
ZGVyIHRvIGdpdmUgdXMgZGF0YSB1bnRpbCB3ZSBoYXZlCisgICAgICAgICAgICAvLyBhdCByZWNl
aXZlZCBhdCBsZWFzdCB8bnVtYmVyT2ZGcmFtZXN8IG9mIGRhdGEuIFN0dWZmCisgICAgICAgICAg
ICAvLyB0aGUgZGF0YSBpbnRvIHRoZSBGSUZPLgorICAgICAgICAgICAgd2hpbGUgKG51bWJlck9m
RnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAgIG1fcHJvdmlkZXIucHJvdmlkZUlucHV0KCZt
X3RlbXBCdXMsIG1fcmVuZGVyU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtYmVy
T2ZDaGFubmVscyA9IG1fZmlmb0F1ZGlvQnVzLm51bWJlck9mQ2hhbm5lbHMoKTsKKyAgICAgICAg
ICAgICAgICBzaXplX3QgcGFydDFMZW5ndGg7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQy
TGVuZ3RoOworCisgICAgICAgICAgICAgICAgZmluZFdyYXBMZW5ndGhzKG1fd3JpdGVJbmRleCwg
bV9yZW5kZXJTaXplLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGgpOworCisgICAgICAgICAgICAg
ICAgZm9yIChzaXplX3QgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVyT2ZD
aGFubmVsczsgKytjaGFubmVsSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRl
c3RpbmF0aW9uID0gbV9maWZvQXVkaW9CdXMuY2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7
CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzb3VyY2UgPSBtX3RlbXBCdXMuY2hhbm5lbChj
aGFubmVsSW5kZXgpLT5kYXRhKCk7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3Rp
bmF0aW9uICsgbV93cml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDFMZW5ndGggKiBzaXplb2YoKmRlc3Rp
bmF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB3cmFwIGFyb3VuZCBvZiB0
aGUgRklGTywgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAocGFydDJMZW5ndGgg
PiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSArIHBhcnQxTGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhcnQyTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5hdGlvbikp
OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fbGVuZ3RoICs9IG1fcmVu
ZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9sZW5ndGggPD0gbV9maWZvTGVuZ3Ro
KTsKKyAgICAgICAgICAgICAgICBtX3dyaXRlSW5kZXggPSB1cGRhdGVJbmRleChtX3dyaXRlSW5k
ZXgsIG1fcmVuZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgbnVtYmVyT2ZGcmFtZXMgLT0gbV9y
ZW5kZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHBy
b3ZpZGVyIG9mIHRoZSBkYXRhIGluIG91ciBGSUZPLgorICAgICAgICBBdWRpb1NvdXJjZVByb3Zp
ZGVyJiBtX3Byb3ZpZGVyOworCisgICAgICAgIC8vIFRoZSBGSUZPIGl0c2VsZi4gSW4gcmVhbGl0
eSwgdGhlIEZJRk8gaXMgYSBjaXJjdWxhcgorICAgICAgICAvLyBidWZmZXIuCisgICAgICAgIEF1
ZGlvQnVzIG1fZmlmb0F1ZGlvQnVzOworCisgICAgICAgIC8vIFRoZSB0b3RhbCBzcGFjZSBpbiB0
aGUgRklGTy4KKyAgICAgICAgc2l6ZV90IG1fZmlmb0xlbmd0aDsKKworICAgICAgICAvLyBUaGUg
bnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBGSUZPCisgICAgICAgIHNpemVfdCBtX2xlbmd0aDsK
KworICAgICAgICAvLyBXaGVyZSB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIEZJRk8uCisgICAg
ICAgIGludCBtX3JlYWRJbmRleDsKKworICAgICAgICAvLyBXaGVyZSB0byBzdGFydCB3cml0aW5n
IHRvIHRoZSBGSUZPLgorICAgICAgICBpbnQgbV93cml0ZUluZGV4OworCisgICAgICAgIC8vIFJl
bmRlciBzaXplCisgICAgICAgIHVuc2lnbmVkIGludCBtX3JlbmRlclNpemU7CisKKyAgICAgICAg
Ly8gVGVtcG9yYXJ5IHdvcmtzcGFjZSB0byBob2xkIHRoZSBkYXRhIGZyb20gdGhlIHByb3ZpZGVy
LgorICAgICAgICBBdWRpb0J1cyBtX3RlbXBCdXM7CisKKyAgICB9OworCitBdWRpb1NvdXJjZVBy
b3ZpZGVyJiBtX3Byb3ZpZGVyOwogICAgIEF1ZGlvQnVzIG1fcmVuZGVyQnVzOwogICAgIGZsb2F0
IG1fc2FtcGxlUmF0ZTsKICAgICBib29sIG1faXNQbGF5aW5nOwogICAgIE93blB0cjxXZWJLaXQ6
OldlYkF1ZGlvRGV2aWNlPiBtX2F1ZGlvRGV2aWNlOwogICAgIHNpemVfdCBtX2NhbGxiYWNrQnVm
ZmVyU2l6ZTsKLSAgICB1bnNpZ25lZCBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2s7CisgICAgT3du
UHRyPEZJRk8+IG1fZmlmbzsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114735</attachid>
            <date>2011-11-11 11:06:48 -0800</date>
            <delta_ts>2011-11-11 16:09:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111111110647.patch</filename>
            <type>text/plain</type>
            <size>11871</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTk2NzQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXgg
NzFkZTQ1YWI3N2M5OTliYzQ1MDVmMWZkYmM3ZGFiMDY5NzU3NTY5Yy4uMDZjMjM5NWViYWFhNzYy
OWZhMjZkNzZlNThkMTc4Mzc4N2M3MTIwYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAg
LTEsMyArMSwyOCBAQAorMjAxMS0xMS0xMSAgUmF5bW9uZCBUb3kgIDxydG95QGdvb2dsZS5jb20+
CisKKyAgICAgICAgQWRkIGJ1ZmZlcmluZyB0byBoYW5kbGUgbWlzbWF0Y2ggYmV0d2VlbiBoYXJk
d2FyZSBidWZmZXIgc2l6ZSBhbmQgd2ViYXVkaW8gcmVuZGVyIHNpemUKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKToKKyAgICAgICAgQ3JlYXRlIHRoZSBGSUZPIGZvciBi
dWZmZXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJl
bmRlcik6ICBHZXQgcmlkIG9mCisgICAgICAgIG1fcmVuZGVyQ291bnRQZXJDYWxsYmFjayBhbmQg
bGV0IHRoZSBGSUZPIGNvbnN1bWUgZnVuY3Rpb24gcHJvZHVjZQorICAgICAgICB0aGUgYXBwcm9w
cmlhdGUgbnVibWVyIG9mIGNhbGxzIHRvIHRoZSB3ZWJhdWRpbyBwcm9kdWNlci4gIEFsc28KKyAg
ICAgICAgcmVtb3ZlIHRoZSByb3VuZGluZyBvZiB0aGUgY2FsbGJhY2sgc2l6ZSBzbyB3ZSB1c2Ug
d2hhdGV2ZXIgdGhlCisgICAgICAgIGhhcmR3YXJlIHJldHVybnMuICBSZW1vdmVkIG1heGltdW1D
YWxsYmFja0J1ZmZlclNpemUgYW5kIHVzZQorICAgICAgICBmaWZvU2l6ZSB0byBzZXQgdGhlIEZJ
Rk8gc2l6ZS4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklG
Tzo6RklGTyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJ
Rk86OmNvbnN1bWUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVt
OjpGSUZPOjpmaW5kV3JhcExlbmd0aHMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5h
dGlvbkNocm9taXVtOjpGSUZPOjpmaWxsQnVmZmVyKToKKyAgICAgICAgSW1wbGVtZW50YXRpb24g
b2YgbmV3IEZJRk8gY2xhc3MuCisgICAgICAgICogc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjp1
cGRhdGVJbmRleCk6CisgICAgICAgIERlZmluZSBuZXcgRklGTyBjbGFzcy4KKwogMjAxMS0xMS0w
OCAgSmF5IENpdmVsbGkgIDxqY2l2ZWxsaUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgRml4ZXMg
YW5kIHJlZW5hYmxlcyB0aGUgV2ViUGFnZVNlcmlhbGl6ZXIgdGVzdHMuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwIGIv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmNwcApp
bmRleCBhYTljNmZhNmQ3M2E0NWQzNmIwNGYwMjAwYzk2MGE4YTllZjMzZGE2Li41MjIwODUyYjcy
MmY3YjcwNTIyNDYzOTBiYjk2MDU0ZmY4YmIxZmQ1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCisrKyBiL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAKQEAgLTMyLDcg
KzMyLDYgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oIgogCi0jaW5j
bHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIldlYktpdC5oIgogI2luY2x1
ZGUgIldlYktpdFBsYXRmb3JtU3VwcG9ydC5oIgogCkBAIC00Myw4ICs0Miw4IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIC8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRoZSB3ZWIgYXVkaW8gZW5naW5l
IHdpbGwgcmVuZGVyLgogY29uc3QgdW5zaWduZWQgcmVuZGVyQnVmZmVyU2l6ZSA9IDEyODsKIAot
Ly8gTWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplCi1jb25zdCBzaXplX3QgbWF4aW11bUNhbGxi
YWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OworLy8gU2l6ZSBvZiB0aGUgRklGTworY29uc3Qgc2l6ZV90
IGZpZm9TaXplID0gODE5MjsKIAogLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZvciBtdWx0aS1jaGFu
bmVsLgogY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IDI7CkBAIC02MSwyMyArNjAs
MjQgQEAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0o
QXVkaW9Tb3VyY2VQcm92aWRlciYgcHJvdmlkZXIKICAgICAsIG1fc2FtcGxlUmF0ZShzYW1wbGVS
YXRlKQogICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCiB7Ci0gICAgLy8gR2V0IHRoZSBtaW5pbXVt
IHVzYWJsZSBidWZmZXIgc2l6ZS4gV2UnbGwgcm91bmQgdGhpcyB2YWx1ZSB1cAotICAgIC8vIHRv
IGEgbXVsdGlwbGUgb2Ygb3VyIHJlbmRlciBzaXplLgotICAgIHNpemVfdCBjYWxsYmFja1NpemUg
PSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKKyAg
ICAvLyBVc2UgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUgcmVjb21tZW5kZWQgYnkgdGhlIGF1ZGlv
IGJhY2tlbmQuCisgICAgbV9jYWxsYmFja0J1ZmZlclNpemUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBv
cnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKIAotICAgIC8vIEZpZ3VyZSBvdXQgaG93
IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ssIHJvdW5kaW5nIHVwIGlmIG5lZWRlZC4K
LSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAoY2FsbGJhY2tTaXplICsgcmVuZGVyQnVm
ZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIG1fY2FsbGJhY2tCdWZmZXJT
aXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICogcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAg
IGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZmZXJTaXplID49IHJlbmRlckJ1ZmZlclNp
emUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNpemUgPD0gbWF4aW11bUNhbGxiYWNrQnVm
ZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7Ci0gICAgaWYgKCFpc1NpemVHb29kKQot
ICAgICAgcmV0dXJuOworICAgIC8vIFF1aWNrIGV4aXQgaWYgdGhlIHJlcXVlc3RlZCBzaXplIGlz
IHRvbyBsYXJnZS4KKyAgICBBU1NFUlQobV9jYWxsYmFja0J1ZmZlclNpemUgKyByZW5kZXJCdWZm
ZXJTaXplIDw9IGZpZm9TaXplKTsKKyAgICBpZiAobV9jYWxsYmFja0J1ZmZlclNpemUgKyByZW5k
ZXJCdWZmZXJTaXplID4gZmlmb1NpemUpCisgICAgICAgIHJldHVybjsKICAgICAKICAgICBtX2F1
ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0UGxhdGZvcm1TdXBwb3J0KCktPmNyZWF0ZUF1ZGlv
RGV2aWNlKG1fY2FsbGJhY2tCdWZmZXJTaXplLCBudW1iZXJPZkNoYW5uZWxzLCBzYW1wbGVSYXRl
LCB0aGlzKSk7CiAgICAgQVNTRVJUKG1fYXVkaW9EZXZpY2UpOworCisgICAgLy8gQ3JlYXRlIGEg
RklGTyB0byBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBjYWxsYmFjayBzaXplCisgICAg
Ly8gbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhlIHJlbmRlciBzaXplLiBJZiB0aGUgRklGTyBh
bHJlYWR5CisgICAgLy8gY29udGFpbnMgZW5vdWdoIGRhdGEsIHRoZSBkYXRhIHdpbGwgYmUgcHJv
dmlkZWQgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRklGTyB3aWxsIGNhbGwgdGhl
IHByb3ZpZGVyIGVub3VnaCB0aW1lcyB0bworICAgIC8vIHNhdGlzZnkgdGhlIHJlcXVlc3QgZm9y
IGRhdGEuCisgICAgbV9maWZvID0gYWRvcHRQdHIobmV3IEZJRk8ocHJvdmlkZXIsIG51bWJlck9m
Q2hhbm5lbHMsIGZpZm9TaXplLCByZW5kZXJCdWZmZXJTaXplKSk7CisgICAgQVNTRVJUKG1fZmlm
byk7CiB9CiAKIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJv
bWl1bSgpCkBAIC0xMjEsMTEgKzEyMSwxMDcgQEAgdm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21p
dW06OnJlbmRlcihjb25zdCBXZWJWZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZm
ZXIgaW50byBzbWFsbGVyIGNodW5rcyB3aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBv
dGhlci4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZW5kZXJDb3VudFBlckNhbGxi
YWNrOyArK2kpIHsKLSAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgwLCBhdWRp
b0RhdGFbMF0gKyBpICogcmVuZGVyQnVmZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAg
ICAgIG1fcmVuZGVyQnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVkaW9EYXRhWzFdICsgaSAqIHJl
bmRlckJ1ZmZlclNpemUsIHJlbmRlckJ1ZmZlclNpemUpOwotICAgICAgICBtX3Byb3ZpZGVyLnBy
b3ZpZGVJbnB1dCgmbV9yZW5kZXJCdXMsIHJlbmRlckJ1ZmZlclNpemUpOworICAgIG1fcmVuZGVy
QnVzLnNldENoYW5uZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7Cisg
ICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9m
RnJhbWVzKTsKKyAgICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1l
cyk7Cit9CisKK0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6RklGTyhBdWRpb1NvdXJj
ZVByb3ZpZGVyJiBwcm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZp
Zm9MZW5ndGgsIHNpemVfdCBwcm92aWRlclNpemUpCisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVy
KQorICAgICwgbV9maWZvQXVkaW9CdXMobnVtYmVyT2ZDaGFubmVscywgZmlmb0xlbmd0aCkKKyAg
ICAsIG1fZmlmb0xlbmd0aChmaWZvTGVuZ3RoKQorICAgICwgbV9mcmFtZXNJbkZpZm8oMCkKKyAg
ICAsIG1fcmVhZEluZGV4KDApCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAsIG1fcHJvdmlk
ZXJTaXplKHByb3ZpZGVyU2l6ZSkKKyAgICAsIG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCBw
cm92aWRlclNpemUpCit7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZP
Ojpjb25zdW1lKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lc1RvQ29uc3VtZSkKK3sK
KyAgICBBU1NFUlQoZGVzdGluYXRpb24pOworICAgIGlmICghZGVzdGluYXRpb24pCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChmcmFtZXNUb0NvbnN1bWUgPiBtX2ZyYW1lc0luRmlmbykgewor
ICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBGSUZPIHRvIGZ1bGZp
bGwgdGhlCisgICAgICAgIC8vIHJlcXVlc3QuIEFzayBmb3IgbW9yZSBkYXRhLgorICAgICAgICBm
aWxsQnVmZmVyKGZyYW1lc1RvQ29uc3VtZSAtIG1fZnJhbWVzSW5GaWZvKTsKKyAgICB9CisKKyAg
ICAvLyBXZSBoYXZlIGVub3VnaCBkYXRhIG5vdy4gQ29weSB0aGUgcmVxdWVzdGVkIG51bWJlciBv
ZiBzYW1wbGVzCisgICAgLy8gdG8gdGhlIGRlc3RpbmF0aW9uLgorCisgICAgc2l6ZV90IHBhcnQx
TGVuZ3RoOworICAgIHNpemVfdCBwYXJ0Mkxlbmd0aDsKKyAgICBmaW5kV3JhcExlbmd0aHMobV9y
ZWFkSW5kZXgsIGZyYW1lc1RvQ29uc3VtZSwgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoKTsKKwor
ICAgIHNpemVfdCBudW1iZXJPZkNoYW5uZWxzID0gbV9maWZvQXVkaW9CdXMubnVtYmVyT2ZDaGFu
bmVscygpOworCisgICAgZm9yIChzaXplX3QgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4
IDwgbnVtYmVyT2ZDaGFubmVsczsgKytjaGFubmVsSW5kZXgpIHsKKyAgICAgICAgZmxvYXQqIGRl
c3RpbmF0aW9uRGF0YSA9IGRlc3RpbmF0aW9uLT5jaGFubmVsKGNoYW5uZWxJbmRleCktPmRhdGEo
KTsKKyAgICAgICAgZmxvYXQqIHNvdXJjZURhdGEgPSBtX2ZpZm9BdWRpb0J1cy5jaGFubmVsKGNo
YW5uZWxJbmRleCktPmRhdGEoKTsKKworICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25EYXRhLCBz
b3VyY2VEYXRhICsgbV9yZWFkSW5kZXgsIHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpzb3VyY2VEYXRh
KSk7CisgICAgICAgIC8vIEhhbmRsZSB3cmFwIGFyb3VuZCBvZiB0aGUgRklGTywgaWYgbmVlZGVk
LgorICAgICAgICBpZiAocGFydDJMZW5ndGggPiAwKQorICAgICAgICAgICAgbWVtY3B5KGRlc3Rp
bmF0aW9uRGF0YSArIHBhcnQxTGVuZ3RoLCBzb3VyY2VEYXRhLCBwYXJ0Mkxlbmd0aCAqIHNpemVv
Zigqc291cmNlRGF0YSkpOworICAgIH0KKyAgICBtX3JlYWRJbmRleCA9IHVwZGF0ZUluZGV4KG1f
cmVhZEluZGV4LCBmcmFtZXNUb0NvbnN1bWUpOworICAgIG1fZnJhbWVzSW5GaWZvIC09IGZyYW1l
c1RvQ29uc3VtZTsKKyAgICBBU1NFUlQobV9mcmFtZXNJbkZpZm8gPj0gMCk7Cit9CisKK3ZvaWQg
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpmaW5kV3JhcExlbmd0aHMoc2l6ZV90IGlu
ZGV4LCBzaXplX3Qgc2l6ZSwgc2l6ZV90JiBwYXJ0MUxlbmd0aCwgc2l6ZV90JiBwYXJ0Mkxlbmd0
aCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPCBtX2ZpZm9MZW5ndGggJiYgc2l6ZSA8PSBtX2ZpZm9M
ZW5ndGgpOworICAgIGlmIChpbmRleCA8IG1fZmlmb0xlbmd0aCAmJiBzaXplIDw9IG1fZmlmb0xl
bmd0aCkgeworICAgICAgICBpZiAoaW5kZXggKyBzaXplID4gbV9maWZvTGVuZ3RoKSB7CisgICAg
ICAgICAgICAvLyBOZWVkIHRvIHdyYXAuIEZpZ3VyZSBvdXQgdGhlIGxlbmd0aCBvZiBlYWNoIHBp
ZWNlLgorICAgICAgICAgICAgcGFydDFMZW5ndGggPSBtX2ZpZm9MZW5ndGggLSBpbmRleDsKKyAg
ICAgICAgICAgIHBhcnQyTGVuZ3RoID0gc2l6ZSAtIHBhcnQxTGVuZ3RoOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gTm8gd3JhcCBuZWVkZWQuCisgICAgICAgICAgICBwYXJ0MUxl
bmd0aCA9IHNpemU7CisgICAgICAgICAgICBwYXJ0Mkxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgaW5kZXggb3Igc2l6ZS4g
U2V0IHRoZSBwYXJ0IGxlbmd0aHMgdG8KKyAgICAgICAgLy8gemVybyBzbyBub3RoaW5nIGlzIGNv
cGllZC4KKyAgICAgICAgcGFydDFMZW5ndGggPSAwOworICAgICAgICBwYXJ0Mkxlbmd0aCA9IDA7
CisgICAgfQorfQorCit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6ZmlsbEJ1
ZmZlcihpbnQgbnVtYmVyT2ZGcmFtZXMpCit7CisgICAgLy8gS2VlcCBhc2tpbmcgdGhlIHByb3Zp
ZGVyIHRvIGdpdmUgdXMgZGF0YSB1bnRpbCB3ZSBoYXZlIHJlY2VpdmVkCisgICAgLy8gYXQgbGVh
c3QgfG51bWJlck9mRnJhbWVzfCBvZiBkYXRhLiBTdHVmZiB0aGUgZGF0YSBpbnRvIHRoZQorICAg
IC8vIEZJRk8uCisgICAgd2hpbGUgKG51bWJlck9mRnJhbWVzID4gMCkgeworICAgICAgICBtX3By
b3ZpZGVyLnByb3ZpZGVJbnB1dCgmbV90ZW1wQnVzLCBtX3Byb3ZpZGVyU2l6ZSk7CisKKyAgICAg
ICAgc2l6ZV90IHBhcnQxTGVuZ3RoOworICAgICAgICBzaXplX3QgcGFydDJMZW5ndGg7CisgICAg
ICAgIGZpbmRXcmFwTGVuZ3RocyhtX3dyaXRlSW5kZXgsIG1fcHJvdmlkZXJTaXplLCBwYXJ0MUxl
bmd0aCwgcGFydDJMZW5ndGgpOworCisgICAgICAgIHNpemVfdCBudW1iZXJPZkNoYW5uZWxzID0g
bV9maWZvQXVkaW9CdXMubnVtYmVyT2ZDaGFubmVscygpOworICAgICAgICAKKyAgICAgICAgZm9y
IChzaXplX3QgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVyT2ZDaGFubmVs
czsgKytjaGFubmVsSW5kZXgpIHsKKyAgICAgICAgICAgIGZsb2F0KiBkZXN0aW5hdGlvbiA9IG1f
Zmlmb0F1ZGlvQnVzLmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOworICAgICAgICAgICAg
ZmxvYXQqIHNvdXJjZSA9IG1fdGVtcEJ1cy5jaGFubmVsKGNoYW5uZWxJbmRleCktPmRhdGEoKTsK
KworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgbV93cml0ZUluZGV4LCBzb3VyY2Us
IHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5hdGlvbikpOworICAgICAgICAgICAgLy8gSGFu
ZGxlIHdyYXAgYXJvdW5kIG9mIHRoZSBGSUZPLCBpZiBuZWVkZWQuCisgICAgICAgICAgICBpZiAo
cGFydDJMZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgc291
cmNlICsgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5hdGlvbikpOwor
ICAgICAgICB9CisKKyAgICAgICAgbV9mcmFtZXNJbkZpZm8gKz0gbV9wcm92aWRlclNpemU7Cisg
ICAgICAgIEFTU0VSVChtX2ZyYW1lc0luRmlmbyA8PSBtX2ZpZm9MZW5ndGgpOworICAgICAgICBt
X3dyaXRlSW5kZXggPSB1cGRhdGVJbmRleChtX3dyaXRlSW5kZXgsIG1fcHJvdmlkZXJTaXplKTsK
KyAgICAgICAgbnVtYmVyT2ZGcmFtZXMgLT0gbV9wcm92aWRlclNpemU7CiAgICAgfQogfQogCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hy
b21pdW0uaCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJv
bWl1bS5oCmluZGV4IDEzYTNmNTJmZDgzZjdkNzJiYzBmMGE0YmNmZmQzYjAzYTBkYTE3YWQuLjI4
ZDhmYzgwYzU0YmI4YmZkNDQ5ZWU2ZGIyZDY0ZjRiYmY1MDY5OGIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oCisrKyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oCkBAIC0z
MSw2ICszMSw3IEBACiAKICNpbmNsdWRlICJBdWRpb0J1cy5oIgogI2luY2x1ZGUgIkF1ZGlvRGVz
dGluYXRpb24uaCIKKyNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3ZpZGVyLmgiCiAjaW5jbHVkZSAi
V2ViQXVkaW9EZXZpY2UuaCIKICNpbmNsdWRlICJXZWJWZWN0b3IuaCIKIApAQCAtNTUsMTMgKzU2
LDY3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKGNvbnN0IFdlYktpdDo6V2Vi
VmVjdG9yPGZsb2F0Kj4mIGF1ZGlvRGF0YSwgc2l6ZV90IG51bWJlck9mRnJhbWVzKTsKIAogcHJp
dmF0ZToKLSAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVyOworICAgIC8vIEEgRklG
TyAoRmlyc3QgSW4gRmlyc3QgT3V0KSBidWZmZXIgdG8gaGFuZGxlIG1pc21hdGNoZXMgaW4gdGhl
CisgICAgLy8gYXVkaW8gYnVmZmVyIHNpemUgYW5kIHRoZSBXZWIgQXVkaW8gcmVuZGVyIHNpemUu
CisgICAgY2xhc3MgRklGTyB7CisgICAgcHVibGljOgorICAgICAgICAvLyBDcmVhdGUgYSBGSUZP
IHRoYXQgZ2V0cyBkYXRhIGZyb20gfHByb3ZpZGVyfC4gVGhlIEZJRk8KKyAgICAgICAgLy8gd2ls
bCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB8bGVuZ3RofCBmcmFtZXMgb2YgZGF0YSBvZgorICAg
ICAgICAvLyB8bnVtYmVyT2ZDaGFubmVsc3wgY2hhbm5lbHMuIFRoZSBBdWRpb1NvdXJjZVByb3Zp
ZGVyIG11c3QKKyAgICAgICAgLy8gcHJvdmlkZSBkYXRhIGluIGZyYW1lcyBvZiBzaXplIHxwcm92
aWRlclNpemV8LgorICAgICAgICBGSUZPKEF1ZGlvU291cmNlUHJvdmlkZXImIHByb3ZpZGVyLCB1
bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgZmlmb0xlbmd0aCwgc2l6ZV90IHByb3Zp
ZGVyU2l6ZSk7CisKKyAgICAgICAgLy8gR2V0IGRhdGEgZnJvbSB8ZnJhbWVzdG9Db25zdW1lfCBm
cmFtZXMgZnJvbSB0aGUgRklGTyBhbmQKKyAgICAgICAgLy8gcGxhY2UgaXQgaW4gdGhlIGRlc3Rp
bmF0aW9uLiBJZiB0aGUgRklGTyBkb2VzIG5vdCBoYXZlCisgICAgICAgIC8vIGVub3VnaCBkYXRh
LCB3ZSBhc2sgdGhlIHxwcm92aWRlcnwgdG8gZ2V0IG1vcmUgZGF0YSB0bworICAgICAgICAvLyBm
dWxmaWxsIHRoZSByZXF1ZXN0LgorICAgICAgICB2b2lkIGNvbnN1bWUoQXVkaW9CdXMqIGRlc3Rp
bmF0aW9uLCBpbnQgZnJhbWVzVG9Db25zdW1lKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8v
IFVwZGF0ZSB0aGUgRklGTyBpbmRleCBieSB0aGUgc3RlcCwgd2l0aCBhcHByb3ByaWF0ZQorICAg
ICAgICAvLyB3cmFwcGluZyBhcm91bmQgdGhlIGVuZHBvaW50LgorICAgICAgICBpbnQgdXBkYXRl
SW5kZXgoaW50IGluZGV4LCBpbnQgc3RlcCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJu
IChpbmRleCArIHN0ZXApICUgbV9maWZvTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgdm9p
ZCBmaW5kV3JhcExlbmd0aHMoc2l6ZV90IGluZGV4LCBzaXplX3QgcHJvdmlkZXJTaXplLCBzaXpl
X3QmIHBhcnQxTGVuZ3RoLCBzaXplX3QmIHBhcnQyTGVuZ3RoKTsKKyAgICAgICAgCisgICAgICAg
IC8vIEZpbGwgdGhlIEZJRk8gYnVmZmVyIHdpdGggYXQgbGVhc3QgfG51bWJlck9mRnJhbWVzfCBt
b3JlIGRhdGEuCisgICAgICAgIHZvaWQgZmlsbEJ1ZmZlcihpbnQgbnVtYmVyT2ZGcmFtZXMpOwor
CisgICAgICAgIC8vIFRoZSBwcm92aWRlciBvZiB0aGUgZGF0YSBpbiBvdXIgRklGTy4KKyAgICAg
ICAgQXVkaW9Tb3VyY2VQcm92aWRlciYgbV9wcm92aWRlcjsKKworICAgICAgICAvLyBUaGUgRklG
TyBpdHNlbGYuIEluIHJlYWxpdHksIHRoZSBGSUZPIGlzIGEgY2lyY3VsYXIgYnVmZmVyLgorICAg
ICAgICBBdWRpb0J1cyBtX2ZpZm9BdWRpb0J1czsKKworICAgICAgICAvLyBUaGUgdG90YWwgYXZh
aWxhYmxlIHNwYWNlIGluIHRoZSBGSUZPLgorICAgICAgICBzaXplX3QgbV9maWZvTGVuZ3RoOwor
CisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYWN0dWFsIGVsZW1lbnRzIGluIHRoZSBGSUZPCisg
ICAgICAgIGludCBtX2ZyYW1lc0luRmlmbzsKKworICAgICAgICAvLyBXaGVyZSB0byBzdGFydCBy
ZWFkaW5nIGZyb20gdGhlIEZJRk8uCisgICAgICAgIGludCBtX3JlYWRJbmRleDsKKworICAgICAg
ICAvLyBXaGVyZSB0byBzdGFydCB3cml0aW5nIHRvIHRoZSBGSUZPLgorICAgICAgICBpbnQgbV93
cml0ZUluZGV4OworCisgICAgICAgIC8vIE51bWJlciBvZiBmcmFtZXMgb2YgZGF0YSB0aGF0IHRo
ZSBwcm92aWRlciB3aWxsIHByb2R1Y2UgcGVyIGNhbGwuCisgICAgICAgIHVuc2lnbmVkIGludCBt
X3Byb3ZpZGVyU2l6ZTsKKworICAgICAgICAvLyBUZW1wb3Jhcnkgd29ya3NwYWNlIHRvIGhvbGQg
dGhlIGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIuCisgICAgICAgIEF1ZGlvQnVzIG1fdGVtcEJ1czsK
KyAgICB9OworCitBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVyOwogICAgIEF1ZGlvQnVz
IG1fcmVuZGVyQnVzOwogICAgIGZsb2F0IG1fc2FtcGxlUmF0ZTsKICAgICBib29sIG1faXNQbGF5
aW5nOwogICAgIE93blB0cjxXZWJLaXQ6OldlYkF1ZGlvRGV2aWNlPiBtX2F1ZGlvRGV2aWNlOwog
ICAgIHNpemVfdCBtX2NhbGxiYWNrQnVmZmVyU2l6ZTsKLSAgICB1bnNpZ25lZCBtX3JlbmRlckNv
dW50UGVyQ2FsbGJhY2s7CisgICAgT3duUHRyPEZJRk8+IG1fZmlmbzsKIH07CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114795</attachid>
            <date>2011-11-11 16:06:54 -0800</date>
            <delta_ts>2011-11-14 10:28:19 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111111160653.patch</filename>
            <type>text/plain</type>
            <size>12569</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTk5NTYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXgg
NzM0MjNhNTc5ZjEwNmUxZjI4MTk4NjZjYWI0NTlhNjk4YTVlMWM5Zi4uNzIwY2NjM2I3YTg2OWQ1
MWViOTU0ZmYxN2IzZTY0YjUyY2M0MGUzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAg
LTEsMyArMSwyOCBAQAorMjAxMS0xMS0xMSAgUmF5bW9uZCBUb3kgIDxydG95QGdvb2dsZS5jb20+
CisKKyAgICAgICAgQWRkIGJ1ZmZlcmluZyB0byBoYW5kbGUgbWlzbWF0Y2ggYmV0d2VlbiBoYXJk
d2FyZSBidWZmZXIgc2l6ZSBhbmQgd2ViYXVkaW8gcmVuZGVyIHNpemUKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKToKKyAgICAgICAgQ3JlYXRlIHRoZSBGSUZPIGZvciBi
dWZmZXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJl
bmRlcik6ICBHZXQgcmlkIG9mCisgICAgICAgIG1fcmVuZGVyQ291bnRQZXJDYWxsYmFjayBhbmQg
bGV0IHRoZSBGSUZPIGNvbnN1bWUgZnVuY3Rpb24gcHJvZHVjZQorICAgICAgICB0aGUgYXBwcm9w
cmlhdGUgbnVibWVyIG9mIGNhbGxzIHRvIHRoZSB3ZWJhdWRpbyBwcm9kdWNlci4gIEFsc28KKyAg
ICAgICAgcmVtb3ZlIHRoZSByb3VuZGluZyBvZiB0aGUgY2FsbGJhY2sgc2l6ZSBzbyB3ZSB1c2Ug
d2hhdGV2ZXIgdGhlCisgICAgICAgIGhhcmR3YXJlIHJldHVybnMuICBSZW1vdmVkIG1heGltdW1D
YWxsYmFja0J1ZmZlclNpemUgYW5kIHVzZQorICAgICAgICBmaWZvU2l6ZSB0byBzZXQgdGhlIEZJ
Rk8gc2l6ZS4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklG
Tzo6RklGTyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJ
Rk86OmNvbnN1bWUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVt
OjpGSUZPOjpmaW5kV3JhcExlbmd0aHMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5h
dGlvbkNocm9taXVtOjpGSUZPOjpmaWxsQnVmZmVyKToKKyAgICAgICAgSW1wbGVtZW50YXRpb24g
b2YgbmV3IEZJRk8gY2xhc3MuCisgICAgICAgICogc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjp1
cGRhdGVJbmRleCk6CisgICAgICAgIERlZmluZSBuZXcgRklGTyBjbGFzcy4KKwogMjAxMS0xMS0x
MSAgSmFtZXMgUm9iaW5zb24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJv
bWl1bV0gRml4IENDTGF5ZXJUcmVlSG9zdCBsZWFrIGluIHdlYmtpdF91bml0X3Rlc3RzCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21p
dW0uY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9t
aXVtLmNwcAppbmRleCBhYTljNmZhNmQ3M2E0NWQzNmIwNGYwMjAwYzk2MGE4YTllZjMzZGE2Li40
ZTkxMmRkNWQyNTJkZjFjOGU1ODNjNjkyMDcwM2FmNzhkZWMxZjdkIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAK
QEAgLTMyLDcgKzMyLDYgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5o
IgogCi0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIldlYktpdC5o
IgogI2luY2x1ZGUgIldlYktpdFBsYXRmb3JtU3VwcG9ydC5oIgogCkBAIC00Myw4ICs0Miw4IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIC8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRoZSB3ZWIgYXVk
aW8gZW5naW5lIHdpbGwgcmVuZGVyLgogY29uc3QgdW5zaWduZWQgcmVuZGVyQnVmZmVyU2l6ZSA9
IDEyODsKIAotLy8gTWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplCi1jb25zdCBzaXplX3QgbWF4
aW11bUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OworLy8gU2l6ZSBvZiB0aGUgRklGTworY29u
c3Qgc2l6ZV90IGZpZm9TaXplID0gODE5MjsKIAogLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZvciBt
dWx0aS1jaGFubmVsLgogY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IDI7CkBAIC02
MSwyMyArNjAsMjMgQEAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0aW9u
Q2hyb21pdW0oQXVkaW9Tb3VyY2VQcm92aWRlciYgcHJvdmlkZXIKICAgICAsIG1fc2FtcGxlUmF0
ZShzYW1wbGVSYXRlKQogICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCiB7Ci0gICAgLy8gR2V0IHRo
ZSBtaW5pbXVtIHVzYWJsZSBidWZmZXIgc2l6ZS4gV2UnbGwgcm91bmQgdGhpcyB2YWx1ZSB1cAot
ICAgIC8vIHRvIGEgbXVsdGlwbGUgb2Ygb3VyIHJlbmRlciBzaXplLgotICAgIHNpemVfdCBjYWxs
YmFja1NpemUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNp
emUoKTsKKyAgICAvLyBVc2UgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUgcmVjb21tZW5kZWQgYnkg
dGhlIGF1ZGlvIGJhY2tlbmQuCisgICAgbV9jYWxsYmFja0J1ZmZlclNpemUgPSB3ZWJLaXRQbGF0
Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKIAotICAgIC8vIEZpZ3Vy
ZSBvdXQgaG93IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ssIHJvdW5kaW5nIHVwIGlm
IG5lZWRlZC4KLSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAoY2FsbGJhY2tTaXplICsg
cmVuZGVyQnVmZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIG1fY2FsbGJh
Y2tCdWZmZXJTaXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICogcmVuZGVyQnVmZmVyU2l6
ZTsKLQotICAgIGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZmZXJTaXplID49IHJlbmRl
ckJ1ZmZlclNpemUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNpemUgPD0gbWF4aW11bUNh
bGxiYWNrQnVmZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7Ci0gICAgaWYgKCFpc1Np
emVHb29kKQotICAgICAgcmV0dXJuOworICAgIC8vIFF1aWNrIGV4aXQgaWYgdGhlIHJlcXVlc3Rl
ZCBzaXplIGlzIHRvbyBsYXJnZS4KKyAgICBBU1NFUlQobV9jYWxsYmFja0J1ZmZlclNpemUgKyBy
ZW5kZXJCdWZmZXJTaXplIDw9IGZpZm9TaXplKTsKKyAgICBpZiAobV9jYWxsYmFja0J1ZmZlclNp
emUgKyByZW5kZXJCdWZmZXJTaXplID4gZmlmb1NpemUpCisgICAgICAgIHJldHVybjsKICAgICAK
ICAgICBtX2F1ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0UGxhdGZvcm1TdXBwb3J0KCktPmNy
ZWF0ZUF1ZGlvRGV2aWNlKG1fY2FsbGJhY2tCdWZmZXJTaXplLCBudW1iZXJPZkNoYW5uZWxzLCBz
YW1wbGVSYXRlLCB0aGlzKSk7CiAgICAgQVNTRVJUKG1fYXVkaW9EZXZpY2UpOworCisgICAgLy8g
Q3JlYXRlIGEgRklGTyB0byBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBjYWxsYmFjayBz
aXplCisgICAgLy8gbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhlIHJlbmRlciBzaXplLiBJZiB0
aGUgRklGTyBhbHJlYWR5CisgICAgLy8gY29udGFpbnMgZW5vdWdoIGRhdGEsIHRoZSBkYXRhIHdp
bGwgYmUgcHJvdmlkZWQgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRklGTyB3aWxs
IGNhbGwgdGhlIHByb3ZpZGVyIGVub3VnaCB0aW1lcyB0bworICAgIC8vIHNhdGlzZnkgdGhlIHJl
cXVlc3QgZm9yIGRhdGEuCisgICAgbV9maWZvID0gYWRvcHRQdHIobmV3IEZJRk8ocHJvdmlkZXIs
IG51bWJlck9mQ2hhbm5lbHMsIGZpZm9TaXplLCByZW5kZXJCdWZmZXJTaXplKSk7CiB9CiAKIEF1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSgpCkBAIC0x
MjEsMTEgKzEyMCwxMjIgQEAgdm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRlcihj
b25zdCBXZWJWZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAotICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZmZXIgaW50byBzbWFs
bGVyIGNodW5rcyB3aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBvdGhlci4KLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrOyArK2kpIHsK
LSAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgwLCBhdWRpb0RhdGFbMF0gKyBp
ICogcmVuZGVyQnVmZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1fcmVuZGVy
QnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVkaW9EYXRhWzFdICsgaSAqIHJlbmRlckJ1ZmZlclNp
emUsIHJlbmRlckJ1ZmZlclNpemUpOwotICAgICAgICBtX3Byb3ZpZGVyLnByb3ZpZGVJbnB1dCgm
bV9yZW5kZXJCdXMsIHJlbmRlckJ1ZmZlclNpemUpOworICAgIG1fcmVuZGVyQnVzLnNldENoYW5u
ZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7CisgICAgbV9yZW5kZXJC
dXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9mRnJhbWVzKTsKKyAg
ICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1lcyk7Cit9CisKK0F1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6RklGTyhBdWRpb1NvdXJjZVByb3ZpZGVyJiBw
cm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZpZm9MZW5ndGgsIHNp
emVfdCBwcm92aWRlclNpemUpCisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICwgbV9m
aWZvQXVkaW9CdXMobnVtYmVyT2ZDaGFubmVscywgZmlmb0xlbmd0aCkKKyAgICAsIG1fZmlmb0xl
bmd0aChmaWZvTGVuZ3RoKQorICAgICwgbV9mcmFtZXNJbkZpZm8oMCkKKyAgICAsIG1fcmVhZElu
ZGV4KDApCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAsIG1fcHJvdmlkZXJTaXplKHByb3Zp
ZGVyU2l6ZSkKKyAgICAsIG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCBwcm92aWRlclNpemUp
Cit7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpjb25zdW1lKEF1
ZGlvQnVzKiBkZXN0aW5hdGlvbiwgaW50IGZyYW1lc1RvQ29uc3VtZSkKK3sKKyAgICBib29sIGlz
R29vZCA9IGRlc3RpbmF0aW9uICYmIChmcmFtZXNUb0NvbnN1bWUgPD0gc3RhdGljX2Nhc3Q8aW50
PihtX2ZpZm9MZW5ndGgpKTsKKyAgICBBU1NFUlQoaXNHb29kKTsKKyAgICBpZiAoIWlzR29vZCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZyYW1lc1RvQ29uc3VtZSA+IG1fZnJhbWVzSW5G
aWZvKSB7CisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgaW4gdGhlIEZJRk8g
dG8gZnVsZmlsbCB0aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gQXNrIGZvciBtb3JlIGRhdGEuCisg
ICAgICAgIGZpbGxCdWZmZXIoZnJhbWVzVG9Db25zdW1lIC0gbV9mcmFtZXNJbkZpZm8pOworICAg
IH0KKworICAgIC8vIFdlIGhhdmUgZW5vdWdoIGRhdGEgbm93LiBDb3B5IHRoZSByZXF1ZXN0ZWQg
bnVtYmVyIG9mIHNhbXBsZXMKKyAgICAvLyB0byB0aGUgZGVzdGluYXRpb24uCisKKyAgICBzaXpl
X3QgcGFydDFMZW5ndGg7CisgICAgc2l6ZV90IHBhcnQyTGVuZ3RoOworICAgIGZpbmRXcmFwTGVu
Z3RocyhtX3JlYWRJbmRleCwgZnJhbWVzVG9Db25zdW1lLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5n
dGgpOworCisgICAgc2l6ZV90IG51bWJlck9mQ2hhbm5lbHMgPSBtX2ZpZm9BdWRpb0J1cy5udW1i
ZXJPZkNoYW5uZWxzKCk7CisKKyAgICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFu
bmVsSW5kZXggPCBudW1iZXJPZkNoYW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICBm
bG9hdCogZGVzdGluYXRpb25EYXRhID0gZGVzdGluYXRpb24tPmNoYW5uZWwoY2hhbm5lbEluZGV4
KS0+ZGF0YSgpOworICAgICAgICBmbG9hdCogc291cmNlRGF0YSA9IG1fZmlmb0F1ZGlvQnVzLmNo
YW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOworCisgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9
IChzdGF0aWNfY2FzdDxpbnQ+KHBhcnQxTGVuZ3RoKSA8PSBmcmFtZXNUb0NvbnN1bWUKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PGludD4ocGFydDJMZW5ndGgpIDw9
IGZyYW1lc1RvQ29uc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGljX2Nh
c3Q8aW50PihwYXJ0MUxlbmd0aCArIHBhcnQyTGVuZ3RoKSA8PSBmcmFtZXNUb0NvbnN1bWUpOwor
ICAgICAgICBBU1NFUlQoaXNDb3B5R29vZCk7CisgICAgICAgIGlmICghaXNDb3B5R29vZCkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkRh
dGEsIHNvdXJjZURhdGEgKyBtX3JlYWRJbmRleCwgcGFydDFMZW5ndGggKiBzaXplb2YoKnNvdXJj
ZURhdGEpKTsKKyAgICAgICAgLy8gSGFuZGxlIHdyYXAgYXJvdW5kIG9mIHRoZSBGSUZPLCBpZiBu
ZWVkZWQuCisgICAgICAgIGlmIChwYXJ0Mkxlbmd0aCA+IDApCisgICAgICAgICAgICBtZW1jcHko
ZGVzdGluYXRpb25EYXRhICsgcGFydDFMZW5ndGgsIHNvdXJjZURhdGEsIHBhcnQyTGVuZ3RoICog
c2l6ZW9mKCpzb3VyY2VEYXRhKSk7CisgICAgfQorICAgIG1fcmVhZEluZGV4ID0gdXBkYXRlSW5k
ZXgobV9yZWFkSW5kZXgsIGZyYW1lc1RvQ29uc3VtZSk7CisgICAgbV9mcmFtZXNJbkZpZm8gLT0g
ZnJhbWVzVG9Db25zdW1lOworICAgIEFTU0VSVChtX2ZyYW1lc0luRmlmbyA+PSAwKTsKK30KKwor
dm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJRk86OmZpbmRXcmFwTGVuZ3RocyhzaXpl
X3QgaW5kZXgsIHNpemVfdCBzaXplLCBzaXplX3QmIHBhcnQxTGVuZ3RoLCBzaXplX3QmIHBhcnQy
TGVuZ3RoKQoreworICAgIEFTU0VSVChpbmRleCA8IG1fZmlmb0xlbmd0aCAmJiBzaXplIDw9IG1f
Zmlmb0xlbmd0aCk7CisgICAgaWYgKGluZGV4IDwgbV9maWZvTGVuZ3RoICYmIHNpemUgPD0gbV9m
aWZvTGVuZ3RoKSB7CisgICAgICAgIGlmIChpbmRleCArIHNpemUgPiBtX2ZpZm9MZW5ndGgpIHsK
KyAgICAgICAgICAgIC8vIE5lZWQgdG8gd3JhcC4gRmlndXJlIG91dCB0aGUgbGVuZ3RoIG9mIGVh
Y2ggcGllY2UuCisgICAgICAgICAgICBwYXJ0MUxlbmd0aCA9IG1fZmlmb0xlbmd0aCAtIGluZGV4
OworICAgICAgICAgICAgcGFydDJMZW5ndGggPSBzaXplIC0gcGFydDFMZW5ndGg7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyB3cmFwIG5lZWRlZC4KKyAgICAgICAgICAgIHBh
cnQxTGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgICAgIHBhcnQyTGVuZ3RoID0gMDsKKyAgICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludmFsaWQgdmFsdWVzIGZvciBpbmRleCBvciBz
aXplLiBTZXQgdGhlIHBhcnQgbGVuZ3RocyB0bworICAgICAgICAvLyB6ZXJvIHNvIG5vdGhpbmcg
aXMgY29waWVkLgorICAgICAgICBwYXJ0MUxlbmd0aCA9IDA7CisgICAgICAgIHBhcnQyTGVuZ3Ro
ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpm
aWxsQnVmZmVyKGludCBudW1iZXJPZkZyYW1lcykKK3sKKyAgICAvLyBLZWVwIGFza2luZyB0aGUg
cHJvdmlkZXIgdG8gZ2l2ZSB1cyBkYXRhIHVudGlsIHdlIGhhdmUgcmVjZWl2ZWQKKyAgICAvLyBh
dCBsZWFzdCB8bnVtYmVyT2ZGcmFtZXN8IG9mIGRhdGEuIFN0dWZmIHRoZSBkYXRhIGludG8gdGhl
CisgICAgLy8gRklGTy4KKyAgICB3aGlsZSAobnVtYmVyT2ZGcmFtZXMgPiAwKSB7CisgICAgICAg
IG1fcHJvdmlkZXIucHJvdmlkZUlucHV0KCZtX3RlbXBCdXMsIG1fcHJvdmlkZXJTaXplKTsKKwor
ICAgICAgICBzaXplX3QgcGFydDFMZW5ndGg7CisgICAgICAgIHNpemVfdCBwYXJ0Mkxlbmd0aDsK
KyAgICAgICAgZmluZFdyYXBMZW5ndGhzKG1fd3JpdGVJbmRleCwgbV9wcm92aWRlclNpemUsIHBh
cnQxTGVuZ3RoLCBwYXJ0Mkxlbmd0aCk7CisKKyAgICAgICAgc2l6ZV90IG51bWJlck9mQ2hhbm5l
bHMgPSBtX2ZpZm9BdWRpb0J1cy5udW1iZXJPZkNoYW5uZWxzKCk7CisgICAgICAgIAorICAgICAg
ICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBudW1iZXJPZkNo
YW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9u
ID0gbV9maWZvQXVkaW9CdXMuY2hhbm5lbChjaGFubmVsSW5kZXgpLT5kYXRhKCk7CisgICAgICAg
ICAgICBmbG9hdCogc291cmNlID0gbV90ZW1wQnVzLmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0
YSgpOworCisgICAgICAgICAgICBib29sIGlzQ29weUdvb2QgPSAocGFydDFMZW5ndGggPD0gbV9w
cm92aWRlclNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJ0Mkxlbmd0
aCA8PSBtX3Byb3ZpZGVyU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBh
cnQxTGVuZ3RoICsgcGFydDJMZW5ndGggPD0gbV9wcm92aWRlclNpemUpOworICAgICAgICAgICAg
QVNTRVJUKGlzQ29weUdvb2QpOworICAgICAgICAgICAgaWYgKCFpc0NvcHlHb29kKQorICAgICAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgbV93
cml0ZUluZGV4LCBzb3VyY2UsIHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5hdGlvbikpOwor
ICAgICAgICAgICAgLy8gSGFuZGxlIHdyYXAgYXJvdW5kIG9mIHRoZSBGSUZPLCBpZiBuZWVkZWQu
CisgICAgICAgICAgICBpZiAocGFydDJMZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIG1lbWNw
eShkZXN0aW5hdGlvbiwgc291cmNlICsgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoICogc2l6ZW9m
KCpkZXN0aW5hdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgbV9mcmFtZXNJbkZpZm8gKz0g
bV9wcm92aWRlclNpemU7CisgICAgICAgIEFTU0VSVChtX2ZyYW1lc0luRmlmbyA8PSBtX2ZpZm9M
ZW5ndGgpOworICAgICAgICBtX3dyaXRlSW5kZXggPSB1cGRhdGVJbmRleChtX3dyaXRlSW5kZXgs
IG1fcHJvdmlkZXJTaXplKTsKKyAgICAgICAgbnVtYmVyT2ZGcmFtZXMgLT0gbV9wcm92aWRlclNp
emU7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9B
dWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uaCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oCmluZGV4IDEzYTNmNTJmZDgzZjdkNzJiYzBmMGE0YmNm
ZmQzYjAzYTBkYTE3YWQuLmQxNDFlYmU5ZmEzZjU2MDBhMTE2ZWRhNjBkMTcwZTZhYWYxN2I1NWQg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25D
aHJvbWl1bS5oCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRp
b25DaHJvbWl1bS5oCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlICJBdWRpb0J1cy5oIgog
I2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb24uaCIKKyNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3Zp
ZGVyLmgiCiAjaW5jbHVkZSAiV2ViQXVkaW9EZXZpY2UuaCIKICNpbmNsdWRlICJXZWJWZWN0b3Iu
aCIKIApAQCAtNTUsMTMgKzU2LDY0IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVy
KGNvbnN0IFdlYktpdDo6V2ViVmVjdG9yPGZsb2F0Kj4mIGF1ZGlvRGF0YSwgc2l6ZV90IG51bWJl
ck9mRnJhbWVzKTsKIAogcHJpdmF0ZToKLSAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3Zp
ZGVyOworICAgIC8vIEEgRklGTyAoRmlyc3QgSW4gRmlyc3QgT3V0KSBidWZmZXIgdG8gaGFuZGxl
IG1pc21hdGNoZXMgaW4gdGhlCisgICAgLy8gYXVkaW8gYmFja2VuZCBoYXJkd2FyZSBidWZmZXIg
c2l6ZSBhbmQgdGhlIFdlYiBBdWRpbyByZW5kZXIgc2l6ZS4KKyAgICBjbGFzcyBGSUZPIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIC8vIENyZWF0ZSBhIEZJRk8gdGhhdCBnZXRzIGRhdGEgZnJvbSB8
cHJvdmlkZXJ8LiBUaGUgRklGTyB3aWxsCisgICAgICAgIC8vIGJlIGxhcmdlIGVub3VnaCB0byBo
b2xkIHxmaWZvTGVuZ3RofCBmcmFtZXMgb2YgZGF0YSBvZgorICAgICAgICAvLyB8bnVtYmVyT2ZD
aGFubmVsc3wgY2hhbm5lbHMuIFRoZSBBdWRpb1NvdXJjZVByb3ZpZGVyIHdpbGwKKyAgICAgICAg
Ly8gYmUgYXNrZWQgdG8gcHJvZHVjZSB8cHJvdmlkZXJTaXplfCBmcmFtZXMgd2hlbiB0aGUgRklG
TworICAgICAgICAvLyBuZWVkcyBtb3JlIGRhdGEuCisgICAgICAgIEZJRk8oQXVkaW9Tb3VyY2VQ
cm92aWRlciYgcHJvdmlkZXIsIHVuc2lnbmVkIG51bWJlck9mQ2hhbm5lbHMsIHNpemVfdCBmaWZv
TGVuZ3RoLCBzaXplX3QgcHJvdmlkZXJTaXplKTsKKworICAgICAgICAvLyBSZWFkIHxmcmFtZXNU
b0NvbnN1bWV8IGZyYW1lcyBmcm9tIHRoZSBGSUZPIGludG8gdGhlCisgICAgICAgIC8vIGRlc3Rp
bmF0aW9uLiBJZiB0aGUgRklGTyBkb2VzIG5vdCBoYXZlIGVub3VnaCBkYXRhLCB3ZSBhc2sKKyAg
ICAgICAgLy8gdGhlIHxwcm92aWRlcnwgdG8gZ2V0IG1vcmUgZGF0YSB0byBmdWxmaWxsIHRoZSBy
ZXF1ZXN0LgorICAgICAgICB2b2lkIGNvbnN1bWUoQXVkaW9CdXMqIGRlc3RpbmF0aW9uLCBpbnQg
ZnJhbWVzVG9Db25zdW1lKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFVwZGF0ZSB0aGUg
RklGTyBpbmRleCBieSB0aGUgc3RlcCwgd2l0aCBhcHByb3ByaWF0ZQorICAgICAgICAvLyB3cmFw
cGluZyBhcm91bmQgdGhlIGVuZHBvaW50LgorICAgICAgICBpbnQgdXBkYXRlSW5kZXgoaW50IGlu
ZGV4LCBpbnQgc3RlcCkgeyByZXR1cm4gKGluZGV4ICsgc3RlcCkgJSBtX2ZpZm9MZW5ndGg7IH0K
KworICAgICAgICB2b2lkIGZpbmRXcmFwTGVuZ3RocyhzaXplX3QgaW5kZXgsIHNpemVfdCBwcm92
aWRlclNpemUsIHNpemVfdCYgcGFydDFMZW5ndGgsIHNpemVfdCYgcGFydDJMZW5ndGgpOworICAg
ICAgICAKKyAgICAgICAgLy8gRmlsbCB0aGUgRklGTyBidWZmZXIgd2l0aCBhdCBsZWFzdCB8bnVt
YmVyT2ZGcmFtZXN8IG1vcmUgZGF0YS4KKyAgICAgICAgdm9pZCBmaWxsQnVmZmVyKGludCBudW1i
ZXJPZkZyYW1lcyk7CisKKyAgICAgICAgLy8gVGhlIHByb3ZpZGVyIG9mIHRoZSBkYXRhIGluIG91
ciBGSUZPLgorICAgICAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVyOworCisgICAg
ICAgIC8vIFRoZSBGSUZPIGl0c2VsZi4gSW4gcmVhbGl0eSwgdGhlIEZJRk8gaXMgYSBjaXJjdWxh
ciBidWZmZXIuCisgICAgICAgIEF1ZGlvQnVzIG1fZmlmb0F1ZGlvQnVzOworCisgICAgICAgIC8v
IFRoZSB0b3RhbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEZJRk8uCisgICAgICAgIHNpemVfdCBt
X2ZpZm9MZW5ndGg7CisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhY3R1YWwgZWxlbWVudHMg
aW4gdGhlIEZJRk8KKyAgICAgICAgaW50IG1fZnJhbWVzSW5GaWZvOworCisgICAgICAgIC8vIFdo
ZXJlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgRklGTy4KKyAgICAgICAgaW50IG1fcmVhZElu
ZGV4OworCisgICAgICAgIC8vIFdoZXJlIHRvIHN0YXJ0IHdyaXRpbmcgdG8gdGhlIEZJRk8uCisg
ICAgICAgIGludCBtX3dyaXRlSW5kZXg7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBv
ZiBkYXRhIHRoYXQgdGhlIHByb3ZpZGVyIHdpbGwgcHJvZHVjZSBwZXIgY2FsbC4KKyAgICAgICAg
dW5zaWduZWQgaW50IG1fcHJvdmlkZXJTaXplOworCisgICAgICAgIC8vIFRlbXBvcmFyeSB3b3Jr
c3BhY2UgdG8gaG9sZCB0aGUgZGF0YSBmcm9tIHRoZSBwcm92aWRlci4KKyAgICAgICAgQXVkaW9C
dXMgbV90ZW1wQnVzOworICAgIH07CisKK0F1ZGlvU291cmNlUHJvdmlkZXImIG1fcHJvdmlkZXI7
CiAgICAgQXVkaW9CdXMgbV9yZW5kZXJCdXM7CiAgICAgZmxvYXQgbV9zYW1wbGVSYXRlOwogICAg
IGJvb2wgbV9pc1BsYXlpbmc7CiAgICAgT3duUHRyPFdlYktpdDo6V2ViQXVkaW9EZXZpY2U+IG1f
YXVkaW9EZXZpY2U7CiAgICAgc2l6ZV90IG1fY2FsbGJhY2tCdWZmZXJTaXplOwotICAgIHVuc2ln
bmVkIG1fcmVuZGVyQ291bnRQZXJDYWxsYmFjazsKKyAgICBPd25QdHI8RklGTz4gbV9maWZvOwog
fTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114977</attachid>
            <date>2011-11-14 10:27:04 -0800</date>
            <delta_ts>2011-11-14 13:09:19 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111114102703.patch</filename>
            <type>text/plain</type>
            <size>12803</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTk5NTYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXgg
NzM0MjNhNTc5ZjEwNmUxZjI4MTk4NjZjYWI0NTlhNjk4YTVlMWM5Zi4uNzIwY2NjM2I3YTg2OWQ1
MWViOTU0ZmYxN2IzZTY0YjUyY2M0MGUzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAg
LTEsMyArMSwyOCBAQAorMjAxMS0xMS0xMSAgUmF5bW9uZCBUb3kgIDxydG95QGdvb2dsZS5jb20+
CisKKyAgICAgICAgQWRkIGJ1ZmZlcmluZyB0byBoYW5kbGUgbWlzbWF0Y2ggYmV0d2VlbiBoYXJk
d2FyZSBidWZmZXIgc2l6ZSBhbmQgd2ViYXVkaW8gcmVuZGVyIHNpemUKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKToKKyAgICAgICAgQ3JlYXRlIHRoZSBGSUZPIGZvciBi
dWZmZXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJl
bmRlcik6ICBHZXQgcmlkIG9mCisgICAgICAgIG1fcmVuZGVyQ291bnRQZXJDYWxsYmFjayBhbmQg
bGV0IHRoZSBGSUZPIGNvbnN1bWUgZnVuY3Rpb24gcHJvZHVjZQorICAgICAgICB0aGUgYXBwcm9w
cmlhdGUgbnVibWVyIG9mIGNhbGxzIHRvIHRoZSB3ZWJhdWRpbyBwcm9kdWNlci4gIEFsc28KKyAg
ICAgICAgcmVtb3ZlIHRoZSByb3VuZGluZyBvZiB0aGUgY2FsbGJhY2sgc2l6ZSBzbyB3ZSB1c2Ug
d2hhdGV2ZXIgdGhlCisgICAgICAgIGhhcmR3YXJlIHJldHVybnMuICBSZW1vdmVkIG1heGltdW1D
YWxsYmFja0J1ZmZlclNpemUgYW5kIHVzZQorICAgICAgICBmaWZvU2l6ZSB0byBzZXQgdGhlIEZJ
Rk8gc2l6ZS4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklG
Tzo6RklGTyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJ
Rk86OmNvbnN1bWUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVt
OjpGSUZPOjpmaW5kV3JhcExlbmd0aHMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5h
dGlvbkNocm9taXVtOjpGSUZPOjpmaWxsQnVmZmVyKToKKyAgICAgICAgSW1wbGVtZW50YXRpb24g
b2YgbmV3IEZJRk8gY2xhc3MuCisgICAgICAgICogc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjp1
cGRhdGVJbmRleCk6CisgICAgICAgIERlZmluZSBuZXcgRklGTyBjbGFzcy4KKwogMjAxMS0xMS0x
MSAgSmFtZXMgUm9iaW5zb24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJv
bWl1bV0gRml4IENDTGF5ZXJUcmVlSG9zdCBsZWFrIGluIHdlYmtpdF91bml0X3Rlc3RzCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21p
dW0uY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9t
aXVtLmNwcAppbmRleCBhYTljNmZhNmQ3M2E0NWQzNmIwNGYwMjAwYzk2MGE4YTllZjMzZGE2Li41
Y2ZiZWEwYmFmNDE2YTNkZjBkY2IyNDllNjI3MzIzNjIyYmM0YTEwIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAK
QEAgLTMyLDcgKzMyLDYgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5o
IgogCi0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIldlYktpdC5o
IgogI2luY2x1ZGUgIldlYktpdFBsYXRmb3JtU3VwcG9ydC5oIgogCkBAIC00Myw4ICs0Miw4IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIC8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRoZSB3ZWIgYXVk
aW8gZW5naW5lIHdpbGwgcmVuZGVyLgogY29uc3QgdW5zaWduZWQgcmVuZGVyQnVmZmVyU2l6ZSA9
IDEyODsKIAotLy8gTWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplCi1jb25zdCBzaXplX3QgbWF4
aW11bUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OworLy8gU2l6ZSBvZiB0aGUgRklGTworY29u
c3Qgc2l6ZV90IGZpZm9TaXplID0gODE5MjsKIAogLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZvciBt
dWx0aS1jaGFubmVsLgogY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IDI7CkBAIC02
MSwyMyArNjAsMjMgQEAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0aW9u
Q2hyb21pdW0oQXVkaW9Tb3VyY2VQcm92aWRlciYgcHJvdmlkZXIKICAgICAsIG1fc2FtcGxlUmF0
ZShzYW1wbGVSYXRlKQogICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCiB7Ci0gICAgLy8gR2V0IHRo
ZSBtaW5pbXVtIHVzYWJsZSBidWZmZXIgc2l6ZS4gV2UnbGwgcm91bmQgdGhpcyB2YWx1ZSB1cAot
ICAgIC8vIHRvIGEgbXVsdGlwbGUgb2Ygb3VyIHJlbmRlciBzaXplLgotICAgIHNpemVfdCBjYWxs
YmFja1NpemUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNp
emUoKTsKKyAgICAvLyBVc2UgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUgcmVjb21tZW5kZWQgYnkg
dGhlIGF1ZGlvIGJhY2tlbmQuCisgICAgbV9jYWxsYmFja0J1ZmZlclNpemUgPSB3ZWJLaXRQbGF0
Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKIAotICAgIC8vIEZpZ3Vy
ZSBvdXQgaG93IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ssIHJvdW5kaW5nIHVwIGlm
IG5lZWRlZC4KLSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAoY2FsbGJhY2tTaXplICsg
cmVuZGVyQnVmZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIG1fY2FsbGJh
Y2tCdWZmZXJTaXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICogcmVuZGVyQnVmZmVyU2l6
ZTsKLQotICAgIGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZmZXJTaXplID49IHJlbmRl
ckJ1ZmZlclNpemUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNpemUgPD0gbWF4aW11bUNh
bGxiYWNrQnVmZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7Ci0gICAgaWYgKCFpc1Np
emVHb29kKQotICAgICAgcmV0dXJuOworICAgIC8vIFF1aWNrIGV4aXQgaWYgdGhlIHJlcXVlc3Rl
ZCBzaXplIGlzIHRvbyBsYXJnZS4KKyAgICBBU1NFUlQobV9jYWxsYmFja0J1ZmZlclNpemUgKyBy
ZW5kZXJCdWZmZXJTaXplIDw9IGZpZm9TaXplKTsKKyAgICBpZiAobV9jYWxsYmFja0J1ZmZlclNp
emUgKyByZW5kZXJCdWZmZXJTaXplID4gZmlmb1NpemUpCisgICAgICAgIHJldHVybjsKICAgICAK
ICAgICBtX2F1ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0UGxhdGZvcm1TdXBwb3J0KCktPmNy
ZWF0ZUF1ZGlvRGV2aWNlKG1fY2FsbGJhY2tCdWZmZXJTaXplLCBudW1iZXJPZkNoYW5uZWxzLCBz
YW1wbGVSYXRlLCB0aGlzKSk7CiAgICAgQVNTRVJUKG1fYXVkaW9EZXZpY2UpOworCisgICAgLy8g
Q3JlYXRlIGEgRklGTyB0byBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBjYWxsYmFjayBz
aXplCisgICAgLy8gbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhlIHJlbmRlciBzaXplLiBJZiB0
aGUgRklGTyBhbHJlYWR5CisgICAgLy8gY29udGFpbnMgZW5vdWdoIGRhdGEsIHRoZSBkYXRhIHdp
bGwgYmUgcHJvdmlkZWQgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRklGTyB3aWxs
IGNhbGwgdGhlIHByb3ZpZGVyIGVub3VnaCB0aW1lcyB0bworICAgIC8vIHNhdGlzZnkgdGhlIHJl
cXVlc3QgZm9yIGRhdGEuCisgICAgbV9maWZvID0gYWRvcHRQdHIobmV3IEZJRk8ocHJvdmlkZXIs
IG51bWJlck9mQ2hhbm5lbHMsIGZpZm9TaXplLCByZW5kZXJCdWZmZXJTaXplKSk7CiB9CiAKIEF1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSgpCkBAIC0x
MjEsMTEgKzEyMCwxMjggQEAgdm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRlcihj
b25zdCBXZWJWZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAotICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZmZXIgaW50byBzbWFs
bGVyIGNodW5rcyB3aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBvdGhlci4KLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrOyArK2kpIHsK
LSAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgwLCBhdWRpb0RhdGFbMF0gKyBp
ICogcmVuZGVyQnVmZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1fcmVuZGVy
QnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVkaW9EYXRhWzFdICsgaSAqIHJlbmRlckJ1ZmZlclNp
emUsIHJlbmRlckJ1ZmZlclNpemUpOwotICAgICAgICBtX3Byb3ZpZGVyLnByb3ZpZGVJbnB1dCgm
bV9yZW5kZXJCdXMsIHJlbmRlckJ1ZmZlclNpemUpOworICAgIG1fcmVuZGVyQnVzLnNldENoYW5u
ZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7CisgICAgbV9yZW5kZXJC
dXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9mRnJhbWVzKTsKKyAg
ICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1lcyk7Cit9CisKK0F1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6RklGTyhBdWRpb1NvdXJjZVByb3ZpZGVyJiBw
cm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZpZm9MZW5ndGgsIHNp
emVfdCBwcm92aWRlclNpemUpCisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICwgbV9m
aWZvQXVkaW9CdXMobnVtYmVyT2ZDaGFubmVscywgZmlmb0xlbmd0aCkKKyAgICAsIG1fZmlmb0xl
bmd0aChmaWZvTGVuZ3RoKQorICAgICwgbV9mcmFtZXNJbkZpZm8oMCkKKyAgICAsIG1fcmVhZElu
ZGV4KDApCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAsIG1fcHJvdmlkZXJTaXplKHByb3Zp
ZGVyU2l6ZSkKKyAgICAsIG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCBwcm92aWRlclNpemUp
Cit7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpjb25zdW1lKEF1
ZGlvQnVzKiBkZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1RvQ29uc3VtZSkKK3sKKyAgICBib29s
IGlzR29vZCA9IGRlc3RpbmF0aW9uICYmIChmcmFtZXNUb0NvbnN1bWUgPD0gbV9maWZvTGVuZ3Ro
KTsKKyAgICBBU1NFUlQoaXNHb29kKTsKKyAgICBpZiAoIWlzR29vZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGZyYW1lc1RvQ29uc3VtZSA+IG1fZnJhbWVzSW5GaWZvKSB7CisgICAgICAg
IC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgaW4gdGhlIEZJRk8gdG8gZnVsZmlsbCB0aGUK
KyAgICAgICAgLy8gcmVxdWVzdC4gQXNrIGZvciBtb3JlIGRhdGEuCisgICAgICAgIGZpbGxCdWZm
ZXIoZnJhbWVzVG9Db25zdW1lIC0gbV9mcmFtZXNJbkZpZm8pOworICAgIH0KKworICAgIC8vIFdl
IGhhdmUgZW5vdWdoIGRhdGEgbm93LiBDb3B5IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHNhbXBs
ZXMKKyAgICAvLyB0byB0aGUgZGVzdGluYXRpb24uCisKKyAgICBzaXplX3QgcGFydDFMZW5ndGg7
CisgICAgc2l6ZV90IHBhcnQyTGVuZ3RoOworICAgIGZpbmRXcmFwTGVuZ3RocyhtX3JlYWRJbmRl
eCwgZnJhbWVzVG9Db25zdW1lLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGgpOworCisgICAgc2l6
ZV90IG51bWJlck9mQ2hhbm5lbHMgPSBtX2ZpZm9BdWRpb0J1cy5udW1iZXJPZkNoYW5uZWxzKCk7
CisKKyAgICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBudW1i
ZXJPZkNoYW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICBmbG9hdCogZGVzdGluYXRp
b25EYXRhID0gZGVzdGluYXRpb24tPmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOworICAg
ICAgICBmbG9hdCogc291cmNlRGF0YSA9IG1fZmlmb0F1ZGlvQnVzLmNoYW5uZWwoY2hhbm5lbElu
ZGV4KS0+ZGF0YSgpOworCisgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9IChwYXJ0MUxlbmd0aCA8
PSBmcmFtZXNUb0NvbnN1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhcnQyTGVu
Z3RoIDw9IGZyYW1lc1RvQ29uc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBh
cnQxTGVuZ3RoICsgcGFydDJMZW5ndGgpIDw9IGZyYW1lc1RvQ29uc3VtZQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJiYgKG1fcmVhZEluZGV4ID49IDApCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmJiAobV9yZWFkSW5kZXggPCBtX2ZpZm9MZW5ndGgpKTsKKyAgICAgICAgQVNTRVJU
KGlzQ29weUdvb2QpOworICAgICAgICBpZiAoIWlzQ29weUdvb2QpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25EYXRhLCBzb3VyY2VEYXRh
ICsgbV9yZWFkSW5kZXgsIHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpzb3VyY2VEYXRhKSk7CisgICAg
ICAgIC8vIEhhbmRsZSB3cmFwIGFyb3VuZCBvZiB0aGUgRklGTywgaWYgbmVlZGVkLgorICAgICAg
ICBpZiAocGFydDJMZW5ndGggPiAwKQorICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uRGF0
YSArIHBhcnQxTGVuZ3RoLCBzb3VyY2VEYXRhLCBwYXJ0Mkxlbmd0aCAqIHNpemVvZigqc291cmNl
RGF0YSkpOworICAgIH0KKyAgICBtX3JlYWRJbmRleCA9IHVwZGF0ZUluZGV4KG1fcmVhZEluZGV4
LCBmcmFtZXNUb0NvbnN1bWUpOworICAgIG1fZnJhbWVzSW5GaWZvIC09IGZyYW1lc1RvQ29uc3Vt
ZTsKKyAgICBBU1NFUlQobV9mcmFtZXNJbkZpZm8gPj0gMCk7Cit9CisKK3ZvaWQgQXVkaW9EZXN0
aW5hdGlvbkNocm9taXVtOjpGSUZPOjpmaW5kV3JhcExlbmd0aHMoc2l6ZV90IGluZGV4LCBzaXpl
X3Qgc2l6ZSwgc2l6ZV90JiBwYXJ0MUxlbmd0aCwgc2l6ZV90JiBwYXJ0Mkxlbmd0aCkKK3sKKyAg
ICBBU1NFUlQoaW5kZXggPCBtX2ZpZm9MZW5ndGggJiYgc2l6ZSA8PSBtX2ZpZm9MZW5ndGgpOwor
ICAgIGlmIChpbmRleCA8IG1fZmlmb0xlbmd0aCAmJiBzaXplIDw9IG1fZmlmb0xlbmd0aCkgewor
ICAgICAgICBpZiAoaW5kZXggKyBzaXplID4gbV9maWZvTGVuZ3RoKSB7CisgICAgICAgICAgICAv
LyBOZWVkIHRvIHdyYXAuIEZpZ3VyZSBvdXQgdGhlIGxlbmd0aCBvZiBlYWNoIHBpZWNlLgorICAg
ICAgICAgICAgcGFydDFMZW5ndGggPSBtX2ZpZm9MZW5ndGggLSBpbmRleDsKKyAgICAgICAgICAg
IHBhcnQyTGVuZ3RoID0gc2l6ZSAtIHBhcnQxTGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgLy8gTm8gd3JhcCBuZWVkZWQuCisgICAgICAgICAgICBwYXJ0MUxlbmd0aCA9IHNp
emU7CisgICAgICAgICAgICBwYXJ0Mkxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2Ug
eworICAgICAgICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgaW5kZXggb3Igc2l6ZS4gU2V0IHRoZSBw
YXJ0IGxlbmd0aHMgdG8KKyAgICAgICAgLy8gemVybyBzbyBub3RoaW5nIGlzIGNvcGllZC4KKyAg
ICAgICAgcGFydDFMZW5ndGggPSAwOworICAgICAgICBwYXJ0Mkxlbmd0aCA9IDA7CisgICAgfQor
fQorCit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6ZmlsbEJ1ZmZlcihzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMpCit7CisgICAgLy8gS2VlcCBhc2tpbmcgdGhlIHByb3ZpZGVyIHRv
IGdpdmUgdXMgZGF0YSB1bnRpbCB3ZSBoYXZlIHJlY2VpdmVkCisgICAgLy8gYXQgbGVhc3QgfG51
bWJlck9mRnJhbWVzfCBvZiBkYXRhLiBTdHVmZiB0aGUgZGF0YSBpbnRvIHRoZQorICAgIC8vIEZJ
Rk8uCisgICAgc2l6ZV90IGZyYW1lc1Byb3ZpZGVkID0gMDsKKyAgICAKKyAgICB3aGlsZSAoZnJh
bWVzUHJvdmlkZWQgPCBudW1iZXJPZkZyYW1lcykgeworICAgICAgICBtX3Byb3ZpZGVyLnByb3Zp
ZGVJbnB1dCgmbV90ZW1wQnVzLCBtX3Byb3ZpZGVyU2l6ZSk7CisKKyAgICAgICAgc2l6ZV90IHBh
cnQxTGVuZ3RoOworICAgICAgICBzaXplX3QgcGFydDJMZW5ndGg7CisgICAgICAgIGZpbmRXcmFw
TGVuZ3RocyhtX3dyaXRlSW5kZXgsIG1fcHJvdmlkZXJTaXplLCBwYXJ0MUxlbmd0aCwgcGFydDJM
ZW5ndGgpOworCisgICAgICAgIHNpemVfdCBudW1iZXJPZkNoYW5uZWxzID0gbV9maWZvQXVkaW9C
dXMubnVtYmVyT2ZDaGFubmVscygpOworICAgICAgICAKKyAgICAgICAgZm9yIChzaXplX3QgY2hh
bm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgbnVtYmVyT2ZDaGFubmVsczsgKytjaGFubmVs
SW5kZXgpIHsKKyAgICAgICAgICAgIGZsb2F0KiBkZXN0aW5hdGlvbiA9IG1fZmlmb0F1ZGlvQnVz
LmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOworICAgICAgICAgICAgZmxvYXQqIHNvdXJj
ZSA9IG1fdGVtcEJ1cy5jaGFubmVsKGNoYW5uZWxJbmRleCktPmRhdGEoKTsKKworICAgICAgICAg
ICAgYm9vbCBpc0NvcHlHb29kID0gKHBhcnQxTGVuZ3RoIDw9IG1fcHJvdmlkZXJTaXplCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFydDJMZW5ndGggPD0gbV9wcm92aWRlclNp
emUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocGFydDFMZW5ndGggKyBwYXJ0
Mkxlbmd0aCkgPD0gbV9wcm92aWRlclNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmJiAobV93cml0ZUluZGV4ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
JiYgKG1fd3JpdGVJbmRleCA8IG1fZmlmb0xlbmd0aCkpOworICAgICAgICAgICAgQVNTRVJUKGlz
Q29weUdvb2QpOworICAgICAgICAgICAgaWYgKCFpc0NvcHlHb29kKQorICAgICAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgbV93cml0ZUluZGV4
LCBzb3VyY2UsIHBhcnQxTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5hdGlvbikpOworICAgICAgICAg
ICAgLy8gSGFuZGxlIHdyYXAgYXJvdW5kIG9mIHRoZSBGSUZPLCBpZiBuZWVkZWQuCisgICAgICAg
ICAgICBpZiAocGFydDJMZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIG1lbWNweShkZXN0aW5h
dGlvbiwgc291cmNlICsgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoICogc2l6ZW9mKCpkZXN0aW5h
dGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgbV9mcmFtZXNJbkZpZm8gKz0gbV9wcm92aWRl
clNpemU7CisgICAgICAgIEFTU0VSVChtX2ZyYW1lc0luRmlmbyA8PSBtX2ZpZm9MZW5ndGgpOwor
ICAgICAgICBtX3dyaXRlSW5kZXggPSB1cGRhdGVJbmRleChtX3dyaXRlSW5kZXgsIG1fcHJvdmlk
ZXJTaXplKTsKKyAgICAgICAgZnJhbWVzUHJvdmlkZWQgKz0gbV9wcm92aWRlclNpemU7CiAgICAg
fQogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3Rp
bmF0aW9uQ2hyb21pdW0uaCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGlu
YXRpb25DaHJvbWl1bS5oCmluZGV4IDEzYTNmNTJmZDgzZjdkNzJiYzBmMGE0YmNmZmQzYjAzYTBk
YTE3YWQuLjIwNGMxNmI0ZDVjOTcwZWFiZDA0MzgwZGU1ZjJjYzI5YjU4NTViNzYgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5o
CisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlICJBdWRpb0J1cy5oIgogI2luY2x1ZGUg
IkF1ZGlvRGVzdGluYXRpb24uaCIKKyNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3ZpZGVyLmgiCiAj
aW5jbHVkZSAiV2ViQXVkaW9EZXZpY2UuaCIKICNpbmNsdWRlICJXZWJWZWN0b3IuaCIKIApAQCAt
NTUsMTMgKzU2LDY0IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKGNvbnN0IFdl
YktpdDo6V2ViVmVjdG9yPGZsb2F0Kj4mIGF1ZGlvRGF0YSwgc2l6ZV90IG51bWJlck9mRnJhbWVz
KTsKIAogcHJpdmF0ZToKLSAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVyOworICAg
IC8vIEEgRklGTyAoRmlyc3QgSW4gRmlyc3QgT3V0KSBidWZmZXIgdG8gaGFuZGxlIG1pc21hdGNo
ZXMgaW4gdGhlCisgICAgLy8gYXVkaW8gYmFja2VuZCBoYXJkd2FyZSBidWZmZXIgc2l6ZSBhbmQg
dGhlIFdlYiBBdWRpbyByZW5kZXIgc2l6ZS4KKyAgICBjbGFzcyBGSUZPIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIC8vIENyZWF0ZSBhIEZJRk8gdGhhdCBnZXRzIGRhdGEgZnJvbSB8cHJvdmlkZXJ8
LiBUaGUgRklGTyB3aWxsCisgICAgICAgIC8vIGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHxmaWZv
TGVuZ3RofCBmcmFtZXMgb2YgZGF0YSBvZgorICAgICAgICAvLyB8bnVtYmVyT2ZDaGFubmVsc3wg
Y2hhbm5lbHMuIFRoZSBBdWRpb1NvdXJjZVByb3ZpZGVyIHdpbGwKKyAgICAgICAgLy8gYmUgYXNr
ZWQgdG8gcHJvZHVjZSB8cHJvdmlkZXJTaXplfCBmcmFtZXMgd2hlbiB0aGUgRklGTworICAgICAg
ICAvLyBuZWVkcyBtb3JlIGRhdGEuCisgICAgICAgIEZJRk8oQXVkaW9Tb3VyY2VQcm92aWRlciYg
cHJvdmlkZXIsIHVuc2lnbmVkIG51bWJlck9mQ2hhbm5lbHMsIHNpemVfdCBmaWZvTGVuZ3RoLCBz
aXplX3QgcHJvdmlkZXJTaXplKTsKKworICAgICAgICAvLyBSZWFkIHxmcmFtZXNUb0NvbnN1bWV8
IGZyYW1lcyBmcm9tIHRoZSBGSUZPIGludG8gdGhlCisgICAgICAgIC8vIGRlc3RpbmF0aW9uLiBJ
ZiB0aGUgRklGTyBkb2VzIG5vdCBoYXZlIGVub3VnaCBkYXRhLCB3ZSBhc2sKKyAgICAgICAgLy8g
dGhlIHxwcm92aWRlcnwgdG8gZ2V0IG1vcmUgZGF0YSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0Lgor
ICAgICAgICB2b2lkIGNvbnN1bWUoQXVkaW9CdXMqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJhbWVz
VG9Db25zdW1lKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgRklGTyBp
bmRleCBieSB0aGUgc3RlcCwgd2l0aCBhcHByb3ByaWF0ZQorICAgICAgICAvLyB3cmFwcGluZyBh
cm91bmQgdGhlIGVuZHBvaW50LgorICAgICAgICBpbnQgdXBkYXRlSW5kZXgoaW50IGluZGV4LCBp
bnQgc3RlcCkgeyByZXR1cm4gKGluZGV4ICsgc3RlcCkgJSBtX2ZpZm9MZW5ndGg7IH0KKworICAg
ICAgICB2b2lkIGZpbmRXcmFwTGVuZ3RocyhzaXplX3QgaW5kZXgsIHNpemVfdCBwcm92aWRlclNp
emUsIHNpemVfdCYgcGFydDFMZW5ndGgsIHNpemVfdCYgcGFydDJMZW5ndGgpOworICAgICAgICAK
KyAgICAgICAgLy8gRmlsbCB0aGUgRklGTyBidWZmZXIgd2l0aCBhdCBsZWFzdCB8bnVtYmVyT2ZG
cmFtZXN8IG1vcmUgZGF0YS4KKyAgICAgICAgdm9pZCBmaWxsQnVmZmVyKHNpemVfdCBudW1iZXJP
ZkZyYW1lcyk7CisKKyAgICAgICAgLy8gVGhlIHByb3ZpZGVyIG9mIHRoZSBkYXRhIGluIG91ciBG
SUZPLgorICAgICAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVyOworCisgICAgICAg
IC8vIFRoZSBGSUZPIGl0c2VsZi4gSW4gcmVhbGl0eSwgdGhlIEZJRk8gaXMgYSBjaXJjdWxhciBi
dWZmZXIuCisgICAgICAgIEF1ZGlvQnVzIG1fZmlmb0F1ZGlvQnVzOworCisgICAgICAgIC8vIFRo
ZSB0b3RhbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEZJRk8uCisgICAgICAgIHNpemVfdCBtX2Zp
Zm9MZW5ndGg7CisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhY3R1YWwgZWxlbWVudHMgaW4g
dGhlIEZJRk8KKyAgICAgICAgc2l6ZV90IG1fZnJhbWVzSW5GaWZvOworCisgICAgICAgIC8vIFdo
ZXJlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgRklGTy4KKyAgICAgICAgc2l6ZV90IG1fcmVh
ZEluZGV4OworCisgICAgICAgIC8vIFdoZXJlIHRvIHN0YXJ0IHdyaXRpbmcgdG8gdGhlIEZJRk8u
CisgICAgICAgIHNpemVfdCBtX3dyaXRlSW5kZXg7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGZy
YW1lcyBvZiBkYXRhIHRoYXQgdGhlIHByb3ZpZGVyIHdpbGwgcHJvZHVjZSBwZXIgY2FsbC4KKyAg
ICAgICAgdW5zaWduZWQgaW50IG1fcHJvdmlkZXJTaXplOworCisgICAgICAgIC8vIFRlbXBvcmFy
eSB3b3Jrc3BhY2UgdG8gaG9sZCB0aGUgZGF0YSBmcm9tIHRoZSBwcm92aWRlci4KKyAgICAgICAg
QXVkaW9CdXMgbV90ZW1wQnVzOworICAgIH07CisKK0F1ZGlvU291cmNlUHJvdmlkZXImIG1fcHJv
dmlkZXI7CiAgICAgQXVkaW9CdXMgbV9yZW5kZXJCdXM7CiAgICAgZmxvYXQgbV9zYW1wbGVSYXRl
OwogICAgIGJvb2wgbV9pc1BsYXlpbmc7CiAgICAgT3duUHRyPFdlYktpdDo6V2ViQXVkaW9EZXZp
Y2U+IG1fYXVkaW9EZXZpY2U7CiAgICAgc2l6ZV90IG1fY2FsbGJhY2tCdWZmZXJTaXplOwotICAg
IHVuc2lnbmVkIG1fcmVuZGVyQ291bnRQZXJDYWxsYmFjazsKKyAgICBPd25QdHI8RklGTz4gbV9m
aWZvOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115015</attachid>
            <date>2011-11-14 13:09:23 -0800</date>
            <delta_ts>2011-11-14 13:35:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111114130922.patch</filename>
            <type>text/plain</type>
            <size>12801</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAwMTM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDQ2MDUyNDYzMWZlZGQ0YTMyNGQyOGMzNWEwNDY0Y2UzYWRhYWQ1N2EuLjY3ODBmYjFlNDkzZWVi
MGRlOGM2NmE3OGNmMGZhY2JiOTUwYWUxNTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTEtMTEtMTEgIFJheW1vbmQgVG95ICA8cnRveUBnb29nbGUuY29t
PgorCisgICAgICAgIEFkZCBidWZmZXJpbmcgdG8gaGFuZGxlIG1pc21hdGNoIGJldHdlZW4gaGFy
ZHdhcmUgYnVmZmVyIHNpemUgYW5kIHdlYmF1ZGlvIHJlbmRlciBzaXplCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk0OQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogc3JjL0F1ZGlvRGVzdGluYXRpb25D
aHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06
OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSk6CisgICAgICAgIENyZWF0ZSB0aGUgRklGTyBmb3Ig
YnVmZmVyaW5nLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpy
ZW5kZXIpOiAgR2V0IHJpZCBvZgorICAgICAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgYW5k
IGxldCB0aGUgRklGTyBjb25zdW1lIGZ1bmN0aW9uIHByb2R1Y2UKKyAgICAgICAgdGhlIGFwcHJv
cHJpYXRlIG51Ym1lciBvZiBjYWxscyB0byB0aGUgd2ViYXVkaW8gcHJvZHVjZXIuICBBbHNvCisg
ICAgICAgIHJlbW92ZSB0aGUgcm91bmRpbmcgb2YgdGhlIGNhbGxiYWNrIHNpemUgc28gd2UgdXNl
IHdoYXRldmVyIHRoZQorICAgICAgICBoYXJkd2FyZSByZXR1cm5zLiAgUmVtb3ZlZCBtYXhpbXVt
Q2FsbGJhY2tCdWZmZXJTaXplIGFuZCB1c2UKKyAgICAgICAgZmlmb1NpemUgdG8gc2V0IHRoZSBG
SUZPIHNpemUuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJ
Rk86OkZJRk8pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpG
SUZPOjpjb25zdW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bTo6RklGTzo6ZmluZFdyYXBMZW5ndGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGlu
YXRpb25DaHJvbWl1bTo6RklGTzo6ZmlsbEJ1ZmZlcik6CisgICAgICAgIEltcGxlbWVudGF0aW9u
IG9mIG5ldyBGSUZPIGNsYXNzLgorICAgICAgICAqIHNyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21p
dW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6
dXBkYXRlSW5kZXgpOgorICAgICAgICBEZWZpbmUgbmV3IEZJRk8gY2xhc3MuCisKIDIwMTEtMTEt
MTQgIElhaW4gTWVycmljayAgPGh1c2t5QGdvb2dsZS5jb20+CiAKICAgICAgICAgW2Nocm9taXVt
XSBGaXggaW5jb3JyZWN0IHVzYWdlIG9mIEFTU0VSVCBpbiBDQ0xheWVyVHJlZUhvc3RUZXN0CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hy
b21pdW0uY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcAppbmRleCBhYTljNmZhNmQ3M2E0NWQzNmIwNGYwMjAwYzk2MGE4YTllZjMzZGE2
Li5kMGYyYzgzZDY2ZDkxZTYyZmQyNTVlODFlNjQ3NjlkMjliNzc1OTMzIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5j
cHAKQEAgLTMyLDcgKzMyLDYgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oIgogCi0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIldlYktp
dC5oIgogI2luY2x1ZGUgIldlYktpdFBsYXRmb3JtU3VwcG9ydC5oIgogCkBAIC00Myw4ICs0Miw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIC8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRoZSB3ZWIg
YXVkaW8gZW5naW5lIHdpbGwgcmVuZGVyLgogY29uc3QgdW5zaWduZWQgcmVuZGVyQnVmZmVyU2l6
ZSA9IDEyODsKIAotLy8gTWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplCi1jb25zdCBzaXplX3Qg
bWF4aW11bUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OworLy8gU2l6ZSBvZiB0aGUgRklGTwor
Y29uc3Qgc2l6ZV90IGZpZm9TaXplID0gODE5MjsKIAogLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZv
ciBtdWx0aS1jaGFubmVsLgogY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IDI7CkBA
IC02MSwyMyArNjAsMjMgQEAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0
aW9uQ2hyb21pdW0oQXVkaW9Tb3VyY2VQcm92aWRlciYgcHJvdmlkZXIKICAgICAsIG1fc2FtcGxl
UmF0ZShzYW1wbGVSYXRlKQogICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCiB7Ci0gICAgLy8gR2V0
IHRoZSBtaW5pbXVtIHVzYWJsZSBidWZmZXIgc2l6ZS4gV2UnbGwgcm91bmQgdGhpcyB2YWx1ZSB1
cAotICAgIC8vIHRvIGEgbXVsdGlwbGUgb2Ygb3VyIHJlbmRlciBzaXplLgotICAgIHNpemVfdCBj
YWxsYmFja1NpemUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZl
clNpemUoKTsKKyAgICAvLyBVc2UgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUgcmVjb21tZW5kZWQg
YnkgdGhlIGF1ZGlvIGJhY2tlbmQuCisgICAgbV9jYWxsYmFja0J1ZmZlclNpemUgPSB3ZWJLaXRQ
bGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKIAotICAgIC8vIEZp
Z3VyZSBvdXQgaG93IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ssIHJvdW5kaW5nIHVw
IGlmIG5lZWRlZC4KLSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAoY2FsbGJhY2tTaXpl
ICsgcmVuZGVyQnVmZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIG1fY2Fs
bGJhY2tCdWZmZXJTaXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICogcmVuZGVyQnVmZmVy
U2l6ZTsKLQotICAgIGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZmZXJTaXplID49IHJl
bmRlckJ1ZmZlclNpemUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNpemUgPD0gbWF4aW11
bUNhbGxiYWNrQnVmZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7Ci0gICAgaWYgKCFp
c1NpemVHb29kKQotICAgICAgcmV0dXJuOworICAgIC8vIFF1aWNrIGV4aXQgaWYgdGhlIHJlcXVl
c3RlZCBzaXplIGlzIHRvbyBsYXJnZS4KKyAgICBBU1NFUlQobV9jYWxsYmFja0J1ZmZlclNpemUg
KyByZW5kZXJCdWZmZXJTaXplIDw9IGZpZm9TaXplKTsKKyAgICBpZiAobV9jYWxsYmFja0J1ZmZl
clNpemUgKyByZW5kZXJCdWZmZXJTaXplID4gZmlmb1NpemUpCisgICAgICAgIHJldHVybjsKICAg
ICAKICAgICBtX2F1ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0UGxhdGZvcm1TdXBwb3J0KCkt
PmNyZWF0ZUF1ZGlvRGV2aWNlKG1fY2FsbGJhY2tCdWZmZXJTaXplLCBudW1iZXJPZkNoYW5uZWxz
LCBzYW1wbGVSYXRlLCB0aGlzKSk7CiAgICAgQVNTRVJUKG1fYXVkaW9EZXZpY2UpOworCisgICAg
Ly8gQ3JlYXRlIGEgRklGTyB0byBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBjYWxsYmFj
ayBzaXplCisgICAgLy8gbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhlIHJlbmRlciBzaXplLiBJ
ZiB0aGUgRklGTyBhbHJlYWR5CisgICAgLy8gY29udGFpbnMgZW5vdWdoIGRhdGEsIHRoZSBkYXRh
IHdpbGwgYmUgcHJvdmlkZWQgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRklGTyB3
aWxsIGNhbGwgdGhlIHByb3ZpZGVyIGVub3VnaCB0aW1lcyB0bworICAgIC8vIHNhdGlzZnkgdGhl
IHJlcXVlc3QgZm9yIGRhdGEuCisgICAgbV9maWZvID0gYWRvcHRQdHIobmV3IEZJRk8ocHJvdmlk
ZXIsIG51bWJlck9mQ2hhbm5lbHMsIGZpZm9TaXplLCByZW5kZXJCdWZmZXJTaXplKSk7CiB9CiAK
IEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSgpCkBA
IC0xMjEsMTEgKzEyMCwxMjcgQEAgdm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRl
cihjb25zdCBXZWJWZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QKICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAotICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZmZXIgaW50byBz
bWFsbGVyIGNodW5rcyB3aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBvdGhlci4KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrOyArK2kp
IHsKLSAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgwLCBhdWRpb0RhdGFbMF0g
KyBpICogcmVuZGVyQnVmZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1fcmVu
ZGVyQnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVkaW9EYXRhWzFdICsgaSAqIHJlbmRlckJ1ZmZl
clNpemUsIHJlbmRlckJ1ZmZlclNpemUpOwotICAgICAgICBtX3Byb3ZpZGVyLnByb3ZpZGVJbnB1
dCgmbV9yZW5kZXJCdXMsIHJlbmRlckJ1ZmZlclNpemUpOworICAgIG1fcmVuZGVyQnVzLnNldENo
YW5uZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7CisgICAgbV9yZW5k
ZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9mRnJhbWVzKTsK
KyAgICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1lcyk7Cit9CisK
K0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6RklGTyhBdWRpb1NvdXJjZVByb3ZpZGVy
JiBwcm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZpZm9MZW5ndGgs
IHNpemVfdCBwcm92aWRlclNpemUpCisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICwg
bV9maWZvQXVkaW9CdXMobnVtYmVyT2ZDaGFubmVscywgZmlmb0xlbmd0aCkKKyAgICAsIG1fZmlm
b0xlbmd0aChmaWZvTGVuZ3RoKQorICAgICwgbV9mcmFtZXNJbkZpZm8oMCkKKyAgICAsIG1fcmVh
ZEluZGV4KDApCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAsIG1fcHJvdmlkZXJTaXplKHBy
b3ZpZGVyU2l6ZSkKKyAgICAsIG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCBwcm92aWRlclNp
emUpCit7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpjb25zdW1l
KEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1RvQ29uc3VtZSkKK3sKKyAgICBi
b29sIGlzR29vZCA9IGRlc3RpbmF0aW9uICYmIChmcmFtZXNUb0NvbnN1bWUgPD0gbV9maWZvTGVu
Z3RoKTsKKyAgICBBU1NFUlQoaXNHb29kKTsKKyAgICBpZiAoIWlzR29vZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGZyYW1lc1RvQ29uc3VtZSA+IG1fZnJhbWVzSW5GaWZvKSB7CisgICAg
ICAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgaW4gdGhlIEZJRk8gdG8gZnVsZmlsbCB0
aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gQXNrIGZvciBtb3JlIGRhdGEuCisgICAgICAgIGZpbGxC
dWZmZXIoZnJhbWVzVG9Db25zdW1lIC0gbV9mcmFtZXNJbkZpZm8pOworICAgIH0KKworICAgIC8v
IFdlIGhhdmUgZW5vdWdoIGRhdGEgbm93LiBDb3B5IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHNh
bXBsZXMKKyAgICAvLyB0byB0aGUgZGVzdGluYXRpb24uCisKKyAgICBzaXplX3QgcGFydDFMZW5n
dGg7CisgICAgc2l6ZV90IHBhcnQyTGVuZ3RoOworICAgIGZpbmRXcmFwTGVuZ3RocyhtX3JlYWRJ
bmRleCwgZnJhbWVzVG9Db25zdW1lLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGgpOworCisgICAg
c2l6ZV90IG51bWJlck9mQ2hhbm5lbHMgPSBtX2ZpZm9BdWRpb0J1cy5udW1iZXJPZkNoYW5uZWxz
KCk7CisKKyAgICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBu
dW1iZXJPZkNoYW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICBmbG9hdCogZGVzdGlu
YXRpb25EYXRhID0gZGVzdGluYXRpb24tPmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOwor
ICAgICAgICBmbG9hdCogc291cmNlRGF0YSA9IG1fZmlmb0F1ZGlvQnVzLmNoYW5uZWwoY2hhbm5l
bEluZGV4KS0+ZGF0YSgpOworCisgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9ICgobV9yZWFkSW5k
ZXggPCBtX2ZpZm9MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobV9yZWFk
SW5kZXggKyBwYXJ0MUxlbmd0aCkgPCBtX2ZpZm9MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICYmIChwYXJ0MUxlbmd0aCA8IGRlc3RpbmF0aW9uLT5sZW5ndGgoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICYmIChwYXJ0MUxlbmd0aCArIHBhcnQyTGVuZ3RoKSA8IGRlc3Rp
bmF0aW9uLT5sZW5ndGgoKSk7CisgICAgICAgIEFTU0VSVChpc0NvcHlHb29kKTsKKyAgICAgICAg
aWYgKCFpc0NvcHlHb29kKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAg
bWVtY3B5KGRlc3RpbmF0aW9uRGF0YSwgc291cmNlRGF0YSArIG1fcmVhZEluZGV4LCBwYXJ0MUxl
bmd0aCAqIHNpemVvZigqc291cmNlRGF0YSkpOworICAgICAgICAvLyBIYW5kbGUgd3JhcCBhcm91
bmQgb2YgdGhlIEZJRk8sIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKHBhcnQyTGVuZ3RoID4gMCkK
KyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkRhdGEgKyBwYXJ0MUxlbmd0aCwgc291cmNl
RGF0YSwgcGFydDJMZW5ndGggKiBzaXplb2YoKnNvdXJjZURhdGEpKTsKKyAgICB9CisgICAgbV9y
ZWFkSW5kZXggPSB1cGRhdGVJbmRleChtX3JlYWRJbmRleCwgZnJhbWVzVG9Db25zdW1lKTsKKyAg
ICBtX2ZyYW1lc0luRmlmbyAtPSBmcmFtZXNUb0NvbnN1bWU7CisgICAgQVNTRVJUKG1fZnJhbWVz
SW5GaWZvID49IDApOworfQorCit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6
ZmluZFdyYXBMZW5ndGhzKHNpemVfdCBpbmRleCwgc2l6ZV90IHNpemUsIHNpemVfdCYgcGFydDFM
ZW5ndGgsIHNpemVfdCYgcGFydDJMZW5ndGgpCit7CisgICAgQVNTRVJUKGluZGV4IDwgbV9maWZv
TGVuZ3RoICYmIHNpemUgPD0gbV9maWZvTGVuZ3RoKTsKKyAgICBpZiAoaW5kZXggPCBtX2ZpZm9M
ZW5ndGggJiYgc2l6ZSA8PSBtX2ZpZm9MZW5ndGgpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgc2l6
ZSA+IG1fZmlmb0xlbmd0aCkgeworICAgICAgICAgICAgLy8gTmVlZCB0byB3cmFwLiBGaWd1cmUg
b3V0IHRoZSBsZW5ndGggb2YgZWFjaCBwaWVjZS4KKyAgICAgICAgICAgIHBhcnQxTGVuZ3RoID0g
bV9maWZvTGVuZ3RoIC0gaW5kZXg7CisgICAgICAgICAgICBwYXJ0Mkxlbmd0aCA9IHNpemUgLSBw
YXJ0MUxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHdyYXAgbmVl
ZGVkLgorICAgICAgICAgICAgcGFydDFMZW5ndGggPSBzaXplOworICAgICAgICAgICAgcGFydDJM
ZW5ndGggPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW52YWxpZCB2
YWx1ZXMgZm9yIGluZGV4IG9yIHNpemUuIFNldCB0aGUgcGFydCBsZW5ndGhzIHRvCisgICAgICAg
IC8vIHplcm8gc28gbm90aGluZyBpcyBjb3BpZWQuCisgICAgICAgIHBhcnQxTGVuZ3RoID0gMDsK
KyAgICAgICAgcGFydDJMZW5ndGggPSAwOworICAgIH0KK30KKwordm9pZCBBdWRpb0Rlc3RpbmF0
aW9uQ2hyb21pdW06OkZJRk86OmZpbGxCdWZmZXIoc2l6ZV90IG51bWJlck9mRnJhbWVzKQorewor
ICAgIC8vIEtlZXAgYXNraW5nIHRoZSBwcm92aWRlciB0byBnaXZlIHVzIGRhdGEgdW50aWwgd2Ug
aGF2ZSByZWNlaXZlZAorICAgIC8vIGF0IGxlYXN0IHxudW1iZXJPZkZyYW1lc3wgb2YgZGF0YS4g
U3R1ZmYgdGhlIGRhdGEgaW50byB0aGUKKyAgICAvLyBGSUZPLgorICAgIHNpemVfdCBmcmFtZXNQ
cm92aWRlZCA9IDA7CisgICAgCisgICAgd2hpbGUgKGZyYW1lc1Byb3ZpZGVkIDwgbnVtYmVyT2ZG
cmFtZXMpIHsKKyAgICAgICAgbV9wcm92aWRlci5wcm92aWRlSW5wdXQoJm1fdGVtcEJ1cywgbV9w
cm92aWRlclNpemUpOworCisgICAgICAgIHNpemVfdCBwYXJ0MUxlbmd0aDsKKyAgICAgICAgc2l6
ZV90IHBhcnQyTGVuZ3RoOworICAgICAgICBmaW5kV3JhcExlbmd0aHMobV93cml0ZUluZGV4LCBt
X3Byb3ZpZGVyU2l6ZSwgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoKTsKKworICAgICAgICBzaXpl
X3QgbnVtYmVyT2ZDaGFubmVscyA9IG1fZmlmb0F1ZGlvQnVzLm51bWJlck9mQ2hhbm5lbHMoKTsK
KyAgICAgICAgCisgICAgICAgIGZvciAoc2l6ZV90IGNoYW5uZWxJbmRleCA9IDA7IGNoYW5uZWxJ
bmRleCA8IG51bWJlck9mQ2hhbm5lbHM7ICsrY2hhbm5lbEluZGV4KSB7CisgICAgICAgICAgICBm
bG9hdCogZGVzdGluYXRpb24gPSBtX2ZpZm9BdWRpb0J1cy5jaGFubmVsKGNoYW5uZWxJbmRleCkt
PmRhdGEoKTsKKyAgICAgICAgICAgIGZsb2F0KiBzb3VyY2UgPSBtX3RlbXBCdXMuY2hhbm5lbChj
aGFubmVsSW5kZXgpLT5kYXRhKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9IChw
YXJ0MUxlbmd0aCA8PSBtX3Byb3ZpZGVyU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICYmIChwYXJ0MUxlbmd0aCArIHBhcnQyTGVuZ3RoKSA8PSBtX3Byb3ZpZGVyU2l6ZQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtX3dyaXRlSW5kZXggPCBtX2ZpZm9MZW5n
dGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1fd3JpdGVJbmRleCArIHBh
cnQxTGVuZ3RoKSA8IG1fZmlmb0xlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIHBhcnQyTGVuZ3RoIDwgbV9maWZvTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVChpc0Nv
cHlHb29kKTsKKyAgICAgICAgICAgIGlmICghaXNDb3B5R29vZCkKKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiArIG1fd3JpdGVJbmRleCwg
c291cmNlLCBwYXJ0MUxlbmd0aCAqIHNpemVvZigqZGVzdGluYXRpb24pKTsKKyAgICAgICAgICAg
IC8vIEhhbmRsZSB3cmFwIGFyb3VuZCBvZiB0aGUgRklGTywgaWYgbmVlZGVkLgorICAgICAgICAg
ICAgaWYgKHBhcnQyTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRp
b24sIHNvdXJjZSArIHBhcnQxTGVuZ3RoLCBwYXJ0Mkxlbmd0aCAqIHNpemVvZigqZGVzdGluYXRp
b24pKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fZnJhbWVzSW5GaWZvICs9IG1fcHJvdmlkZXJT
aXplOworICAgICAgICBBU1NFUlQobV9mcmFtZXNJbkZpZm8gPD0gbV9maWZvTGVuZ3RoKTsKKyAg
ICAgICAgbV93cml0ZUluZGV4ID0gdXBkYXRlSW5kZXgobV93cml0ZUluZGV4LCBtX3Byb3ZpZGVy
U2l6ZSk7CisgICAgICAgIGZyYW1lc1Byb3ZpZGVkICs9IG1fcHJvdmlkZXJTaXplOwogICAgIH0K
IH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5h
dGlvbkNocm9taXVtLmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0
aW9uQ2hyb21pdW0uaAppbmRleCAxM2EzZjUyZmQ4M2Y3ZDcyYmMwZjBhNGJjZmZkM2IwM2EwZGEx
N2FkLi4yMDRjMTZiNGQ1Yzk3MGVhYmQwNDM4MGRlNWYyY2MyOWI1ODU1Yjc2IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uaAor
KysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0u
aApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9CdXMuaCIKICNpbmNsdWRlICJB
dWRpb0Rlc3RpbmF0aW9uLmgiCisjaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2lu
Y2x1ZGUgIldlYkF1ZGlvRGV2aWNlLmgiCiAjaW5jbHVkZSAiV2ViVmVjdG9yLmgiCiAKQEAgLTU1
LDEzICs1Niw2NCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHJlbmRlcihjb25zdCBXZWJL
aXQ6OldlYlZlY3RvcjxmbG9hdCo+JiBhdWRpb0RhdGEsIHNpemVfdCBudW1iZXJPZkZyYW1lcyk7
CiAKIHByaXZhdGU6Ci0gICAgQXVkaW9Tb3VyY2VQcm92aWRlciYgbV9wcm92aWRlcjsKKyAgICAv
LyBBIEZJRk8gKEZpcnN0IEluIEZpcnN0IE91dCkgYnVmZmVyIHRvIGhhbmRsZSBtaXNtYXRjaGVz
IGluIHRoZQorICAgIC8vIGF1ZGlvIGJhY2tlbmQgaGFyZHdhcmUgYnVmZmVyIHNpemUgYW5kIHRo
ZSBXZWIgQXVkaW8gcmVuZGVyIHNpemUuCisgICAgY2xhc3MgRklGTyB7CisgICAgcHVibGljOgor
ICAgICAgICAvLyBDcmVhdGUgYSBGSUZPIHRoYXQgZ2V0cyBkYXRhIGZyb20gfHByb3ZpZGVyfC4g
VGhlIEZJRk8gd2lsbAorICAgICAgICAvLyBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB8Zmlmb0xl
bmd0aHwgZnJhbWVzIG9mIGRhdGEgb2YKKyAgICAgICAgLy8gfG51bWJlck9mQ2hhbm5lbHN8IGNo
YW5uZWxzLiBUaGUgQXVkaW9Tb3VyY2VQcm92aWRlciB3aWxsCisgICAgICAgIC8vIGJlIGFza2Vk
IHRvIHByb2R1Y2UgfHByb3ZpZGVyU2l6ZXwgZnJhbWVzIHdoZW4gdGhlIEZJRk8KKyAgICAgICAg
Ly8gbmVlZHMgbW9yZSBkYXRhLgorICAgICAgICBGSUZPKEF1ZGlvU291cmNlUHJvdmlkZXImIHBy
b3ZpZGVyLCB1bnNpZ25lZCBudW1iZXJPZkNoYW5uZWxzLCBzaXplX3QgZmlmb0xlbmd0aCwgc2l6
ZV90IHByb3ZpZGVyU2l6ZSk7CisKKyAgICAgICAgLy8gUmVhZCB8ZnJhbWVzVG9Db25zdW1lfCBm
cmFtZXMgZnJvbSB0aGUgRklGTyBpbnRvIHRoZQorICAgICAgICAvLyBkZXN0aW5hdGlvbi4gSWYg
dGhlIEZJRk8gZG9lcyBub3QgaGF2ZSBlbm91Z2ggZGF0YSwgd2UgYXNrCisgICAgICAgIC8vIHRo
ZSB8cHJvdmlkZXJ8IHRvIGdldCBtb3JlIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdC4KKyAg
ICAgICAgdm9pZCBjb25zdW1lKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1Rv
Q29uc3VtZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBVcGRhdGUgdGhlIEZJRk8gaW5k
ZXggYnkgdGhlIHN0ZXAsIHdpdGggYXBwcm9wcmlhdGUKKyAgICAgICAgLy8gd3JhcHBpbmcgYXJv
dW5kIHRoZSBlbmRwb2ludC4KKyAgICAgICAgaW50IHVwZGF0ZUluZGV4KGludCBpbmRleCwgaW50
IHN0ZXApIHsgcmV0dXJuIChpbmRleCArIHN0ZXApICUgbV9maWZvTGVuZ3RoOyB9CisKKyAgICAg
ICAgdm9pZCBmaW5kV3JhcExlbmd0aHMoc2l6ZV90IGluZGV4LCBzaXplX3QgcHJvdmlkZXJTaXpl
LCBzaXplX3QmIHBhcnQxTGVuZ3RoLCBzaXplX3QmIHBhcnQyTGVuZ3RoKTsKKyAgICAgICAgCisg
ICAgICAgIC8vIEZpbGwgdGhlIEZJRk8gYnVmZmVyIHdpdGggYXQgbGVhc3QgfG51bWJlck9mRnJh
bWVzfCBtb3JlIGRhdGEuCisgICAgICAgIHZvaWQgZmlsbEJ1ZmZlcihzaXplX3QgbnVtYmVyT2ZG
cmFtZXMpOworCisgICAgICAgIC8vIFRoZSBwcm92aWRlciBvZiB0aGUgZGF0YSBpbiBvdXIgRklG
Ty4KKyAgICAgICAgQXVkaW9Tb3VyY2VQcm92aWRlciYgbV9wcm92aWRlcjsKKworICAgICAgICAv
LyBUaGUgRklGTyBpdHNlbGYuIEluIHJlYWxpdHksIHRoZSBGSUZPIGlzIGEgY2lyY3VsYXIgYnVm
ZmVyLgorICAgICAgICBBdWRpb0J1cyBtX2ZpZm9BdWRpb0J1czsKKworICAgICAgICAvLyBUaGUg
dG90YWwgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBGSUZPLgorICAgICAgICBzaXplX3QgbV9maWZv
TGVuZ3RoOworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYWN0dWFsIGVsZW1lbnRzIGluIHRo
ZSBGSUZPCisgICAgICAgIHNpemVfdCBtX2ZyYW1lc0luRmlmbzsKKworICAgICAgICAvLyBXaGVy
ZSB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIEZJRk8uCisgICAgICAgIHNpemVfdCBtX3JlYWRJ
bmRleDsKKworICAgICAgICAvLyBXaGVyZSB0byBzdGFydCB3cml0aW5nIHRvIHRoZSBGSUZPLgor
ICAgICAgICBzaXplX3QgbV93cml0ZUluZGV4OworCisgICAgICAgIC8vIE51bWJlciBvZiBmcmFt
ZXMgb2YgZGF0YSB0aGF0IHRoZSBwcm92aWRlciB3aWxsIHByb2R1Y2UgcGVyIGNhbGwuCisgICAg
ICAgIHVuc2lnbmVkIGludCBtX3Byb3ZpZGVyU2l6ZTsKKworICAgICAgICAvLyBUZW1wb3Jhcnkg
d29ya3NwYWNlIHRvIGhvbGQgdGhlIGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIuCisgICAgICAgIEF1
ZGlvQnVzIG1fdGVtcEJ1czsKKyAgICB9OworCitBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3Zp
ZGVyOwogICAgIEF1ZGlvQnVzIG1fcmVuZGVyQnVzOwogICAgIGZsb2F0IG1fc2FtcGxlUmF0ZTsK
ICAgICBib29sIG1faXNQbGF5aW5nOwogICAgIE93blB0cjxXZWJLaXQ6OldlYkF1ZGlvRGV2aWNl
PiBtX2F1ZGlvRGV2aWNlOwogICAgIHNpemVfdCBtX2NhbGxiYWNrQnVmZmVyU2l6ZTsKLSAgICB1
bnNpZ25lZCBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2s7CisgICAgT3duUHRyPEZJRk8+IG1fZmlm
bzsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115023</attachid>
            <date>2011-11-14 13:35:59 -0800</date>
            <delta_ts>2011-11-14 16:18:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-71949-20111114133558.patch</filename>
            <type>text/plain</type>
            <size>12793</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAwMTM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDQ2MDUyNDYzMWZlZGQ0YTMyNGQyOGMzNWEwNDY0Y2UzYWRhYWQ1N2EuLjY3ODBmYjFlNDkzZWVi
MGRlOGM2NmE3OGNmMGZhY2JiOTUwYWUxNTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTEtMTEtMTEgIFJheW1vbmQgVG95ICA8cnRveUBnb29nbGUuY29t
PgorCisgICAgICAgIEFkZCBidWZmZXJpbmcgdG8gaGFuZGxlIG1pc21hdGNoIGJldHdlZW4gaGFy
ZHdhcmUgYnVmZmVyIHNpemUgYW5kIHdlYmF1ZGlvIHJlbmRlciBzaXplCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk0OQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogc3JjL0F1ZGlvRGVzdGluYXRpb25D
aHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06
OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSk6CisgICAgICAgIENyZWF0ZSB0aGUgRklGTyBmb3Ig
YnVmZmVyaW5nLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpy
ZW5kZXIpOiAgR2V0IHJpZCBvZgorICAgICAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgYW5k
IGxldCB0aGUgRklGTyBjb25zdW1lIGZ1bmN0aW9uIHByb2R1Y2UKKyAgICAgICAgdGhlIGFwcHJv
cHJpYXRlIG51Ym1lciBvZiBjYWxscyB0byB0aGUgd2ViYXVkaW8gcHJvZHVjZXIuICBBbHNvCisg
ICAgICAgIHJlbW92ZSB0aGUgcm91bmRpbmcgb2YgdGhlIGNhbGxiYWNrIHNpemUgc28gd2UgdXNl
IHdoYXRldmVyIHRoZQorICAgICAgICBoYXJkd2FyZSByZXR1cm5zLiAgUmVtb3ZlZCBtYXhpbXVt
Q2FsbGJhY2tCdWZmZXJTaXplIGFuZCB1c2UKKyAgICAgICAgZmlmb1NpemUgdG8gc2V0IHRoZSBG
SUZPIHNpemUuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJ
Rk86OkZJRk8pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpG
SUZPOjpjb25zdW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bTo6RklGTzo6ZmluZFdyYXBMZW5ndGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGlu
YXRpb25DaHJvbWl1bTo6RklGTzo6ZmlsbEJ1ZmZlcik6CisgICAgICAgIEltcGxlbWVudGF0aW9u
IG9mIG5ldyBGSUZPIGNsYXNzLgorICAgICAgICAqIHNyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21p
dW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6
dXBkYXRlSW5kZXgpOgorICAgICAgICBEZWZpbmUgbmV3IEZJRk8gY2xhc3MuCisKIDIwMTEtMTEt
MTQgIElhaW4gTWVycmljayAgPGh1c2t5QGdvb2dsZS5jb20+CiAKICAgICAgICAgW2Nocm9taXVt
XSBGaXggaW5jb3JyZWN0IHVzYWdlIG9mIEFTU0VSVCBpbiBDQ0xheWVyVHJlZUhvc3RUZXN0CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hy
b21pdW0uY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmNwcAppbmRleCBhYTljNmZhNmQ3M2E0NWQzNmIwNGYwMjAwYzk2MGE4YTllZjMzZGE2
Li4yNjRhMmMwMWVhZDRhMjBmZDVjNWNlYWMzOTgxMzg2YTg2ZDQwMDczIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5j
cHAKQEAgLTMyLDcgKzMyLDYgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1
bS5oIgogCi0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIldlYktp
dC5oIgogI2luY2x1ZGUgIldlYktpdFBsYXRmb3JtU3VwcG9ydC5oIgogCkBAIC00Myw4ICs0Miw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIC8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRoZSB3ZWIg
YXVkaW8gZW5naW5lIHdpbGwgcmVuZGVyLgogY29uc3QgdW5zaWduZWQgcmVuZGVyQnVmZmVyU2l6
ZSA9IDEyODsKIAotLy8gTWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplCi1jb25zdCBzaXplX3Qg
bWF4aW11bUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDE2Mzg0OworLy8gU2l6ZSBvZiB0aGUgRklGTwor
Y29uc3Qgc2l6ZV90IGZpZm9TaXplID0gODE5MjsKIAogLy8gRklYTUU6IGFkZCBzdXBwb3J0IGZv
ciBtdWx0aS1jaGFubmVsLgogY29uc3QgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IDI7CkBA
IC02MSwyMyArNjAsMjMgQEAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0
aW9uQ2hyb21pdW0oQXVkaW9Tb3VyY2VQcm92aWRlciYgcHJvdmlkZXIKICAgICAsIG1fc2FtcGxl
UmF0ZShzYW1wbGVSYXRlKQogICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCiB7Ci0gICAgLy8gR2V0
IHRoZSBtaW5pbXVtIHVzYWJsZSBidWZmZXIgc2l6ZS4gV2UnbGwgcm91bmQgdGhpcyB2YWx1ZSB1
cAotICAgIC8vIHRvIGEgbXVsdGlwbGUgb2Ygb3VyIHJlbmRlciBzaXplLgotICAgIHNpemVfdCBj
YWxsYmFja1NpemUgPSB3ZWJLaXRQbGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZl
clNpemUoKTsKKyAgICAvLyBVc2UgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUgcmVjb21tZW5kZWQg
YnkgdGhlIGF1ZGlvIGJhY2tlbmQuCisgICAgbV9jYWxsYmFja0J1ZmZlclNpemUgPSB3ZWJLaXRQ
bGF0Zm9ybVN1cHBvcnQoKS0+YXVkaW9IYXJkd2FyZUJ1ZmZlclNpemUoKTsKIAotICAgIC8vIEZp
Z3VyZSBvdXQgaG93IG1hbnkgcmVuZGVyIGNhbGxzIHBlciBjYWxsIGJhY2ssIHJvdW5kaW5nIHVw
IGlmIG5lZWRlZC4KLSAgICBtX3JlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSAoY2FsbGJhY2tTaXpl
ICsgcmVuZGVyQnVmZmVyU2l6ZSAtIDEpIC8gcmVuZGVyQnVmZmVyU2l6ZTsKLQotICAgIG1fY2Fs
bGJhY2tCdWZmZXJTaXplID0gbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrICogcmVuZGVyQnVmZmVy
U2l6ZTsKLQotICAgIGJvb2wgaXNTaXplR29vZCA9IG1fY2FsbGJhY2tCdWZmZXJTaXplID49IHJl
bmRlckJ1ZmZlclNpemUKLSAgICAgICAgJiYgbV9jYWxsYmFja0J1ZmZlclNpemUgPD0gbWF4aW11
bUNhbGxiYWNrQnVmZmVyU2l6ZTsKLSAgICBBU1NFUlQoaXNTaXplR29vZCk7Ci0gICAgaWYgKCFp
c1NpemVHb29kKQotICAgICAgcmV0dXJuOworICAgIC8vIFF1aWNrIGV4aXQgaWYgdGhlIHJlcXVl
c3RlZCBzaXplIGlzIHRvbyBsYXJnZS4KKyAgICBBU1NFUlQobV9jYWxsYmFja0J1ZmZlclNpemUg
KyByZW5kZXJCdWZmZXJTaXplIDw9IGZpZm9TaXplKTsKKyAgICBpZiAobV9jYWxsYmFja0J1ZmZl
clNpemUgKyByZW5kZXJCdWZmZXJTaXplID4gZmlmb1NpemUpCisgICAgICAgIHJldHVybjsKICAg
ICAKICAgICBtX2F1ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0UGxhdGZvcm1TdXBwb3J0KCkt
PmNyZWF0ZUF1ZGlvRGV2aWNlKG1fY2FsbGJhY2tCdWZmZXJTaXplLCBudW1iZXJPZkNoYW5uZWxz
LCBzYW1wbGVSYXRlLCB0aGlzKSk7CiAgICAgQVNTRVJUKG1fYXVkaW9EZXZpY2UpOworCisgICAg
Ly8gQ3JlYXRlIGEgRklGTyB0byBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBjYWxsYmFj
ayBzaXplCisgICAgLy8gbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhlIHJlbmRlciBzaXplLiBJ
ZiB0aGUgRklGTyBhbHJlYWR5CisgICAgLy8gY29udGFpbnMgZW5vdWdoIGRhdGEsIHRoZSBkYXRh
IHdpbGwgYmUgcHJvdmlkZWQgZGlyZWN0bHkuCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRklGTyB3
aWxsIGNhbGwgdGhlIHByb3ZpZGVyIGVub3VnaCB0aW1lcyB0bworICAgIC8vIHNhdGlzZnkgdGhl
IHJlcXVlc3QgZm9yIGRhdGEuCisgICAgbV9maWZvID0gYWRvcHRQdHIobmV3IEZJRk8ocHJvdmlk
ZXIsIG51bWJlck9mQ2hhbm5lbHMsIGZpZm9TaXplLCByZW5kZXJCdWZmZXJTaXplKSk7CiB9CiAK
IEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSgpCkBA
IC0xMjEsMTEgKzEyMCwxMjcgQEAgdm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRl
cihjb25zdCBXZWJWZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QKICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAotICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZmZXIgaW50byBz
bWFsbGVyIGNodW5rcyB3aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBvdGhlci4KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9yZW5kZXJDb3VudFBlckNhbGxiYWNrOyArK2kp
IHsKLSAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgwLCBhdWRpb0RhdGFbMF0g
KyBpICogcmVuZGVyQnVmZmVyU2l6ZSwgcmVuZGVyQnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1fcmVu
ZGVyQnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVkaW9EYXRhWzFdICsgaSAqIHJlbmRlckJ1ZmZl
clNpemUsIHJlbmRlckJ1ZmZlclNpemUpOwotICAgICAgICBtX3Byb3ZpZGVyLnByb3ZpZGVJbnB1
dCgmbV9yZW5kZXJCdXMsIHJlbmRlckJ1ZmZlclNpemUpOworICAgIG1fcmVuZGVyQnVzLnNldENo
YW5uZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdLCBudW1iZXJPZkZyYW1lcyk7CisgICAgbV9yZW5k
ZXJCdXMuc2V0Q2hhbm5lbE1lbW9yeSgxLCBhdWRpb0RhdGFbMV0sIG51bWJlck9mRnJhbWVzKTsK
KyAgICBtX2ZpZm8tPmNvbnN1bWUoJm1fcmVuZGVyQnVzLCBudW1iZXJPZkZyYW1lcyk7Cit9CisK
K0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6RklGTzo6RklGTyhBdWRpb1NvdXJjZVByb3ZpZGVy
JiBwcm92aWRlciwgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZpZm9MZW5ndGgs
IHNpemVfdCBwcm92aWRlclNpemUpCisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICwg
bV9maWZvQXVkaW9CdXMobnVtYmVyT2ZDaGFubmVscywgZmlmb0xlbmd0aCkKKyAgICAsIG1fZmlm
b0xlbmd0aChmaWZvTGVuZ3RoKQorICAgICwgbV9mcmFtZXNJbkZpZm8oMCkKKyAgICAsIG1fcmVh
ZEluZGV4KDApCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAsIG1fcHJvdmlkZXJTaXplKHBy
b3ZpZGVyU2l6ZSkKKyAgICAsIG1fdGVtcEJ1cyhudW1iZXJPZkNoYW5uZWxzLCBwcm92aWRlclNp
emUpCit7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpGSUZPOjpjb25zdW1l
KEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1RvQ29uc3VtZSkKK3sKKyAgICBi
b29sIGlzR29vZCA9IGRlc3RpbmF0aW9uICYmIChmcmFtZXNUb0NvbnN1bWUgPD0gbV9maWZvTGVu
Z3RoKTsKKyAgICBBU1NFUlQoaXNHb29kKTsKKyAgICBpZiAoIWlzR29vZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGZyYW1lc1RvQ29uc3VtZSA+IG1fZnJhbWVzSW5GaWZvKSB7CisgICAg
ICAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgaW4gdGhlIEZJRk8gdG8gZnVsZmlsbCB0
aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gQXNrIGZvciBtb3JlIGRhdGEuCisgICAgICAgIGZpbGxC
dWZmZXIoZnJhbWVzVG9Db25zdW1lIC0gbV9mcmFtZXNJbkZpZm8pOworICAgIH0KKworICAgIC8v
IFdlIGhhdmUgZW5vdWdoIGRhdGEgbm93LiBDb3B5IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHNh
bXBsZXMKKyAgICAvLyB0byB0aGUgZGVzdGluYXRpb24uCisKKyAgICBzaXplX3QgcGFydDFMZW5n
dGg7CisgICAgc2l6ZV90IHBhcnQyTGVuZ3RoOworICAgIGZpbmRXcmFwTGVuZ3RocyhtX3JlYWRJ
bmRleCwgZnJhbWVzVG9Db25zdW1lLCBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGgpOworCisgICAg
c2l6ZV90IG51bWJlck9mQ2hhbm5lbHMgPSBtX2ZpZm9BdWRpb0J1cy5udW1iZXJPZkNoYW5uZWxz
KCk7CisKKyAgICBmb3IgKHNpemVfdCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBu
dW1iZXJPZkNoYW5uZWxzOyArK2NoYW5uZWxJbmRleCkgeworICAgICAgICBmbG9hdCogZGVzdGlu
YXRpb25EYXRhID0gZGVzdGluYXRpb24tPmNoYW5uZWwoY2hhbm5lbEluZGV4KS0+ZGF0YSgpOwor
ICAgICAgICBmbG9hdCogc291cmNlRGF0YSA9IG1fZmlmb0F1ZGlvQnVzLmNoYW5uZWwoY2hhbm5l
bEluZGV4KS0+ZGF0YSgpOworCisgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9ICgobV9yZWFkSW5k
ZXggPCBtX2ZpZm9MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobV9yZWFk
SW5kZXggKyBwYXJ0MUxlbmd0aCkgPD0gbV9maWZvTGVuZ3RoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmJiAocGFydDFMZW5ndGggPD0gZGVzdGluYXRpb24tPmxlbmd0aCgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJiYgKHBhcnQxTGVuZ3RoICsgcGFydDJMZW5ndGgpIDw9IGRl
c3RpbmF0aW9uLT5sZW5ndGgoKSk7CisgICAgICAgIEFTU0VSVChpc0NvcHlHb29kKTsKKyAgICAg
ICAgaWYgKCFpc0NvcHlHb29kKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG1lbWNw
eShkZXN0aW5hdGlvbkRhdGEsIHNvdXJjZURhdGEgKyBtX3JlYWRJbmRleCwgcGFydDFMZW5ndGgg
KiBzaXplb2YoKnNvdXJjZURhdGEpKTsKKyAgICAgICAgLy8gSGFuZGxlIHdyYXAgYXJvdW5kIG9m
IHRoZSBGSUZPLCBpZiBuZWVkZWQuCisgICAgICAgIGlmIChwYXJ0Mkxlbmd0aCA+IDApCisgICAg
ICAgICAgICBtZW1jcHkoZGVzdGluYXRpb25EYXRhICsgcGFydDFMZW5ndGgsIHNvdXJjZURhdGEs
IHBhcnQyTGVuZ3RoICogc2l6ZW9mKCpzb3VyY2VEYXRhKSk7CisgICAgfQorICAgIG1fcmVhZElu
ZGV4ID0gdXBkYXRlSW5kZXgobV9yZWFkSW5kZXgsIGZyYW1lc1RvQ29uc3VtZSk7CisgICAgbV9m
cmFtZXNJbkZpZm8gLT0gZnJhbWVzVG9Db25zdW1lOworICAgIEFTU0VSVChtX2ZyYW1lc0luRmlm
byA+PSAwKTsKK30KKwordm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkZJRk86OmZpbmRX
cmFwTGVuZ3RocyhzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplLCBzaXplX3QmIHBhcnQxTGVuZ3Ro
LCBzaXplX3QmIHBhcnQyTGVuZ3RoKQoreworICAgIEFTU0VSVChpbmRleCA8IG1fZmlmb0xlbmd0
aCAmJiBzaXplIDw9IG1fZmlmb0xlbmd0aCk7CisgICAgaWYgKGluZGV4IDwgbV9maWZvTGVuZ3Ro
ICYmIHNpemUgPD0gbV9maWZvTGVuZ3RoKSB7CisgICAgICAgIGlmIChpbmRleCArIHNpemUgPiBt
X2ZpZm9MZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gd3JhcC4gRmlndXJlIG91dCB0
aGUgbGVuZ3RoIG9mIGVhY2ggcGllY2UuCisgICAgICAgICAgICBwYXJ0MUxlbmd0aCA9IG1fZmlm
b0xlbmd0aCAtIGluZGV4OworICAgICAgICAgICAgcGFydDJMZW5ndGggPSBzaXplIC0gcGFydDFM
ZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyB3cmFwIG5lZWRlZC4K
KyAgICAgICAgICAgIHBhcnQxTGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgICAgIHBhcnQyTGVuZ3Ro
ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludmFsaWQgdmFsdWVz
IGZvciBpbmRleCBvciBzaXplLiBTZXQgdGhlIHBhcnQgbGVuZ3RocyB0bworICAgICAgICAvLyB6
ZXJvIHNvIG5vdGhpbmcgaXMgY29waWVkLgorICAgICAgICBwYXJ0MUxlbmd0aCA9IDA7CisgICAg
ICAgIHBhcnQyTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtOjpGSUZPOjpmaWxsQnVmZmVyKHNpemVfdCBudW1iZXJPZkZyYW1lcykKK3sKKyAgICAv
LyBLZWVwIGFza2luZyB0aGUgcHJvdmlkZXIgdG8gZ2l2ZSB1cyBkYXRhIHVudGlsIHdlIGhhdmUg
cmVjZWl2ZWQKKyAgICAvLyBhdCBsZWFzdCB8bnVtYmVyT2ZGcmFtZXN8IG9mIGRhdGEuIFN0dWZm
IHRoZSBkYXRhIGludG8gdGhlCisgICAgLy8gRklGTy4KKyAgICBzaXplX3QgZnJhbWVzUHJvdmlk
ZWQgPSAwOworCisgICAgd2hpbGUgKGZyYW1lc1Byb3ZpZGVkIDwgbnVtYmVyT2ZGcmFtZXMpIHsK
KyAgICAgICAgbV9wcm92aWRlci5wcm92aWRlSW5wdXQoJm1fdGVtcEJ1cywgbV9wcm92aWRlclNp
emUpOworCisgICAgICAgIHNpemVfdCBwYXJ0MUxlbmd0aDsKKyAgICAgICAgc2l6ZV90IHBhcnQy
TGVuZ3RoOworICAgICAgICBmaW5kV3JhcExlbmd0aHMobV93cml0ZUluZGV4LCBtX3Byb3ZpZGVy
U2l6ZSwgcGFydDFMZW5ndGgsIHBhcnQyTGVuZ3RoKTsKKworICAgICAgICBzaXplX3QgbnVtYmVy
T2ZDaGFubmVscyA9IG1fZmlmb0F1ZGlvQnVzLm51bWJlck9mQ2hhbm5lbHMoKTsKKyAgICAgICAg
CisgICAgICAgIGZvciAoc2l6ZV90IGNoYW5uZWxJbmRleCA9IDA7IGNoYW5uZWxJbmRleCA8IG51
bWJlck9mQ2hhbm5lbHM7ICsrY2hhbm5lbEluZGV4KSB7CisgICAgICAgICAgICBmbG9hdCogZGVz
dGluYXRpb24gPSBtX2ZpZm9BdWRpb0J1cy5jaGFubmVsKGNoYW5uZWxJbmRleCktPmRhdGEoKTsK
KyAgICAgICAgICAgIGZsb2F0KiBzb3VyY2UgPSBtX3RlbXBCdXMuY2hhbm5lbChjaGFubmVsSW5k
ZXgpLT5kYXRhKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNDb3B5R29vZCA9IChwYXJ0MUxlbmd0
aCA8PSBtX3Byb3ZpZGVyU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChw
YXJ0MUxlbmd0aCArIHBhcnQyTGVuZ3RoKSA8PSBtX3Byb3ZpZGVyU2l6ZQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICYmIChtX3dyaXRlSW5kZXggPCBtX2ZpZm9MZW5ndGgpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1fd3JpdGVJbmRleCArIHBhcnQxTGVuZ3Ro
KSA8PSBtX2ZpZm9MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJ0
Mkxlbmd0aCA8IG1fZmlmb0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlQoaXNDb3B5R29vZCk7
CisgICAgICAgICAgICBpZiAoIWlzQ29weUdvb2QpCisgICAgICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24gKyBtX3dyaXRlSW5kZXgsIHNvdXJjZSwg
cGFydDFMZW5ndGggKiBzaXplb2YoKmRlc3RpbmF0aW9uKSk7CisgICAgICAgICAgICAvLyBIYW5k
bGUgd3JhcCBhcm91bmQgb2YgdGhlIEZJRk8sIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChw
YXJ0Mkxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBzb3Vy
Y2UgKyBwYXJ0MUxlbmd0aCwgcGFydDJMZW5ndGggKiBzaXplb2YoKmRlc3RpbmF0aW9uKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBtX2ZyYW1lc0luRmlmbyArPSBtX3Byb3ZpZGVyU2l6ZTsKKyAg
ICAgICAgQVNTRVJUKG1fZnJhbWVzSW5GaWZvIDw9IG1fZmlmb0xlbmd0aCk7CisgICAgICAgIG1f
d3JpdGVJbmRleCA9IHVwZGF0ZUluZGV4KG1fd3JpdGVJbmRleCwgbV9wcm92aWRlclNpemUpOwor
ICAgICAgICBmcmFtZXNQcm92aWRlZCArPSBtX3Byb3ZpZGVyU2l6ZTsKICAgICB9CiB9CiAKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJv
bWl1bS5oIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9t
aXVtLmgKaW5kZXggMTNhM2Y1MmZkODNmN2Q3MmJjMGYwYTRiY2ZmZDNiMDNhMGRhMTdhZC4uMjA0
YzE2YjRkNWM5NzBlYWJkMDQzODBkZTVmMmNjMjliNTg1NWI3NiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmgKKysrIGIvU291
cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmgKQEAgLTMx
LDYgKzMxLDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvQnVzLmgiCiAjaW5jbHVkZSAiQXVkaW9EZXN0
aW5hdGlvbi5oIgorI2luY2x1ZGUgIkF1ZGlvU291cmNlUHJvdmlkZXIuaCIKICNpbmNsdWRlICJX
ZWJBdWRpb0RldmljZS5oIgogI2luY2x1ZGUgIldlYlZlY3Rvci5oIgogCkBAIC01NSwxMyArNTYs
NjQgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoY29uc3QgV2ViS2l0OjpXZWJW
ZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpOwogCiBwcml2
YXRlOgotICAgIEF1ZGlvU291cmNlUHJvdmlkZXImIG1fcHJvdmlkZXI7CisgICAgLy8gQSBGSUZP
IChGaXJzdCBJbiBGaXJzdCBPdXQpIGJ1ZmZlciB0byBoYW5kbGUgbWlzbWF0Y2hlcyBpbiB0aGUK
KyAgICAvLyBhdWRpbyBiYWNrZW5kIGhhcmR3YXJlIGJ1ZmZlciBzaXplIGFuZCB0aGUgV2ViIEF1
ZGlvIHJlbmRlciBzaXplLgorICAgIGNsYXNzIEZJRk8geworICAgIHB1YmxpYzoKKyAgICAgICAg
Ly8gQ3JlYXRlIGEgRklGTyB0aGF0IGdldHMgZGF0YSBmcm9tIHxwcm92aWRlcnwuIFRoZSBGSUZP
IHdpbGwKKyAgICAgICAgLy8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgfGZpZm9MZW5ndGh8IGZy
YW1lcyBvZiBkYXRhIG9mCisgICAgICAgIC8vIHxudW1iZXJPZkNoYW5uZWxzfCBjaGFubmVscy4g
VGhlIEF1ZGlvU291cmNlUHJvdmlkZXIgd2lsbAorICAgICAgICAvLyBiZSBhc2tlZCB0byBwcm9k
dWNlIHxwcm92aWRlclNpemV8IGZyYW1lcyB3aGVuIHRoZSBGSUZPCisgICAgICAgIC8vIG5lZWRz
IG1vcmUgZGF0YS4KKyAgICAgICAgRklGTyhBdWRpb1NvdXJjZVByb3ZpZGVyJiBwcm92aWRlciwg
dW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscywgc2l6ZV90IGZpZm9MZW5ndGgsIHNpemVfdCBwcm92
aWRlclNpemUpOworCisgICAgICAgIC8vIFJlYWQgfGZyYW1lc1RvQ29uc3VtZXwgZnJhbWVzIGZy
b20gdGhlIEZJRk8gaW50byB0aGUKKyAgICAgICAgLy8gZGVzdGluYXRpb24uIElmIHRoZSBGSUZP
IGRvZXMgbm90IGhhdmUgZW5vdWdoIGRhdGEsIHdlIGFzaworICAgICAgICAvLyB0aGUgfHByb3Zp
ZGVyfCB0byBnZXQgbW9yZSBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisgICAgICAgIHZv
aWQgY29uc3VtZShBdWRpb0J1cyogZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb0NvbnN1bWUp
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBGSUZPIGluZGV4IGJ5IHRo
ZSBzdGVwLCB3aXRoIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIHdyYXBwaW5nIGFyb3VuZCB0aGUg
ZW5kcG9pbnQuCisgICAgICAgIGludCB1cGRhdGVJbmRleChpbnQgaW5kZXgsIGludCBzdGVwKSB7
IHJldHVybiAoaW5kZXggKyBzdGVwKSAlIG1fZmlmb0xlbmd0aDsgfQorCisgICAgICAgIHZvaWQg
ZmluZFdyYXBMZW5ndGhzKHNpemVfdCBpbmRleCwgc2l6ZV90IHByb3ZpZGVyU2l6ZSwgc2l6ZV90
JiBwYXJ0MUxlbmd0aCwgc2l6ZV90JiBwYXJ0Mkxlbmd0aCk7CisgICAgICAgIAorICAgICAgICAv
LyBGaWxsIHRoZSBGSUZPIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IHxudW1iZXJPZkZyYW1lc3wgbW9y
ZSBkYXRhLgorICAgICAgICB2b2lkIGZpbGxCdWZmZXIoc2l6ZV90IG51bWJlck9mRnJhbWVzKTsK
KworICAgICAgICAvLyBUaGUgcHJvdmlkZXIgb2YgdGhlIGRhdGEgaW4gb3VyIEZJRk8uCisgICAg
ICAgIEF1ZGlvU291cmNlUHJvdmlkZXImIG1fcHJvdmlkZXI7CisKKyAgICAgICAgLy8gVGhlIEZJ
Rk8gaXRzZWxmLiBJbiByZWFsaXR5LCB0aGUgRklGTyBpcyBhIGNpcmN1bGFyIGJ1ZmZlci4KKyAg
ICAgICAgQXVkaW9CdXMgbV9maWZvQXVkaW9CdXM7CisKKyAgICAgICAgLy8gVGhlIHRvdGFsIGF2
YWlsYWJsZSBzcGFjZSBpbiB0aGUgRklGTy4KKyAgICAgICAgc2l6ZV90IG1fZmlmb0xlbmd0aDsK
KworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGFjdHVhbCBlbGVtZW50cyBpbiB0aGUgRklGTwor
ICAgICAgICBzaXplX3QgbV9mcmFtZXNJbkZpZm87CisKKyAgICAgICAgLy8gV2hlcmUgdG8gc3Rh
cnQgcmVhZGluZyBmcm9tIHRoZSBGSUZPLgorICAgICAgICBzaXplX3QgbV9yZWFkSW5kZXg7CisK
KyAgICAgICAgLy8gV2hlcmUgdG8gc3RhcnQgd3JpdGluZyB0byB0aGUgRklGTy4KKyAgICAgICAg
c2l6ZV90IG1fd3JpdGVJbmRleDsKKworICAgICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIG9mIGRh
dGEgdGhhdCB0aGUgcHJvdmlkZXIgd2lsbCBwcm9kdWNlIHBlciBjYWxsLgorICAgICAgICB1bnNp
Z25lZCBpbnQgbV9wcm92aWRlclNpemU7CisKKyAgICAgICAgLy8gVGVtcG9yYXJ5IHdvcmtzcGFj
ZSB0byBob2xkIHRoZSBkYXRhIGZyb20gdGhlIHByb3ZpZGVyLgorICAgICAgICBBdWRpb0J1cyBt
X3RlbXBCdXM7CisgICAgfTsKKworQXVkaW9Tb3VyY2VQcm92aWRlciYgbV9wcm92aWRlcjsKICAg
ICBBdWRpb0J1cyBtX3JlbmRlckJ1czsKICAgICBmbG9hdCBtX3NhbXBsZVJhdGU7CiAgICAgYm9v
bCBtX2lzUGxheWluZzsKICAgICBPd25QdHI8V2ViS2l0OjpXZWJBdWRpb0RldmljZT4gbV9hdWRp
b0RldmljZTsKICAgICBzaXplX3QgbV9jYWxsYmFja0J1ZmZlclNpemU7Ci0gICAgdW5zaWduZWQg
bV9yZW5kZXJDb3VudFBlckNhbGxiYWNrOworICAgIE93blB0cjxGSUZPPiBtX2ZpZm87CiB9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>