<?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>46374</bug_id>
          
          <creation_ts>2010-09-23 10:44:50 -0700</creation_ts>
          <short_desc>[Chromium] FontLinux performance improvement and cleanup</short_desc>
          <delta_ts>2010-09-30 16:29:06 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Linux</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="Xiaomei Ji">xji</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>agl</cc>
    
    <cc>evan</cc>
    
    <cc>jamesr</cc>
    
    <cc>levin</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>283770</commentid>
    <comment_count>0</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-23 10:44:50 -0700</bug_when>
    <thetext>On behalf of Claire who investigated the problem in Android.

ChangeSet #61795 (http://trac.webkit.org/changeset/61795/trunk/WebCore/platform/graphics/chromium/FontLinux.cpp) did FontLinux.cpp cleanup to fix the complex script overlap problem. The problem is fixed probably by delete and new glyph arrays so the arrays are clean when use. Now, the overlap issue is gone but Android team reported there is a core dump in FontAndroid.cpp which is similar to FontLinux.cpp in Chrome.
While investing the new core dump problem, Claire found there is unnecessary free/new memory in the code. Here is the high level code structure:

Font:: *ComplexText
  ...
  while (walker.nextScriptRun()) {
   ....
  }
...

bool nextScriptRun() {
   ...
   shapeGlyphs();
   ...
}

void shapeGlyphs() {
   ...
   for (;;) {
       if (HB_ShapeItem(&amp;m_item))  ==&gt; m_item.num_glyphs is changed after this call.
          break;
       deleteGlyphArrays();  
       createGlyphArrays(m_item.num_glyphs);
        ==&gt; delete/createGlyphArrays are hit if m_item.num_glyphs &gt; previous m_item.num_glyphs
   ...
}

HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
{
    HB_Bool result = false;
    if (shaper_item-&gt;num_glyphs &lt; shaper_item-&gt;item.length) {
        shaper_item-&gt;num_glyphs = shaper_item-&gt;item.length;
        return false;
    }
    ...
}

So, Claire proposed to resume the setting of m_item.num_glyphs = m_maxGlyphs before HB_ShapeItem() call to minimize the number of delete/new and always cleanup all glyph arrays before re-using them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283782</commentid>
    <comment_count>1</comment_count>
      <attachid>68550</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-23 10:57:06 -0700</bug_when>
    <thetext>Created attachment 68550
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283786</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-23 11:01:32 -0700</bug_when>
    <thetext>Attachment 68550 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/chromium/FontLinux.cpp:488:  One space before end of line comments  [whitespace/comments] [5]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283819</commentid>
    <comment_count>3</comment_count>
      <attachid>68557</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-23 12:03:40 -0700</bug_when>
    <thetext>Created attachment 68557
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283841</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2010-09-23 12:22:00 -0700</bug_when>
    <thetext>By my reading this patch ends up zeroing already zeroed memory and saves no allocations. Maybe I&apos;m missing something, but I think you need to be clearer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>283909</commentid>
    <comment_count>5</comment_count>
      <attachid>68557</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-09-23 13:27:02 -0700</bug_when>
    <thetext>Comment on attachment 68557
patch

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

Is this optimization worthwhile? Is it good to keep around larger arrays than you need?

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:488
&gt; +        m_glyphsArraySize = size; // Save the GlyphArrays size.

It seems like m_glyphsArrayCapacity (or max capacity) may be a better term here to reflect the fact that it stores the maximum size of the arrays.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:492
&gt; +    void resetGlyphArrays(int size)

Why pass in size? Just use m_item.num_glyphs.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:506
&gt; +        // Reset the array limit becuase HB_ShapeItem() overrides the

s/becuase/because/

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:507
&gt; +        // m_item.num_glyphs.

This comment is very unclear. As I understand it, you&apos;re trying to say that the capacity of the arrays may be larger than the current value of m_item.num_glyphs  due to a previous call to HB_ShapeItem which used less space than was available.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:509
&gt; +        resetGlyphArrays(m_glyphsArraySize);

This shouldn&apos;t be done unless the current glyphs aren&apos;t deleted (or else you are zero&apos;ing out stuff that doesn&apos;t need to be cleared).  btw, is it a bug in the old code that the for loop could have exited without clearing the glyphs if the array was big enough to hold them?

One solution to this issue is to make a separate api for allocate that doesn&apos;t reset the arrays. Only call the allocate array inside of this loop and then call the reset function after the loop exits.

&gt; WebCore/platform/graphics/chromium/FontLinux.cpp:611
&gt; +    unsigned m_glyphsArraySize; // Current size of all the Harfbuzz arrays.

I would say capacity instead of size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284164</commentid>
    <comment_count>6</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-23 18:13:14 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; By my reading this patch ends up zeroing already zeroed memory and saves no allocations. Maybe I&apos;m missing something, but I think you need to be clearer.

Using http://www.google.ae/preferences?hl=ar  as an example.

Following is the change of m_item.num_glyphs after the call of HB_ShapeItem().

54 --&gt; 5
5 --&gt; 1
1 --&gt; 8
.....

The array is zero-ed initially (with size 54), so there is no problem when shaping the first script run.
After shaping, the m_item.num_glyphs changed to 5.

Then, when shaping next script run, since there is enough space available for HB_ShapeItem(), no deleteGlypyArrays/createGlyphArrays will be called, *but* the no zero-ing array is called either, so the next script run&apos;s shaping is based on a dirty array. This is one issue the patch addressed.

In the 3rd script run, although there is actually an array of size 54, the recorded num_glyphs is 1, and it is less than the needed size, so, array of size 54 is deleted and an array of size 8 is created. 
The increase of num_glyphs from one run to its next is not uncommon. And above delete/new will introduce extra overhead. This is the 2nd issue the patch addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284174</commentid>
    <comment_count>7</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-23 18:34:47 -0700</bug_when>
    <thetext>Thanks for the review. Please see my comments inline.

(In reply to comment #5)
&gt; (From update of attachment 68557 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=68557&amp;action=review
&gt; 
&gt; Is this optimization worthwhile? Is it good to keep around larger arrays than you need?

Using http://www.google.ae/preferences?hl=ar as an example, the deleteGlyphArrays()/createGlyphArrays() is hit 1096 times during loading the page.

But I do not have much idea on how large one text run could be.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:488
&gt; &gt; +        m_glyphsArraySize = size; // Save the GlyphArrays size.
&gt; 
&gt; It seems like m_glyphsArrayCapacity (or max capacity) may be a better term here to reflect the fact that it stores the maximum size of the arrays.

Done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:492
&gt; &gt; +    void resetGlyphArrays(int size)
&gt; 
&gt; Why pass in size? Just use m_item.num_glyphs.

Done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:506
&gt; &gt; +        // Reset the array limit becuase HB_ShapeItem() overrides the
&gt; 
&gt; s/becuase/because/

Done.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:507
&gt; &gt; +        // m_item.num_glyphs.
&gt; 
&gt; This comment is very unclear. As I understand it, you&apos;re trying to say that the capacity of the arrays may be larger than the current value of m_item.num_glyphs  due to a previous call to HB_ShapeItem which used less space than was available.

You are right. Changed comments.

&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:509
&gt; &gt; +        resetGlyphArrays(m_glyphsArraySize);
&gt; 
&gt; This shouldn&apos;t be done unless the current glyphs aren&apos;t deleted (or else you are zero&apos;ing out stuff that doesn&apos;t need to be cleared).  btw, is it a bug in the old code that the for loop could have exited without clearing the glyphs if the array was big enough to hold them?


As I understand, this function only be called once for one run. So, there is no data sharing problem within one run, and the data should not be shared between different runs. Adam, Evan, please chime in on whether the assumption is correct.

The zero&apos;ing out stuff is done right at the beginning of the function, not within the &quot;for&quot; loop inside the function, it should be correct based on the above assumption.

And yes you are right that the old code exit the for loop without clearing the glyphs if the array was big enough to hold them. It is exactly the problem the fix is solving. But we should not clean the buffer after exit for loop since the content of the buffer might be used for subsequent operations. Instead, the fix cleans the buffer before re-use it (a bit waste since it does not need to clean those not dirty ones, but memset should be fast enough, I think).
 

&gt; 
&gt; One solution to this issue is to make a separate api for allocate that doesn&apos;t reset the arrays. Only call the allocate array inside of this loop and then call the reset function after the loop exits.
&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontLinux.cpp:611
&gt; &gt; +    unsigned m_glyphsArraySize; // Current size of all the Harfbuzz arrays.
&gt; 
&gt; I would say capacity instead of size.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284424</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2010-09-24 09:11:10 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Following is the change of m_item.num_glyphs after the call of HB_ShapeItem().
&gt; 
&gt; 54 --&gt; 5
&gt; 5 --&gt; 1
&gt; 1 --&gt; 8
&gt; .....

&lt;snip&gt;

Given the above I understand what the patch is trying to do and LGTM with David&apos;s comments address. However, the ChangeLog description needs to be made a lot clearer, ideally by using the explanation from #6.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284842</commentid>
    <comment_count>9</comment_count>
      <attachid>68789</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-24 16:34:25 -0700</bug_when>
    <thetext>Created attachment 68789
patch

patch address David&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284871</commentid>
    <comment_count>10</comment_count>
      <attachid>68789</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-09-24 17:39:47 -0700</bug_when>
    <thetext>Comment on attachment 68789
patch

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

Please consider adjusting the ChangeLog.

&gt; WebCore/ChangeLog:46
&gt; +        and new glyph arrays so the arrays in use are clean initially.
&gt; +        But it introduced more delete/new operation which might be a problem in
&gt; +        memory tight devices (such as Android device).
&gt; +
&gt; +        This fix proposed to
&gt; +        1. resume the setting of 
&gt; +        m_item.num_glyphs = m_maxGlyphs before HB_ShapeItem() call to minimize
&gt; +        the number of delete/new operations
&gt; +        2. always cleanup the glyph arrays before re-use them to make sure
&gt; +        the arrays in use are clean initially.
&gt; +
&gt; +        Using http://www.google.ae/preferences?hl=ar as an example.
&gt; +
&gt; +        Following is the change of m_item.num_glyphs after the call of HB_ShapeItem().
&gt; +
&gt; +        54 --&gt; 5
&gt; +        5 --&gt; 1
&gt; +        1 --&gt; 8
&gt; +        .....
&gt; +
&gt; +        The array is zero-ed initially (with size 54), so there is no problem
&gt; +        when shaping the first script run. After shaping, the m_item.num_glyphs
&gt; +        changed to 5.
&gt;  
&gt; +        Then, when shaping next script run, since there is enough space available
&gt; +        for HB_ShapeItem(), no deleteGlypyArrays/createGlyphArrays will be called,
&gt; +        but zero-ing array is not called either, so the next script run&apos;s
&gt; +        shaping is based on a dirty array. This is 2nd issue mentioned above that
&gt; +        the patch addresses.
&gt; +
&gt; +        In the 3rd script run, although there is actually an array of size 54,
&gt; +        the recorded num_glyphs is 1, and it is less than the needed size, so,
&gt; +        array of size 54 is deleted and an array of size 8 is created. 
&gt; +        The increase of num_glyphs from one run to its next is not uncommon. 
&gt; +        It is hit 1096 times during loading the above example page. So the
&gt; +        delete/new will introduce extra overhead. This is the 1st issue mentioned
&gt; +        above that the patch addresses.
&gt; +

This is a bit verbose.

How about this: 

Reduce new/delete operations by storing the maximum capacity of the glyph array and use value that
in subsequent HB_ShapeItem calls. (Note that a call to HB_ShapeItem may reduce the value of m_item.num_glyphs
below the capacity.)

Also be consistent with zero&apos;ing the glyph arrays before calling HB_ShapeItem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286690</commentid>
    <comment_count>11</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-28 18:38:24 -0700</bug_when>
    <thetext>Committed r68618: &lt;http://trac.webkit.org/changeset/68618&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286692</commentid>
    <comment_count>12</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-28 18:41:54 -0700</bug_when>
    <thetext>Due to my mistake on git commit, I&apos;ve committed a set of unsquashed commits for the bug.

http://trac.webkit.org/changeset/68618  is the revert of the batch commits.
And I will recommit the fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286960</commentid>
    <comment_count>13</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-29 10:33:05 -0700</bug_when>
    <thetext>Committed r68660: &lt;http://trac.webkit.org/changeset/68660&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287902</commentid>
    <comment_count>14</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-30 16:09:55 -0700</bug_when>
    <thetext>This changed the behavior of fast/text/international/thai-baht-space.html.

It used to produce this output: http://trac.webkit.org/export/61795/trunk/LayoutTests/platform/chromium-linux/fast/text/international/thai-baht-space-expected.png

Now it produces this: http://trac.webkit.org/export/68847/trunk/LayoutTests/platform/chromium-linux/fast/text/international/thai-baht-space-expected.png

Is this an expected change or a regression?  I know when I&apos;ve tried to do cleanups in FontLinux.cpp before I&apos;ve accidentally broken this test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287910</commentid>
    <comment_count>15</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-09-30 16:18:15 -0700</bug_when>
    <thetext>The new one looks more correct to me (compare it against the expected images from other platforms)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287916</commentid>
    <comment_count>16</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2010-09-30 16:26:22 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; This changed the behavior of fast/text/international/thai-baht-space.html.
&gt; 
&gt; It used to produce this output: http://trac.webkit.org/export/61795/trunk/LayoutTests/platform/chromium-linux/fast/text/international/thai-baht-space-expected.png
&gt; 
&gt; Now it produces this: http://trac.webkit.org/export/68847/trunk/LayoutTests/platform/chromium-linux/fast/text/international/thai-baht-space-expected.png
&gt; 
&gt; Is this an expected change or a regression?  I know when I&apos;ve tried to do cleanups in FontLinux.cpp before I&apos;ve accidentally broken this test.


Verified with Jungshik and the new one is correct.
The difference is space before or after 5 around 5000. It should be before.
I had problem with rebaseline and thanks hclam for rebaselining.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287917</commentid>
    <comment_count>17</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-30 16:29:06 -0700</bug_when>
    <thetext>Awesome!  Thanks for looking.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68550</attachid>
            <date>2010-09-23 10:57:06 -0700</date>
            <delta_ts>2010-09-23 12:04:06 -0700</delta_ts>
            <desc>patch</desc>
            <filename>46374.v1</filename>
            <type>text/plain</type>
            <size>3921</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MThmMmY1Ni4uYjFlYjIxZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOCBAQAorMjAxMC0wOS0yMyAgWGlhb21laSBKaSAg
PHhqaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIEZvbnRMaW51eC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2Mzc0CisKKyAgICAg
ICAgQ2hhbmdzZXQgNjE3OTUgZml4ZWQgY29tcGxleCBzY3JpcHQgb3ZlcmxhcCBwcm9ibGVtIChw
cm9iYWJseSkgYnkgZGVsZXRlCisgICAgICAgIGFuZCBuZXcgZ2x5cGggYXJyYXlzIHNvIHRoZSBh
cnJheXMgaW4gdXNlIGFyZSBjbGVhbiBpbml0aWFsbHkuCisgICAgICAgIEJ1dCBpdCBpbnRyb2R1
Y2VkIG1vcmUgZGVsZXRlL25ldyBvcGVyYXRpb24gd2hpY2ggbWlnaHQgYmUgYSBwcm9ibGVtIGlu
CisgICAgICAgIG1lbW9yeSB0aWdodCBkZXZpY2VzIChzdWNoIGFzIEFuZHJvaWQgZGV2aWNlKS4K
KyAgICAgICAgVGhpcyBmaXggcHJvcG9zZWQgdG8KKyAgICAgICAgMS4gcmVzdW1lIHRoZSBzZXR0
aW5nIG9mIAorICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzIGJlZm9yZSBI
Ql9TaGFwZUl0ZW0oKSBjYWxsIHRvIG1pbmltaXplCisgICAgICAgIHRoZSBudW1iZXIgb2YgZGVs
ZXRlL25ldyBvcGVyYXRpb25zCisgICAgICAgIDIuIGFsd2F5cyBjbGVhbnVwIHRoZSBnbHlwaCBh
cnJheXMgYmVmb3JlIHJlLXVzZSB0aGVtIHRvIG1ha2Ugc3VyZQorICAgICAgICB0aGUgYXJyYXlz
IGluIHVzZSBhcmUgY2xlYW4gaW5pdGlhbGx5LgorCisgICAgICAgIFRoZXJlIGlzIG5vIGZ1bmN0
aW9uYWxpdHkgY2hhbmdlcyBzbyBubyBuZXcgdGVzdHMgYXJlIGFkZGVkLgorCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRSdW5XYWxrZXI6OmNyZWF0ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6
OlRleHRSdW5XYWxrZXI6OnJlc2V0R2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6c2hhcGVHbHlwaHMpOgorCiAyMDEwLTA5LTIyICBFcmlrIEFydmlkc3NvbiAg
PGFydkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmF0ZSBDaGFwaW4uCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAKaW5k
ZXggNjk2Y2Q5Yy4uM2Y0MTYxZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Gb250TGludXguY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRm9udExpbnV4LmNwcApAQCAtNDc3LDI2ICs0NzcsMzcgQEAgcHJpdmF0ZToKICAg
ICB2b2lkIGNyZWF0ZUdseXBoQXJyYXlzKGludCBzaXplKQogICAgIHsKICAgICAgICAgbV9pdGVt
LmdseXBocyA9IG5ldyBIQl9HbHlwaFtzaXplXTsKLSAgICAgICAgbWVtc2V0KG1faXRlbS5nbHlw
aHMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGgpKTsKICAgICAgICAgbV9pdGVtLmF0dHJpYnV0
ZXMgPSBuZXcgSEJfR2x5cGhBdHRyaWJ1dGVzW3NpemVdOwotICAgICAgICBtZW1zZXQobV9pdGVt
LmF0dHJpYnV0ZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGhBdHRyaWJ1dGVzKSk7CiAgICAg
ICAgIG1faXRlbS5hZHZhbmNlcyA9IG5ldyBIQl9GaXhlZFtzaXplXTsKLSAgICAgICAgbWVtc2V0
KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZCkpOwogICAgICAgICBt
X2l0ZW0ub2Zmc2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50W3NpemVdOwotICAgICAgICBtZW1zZXQo
bV9pdGVtLm9mZnNldHMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWRQb2ludCkpOwogCiAgICAg
ICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07CiAgICAgICAgIG1feFBvc2l0aW9u
cyA9IG5ldyBTa1NjYWxhcltzaXplXTsKIAogICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IHNp
emU7CisgICAgICAgIG1fZ2x5cGhzQXJyYXlTaXplID0gc2l6ZTsgIC8vIFNhdmUgdGhlIEdseXBo
QXJyYXlzIHNpemUuCisgICAgICAgIHJlc2V0R2x5cGhBcnJheXMobV9nbHlwaHNBcnJheVNpemUp
OwogICAgIH0KIAotICAgIHZvaWQgc2hhcGVHbHlwaHMoKQorICAgIHZvaWQgcmVzZXRHbHlwaEFy
cmF5cyhpbnQgc2l6ZSkKICAgICB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGlm
IChIQl9TaGFwZUl0ZW0oJm1faXRlbSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IC8vIEFsbCB0aGUgdHlwZXMgaGVyZSBkb24ndCBoYXZlIHBvaW50ZXJzLiBJdCBpcyBzYWZlIHRv
IHJlc2V0IHRvCisgICAgICAgIC8vIHplcm8gdW5sZXNzIEhhcmZidXp6IGJyZWFrcyB0aGUgY29t
cGF0aWJpbGl0eSBpbiB0aGUgZnV0dXJlLgorICAgICAgICBtZW1zZXQobV9pdGVtLmdseXBocywg
MCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaCkpOworICAgICAgICBtZW1zZXQobV9pdGVtLmF0dHJp
YnV0ZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGhBdHRyaWJ1dGVzKSk7CisgICAgICAgIG1l
bXNldChtX2l0ZW0uYWR2YW5jZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWQpKTsKKyAgICAg
ICAgbWVtc2V0KG1faXRlbS5vZmZzZXRzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkUG9pbnQp
KTsKKyAgICAgICAgbWVtc2V0KG1fZ2x5cGhzMTYsIDAsIHNpemUgKiBzaXplb2YodWludDE2X3Qp
KTsKKyAgICAgICAgbWVtc2V0KG1feFBvc2l0aW9ucywgMCwgc2l6ZSAqIHNpemVvZihTa1NjYWxh
cikpOworICAgIH0KIAorICAgIHZvaWQgc2hhcGVHbHlwaHMoKQorICAgIHsKKyAgICAgICAgLy8g
UmVzZXQgdGhlIGFycmF5IGxpbWl0IGJlY3Vhc2UgSEJfU2hhcGVJdGVtKCkgb3ZlcnJpZGVzIHRo
ZQorICAgICAgICAvLyBtX2l0ZW0ubnVtX2dseXBocy4KKyAgICAgICAgbV9pdGVtLm51bV9nbHlw
aHMgPSBtX2dseXBoc0FycmF5U2l6ZTsKKyAgICAgICAgcmVzZXRHbHlwaEFycmF5cyhtX2dseXBo
c0FycmF5U2l6ZSk7CisgICAgICAgIHdoaWxlICghSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKSB7CiAg
ICAgICAgICAgICAvLyBXZSBvdmVyZmxvd2VkIG91ciBhcnJheXMuIFJlc2l6ZSBhbmQgcmV0cnku
CiAgICAgICAgICAgICAvLyBIQl9TaGFwZUl0ZW0gZmlsbHMgaW4gbV9pdGVtLm51bV9nbHlwaHMg
d2l0aCB0aGUgbmVlZGVkIHNpemUuCiAgICAgICAgICAgICBkZWxldGVHbHlwaEFycmF5cygpOwpA
QCAtNTk3LDYgKzYwOCw3IEBAIHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9vZmZzZXRYOyAvLyBP
ZmZzZXQgaW4gcGl4ZWxzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzY3JpcHQgcnVuLgogICAg
IHVuc2lnbmVkIG1fcGl4ZWxXaWR0aDsgLy8gV2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBz
Y3JpcHQgcnVuLgogICAgIHVuc2lnbmVkIG1fbnVtQ29kZVBvaW50czsgLy8gQ29kZSBwb2ludHMg
aW4gY3VycmVudCBzY3JpcHQgcnVuLgorICAgIHVuc2lnbmVkIG1fZ2x5cGhzQXJyYXlTaXplOyAv
LyBDdXJyZW50IHNpemUgb2YgYWxsIHRoZSBIYXJmYnV6eiBhcnJheXMuCiAKICAgICBPd25QdHI8
VGV4dFJ1bj4gbV9ub3JtYWxpemVkUnVuOwogICAgIE93bkFycmF5UHRyPFVDaGFyPiBtX25vcm1h
bGl6ZWRCdWZmZXI7IC8vIEEgYnVmZmVyIGZvciBub3JtYWxpemVkIHJ1bi4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68557</attachid>
            <date>2010-09-23 12:03:40 -0700</date>
            <delta_ts>2010-09-24 16:34:25 -0700</delta_ts>
            <desc>patch</desc>
            <filename>46374.v2</filename>
            <type>text/plain</type>
            <size>3920</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MThmMmY1Ni4uYjFlYjIxZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOCBAQAorMjAxMC0wOS0yMyAgWGlhb21laSBKaSAg
PHhqaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIEZvbnRMaW51eC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2Mzc0CisKKyAgICAg
ICAgQ2hhbmdzZXQgNjE3OTUgZml4ZWQgY29tcGxleCBzY3JpcHQgb3ZlcmxhcCBwcm9ibGVtIChw
cm9iYWJseSkgYnkgZGVsZXRlCisgICAgICAgIGFuZCBuZXcgZ2x5cGggYXJyYXlzIHNvIHRoZSBh
cnJheXMgaW4gdXNlIGFyZSBjbGVhbiBpbml0aWFsbHkuCisgICAgICAgIEJ1dCBpdCBpbnRyb2R1
Y2VkIG1vcmUgZGVsZXRlL25ldyBvcGVyYXRpb24gd2hpY2ggbWlnaHQgYmUgYSBwcm9ibGVtIGlu
CisgICAgICAgIG1lbW9yeSB0aWdodCBkZXZpY2VzIChzdWNoIGFzIEFuZHJvaWQgZGV2aWNlKS4K
KyAgICAgICAgVGhpcyBmaXggcHJvcG9zZWQgdG8KKyAgICAgICAgMS4gcmVzdW1lIHRoZSBzZXR0
aW5nIG9mIAorICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzIGJlZm9yZSBI
Ql9TaGFwZUl0ZW0oKSBjYWxsIHRvIG1pbmltaXplCisgICAgICAgIHRoZSBudW1iZXIgb2YgZGVs
ZXRlL25ldyBvcGVyYXRpb25zCisgICAgICAgIDIuIGFsd2F5cyBjbGVhbnVwIHRoZSBnbHlwaCBh
cnJheXMgYmVmb3JlIHJlLXVzZSB0aGVtIHRvIG1ha2Ugc3VyZQorICAgICAgICB0aGUgYXJyYXlz
IGluIHVzZSBhcmUgY2xlYW4gaW5pdGlhbGx5LgorCisgICAgICAgIFRoZXJlIGlzIG5vIGZ1bmN0
aW9uYWxpdHkgY2hhbmdlcyBzbyBubyBuZXcgdGVzdHMgYXJlIGFkZGVkLgorCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRSdW5XYWxrZXI6OmNyZWF0ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6
OlRleHRSdW5XYWxrZXI6OnJlc2V0R2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6c2hhcGVHbHlwaHMpOgorCiAyMDEwLTA5LTIyICBFcmlrIEFydmlkc3NvbiAg
PGFydkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmF0ZSBDaGFwaW4uCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAKaW5k
ZXggNjk2Y2Q5Yy4uZDZlYzQ2MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Gb250TGludXguY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRm9udExpbnV4LmNwcApAQCAtNDc3LDI2ICs0NzcsMzcgQEAgcHJpdmF0ZToKICAg
ICB2b2lkIGNyZWF0ZUdseXBoQXJyYXlzKGludCBzaXplKQogICAgIHsKICAgICAgICAgbV9pdGVt
LmdseXBocyA9IG5ldyBIQl9HbHlwaFtzaXplXTsKLSAgICAgICAgbWVtc2V0KG1faXRlbS5nbHlw
aHMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGgpKTsKICAgICAgICAgbV9pdGVtLmF0dHJpYnV0
ZXMgPSBuZXcgSEJfR2x5cGhBdHRyaWJ1dGVzW3NpemVdOwotICAgICAgICBtZW1zZXQobV9pdGVt
LmF0dHJpYnV0ZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGhBdHRyaWJ1dGVzKSk7CiAgICAg
ICAgIG1faXRlbS5hZHZhbmNlcyA9IG5ldyBIQl9GaXhlZFtzaXplXTsKLSAgICAgICAgbWVtc2V0
KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZCkpOwogICAgICAgICBt
X2l0ZW0ub2Zmc2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50W3NpemVdOwotICAgICAgICBtZW1zZXQo
bV9pdGVtLm9mZnNldHMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWRQb2ludCkpOwogCiAgICAg
ICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07CiAgICAgICAgIG1feFBvc2l0aW9u
cyA9IG5ldyBTa1NjYWxhcltzaXplXTsKIAogICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IHNp
emU7CisgICAgICAgIG1fZ2x5cGhzQXJyYXlTaXplID0gc2l6ZTsgLy8gU2F2ZSB0aGUgR2x5cGhB
cnJheXMgc2l6ZS4KKyAgICAgICAgcmVzZXRHbHlwaEFycmF5cyhtX2dseXBoc0FycmF5U2l6ZSk7
CiAgICAgfQogCi0gICAgdm9pZCBzaGFwZUdseXBocygpCisgICAgdm9pZCByZXNldEdseXBoQXJy
YXlzKGludCBzaXplKQogICAgIHsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgaWYg
KEhCX1NoYXBlSXRlbSgmbV9pdGVtKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Ly8gQWxsIHRoZSB0eXBlcyBoZXJlIGRvbid0IGhhdmUgcG9pbnRlcnMuIEl0IGlzIHNhZmUgdG8g
cmVzZXQgdG8KKyAgICAgICAgLy8gemVybyB1bmxlc3MgSGFyZmJ1enogYnJlYWtzIHRoZSBjb21w
YXRpYmlsaXR5IGluIHRoZSBmdXR1cmUuCisgICAgICAgIG1lbXNldChtX2l0ZW0uZ2x5cGhzLCAw
LCBzaXplICogc2l6ZW9mKEhCX0dseXBoKSk7CisgICAgICAgIG1lbXNldChtX2l0ZW0uYXR0cmli
dXRlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaEF0dHJpYnV0ZXMpKTsKKyAgICAgICAgbWVt
c2V0KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZCkpOworICAgICAg
ICBtZW1zZXQobV9pdGVtLm9mZnNldHMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWRQb2ludCkp
OworICAgICAgICBtZW1zZXQobV9nbHlwaHMxNiwgMCwgc2l6ZSAqIHNpemVvZih1aW50MTZfdCkp
OworICAgICAgICBtZW1zZXQobV94UG9zaXRpb25zLCAwLCBzaXplICogc2l6ZW9mKFNrU2NhbGFy
KSk7CisgICAgfQogCisgICAgdm9pZCBzaGFwZUdseXBocygpCisgICAgeworICAgICAgICAvLyBS
ZXNldCB0aGUgYXJyYXkgbGltaXQgYmVjdWFzZSBIQl9TaGFwZUl0ZW0oKSBvdmVycmlkZXMgdGhl
CisgICAgICAgIC8vIG1faXRlbS5udW1fZ2x5cGhzLgorICAgICAgICBtX2l0ZW0ubnVtX2dseXBo
cyA9IG1fZ2x5cGhzQXJyYXlTaXplOworICAgICAgICByZXNldEdseXBoQXJyYXlzKG1fZ2x5cGhz
QXJyYXlTaXplKTsKKyAgICAgICAgd2hpbGUgKCFIQl9TaGFwZUl0ZW0oJm1faXRlbSkpIHsKICAg
ICAgICAgICAgIC8vIFdlIG92ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4K
ICAgICAgICAgICAgIC8vIEhCX1NoYXBlSXRlbSBmaWxscyBpbiBtX2l0ZW0ubnVtX2dseXBocyB3
aXRoIHRoZSBuZWVkZWQgc2l6ZS4KICAgICAgICAgICAgIGRlbGV0ZUdseXBoQXJyYXlzKCk7CkBA
IC01OTcsNiArNjA4LDcgQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX29mZnNldFg7IC8vIE9m
ZnNldCBpbiBwaXhlbHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNjcmlwdCBydW4uCiAgICAg
dW5zaWduZWQgbV9waXhlbFdpZHRoOyAvLyBXaWR0aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50IHNj
cmlwdCBydW4uCiAgICAgdW5zaWduZWQgbV9udW1Db2RlUG9pbnRzOyAvLyBDb2RlIHBvaW50cyBp
biBjdXJyZW50IHNjcmlwdCBydW4uCisgICAgdW5zaWduZWQgbV9nbHlwaHNBcnJheVNpemU7IC8v
IEN1cnJlbnQgc2l6ZSBvZiBhbGwgdGhlIEhhcmZidXp6IGFycmF5cy4KIAogICAgIE93blB0cjxU
ZXh0UnVuPiBtX25vcm1hbGl6ZWRSdW47CiAgICAgT3duQXJyYXlQdHI8VUNoYXI+IG1fbm9ybWFs
aXplZEJ1ZmZlcjsgLy8gQSBidWZmZXIgZm9yIG5vcm1hbGl6ZWQgcnVuLgo=
</data>
<flag name="review"
          id="58101"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68789</attachid>
            <date>2010-09-24 16:34:25 -0700</date>
            <delta_ts>2010-09-24 17:39:47 -0700</delta_ts>
            <desc>patch</desc>
            <filename>46374.v2</filename>
            <type>text/plain</type>
            <size>5561</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MDkzZjQ4ZC4uMzc0MjAyMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsNSArMSw1NyBAQAotMjAxMC0wOS0yNCAgTHVpeiBBZ29zdGlu
aSAgPGx1aXouYWdvc3RpbmlAb3BlbmJvc3NhLm9yZz4KKzIwMTAtMDktMjQgIFhpYW9tZWkgSmkg
IDx4amlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciBGb250TGludXguCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NjM3NAorCisgICAg
ICAgIENoYW5nc2V0IDYxNzk1IGZpeGVkIGNvbXBsZXggc2NyaXB0IG92ZXJsYXAgcHJvYmxlbSAo
cHJvYmFibHkpIGJ5IGRlbGV0ZQorICAgICAgICBhbmQgbmV3IGdseXBoIGFycmF5cyBzbyB0aGUg
YXJyYXlzIGluIHVzZSBhcmUgY2xlYW4gaW5pdGlhbGx5LgorICAgICAgICBCdXQgaXQgaW50cm9k
dWNlZCBtb3JlIGRlbGV0ZS9uZXcgb3BlcmF0aW9uIHdoaWNoIG1pZ2h0IGJlIGEgcHJvYmxlbSBp
bgorICAgICAgICBtZW1vcnkgdGlnaHQgZGV2aWNlcyAoc3VjaCBhcyBBbmRyb2lkIGRldmljZSku
CisKKyAgICAgICAgVGhpcyBmaXggcHJvcG9zZWQgdG8KKyAgICAgICAgMS4gcmVzdW1lIHRoZSBz
ZXR0aW5nIG9mIAorICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzIGJlZm9y
ZSBIQl9TaGFwZUl0ZW0oKSBjYWxsIHRvIG1pbmltaXplCisgICAgICAgIHRoZSBudW1iZXIgb2Yg
ZGVsZXRlL25ldyBvcGVyYXRpb25zCisgICAgICAgIDIuIGFsd2F5cyBjbGVhbnVwIHRoZSBnbHlw
aCBhcnJheXMgYmVmb3JlIHJlLXVzZSB0aGVtIHRvIG1ha2Ugc3VyZQorICAgICAgICB0aGUgYXJy
YXlzIGluIHVzZSBhcmUgY2xlYW4gaW5pdGlhbGx5LgorCisgICAgICAgIFVzaW5nIGh0dHA6Ly93
d3cuZ29vZ2xlLmFlL3ByZWZlcmVuY2VzP2hsPWFyIGFzIGFuIGV4YW1wbGUuCisKKyAgICAgICAg
Rm9sbG93aW5nIGlzIHRoZSBjaGFuZ2Ugb2YgbV9pdGVtLm51bV9nbHlwaHMgYWZ0ZXIgdGhlIGNh
bGwgb2YgSEJfU2hhcGVJdGVtKCkuCisKKyAgICAgICAgNTQgLS0+IDUKKyAgICAgICAgNSAtLT4g
MQorICAgICAgICAxIC0tPiA4CisgICAgICAgIC4uLi4uCisKKyAgICAgICAgVGhlIGFycmF5IGlz
IHplcm8tZWQgaW5pdGlhbGx5ICh3aXRoIHNpemUgNTQpLCBzbyB0aGVyZSBpcyBubyBwcm9ibGVt
CisgICAgICAgIHdoZW4gc2hhcGluZyB0aGUgZmlyc3Qgc2NyaXB0IHJ1bi4gQWZ0ZXIgc2hhcGlu
ZywgdGhlIG1faXRlbS5udW1fZ2x5cGhzCisgICAgICAgIGNoYW5nZWQgdG8gNS4KIAorICAgICAg
ICBUaGVuLCB3aGVuIHNoYXBpbmcgbmV4dCBzY3JpcHQgcnVuLCBzaW5jZSB0aGVyZSBpcyBlbm91
Z2ggc3BhY2UgYXZhaWxhYmxlCisgICAgICAgIGZvciBIQl9TaGFwZUl0ZW0oKSwgbm8gZGVsZXRl
R2x5cHlBcnJheXMvY3JlYXRlR2x5cGhBcnJheXMgd2lsbCBiZSBjYWxsZWQsCisgICAgICAgIGJ1
dCB6ZXJvLWluZyBhcnJheSBpcyBub3QgY2FsbGVkIGVpdGhlciwgc28gdGhlIG5leHQgc2NyaXB0
IHJ1bidzCisgICAgICAgIHNoYXBpbmcgaXMgYmFzZWQgb24gYSBkaXJ0eSBhcnJheS4gVGhpcyBp
cyAybmQgaXNzdWUgbWVudGlvbmVkIGFib3ZlIHRoYXQKKyAgICAgICAgdGhlIHBhdGNoIGFkZHJl
c3Nlcy4KKworICAgICAgICBJbiB0aGUgM3JkIHNjcmlwdCBydW4sIGFsdGhvdWdoIHRoZXJlIGlz
IGFjdHVhbGx5IGFuIGFycmF5IG9mIHNpemUgNTQsCisgICAgICAgIHRoZSByZWNvcmRlZCBudW1f
Z2x5cGhzIGlzIDEsIGFuZCBpdCBpcyBsZXNzIHRoYW4gdGhlIG5lZWRlZCBzaXplLCBzbywKKyAg
ICAgICAgYXJyYXkgb2Ygc2l6ZSA1NCBpcyBkZWxldGVkIGFuZCBhbiBhcnJheSBvZiBzaXplIDgg
aXMgY3JlYXRlZC4gCisgICAgICAgIFRoZSBpbmNyZWFzZSBvZiBudW1fZ2x5cGhzIGZyb20gb25l
IHJ1biB0byBpdHMgbmV4dCBpcyBub3QgdW5jb21tb24uIAorICAgICAgICBJdCBpcyBoaXQgMTA5
NiB0aW1lcyBkdXJpbmcgbG9hZGluZyB0aGUgYWJvdmUgZXhhbXBsZSBwYWdlLiBTbyB0aGUKKyAg
ICAgICAgZGVsZXRlL25ldyB3aWxsIGludHJvZHVjZSBleHRyYSBvdmVyaGVhZC4gVGhpcyBpcyB0
aGUgMXN0IGlzc3VlIG1lbnRpb25lZAorICAgICAgICBhYm92ZSB0aGF0IHRoZSBwYXRjaCBhZGRy
ZXNzZXMuCisKKyAgICAgICAgVGhlcmUgaXMgbm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2VzIHNvIG5v
IG5ldyB0ZXN0cyBhcmUgYWRkZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9Gb250TGludXguY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6Y3Jl
YXRlR2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6cmVzZXRH
bHlwaEFycmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzaGFwZUdseXBo
cyk6CisKKzIwMTAtMDktMjQgIEx1aXogQWdvc3RpbmkgIDxsdWl6LmFnb3N0aW5pQG9wZW5ib3Nz
YS5vcmc+CiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFuc2VuLgog
CiAgICAgICAgIEtlZXAgdmlld3BvcnQgaW5mb3JtYXRpb24gaW4gRG9jdW1lbnQKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAppbmRleCAzZDJm
ZWQzLi5jYTc3NWJkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0ZvbnRMaW51eC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9Gb250TGludXguY3BwCkBAIC00NzcsMjYgKzQ3Nyw0MCBAQCBwcml2YXRlOgogICAgIHZvaWQg
Y3JlYXRlR2x5cGhBcnJheXMoaW50IHNpemUpCiAgICAgewogICAgICAgICBtX2l0ZW0uZ2x5cGhz
ID0gbmV3IEhCX0dseXBoW3NpemVdOwotICAgICAgICBtZW1zZXQobV9pdGVtLmdseXBocywgMCwg
c2l6ZSAqIHNpemVvZihIQl9HbHlwaCkpOwogICAgICAgICBtX2l0ZW0uYXR0cmlidXRlcyA9IG5l
dyBIQl9HbHlwaEF0dHJpYnV0ZXNbc2l6ZV07Ci0gICAgICAgIG1lbXNldChtX2l0ZW0uYXR0cmli
dXRlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaEF0dHJpYnV0ZXMpKTsKICAgICAgICAgbV9p
dGVtLmFkdmFuY2VzID0gbmV3IEhCX0ZpeGVkW3NpemVdOwotICAgICAgICBtZW1zZXQobV9pdGVt
LmFkdmFuY2VzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkKSk7CiAgICAgICAgIG1faXRlbS5v
ZmZzZXRzID0gbmV3IEhCX0ZpeGVkUG9pbnRbc2l6ZV07Ci0gICAgICAgIG1lbXNldChtX2l0ZW0u
b2Zmc2V0cywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZFBvaW50KSk7CiAKICAgICAgICAgbV9n
bHlwaHMxNiA9IG5ldyB1aW50MTZfdFtzaXplXTsKICAgICAgICAgbV94UG9zaXRpb25zID0gbmV3
IFNrU2NhbGFyW3NpemVdOwogCiAgICAgICAgIG1faXRlbS5udW1fZ2x5cGhzID0gc2l6ZTsKKyAg
ICAgICAgbV9nbHlwaHNBcnJheUNhcGFjaXR5ID0gc2l6ZTsgLy8gU2F2ZSB0aGUgR2x5cGhBcnJh
eXMgc2l6ZS4KKyAgICAgICAgcmVzZXRHbHlwaEFycmF5cygpOwogICAgIH0KIAotICAgIHZvaWQg
c2hhcGVHbHlwaHMoKQorICAgIHZvaWQgcmVzZXRHbHlwaEFycmF5cygpCiAgICAgewotICAgICAg
ICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpZiAoSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKQotICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpbnQgc2l6ZSA9IG1faXRlbS5udW1fZ2x5cGhz
OworICAgICAgICAvLyBBbGwgdGhlIHR5cGVzIGhlcmUgZG9uJ3QgaGF2ZSBwb2ludGVycy4gSXQg
aXMgc2FmZSB0byByZXNldCB0bworICAgICAgICAvLyB6ZXJvIHVubGVzcyBIYXJmYnV6eiBicmVh
a3MgdGhlIGNvbXBhdGliaWxpdHkgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgbWVtc2V0KG1faXRl
bS5nbHlwaHMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGgpKTsKKyAgICAgICAgbWVtc2V0KG1f
aXRlbS5hdHRyaWJ1dGVzLCAwLCBzaXplICogc2l6ZW9mKEhCX0dseXBoQXR0cmlidXRlcykpOwor
ICAgICAgICBtZW1zZXQobV9pdGVtLmFkdmFuY2VzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVk
KSk7CisgICAgICAgIG1lbXNldChtX2l0ZW0ub2Zmc2V0cywgMCwgc2l6ZSAqIHNpemVvZihIQl9G
aXhlZFBvaW50KSk7CisgICAgICAgIG1lbXNldChtX2dseXBoczE2LCAwLCBzaXplICogc2l6ZW9m
KHVpbnQxNl90KSk7CisgICAgICAgIG1lbXNldChtX3hQb3NpdGlvbnMsIDAsIHNpemUgKiBzaXpl
b2YoU2tTY2FsYXIpKTsKKyAgICB9CiAKKyAgICB2b2lkIHNoYXBlR2x5cGhzKCkKKyAgICB7Cisg
ICAgICAgIC8vIEhCX1NoYXBlSXRlbSgpIHJlc2V0cyBtX2l0ZW0ubnVtX2dseXBocy4gSWYgdGhl
IHByZXZpb3VzIGNhbGwgdG8KKyAgICAgICAgLy8gSEJfU2hhcGVJdGVtKCkgdXNlZCBsZXNzIHNw
YWNlIHRoYW4gd2FzIGF2YWlsYWJsZSwgdGhlIGNhcGFjaXR5IG9mCisgICAgICAgIC8vIHRoZSBh
cnJheSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbV9pdGVtLm51bV9n
bHlwaHMuIAorICAgICAgICAvLyBTbywgd2UgbmVlZCB0byByZXNldCB0aGUgbnVtX2dseXBocyB0
byB0aGUgY2FwYWNpdHkgb2YgdGhlIGFycmF5LgorICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9
IG1fZ2x5cGhzQXJyYXlDYXBhY2l0eTsKKyAgICAgICAgcmVzZXRHbHlwaEFycmF5cygpOworICAg
ICAgICB3aGlsZSAoIUhCX1NoYXBlSXRlbSgmbV9pdGVtKSkgewogICAgICAgICAgICAgLy8gV2Ug
b3ZlcmZsb3dlZCBvdXIgYXJyYXlzLiBSZXNpemUgYW5kIHJldHJ5LgogICAgICAgICAgICAgLy8g
SEJfU2hhcGVJdGVtIGZpbGxzIGluIG1faXRlbS5udW1fZ2x5cGhzIHdpdGggdGhlIG5lZWRlZCBz
aXplLgogICAgICAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKQEAgLTU5Nyw2ICs2MTEsNyBA
QCBwcml2YXRlOgogICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsgLy8gT2Zmc2V0IGluIHBpeGVscyB0
byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2NyaXB0IHJ1bi4KICAgICB1bnNpZ25lZCBtX3BpeGVs
V2lkdGg7IC8vIFdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4KICAgICB1
bnNpZ25lZCBtX251bUNvZGVQb2ludHM7IC8vIENvZGUgcG9pbnRzIGluIGN1cnJlbnQgc2NyaXB0
IHJ1bi4KKyAgICB1bnNpZ25lZCBtX2dseXBoc0FycmF5Q2FwYWNpdHk7IC8vIEN1cnJlbnQgc2l6
ZSBvZiBhbGwgdGhlIEhhcmZidXp6IGFycmF5cy4KIAogICAgIE93blB0cjxUZXh0UnVuPiBtX25v
cm1hbGl6ZWRSdW47CiAgICAgT3duQXJyYXlQdHI8VUNoYXI+IG1fbm9ybWFsaXplZEJ1ZmZlcjsg
Ly8gQSBidWZmZXIgZm9yIG5vcm1hbGl6ZWQgcnVuLgo=
</data>
<flag name="review"
          id="58361"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>