<?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>116151</bug_id>
          
          <creation_ts>2013-05-15 07:12:42 -0700</creation_ts>
          <short_desc>Make PNGImageDecoder::rowAvailable auto-vectorizable</short_desc>
          <delta_ts>2013-05-17 05:41:03 -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>Images</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="Allan Sandfeld Jensen">allan.jensen</reporter>
          <assigned_to name="Allan Sandfeld Jensen">allan.jensen</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>jturcotte</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>889267</commentid>
    <comment_count>0</comment_count>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-15 07:12:42 -0700</bug_when>
    <thetext>After analyzing PNG decoding performance, I noticed that depending on the image somewhere between 25-50% of the decoding time is spend under PNGImageDecoder::rowAvailable simply populating the ImageFrame.

This loop should be vectorizable giving at least 2x speedup in PNGImageDecoder::rowAvailable and thus 12-25% speed-up on PNG decoding in total.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>889271</commentid>
    <comment_count>1</comment_count>
      <attachid>201825</attachid>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-15 07:18:26 -0700</bug_when>
    <thetext>Created attachment 201825
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>889272</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-15 07:20:10 -0700</bug_when>
    <thetext>Attachment 201825 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WTF/ChangeLog&apos;, u&apos;Source/WTF/wtf/MathExtras.h&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/platform/graphics/filters/FEBlend.cpp&apos;, u&apos;Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp&apos;]&quot; exit_code: 1
Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:417:  setPixelRGBA_Premultiplied is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
Total errors found: 1 in 5 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>889512</commentid>
    <comment_count>3</comment_count>
      <attachid>201825</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-05-15 14:12:34 -0700</bug_when>
    <thetext>Comment on attachment 201825
Patch

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

This looks like a step in the right direction. I have a couple of comments:

&gt; Source/WebCore/ChangeLog:13
&gt; +        Together with automatic vectorization by the compiler this provides slightly
&gt; +        over 2x speed-up on PNGImageDecoder::rowAvailable and shaves off 12-25% on
&gt; +        PNG decoding in general.

This is rather unimpressive. Vectorized premultiplication is usually &gt; 4 times faster (vector gain + preload gain + math gain).
Are you sure the compiler is not fucking up somewhere?

&gt; Source/WTF/wtf/MathExtras.h:463
&gt; +inline unsigned char fastDivideBy255(uint16_t value)
&gt; +{
&gt; +    // This is an approximate algorithm for division by 255, but it gives accurate results for 16bit values.
&gt; +    uint16_t approximation = value &gt;&gt; 8;
&gt; +    uint16_t remainder = value - (approximation * 255) + 1;
&gt; +    return approximation + (remainder &gt;&gt; 8);
&gt; +}

I think that does not belong to MathExtras but you are not the first one to abuse this header. :)

Let&apos;s keep the typing consistent: unsigned char -&gt; uint16_t.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:408
&gt; +static inline void setPixelRGB(ImageFrame::PixelData* dest, png_bytep pixel)
&gt; +{
&gt; +    *dest = 0xFF000000 | pixel[0] &lt;&lt; 16 | pixel[1] &lt;&lt; 8 | pixel[2];
&gt; +}

You should check but I am pretty sure the compiler will do a bad job at vectorizing this.

If it is the case, I have written optimized version for Qt that you are free to steal.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:414
&gt; +    nonTrivialAlpha |= ~(a ^ 255U);

Let&apos;s make this cleaner.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:425
&gt; +    nonTrivialAlpha |= ~(a ^ 255U);

Let&apos;s make this cleaner.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:527
&gt; +    unsigned char nonTrivialAlpha = 0;

I would either keep this as a boolean or give it a proper name for a mask.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:535
&gt; +            unsigned alpha = hasAlpha ? pixel[3] : 255;
&gt; +            buffer.setRGBA(address++, pixel[0], pixel[1], pixel[2], alpha);
&gt; +            nonTrivialAlpha |= alpha ^ 255U;

No need to move the &quot;hasAlpha&quot; test out of the loop and use setPixelRGB().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>889541</commentid>
    <comment_count>4</comment_count>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-15 14:57:09 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 201825 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=201825&amp;action=review
&gt; 
&gt; This looks like a step in the right direction. I have a couple of comments:
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:13
&gt; &gt; +        Together with automatic vectorization by the compiler this provides slightly
&gt; &gt; +        over 2x speed-up on PNGImageDecoder::rowAvailable and shaves off 12-25% on
&gt; &gt; +        PNG decoding in general.
&gt; 
&gt; This is rather unimpressive. Vectorized premultiplication is usually &gt; 4 times faster (vector gain + preload gain + math gain).
&gt; Are you sure the compiler is not fucking up somewhere?
&gt; 
This was using a generic x64 target, so the vectorization is limited to SSE2. Additional the 2+x speed-up is for the entire rowAvailable method, including the unoptimized combining of existing row data with the new. It was pretty much what I expected in this situation.

&gt; &gt; Source/WTF/wtf/MathExtras.h:463
&gt; &gt; +inline unsigned char fastDivideBy255(uint16_t value)
&gt; &gt; +{
&gt; &gt; +    // This is an approximate algorithm for division by 255, but it gives accurate results for 16bit values.
&gt; &gt; +    uint16_t approximation = value &gt;&gt; 8;
&gt; &gt; +    uint16_t remainder = value - (approximation * 255) + 1;
&gt; &gt; +    return approximation + (remainder &gt;&gt; 8);
&gt; &gt; +}
&gt; 
&gt; I think that does not belong to MathExtras but you are not the first one to abuse this header. :)
&gt; 
Yes. It is not quite a perfect fit (and I think I might have been one those trying to abuse that header before), but where else should methods like this be placed if they are to be reused?

&gt; &gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:408
&gt; &gt; +static inline void setPixelRGB(ImageFrame::PixelData* dest, png_bytep pixel)
&gt; &gt; +{
&gt; &gt; +    *dest = 0xFF000000 | pixel[0] &lt;&lt; 16 | pixel[1] &lt;&lt; 8 | pixel[2];
&gt; &gt; +}
&gt; 
&gt; You should check but I am pretty sure the compiler will do a bad job at vectorizing this.
&gt; 

I didn&apos;t study the generated code, but GCC reports the loop vectorized.

&gt; &gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:535
&gt; &gt; +            unsigned alpha = hasAlpha ? pixel[3] : 255;
&gt; &gt; +            buffer.setRGBA(address++, pixel[0], pixel[1], pixel[2], alpha);
&gt; &gt; +            nonTrivialAlpha |= alpha ^ 255U;
&gt; 
&gt; No need to move the &quot;hasAlpha&quot; test out of the loop and use setPixelRGB().

This is the scaled case. It doesn&apos;t vectorize anyway because it has table look-up for each x.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>889744</commentid>
    <comment_count>5</comment_count>
      <attachid>201936</attachid>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-16 02:34:16 -0700</bug_when>
    <thetext>Created attachment 201936
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>890224</commentid>
    <comment_count>6</comment_count>
      <attachid>201936</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-05-16 23:57:38 -0700</bug_when>
    <thetext>Comment on attachment 201936
Patch

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

Looks good.

I cq- because I would like you to clarify why you handle nonTrivialAlpha in this weird way.

&gt; Source/WebCore/platform/graphics/Color.h:211
&gt; +inline uint16_t fastDivideBy255(uint16_t value)
&gt; +{
&gt; +    // This is an approximate algorithm for division by 255, but it gives accurate results for 16bit values.
&gt; +    uint16_t approximation = value &gt;&gt; 8;
&gt; +    uint16_t remainder = value - (approximation * 255) + 1;
&gt; +    return approximation + (remainder &gt;&gt; 8);
&gt; +}

Good idea!

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:415
&gt; +    nonTrivialAlpha |= ~(a ^ 255U); // Arithmetic calculation of (a != 255).

Because the compiler has to set bool to 1 or 0, it will actually add a branch here.
So using
    nonTrivialAlpha |= (a == 255).

If you change &quot;bool nonTrivialAlpha&quot; to &quot;unsigned char nonTrivialAlphaMask&quot;, you will avoid that.
I don&apos;t get why you don&apos;t just write 
   nonTrivialAlphaMask |= (a - 0xff)
and check nonTrivialAlpha at the end.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:426
&gt; +    nonTrivialAlpha |= ~(a ^ 255U); // Arithmetic calculation of (a != 255).

Ditto.

&gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:536
&gt; +            nonTrivialAlpha |= ~(alpha ^ 255U); // Arithmetic calculation of (alpha != 255).

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>890250</commentid>
    <comment_count>7</comment_count>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-17 02:16:39 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; &gt; Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:415
&gt; &gt; +    nonTrivialAlpha |= ~(a ^ 255U); // Arithmetic calculation of (a != 255).
&gt; 
&gt; Because the compiler has to set bool to 1 or 0, it will actually add a branch here.
&gt; So using
&gt;     nonTrivialAlpha |= (a == 255).
&gt; 
&gt; If you change &quot;bool nonTrivialAlpha&quot; to &quot;unsigned char nonTrivialAlphaMask&quot;, you will avoid that.

That is what I was doing in the first patch. I tried using a bool and checked if it was still auto-vectorized, and since it was I am assuming gcc is doing something more clever with it. The generated code is unreadable to me though, so I am not sure what  exactly is transformed into.

I will return it to a nonTrivialAlphaMask before landing, just to be nice to different compilers and architectures. (alpha - 255) is a good idea, I hadn&apos;t thought of that. It is probably the same performance wise, but much easier to read.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>890315</commentid>
    <comment_count>8</comment_count>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2013-05-17 05:41:03 -0700</bug_when>
    <thetext>Committed r150252: &lt;http://trac.webkit.org/changeset/150252&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>201825</attachid>
            <date>2013-05-15 07:18:26 -0700</date>
            <delta_ts>2013-05-16 02:34:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-116151-20130515161722.patch</filename>
            <type>text/plain</type>
            <size>7320</size>
            <attacher name="Allan Sandfeld Jensen">allan.jensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTUwMTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IDU5YmJmYzZlYWRhYTJiOWJmM2Y3YWE5
ZTI5OGQ2M2M5ZTg0YjE3OTkuLmM2ODE2YTYyMThhNTNjYWMwY2ViNjg3MmE1ODIwOTk5ZWQ2ZDM0
MTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTMtMDUtMTUgIEFsbGFuIFNhbmRmZWxkIEplbnNl
biAgPGFsbGFuLmplbnNlbkBkaWdpYS5jb20+CisKKyAgICAgICAgTWFrZSBQTkdJbWFnZURlY29k
ZXI6OnJvd0F2YWlsYWJsZSBhdXRvLXZlY3Rvcml6YWJsZQorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MTUxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTWFkZSB0aGUgZmFzdCB2ZWN0b3JpemFibGUgaW50
ZWdlciBkaXZpZGUgYnkgMjU1IG1ldGhvZCBnZW5lcmFsbHkgYXZhaWxhYmxlLgorCisgICAgICAg
ICogd3RmL01hdGhFeHRyYXMuaDoKKyAgICAgICAgKFdURjo6ZmFzdERpdmlkZUJ5MjU1KToKKwog
MjAxMy0wNS0xNCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CiAK
ICAgICAgICAgUmVtb3ZlIFdURl9VU0VfUExBVEZPUk1fU1RSQVRFR0lFUwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4
IDcxMzRkZDhmNTJhNDA3ODNjNmM4MGJjOWYxM2YxYzc5NDZiNzllYjUuLmM3MWRkMmU2NjA2ZjE2
Y2UxZGJjMzMyNmUzZTQ3MDhjZDczNjNlOTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsNSArMSwyNiBAQAog
MjAxMy0wNS0xNSAgQWxsYW4gU2FuZGZlbGQgSmVuc2VuICA8YWxsYW4uamVuc2VuQGRpZ2lhLmNv
bT4KIAorICAgICAgICBNYWtlIFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxhYmxlIGF1dG8tdmVj
dG9yaXphYmxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xMTYxNTEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBDaGFuZ2VkIHRoZSBtYWluIGxvb3BzIHVuZGVyIFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxh
YmxlIHNvIHRoYXQgdGhleQorICAgICAgICBhdm9pZCBicmFuY2hlcyBhbmQgbm9uLXNlcXVlbnRp
YWwgdGFibGUgbG9vayB1cHMuCisKKyAgICAgICAgVG9nZXRoZXIgd2l0aCBhdXRvbWF0aWMgdmVj
dG9yaXphdGlvbiBieSB0aGUgY29tcGlsZXIgdGhpcyBwcm92aWRlcyBzbGlnaHRseQorICAgICAg
ICBvdmVyIDJ4IHNwZWVkLXVwIG9uIFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxhYmxlIGFuZCBz
aGF2ZXMgb2ZmIDEyLTI1JSBvbgorICAgICAgICBQTkcgZGVjb2RpbmcgaW4gZ2VuZXJhbC4KKwor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVCbGVuZC5jcHA6CisgICAgICAg
ICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nL1BOR0ltYWdlRGVjb2Rlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpzZXRQaXhlbFJHQik6CisgICAgICAgIChXZWJDb3JlOjpzZXRQaXhlbFJH
QkEpOgorICAgICAgICAoV2ViQ29yZTo6c2V0UGl4ZWxSR0JBX1ByZW11bHRpcGxpZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUpOgorCisyMDEzLTA1
LTE1ICBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gIDxhbGxhbi5qZW5zZW5AZGlnaWEuY29tPgorCiAg
ICAgICAgIEZvbnTigJlzIGZhc3QgY29kZSBwYXRoIGRvZXNu4oCZdCBoYW5kbGUgcGFydGlhbCBy
dW5zIGNvcnJlY3RseSB3aGVuIGtlcm5pbmcgb3IgbGlnYXR1cmVzIGFyZSBlbmFibGVkIAogICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMDUwCiAKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL01hdGhFeHRyYXMuaCBiL1NvdXJjZS9XVEYvd3RmL01h
dGhFeHRyYXMuaAppbmRleCBkYmRlZWIxYmJkZjFjZjc0NjhmM2UxNWY3YWQxZmFiNTY4N2ZjZjBk
Li4yYjU2OWE3YmFkMDAyNWVlOGFiMzMyNjg5MDRlOWIwNTQ0MTJiNDgyIDEwMDY0NAotLS0gYS9T
b3VyY2UvV1RGL3d0Zi9NYXRoRXh0cmFzLmgKKysrIGIvU291cmNlL1dURi93dGYvTWF0aEV4dHJh
cy5oCkBAIC00NTQsNiArNDU0LDE0IEBAIGlubGluZSB1bnNpZ25lZCBmYXN0TG9nMih1bnNpZ25l
ZCBpKQogICAgIHJldHVybiBsb2cyOwogfQogCitpbmxpbmUgdW5zaWduZWQgY2hhciBmYXN0RGl2
aWRlQnkyNTUodWludDE2X3QgdmFsdWUpCit7CisgICAgLy8gVGhpcyBpcyBhbiBhcHByb3hpbWF0
ZSBhbGdvcml0aG0gZm9yIGRpdmlzaW9uIGJ5IDI1NSwgYnV0IGl0IGdpdmVzIGFjY3VyYXRlIHJl
c3VsdHMgZm9yIDE2Yml0IHZhbHVlcy4KKyAgICB1aW50MTZfdCBhcHByb3hpbWF0aW9uID0gdmFs
dWUgPj4gODsKKyAgICB1aW50MTZfdCByZW1haW5kZXIgPSB2YWx1ZSAtIChhcHByb3hpbWF0aW9u
ICogMjU1KSArIDE7CisgICAgcmV0dXJuIGFwcHJveGltYXRpb24gKyAocmVtYWluZGVyID4+IDgp
OworfQorCiB9IC8vIG5hbWVzcGFjZSBXVEYKIAogI2VuZGlmIC8vICNpZm5kZWYgV1RGX01hdGhF
eHRyYXNfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmls
dGVycy9GRUJsZW5kLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRl
cnMvRkVCbGVuZC5jcHAKaW5kZXggZDU4OTdjMzkyYmI3ZTk2NjRlMGMyYzBlNGVmYzUwNTI5ZDVj
ZWU0OC4uYzVkZTBlNzk3MWJhMDViNjJiMmI2ZWU2NmMyNWYyNDgwYWIwYWUyNiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GRUJsZW5kLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFQmxlbmQuY3Bw
CkBAIC0zNyw2ICszNyw4IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciAoKkJsZW5kVHlwZSko
dW5zaWduZWQgY2hhciBjb2xvckEsIHVuc2lnbmVkIGNoYXIgY29sb3JCLCB1bnNpZ25lZCBjaGFy
IGFscGhhQSwgdW5zaWduZWQgY2hhciBhbHBoYUIpOwogCit1c2luZyBXVEY6OmZhc3REaXZpZGVC
eTI1NTsKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBGRUJsZW5kOjpGRUJsZW5kKEZpbHRlciog
ZmlsdGVyLCBCbGVuZE1vZGVUeXBlIG1vZGUpCkBAIC02MywxNCArNjUsNiBAQCBib29sIEZFQmxl
bmQ6OnNldEJsZW5kTW9kZShCbGVuZE1vZGVUeXBlIG1vZGUpCiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBmYXN0RGl2aWRlQnkyNTUodWludDE2X3Qg
dmFsdWUpCi17Ci0gICAgLy8gVGhpcyBpcyBhbiBhcHByb3hpbWF0ZSBhbGdvcml0aG0gZm9yIGRp
dmlzaW9uIGJ5IDI1NSwgYnV0IGl0IGdpdmVzIGFjY3VyYXRlIHJlc3VsdHMgZm9yIDE2Yml0IHZh
bHVlcy4KLSAgICB1aW50MTZfdCBxdW90aWVudCA9IHZhbHVlID4+IDg7Ci0gICAgdWludDE2X3Qg
cmVtYWluZGVyID0gdmFsdWUgLSAocXVvdGllbnQgKiAyNTUpICsgMTsKLSAgICByZXR1cm4gcXVv
dGllbnQgKyAocmVtYWluZGVyID4+IDgpOwotfQotCiBpbmxpbmUgdW5zaWduZWQgY2hhciBmZUJs
ZW5kTm9ybWFsKHVuc2lnbmVkIGNoYXIgY29sb3JBLCB1bnNpZ25lZCBjaGFyIGNvbG9yQiwgdW5z
aWduZWQgY2hhciBhbHBoYUEsIHVuc2lnbmVkIGNoYXIpCiB7CiAgICAgcmV0dXJuIGZhc3REaXZp
ZGVCeTI1NSgoMjU1IC0gYWxwaGFBKSAqIGNvbG9yQiArIGNvbG9yQSAqIDI1NSk7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VE
ZWNvZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9Q
TkdJbWFnZURlY29kZXIuY3BwCmluZGV4IDc5ODRjOWFlODA2M2YzZjk3OGNkM2ZjZDg0ZDcyYjVk
MmM4OGM1MmUuLjM0NjA5M2Y1ODE0M2M4YmY1MDExODAxNDQwYzM4NDZlNzJiYTZiZTAgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJbWFn
ZURlY29kZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJz
L3BuZy9QTkdJbWFnZURlY29kZXIuY3BwCkBAIC00MDIsNiArNDAyLDI5IEBAIHZvaWQgUE5HSW1h
Z2VEZWNvZGVyOjpoZWFkZXJBdmFpbGFibGUoKQogICAgIH0KIH0KIAorc3RhdGljIGlubGluZSB2
b2lkIHNldFBpeGVsUkdCKEltYWdlRnJhbWU6OlBpeGVsRGF0YSogZGVzdCwgcG5nX2J5dGVwIHBp
eGVsKQoreworICAgICpkZXN0ID0gMHhGRjAwMDAwMCB8IHBpeGVsWzBdIDw8IDE2IHwgcGl4ZWxb
MV0gPDwgOCB8IHBpeGVsWzJdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0UGl4ZWxSR0JB
KEltYWdlRnJhbWU6OlBpeGVsRGF0YSogZGVzdCwgcG5nX2J5dGVwIHBpeGVsLCB1bnNpZ25lZCBj
aGFyJiBub25Ucml2aWFsQWxwaGEpCit7CisgICAgdW5zaWduZWQgY2hhciBhID0gcGl4ZWxbM107
CisgICAgKmRlc3QgPSBhIDw8IDI0IHwgcGl4ZWxbMF0gPDwgMTYgfCBwaXhlbFsxXSA8PCA4IHwg
cGl4ZWxbMl07CisgICAgbm9uVHJpdmlhbEFscGhhIHw9IH4oYSBeIDI1NVUpOworfQorCitzdGF0
aWMgaW5saW5lIHZvaWQgc2V0UGl4ZWxSR0JBX1ByZW11bHRpcGxpZWQoSW1hZ2VGcmFtZTo6UGl4
ZWxEYXRhKiBkZXN0LCBwbmdfYnl0ZXAgcGl4ZWwsIHVuc2lnbmVkIGNoYXImIG5vblRyaXZpYWxB
bHBoYSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGEgPSBwaXhlbFszXTsKKyAgICB1bnNpZ25lZCBj
aGFyIHIgPSBXVEY6OmZhc3REaXZpZGVCeTI1NShwaXhlbFswXSAqIGEpOworICAgIHVuc2lnbmVk
IGNoYXIgZyA9IFdURjo6ZmFzdERpdmlkZUJ5MjU1KHBpeGVsWzFdICogYSk7CisgICAgdW5zaWdu
ZWQgY2hhciBiID0gV1RGOjpmYXN0RGl2aWRlQnkyNTUocGl4ZWxbMl0gKiBhKTsKKworICAgICpk
ZXN0ID0gYSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOworICAgIG5vblRyaXZpYWxBbHBo
YSB8PSB+KGEgXiAyNTVVKTsKK30KKwogdm9pZCBQTkdJbWFnZURlY29kZXI6OnJvd0F2YWlsYWJs
ZSh1bnNpZ25lZCBjaGFyKiByb3dCdWZmZXIsIHVuc2lnbmVkIHJvd0luZGV4LCBpbnQpCiB7CiAg
ICAgaWYgKG1fZnJhbWVCdWZmZXJDYWNoZS5pc0VtcHR5KCkpCkBAIC01MDEsMjQgKzUyNCwzNCBA
QCB2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxhYmxlKHVuc2lnbmVkIGNoYXIqIHJvd0J1
ZmZlciwgdW5zaWduZWQgcm93SW5kZXgsCiAgICAgLy8gV3JpdGUgdGhlIGRlY29kZWQgcm93IHBp
eGVscyB0byB0aGUgZnJhbWUgYnVmZmVyLgogICAgIEltYWdlRnJhbWU6OlBpeGVsRGF0YSogYWRk
cmVzcyA9IGJ1ZmZlci5nZXRBZGRyKDAsIHkpOwogICAgIGludCB3aWR0aCA9IHNjYWxlZFNpemUo
KS53aWR0aCgpOwotICAgIGJvb2wgbm9uVHJpdmlhbEFscGhhID0gZmFsc2U7CisgICAgdW5zaWdu
ZWQgY2hhciBub25Ucml2aWFsQWxwaGEgPSAwOwogCiAjaWYgRU5BQkxFKElNQUdFX0RFQ09ERVJf
RE9XTl9TQU1QTElORykKLSAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAg
ICAgICAgcG5nX2J5dGVwIHBpeGVsID0gcm93ICsgKG1fc2NhbGVkID8gbV9zY2FsZWRDb2x1bW5z
W3hdIDogeCkgKiBjb2xvckNoYW5uZWxzOwotICAgICAgICB1bnNpZ25lZCBhbHBoYSA9IGhhc0Fs
cGhhID8gcGl4ZWxbM10gOiAyNTU7Ci0gICAgICAgIGJ1ZmZlci5zZXRSR0JBKGFkZHJlc3MrKywg
cGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSwgYWxwaGEpOwotICAgICAgICBub25Ucml2aWFs
QWxwaGEgfD0gYWxwaGEgPCAyNTU7Ci0gICAgfQotI2Vsc2UKLSAgICBBU1NFUlQoIW1fc2NhbGVk
KTsKLSAgICBwbmdfYnl0ZXAgcGl4ZWwgPSByb3c7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3
aWR0aDsgKyt4LCBwaXhlbCArPSBjb2xvckNoYW5uZWxzKSB7Ci0gICAgICAgIHVuc2lnbmVkIGFs
cGhhID0gaGFzQWxwaGEgPyBwaXhlbFszXSA6IDI1NTsKLSAgICAgICAgYnVmZmVyLnNldFJHQkEo
YWRkcmVzcysrLCBwaXhlbFswXSwgcGl4ZWxbMV0sIHBpeGVsWzJdLCBhbHBoYSk7Ci0gICAgICAg
IG5vblRyaXZpYWxBbHBoYSB8PSBhbHBoYSA8IDI1NTsKLSAgICB9CisgICAgaWYgKG1fc2NhbGVk
KSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAg
ICAgcG5nX2J5dGVwIHBpeGVsID0gcm93ICsgbV9zY2FsZWRDb2x1bW5zW3hdICogY29sb3JDaGFu
bmVsczsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFscGhhID0gaGFzQWxwaGEgPyBwaXhlbFszXSA6
IDI1NTsKKyAgICAgICAgICAgIGJ1ZmZlci5zZXRSR0JBKGFkZHJlc3MrKywgcGl4ZWxbMF0sIHBp
eGVsWzFdLCBwaXhlbFsyXSwgYWxwaGEpOworICAgICAgICAgICAgbm9uVHJpdmlhbEFscGhhIHw9
IGFscGhhIF4gMjU1VTsKKyAgICAgICAgfQorICAgIH0gZWxzZQogI2VuZGlmCisgICAgeworICAg
ICAgICBwbmdfYnl0ZXAgcGl4ZWwgPSByb3c7CisgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAg
ICAgICAgICAgaWYgKGJ1ZmZlci5wcmVtdWx0aXBseUFscGhhKCkpIHsKKyAgICAgICAgICAgICAg
ICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyArK3gsIHBpeGVsICs9IDQpCisgICAgICAgICAg
ICAgICAgICAgIHNldFBpeGVsUkdCQV9QcmVtdWx0aXBsaWVkKGFkZHJlc3MrKywgcGl4ZWwsIG5v
blRyaXZpYWxBbHBoYSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgd2lkdGg7ICsreCwgcGl4ZWwgKz0gNCkKKyAgICAgICAgICAgICAg
ICAgICAgc2V0UGl4ZWxSR0JBKGFkZHJlc3MrKywgcGl4ZWwsIG5vblRyaXZpYWxBbHBoYSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0g
MDsgeCA8IHdpZHRoOyArK3gsIHBpeGVsICs9IDMpCisgICAgICAgICAgICAgICAgc2V0UGl4ZWxS
R0IoYWRkcmVzcysrLCBwaXhlbCk7CisgICAgICAgIH0KKyAgICB9CisKIAogICAgIGlmIChub25U
cml2aWFsQWxwaGEgJiYgIWJ1ZmZlci5oYXNBbHBoYSgpKQogICAgICAgICBidWZmZXIuc2V0SGFz
QWxwaGEobm9uVHJpdmlhbEFscGhhKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>201936</attachid>
            <date>2013-05-16 02:34:16 -0700</date>
            <delta_ts>2013-05-16 23:57:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-116151-20130516113311.patch</filename>
            <type>text/plain</type>
            <size>7568</size>
            <attacher name="Allan Sandfeld Jensen">allan.jensen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTUwMTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzEzNGRkOGY1MmE0MDc4
M2M2YzgwYmM5ZjEzZjFjNzk0NmI3OWViNS4uMGQxMzBhY2U2NjA5MmNiYmE2ZWNmMWFiMmIxNWJj
MmM0NGMwNTMxYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI4IEBACisyMDEzLTA1LTE2ICBBbGxh
biBTYW5kZmVsZCBKZW5zZW4gIDxhbGxhbi5qZW5zZW5AZGlnaWEuY29tPgorCisgICAgICAgIE1h
a2UgUE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUgYXV0by12ZWN0b3JpemFibGUKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNjE1MQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENoYW5nZWQgdGhlIG1h
aW4gbG9vcHMgdW5kZXIgUE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUgc28gdGhhdCB0aGV5
CisgICAgICAgIGF2b2lkIGJyYW5jaGVzIGFuZCBub24tc2VxdWVudGlhbCB0YWJsZSBsb29rIHVw
cy4KKworICAgICAgICBUb2dldGhlciB3aXRoIGF1dG9tYXRpYyB2ZWN0b3JpemF0aW9uIGJ5IHRo
ZSBjb21waWxlciB0aGlzIHByb3ZpZGVzIGFyb3VuZAorICAgICAgICA0eCBzcGVlZC11cCB3aXRo
IEFWWCBvciAyeCBzcGVlZC11cCBvbiBnZW5lcmljIHg2NC4gU2hhdmluZyBvZmYgMTItNDAlIG9u
CisgICAgICAgIFBORyBkZWNvZGluZyBpbiBnZW5lcmFsLgorCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cHJlbXVsdGlwbGllZEFSR0JG
cm9tQ29sb3IpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmg6CisgICAgICAg
IChXZWJDb3JlOjpmYXN0RGl2aWRlQnkyNTUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2ZpbHRlcnMvRkVCbGVuZC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMv
cG5nL1BOR0ltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpzZXRQaXhlbFJHQik6
CisgICAgICAgIChXZWJDb3JlOjpzZXRQaXhlbFJHQkEpOgorICAgICAgICAoV2ViQ29yZTo6c2V0
UGl4ZWxSR0JBX1ByZW11bHRpcGxpZWQpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNv
ZGVyOjpyb3dBdmFpbGFibGUpOgorCiAyMDEzLTA1LTE1ICBBbGxhbiBTYW5kZmVsZCBKZW5zZW4g
IDxhbGxhbi5qZW5zZW5AZGlnaWEuY29tPgogCiAgICAgICAgIEZvbnTigJlzIGZhc3QgY29kZSBw
YXRoIGRvZXNu4oCZdCBoYW5kbGUgcGFydGlhbCBydW5zIGNvcnJlY3RseSB3aGVuIGtlcm5pbmcg
b3IgbGlnYXR1cmVzIGFyZSBlbmFibGVkIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvQ29sb3IuY3BwCmluZGV4IDA0ZGM3M2VhNmVhMjdhNzcwY2VhNDJlNmY0ODdiYjJlZWZiNDVm
MDkuLjUxYzcxMDAwNzc4NGJjZDMyNzQ0MDk1MTNhZTg4MDZlYzc5MzkwNmEgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAKQEAgLTQzNCw5ICs0MzQsOSBAQCBS
R0JBMzIgcHJlbXVsdGlwbGllZEFSR0JGcm9tQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQogICAg
IHVuc2lnbmVkIGFscGhhID0gY29sb3IuYWxwaGEoKTsKICAgICBpZiAoYWxwaGEgPCAyNTUpIHsK
ICAgICAgICAgcGl4ZWxDb2xvciA9IENvbG9yOjpjcmVhdGVVbmNoZWNrZWQoCi0gICAgICAgICAg
ICAoY29sb3IucmVkKCkgKiBhbHBoYSAgKyAyNTQpIC8gMjU1LAotICAgICAgICAgICAgKGNvbG9y
LmdyZWVuKCkgKiBhbHBoYSAgKyAyNTQpIC8gMjU1LAotICAgICAgICAgICAgKGNvbG9yLmJsdWUo
KSAqIGFscGhhICArIDI1NCkgLyAyNTUsCisgICAgICAgICAgICBmYXN0RGl2aWRlQnkyNTUoY29s
b3IucmVkKCkgKiBhbHBoYSArIDI1NCksCisgICAgICAgICAgICBmYXN0RGl2aWRlQnkyNTUoY29s
b3IuZ3JlZW4oKSAqIGFscGhhICsgMjU0KSwKKyAgICAgICAgICAgIGZhc3REaXZpZGVCeTI1NShj
b2xvci5ibHVlKCkgKiBhbHBoYSArIDI1NCksCiAgICAgICAgICAgICBhbHBoYSkucmdiKCk7CiAg
ICAgfSBlbHNlCiAgICAgICAgICBwaXhlbENvbG9yID0gY29sb3IucmdiKCk7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAppbmRleCAzMWI5ZjRhYTgxNDdkNDM5MDg5NmY3
OGMzZDQ1NDg3NWYxODZiNTQ4Li44ZmUxMDBhMTlmZmViNTlhY2FjNGJhZTJlNTAwYzJlMDRkODZi
ZmVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmgKQEAgLTIwMiw2
ICsyMDIsMTQgQEAgaW5saW5lIENvbG9yIGJsZW5kKGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBD
b2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcywgYm9vbCBibGUKICAgICAgICAgICAgICAgICAgYmxl
bmQoZnJvbS5hbHBoYSgpLCB0by5hbHBoYSgpLCBwcm9ncmVzcykpOwogfQogCitpbmxpbmUgdWlu
dDE2X3QgZmFzdERpdmlkZUJ5MjU1KHVpbnQxNl90IHZhbHVlKQoreworICAgIC8vIFRoaXMgaXMg
YW4gYXBwcm94aW1hdGUgYWxnb3JpdGhtIGZvciBkaXZpc2lvbiBieSAyNTUsIGJ1dCBpdCBnaXZl
cyBhY2N1cmF0ZSByZXN1bHRzIGZvciAxNmJpdCB2YWx1ZXMuCisgICAgdWludDE2X3QgYXBwcm94
aW1hdGlvbiA9IHZhbHVlID4+IDg7CisgICAgdWludDE2X3QgcmVtYWluZGVyID0gdmFsdWUgLSAo
YXBwcm94aW1hdGlvbiAqIDI1NSkgKyAxOworICAgIHJldHVybiBhcHByb3hpbWF0aW9uICsgKHJl
bWFpbmRlciA+PiA4KTsKK30KKwogI2lmIFVTRShDRykKIENHQ29sb3JSZWYgY2FjaGVkQ0dDb2xv
cihjb25zdCBDb2xvciYsIENvbG9yU3BhY2UpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFQmxlbmQuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GRUJsZW5kLmNwcAppbmRleCBkNTg5N2Mz
OTJiYjdlOTY2NGUwYzJjMGU0ZWZjNTA1MjlkNWNlZTQ4Li5iZjUyN2ZmNTNiNjMxNjdjMmI4NWEx
NWVmNDNkMjQwZTY2NzQ2ZjZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9maWx0ZXJzL0ZFQmxlbmQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2ZpbHRlcnMvRkVCbGVuZC5jcHAKQEAgLTYzLDE0ICs2Myw2IEBAIGJvb2wgRkVC
bGVuZDo6c2V0QmxlbmRNb2RlKEJsZW5kTW9kZVR5cGUgbW9kZSkKICAgICByZXR1cm4gdHJ1ZTsK
IH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGZhc3REaXZpZGVCeTI1NSh1aW50MTZf
dCB2YWx1ZSkKLXsKLSAgICAvLyBUaGlzIGlzIGFuIGFwcHJveGltYXRlIGFsZ29yaXRobSBmb3Ig
ZGl2aXNpb24gYnkgMjU1LCBidXQgaXQgZ2l2ZXMgYWNjdXJhdGUgcmVzdWx0cyBmb3IgMTZiaXQg
dmFsdWVzLgotICAgIHVpbnQxNl90IHF1b3RpZW50ID0gdmFsdWUgPj4gODsKLSAgICB1aW50MTZf
dCByZW1haW5kZXIgPSB2YWx1ZSAtIChxdW90aWVudCAqIDI1NSkgKyAxOwotICAgIHJldHVybiBx
dW90aWVudCArIChyZW1haW5kZXIgPj4gOCk7Ci19Ci0KIGlubGluZSB1bnNpZ25lZCBjaGFyIGZl
QmxlbmROb3JtYWwodW5zaWduZWQgY2hhciBjb2xvckEsIHVuc2lnbmVkIGNoYXIgY29sb3JCLCB1
bnNpZ25lZCBjaGFyIGFscGhhQSwgdW5zaWduZWQgY2hhcikKIHsKICAgICByZXR1cm4gZmFzdERp
dmlkZUJ5MjU1KCgyNTUgLSBhbHBoYUEpICogY29sb3JCICsgY29sb3JBICogMjU1KTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZy9QTkdJbWFn
ZURlY29kZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5n
L1BOR0ltYWdlRGVjb2Rlci5jcHAKaW5kZXggNzk4NGM5YWU4MDYzZjNmOTc4Y2QzZmNkODRkNzJi
NWQyYzg4YzUyZS4uMWE4NTgyNDc2YThlMzA5OWEzODFhZWY0ODI2MzFlM2NkM2NlNGFhZiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nL1BOR0lt
YWdlRGVjb2Rlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2Rl
cnMvcG5nL1BOR0ltYWdlRGVjb2Rlci5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJQTkdJbWFnZURlY29kZXIuaCIKIAorI2luY2x1ZGUgIkNvbG9y
LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1JbnN0cnVtZW50YXRpb24uaCIKICNpbmNsdWRlICJwbmcu
aCIKICNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KQEAgLTQwMiw2ICs0MDMsMjkgQEAgdm9p
ZCBQTkdJbWFnZURlY29kZXI6OmhlYWRlckF2YWlsYWJsZSgpCiAgICAgfQogfQogCitzdGF0aWMg
aW5saW5lIHZvaWQgc2V0UGl4ZWxSR0IoSW1hZ2VGcmFtZTo6UGl4ZWxEYXRhKiBkZXN0LCBwbmdf
Ynl0ZXAgcGl4ZWwpCit7CisgICAgKmRlc3QgPSAweEZGMDAwMDAwIHwgcGl4ZWxbMF0gPDwgMTYg
fCBwaXhlbFsxXSA8PCA4IHwgcGl4ZWxbMl07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRQ
aXhlbFJHQkEoSW1hZ2VGcmFtZTo6UGl4ZWxEYXRhKiBkZXN0LCBwbmdfYnl0ZXAgcGl4ZWwsIGJv
b2wmIG5vblRyaXZpYWxBbHBoYSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGEgPSBwaXhlbFszXTsK
KyAgICAqZGVzdCA9IGEgPDwgMjQgfCBwaXhlbFswXSA8PCAxNiB8IHBpeGVsWzFdIDw8IDggfCBw
aXhlbFsyXTsKKyAgICBub25Ucml2aWFsQWxwaGEgfD0gfihhIF4gMjU1VSk7IC8vIEFyaXRobWV0
aWMgY2FsY3VsYXRpb24gb2YgKGEgIT0gMjU1KS4KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNl
dFBpeGVsUHJlbXVsdGlwbGllZFJHQkEoSW1hZ2VGcmFtZTo6UGl4ZWxEYXRhKiBkZXN0LCBwbmdf
Ynl0ZXAgcGl4ZWwsIGJvb2wmIG5vblRyaXZpYWxBbHBoYSkKK3sKKyAgICB1bnNpZ25lZCBjaGFy
IGEgPSBwaXhlbFszXTsKKyAgICB1bnNpZ25lZCBjaGFyIHIgPSBmYXN0RGl2aWRlQnkyNTUocGl4
ZWxbMF0gKiBhKTsKKyAgICB1bnNpZ25lZCBjaGFyIGcgPSBmYXN0RGl2aWRlQnkyNTUocGl4ZWxb
MV0gKiBhKTsKKyAgICB1bnNpZ25lZCBjaGFyIGIgPSBmYXN0RGl2aWRlQnkyNTUocGl4ZWxbMl0g
KiBhKTsKKworICAgICpkZXN0ID0gYSA8PCAyNCB8IHIgPDwgMTYgfCBnIDw8IDggfCBiOworICAg
IG5vblRyaXZpYWxBbHBoYSB8PSB+KGEgXiAyNTVVKTsgLy8gQXJpdGhtZXRpYyBjYWxjdWxhdGlv
biBvZiAoYSAhPSAyNTUpLgorfQorCiB2b2lkIFBOR0ltYWdlRGVjb2Rlcjo6cm93QXZhaWxhYmxl
KHVuc2lnbmVkIGNoYXIqIHJvd0J1ZmZlciwgdW5zaWduZWQgcm93SW5kZXgsIGludCkKIHsKICAg
ICBpZiAobV9mcmFtZUJ1ZmZlckNhY2hlLmlzRW1wdHkoKSkKQEAgLTUwNCwyMSArNTI4LDMxIEBA
IHZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpyb3dBdmFpbGFibGUodW5zaWduZWQgY2hhciogcm93QnVm
ZmVyLCB1bnNpZ25lZCByb3dJbmRleCwKICAgICBib29sIG5vblRyaXZpYWxBbHBoYSA9IGZhbHNl
OwogCiAjaWYgRU5BQkxFKElNQUdFX0RFQ09ERVJfRE9XTl9TQU1QTElORykKLSAgICBmb3IgKGlu
dCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgcG5nX2J5dGVwIHBpeGVsID0gcm93
ICsgKG1fc2NhbGVkID8gbV9zY2FsZWRDb2x1bW5zW3hdIDogeCkgKiBjb2xvckNoYW5uZWxzOwot
ICAgICAgICB1bnNpZ25lZCBhbHBoYSA9IGhhc0FscGhhID8gcGl4ZWxbM10gOiAyNTU7Ci0gICAg
ICAgIGJ1ZmZlci5zZXRSR0JBKGFkZHJlc3MrKywgcGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsy
XSwgYWxwaGEpOwotICAgICAgICBub25Ucml2aWFsQWxwaGEgfD0gYWxwaGEgPCAyNTU7Ci0gICAg
fQotI2Vsc2UKLSAgICBBU1NFUlQoIW1fc2NhbGVkKTsKLSAgICBwbmdfYnl0ZXAgcGl4ZWwgPSBy
b3c7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgKyt4LCBwaXhlbCArPSBjb2xvckNo
YW5uZWxzKSB7Ci0gICAgICAgIHVuc2lnbmVkIGFscGhhID0gaGFzQWxwaGEgPyBwaXhlbFszXSA6
IDI1NTsKLSAgICAgICAgYnVmZmVyLnNldFJHQkEoYWRkcmVzcysrLCBwaXhlbFswXSwgcGl4ZWxb
MV0sIHBpeGVsWzJdLCBhbHBoYSk7Ci0gICAgICAgIG5vblRyaXZpYWxBbHBoYSB8PSBhbHBoYSA8
IDI1NTsKLSAgICB9CisgICAgaWYgKG1fc2NhbGVkKSB7CisgICAgICAgIGZvciAoaW50IHggPSAw
OyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgcG5nX2J5dGVwIHBpeGVsID0gcm93ICsg
bV9zY2FsZWRDb2x1bW5zW3hdICogY29sb3JDaGFubmVsczsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGFscGhhID0gaGFzQWxwaGEgPyBwaXhlbFszXSA6IDI1NTsKKyAgICAgICAgICAgIGJ1ZmZlci5z
ZXRSR0JBKGFkZHJlc3MrKywgcGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSwgYWxwaGEpOwor
ICAgICAgICAgICAgbm9uVHJpdmlhbEFscGhhIHw9IH4oYWxwaGEgXiAyNTVVKTsgLy8gQXJpdGht
ZXRpYyBjYWxjdWxhdGlvbiBvZiAoYWxwaGEgIT0gMjU1KS4KKyAgICAgICAgfQorICAgIH0gZWxz
ZQogI2VuZGlmCisgICAgeworICAgICAgICBwbmdfYnl0ZXAgcGl4ZWwgPSByb3c7CisgICAgICAg
IGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5wcmVtdWx0aXBseUFscGhh
KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyArK3gsIHBp
eGVsICs9IDQpCisgICAgICAgICAgICAgICAgICAgIHNldFBpeGVsUHJlbXVsdGlwbGllZFJHQkEo
YWRkcmVzcysrLCBwaXhlbCwgbm9uVHJpdmlhbEFscGhhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgKyt4LCBwaXhlbCAr
PSA0KQorICAgICAgICAgICAgICAgICAgICBzZXRQaXhlbFJHQkEoYWRkcmVzcysrLCBwaXhlbCwg
bm9uVHJpdmlhbEFscGhhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7ICsreCwgcGl4ZWwgKz0gMykKKyAgICAg
ICAgICAgICAgICBzZXRQaXhlbFJHQihhZGRyZXNzKyssIHBpeGVsKTsKKyAgICAgICAgfQorICAg
IH0KKwogCiAgICAgaWYgKG5vblRyaXZpYWxBbHBoYSAmJiAhYnVmZmVyLmhhc0FscGhhKCkpCiAg
ICAgICAgIGJ1ZmZlci5zZXRIYXNBbHBoYShub25Ucml2aWFsQWxwaGEpOwo=
</data>
<flag name="review"
          id="223329"
          type_id="1"
          status="+"
          setter="benjamin"
    />
    <flag name="commit-queue"
          id="223442"
          type_id="3"
          status="-"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>