<?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>31415</bug_id>
          
          <creation_ts>2009-11-12 09:47:29 -0800</creation_ts>
          <short_desc>[v8] do not copy data twice when converting short v8 string into WebCore::String</short_desc>
          <delta_ts>2009-12-04 12:16:21 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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="anton muhin">antonm</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dimich</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>jens</cc>
    
    <cc>vitalyr</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>162931</commentid>
    <comment_count>0</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-12 09:47:29 -0800</bug_when>
    <thetext>Using WebCore::String::String(const UChar*, int length) leads to another copy of data, so we&apos;d better use String::createUninitialized directly</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162932</commentid>
    <comment_count>1</comment_count>
      <attachid>43070</attachid>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-12 09:50:50 -0800</bug_when>
    <thetext>Created attachment 43070
First take</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162936</commentid>
    <comment_count>2</comment_count>
    <who name="Vitaly Repeshko">vitalyr</who>
    <bug_when>2009-11-12 10:05:53 -0800</bug_when>
    <thetext>(In reply to comment #1)
&gt; Created an attachment (id=43070) [details]
&gt; First take

LGTM.


&gt; +    static String convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {

ASSERT v8String-&gt;Length() == length.

&gt; +        UChar* buffer;
&gt; +        String result = String::createUninitialized(length, buffer);
&gt; +        v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; +        return result;
&gt; +    }

Perhaps add a comment that using an inline buffer doesn&apos;t make sense here to prevent future attempts to &quot;optimize&quot; this.


&gt; +    static AtomicString convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {

ASSERT v8String-&gt;Length() == length.

&gt; +        static const int inlineBufferSize = 16;
&gt; +        if (length &lt;= inlineBufferSize) {
&gt; +            UChar inlineBuffer[inlineBufferSize];
&gt; +            v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(inlineBuffer), 0, length);
&gt; +            return AtomicString(inlineBuffer, length);
&gt; +        } else {
&gt; +            UChar* buffer;
&gt; +            String tmp = String::createUninitialized(length, buffer);
&gt; +            v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; +            return AtomicString(tmp);
&gt; +        }
&gt; +    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162971</commentid>
    <comment_count>3</comment_count>
      <attachid>43080</attachid>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-12 11:09:22 -0800</bug_when>
    <thetext>Created attachment 43080
Addressing Vitaly&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162972</commentid>
    <comment_count>4</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-12 11:11:16 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (In reply to comment #1)
&gt; &gt; Created an attachment (id=43070) [details] [details]
&gt; &gt; First take
&gt; 
&gt; LGTM.
&gt; 
&gt; 
&gt; &gt; +    static String convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
&gt; 
&gt; ASSERT v8String-&gt;Length() == length.
&gt; 
&gt; &gt; +        UChar* buffer;
&gt; &gt; +        String result = String::createUninitialized(length, buffer);
&gt; &gt; +        v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; &gt; +        return result;
&gt; &gt; +    }
&gt; 
&gt; Perhaps add a comment that using an inline buffer doesn&apos;t make sense here to
&gt; prevent future attempts to &quot;optimize&quot; this.

Done.
 
&gt; &gt; +    static AtomicString convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
&gt; 
&gt; ASSERT v8String-&gt;Length() == length.

Done.

Thanks a lot for comments, Vitaly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163068</commentid>
    <comment_count>5</comment_count>
      <attachid>43080</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-11-12 14:48:40 -0800</bug_when>
    <thetext>Comment on attachment 43080
Addressing Vitaly&apos;s comments

&gt; Index: WebCore/ChangeLog

&gt; +        Do not use WebCore::String::String(const UChar*, int length) to convert
&gt; +        short v8 strings.
&gt; +
&gt; +        Plus added string traits.

It is good to add the reason for the change to the ChangeLog as well as what was done.
Ideally, perf optimizations would come with some measurement to show the actual win.

&gt; +    static String convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
&gt; +        ASSERT(v8String-&gt;Length() == length);
&gt; +        // NOTE: as of now, String(const UChar*, int) performs String::createUninitialized
&gt; +        // anyway, so no need to optimize like we do for AtomicString below.
&gt; +        UChar* buffer;
&gt; +        String result = String::createUninitialized(length, buffer);
&gt; +        v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; +        return result;

It is unfortunate that this introduces almost a duplicate of the code... Could you consider having the StringTraits to have some simple bool flag, like &quot;useInlineBuffer&quot; and have a single copy of the code, something like this:
if (StringTraits&lt;StringType&gt;::useInlineBuffer() &amp;&amp; length &lt;= inlineBufferSize)
... use inline buffer ...
} else {
... use createUninitialized ...
}
or some other way to keep the code in one place?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163281</commentid>
    <comment_count>6</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-13 05:08:50 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 43080 [details])
&gt; &gt; Index: WebCore/ChangeLog
&gt; 
&gt; &gt; +        Do not use WebCore::String::String(const UChar*, int length) to convert
&gt; &gt; +        short v8 strings.
&gt; &gt; +
&gt; &gt; +        Plus added string traits.
&gt; 
&gt; It is good to add the reason for the change to the ChangeLog as well as what
&gt; was done.
&gt; Ideally, perf optimizations would come with some measurement to show the actual
&gt; win.

It has no performance impact or completely minimal.  The idea was not to speed up some things, but to make it clear that this optimization is actually wrong for this particular case.

&gt; 
&gt; &gt; +    static String convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
&gt; &gt; +        ASSERT(v8String-&gt;Length() == length);
&gt; &gt; +        // NOTE: as of now, String(const UChar*, int) performs String::createUninitialized
&gt; &gt; +        // anyway, so no need to optimize like we do for AtomicString below.
&gt; &gt; +        UChar* buffer;
&gt; &gt; +        String result = String::createUninitialized(length, buffer);
&gt; &gt; +        v8String-&gt;Write(reinterpret_cast&lt;uint16_t*&gt;(buffer), 0, length);
&gt; &gt; +        return result;
&gt; 
&gt; It is unfortunate that this introduces almost a duplicate of the code... Could
&gt; you consider having the StringTraits to have some simple bool flag, like
&gt; &quot;useInlineBuffer&quot; and have a single copy of the code, something like this:
&gt; if (StringTraits&lt;StringType&gt;::useInlineBuffer() &amp;&amp; length &lt;= inlineBufferSize)
&gt; ... use inline buffer ...
&gt; } else {
&gt; ... use createUninitialized ...
&gt; }
&gt; or some other way to keep the code in one place?

Sure we could.  The problem: there are only three lines of the code (including UChar* buffer declaration), so I am not sure that in this particular case it&apos;s worth the effort.  But if you still think it&apos;s a good idea, I&apos;d definitely do that.

And thanks a lot for comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164215</commentid>
    <comment_count>7</comment_count>
      <attachid>43080</attachid>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-17 06:00:12 -0800</bug_when>
    <thetext>Comment on attachment 43080
Addressing Vitaly&apos;s comments

ping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164341</commentid>
    <comment_count>8</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-11-17 13:52:53 -0800</bug_when>
    <thetext>&gt; It has no performance impact or completely minimal.  The idea was not to speed
&gt; up some things, but to make it clear that this optimization is actually wrong
&gt; for this particular case.

I&apos;m not sure I understand the idea of the patch then. It replaces 15 lines of code with 43, to document that certain optimization does not always produce a perf win... Could a comment suffice? 

It seems the purpose of v8StringToWebCoreString templated function is to fold implementation of 2 other functions, v8StringToWebCoreString and v8StringToAtomicWebCoreString, into one, to avoid code duplication. It is strange to branch into 2 separate implementations again from v8StringToWebCoreString template. Perhaps 2 separate implementations from the start would be more readable?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164549</commentid>
    <comment_count>9</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-18 05:32:37 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; It has no performance impact or completely minimal.  The idea was not to speed
&gt; &gt; up some things, but to make it clear that this optimization is actually wrong
&gt; &gt; for this particular case.
&gt; 
&gt; I&apos;m not sure I understand the idea of the patch then. It replaces 15 lines of
&gt; code with 43, to document that certain optimization does not always produce a
&gt; perf win... Could a comment suffice? 

It is an optimization (for small strings we do not copy them twice).  But perf effect as measured by current benchmarks is minimal if any.  However, I think it should be easy to cook up a benchmark that shows the benefit---many conversions of short strings.

I am not sure number of lines removed/added is a good estimator.  E.g. I removed two lines and added 10 to use a common idiom of traits when fetching webcore string from the resource (instead of overloading which is less intuitive imho).

&gt; It seems the purpose of v8StringToWebCoreString templated function is to fold
&gt; implementation of 2 other functions, v8StringToWebCoreString and
&gt; v8StringToAtomicWebCoreString, into one, to avoid code duplication. It is
&gt; strange to branch into 2 separate implementations again from
&gt; v8StringToWebCoreString template. Perhaps 2 separate implementations from the
&gt; start would be more readable?

The problem is there is no trivial prologue (checking if the string is already externalized) and epilogue (which externalizes the string if necessary) which I&apos;d like not to duplicate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166284</commentid>
    <comment_count>10</comment_count>
      <attachid>43080</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-11-24 14:55:20 -0800</bug_when>
    <thetext>Comment on attachment 43080
Addressing Vitaly&apos;s comments

&gt; Index: WebCore/bindings/v8/V8Binding.cpp

&gt; +template &lt;class S&gt; struct StringTraits
&gt; +{
&gt; +    static S getFromResource(WebCoreStringResource* resource);
&gt; +
&gt; +    static S convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length);

how about naming these fromStringResource and fromV8String?


&gt; +template&lt;&gt;
&gt; +struct StringTraits&lt;String&gt;
&gt; +{
&gt; +    static String getFromResource(WebCoreStringResource* resource) {
&gt; +        return resource-&gt;webcoreString();
&gt; +    }

please place the opening bracket on a new line per webkit style.  same goes
for the other functions in this patch.


&gt; +    static AtomicString convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
...
&gt; +            return AtomicString(inlineBuffer, length);
&gt; +        } else {

nit: no need for else after return.


R- because of style issues.  otherwise, the substance looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166560</commentid>
    <comment_count>11</comment_count>
      <attachid>43872</attachid>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-25 15:19:08 -0800</bug_when>
    <thetext>Created attachment 43872
Addressing Darin&apos;s concerns</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166561</commentid>
    <comment_count>12</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-11-25 15:21:00 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 43080 [details])
&gt; &gt; Index: WebCore/bindings/v8/V8Binding.cpp
&gt; 
&gt; &gt; +template &lt;class S&gt; struct StringTraits
&gt; &gt; +{
&gt; &gt; +    static S getFromResource(WebCoreStringResource* resource);
&gt; &gt; +
&gt; &gt; +    static S convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length);
&gt; 
&gt; how about naming these fromStringResource and fromV8String?

Done.

&gt; &gt; +template&lt;&gt;
&gt; &gt; +struct StringTraits&lt;String&gt;
&gt; &gt; +{
&gt; &gt; +    static String getFromResource(WebCoreStringResource* resource) {
&gt; &gt; +        return resource-&gt;webcoreString();
&gt; &gt; +    }
&gt; 
&gt; please place the opening bracket on a new line per webkit style.  same goes
&gt; for the other functions in this patch.

Hopefully done---I hope we are allowed to keep { on the line of if, at least that was the case before.
&gt; 
&gt; 
&gt; &gt; +    static AtomicString convertFromV8(v8::Handle&lt;v8::String&gt; v8String, int length) {
&gt; ...
&gt; &gt; +            return AtomicString(inlineBuffer, length);
&gt; &gt; +        } else {
&gt; 
&gt; nit: no need for else after return.
&gt; 
&gt; 
&gt; R- because of style issues.  otherwise, the substance looks good.

Many thanks for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166591</commentid>
    <comment_count>13</comment_count>
      <attachid>43872</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-11-25 18:05:12 -0800</bug_when>
    <thetext>Comment on attachment 43872
Addressing Darin&apos;s concerns

Darin Fisher and I discussed it a bit. Although he&apos;s noted the style issues, he didn&apos;t mean to say the discussion we had before is concluded.

Usually, perf improvement should measurably improve perf, so if there is no test but you say it can easily be created then lets add a test, measure and know what we are gaining. Having a test also prevents possible regressions. We have a v8-specific set of tests in src/data/dom_perf - could you add a specific test here?

Again, if there is no measurable difference, I don&apos;t see why make the change. Agree there could be an extra copy of up to 16 bytes to a stack array. But if it&apos;s impossible to measure, why split the code at all?

r- because it needs a test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166666</commentid>
    <comment_count>14</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-11-26 00:06:57 -0800</bug_when>
    <thetext>I agree with Dmitry.  My comment #10 was made without reviewing the commentary in this bug.  I had just jumped to the patch from the request queue :-(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167658</commentid>
    <comment_count>15</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-12-01 09:52:12 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 43872 [details])
&gt; Darin Fisher and I discussed it a bit. Although he&apos;s noted the style issues, he
&gt; didn&apos;t mean to say the discussion we had before is concluded.
&gt; 
&gt; Usually, perf improvement should measurably improve perf, so if there is no
&gt; test but you say it can easily be created then lets add a test, measure and
&gt; know what we are gaining. Having a test also prevents possible regressions. We
&gt; have a v8-specific set of tests in src/data/dom_perf - could you add a specific
&gt; test here?
&gt; 
&gt; Again, if there is no measurable difference, I don&apos;t see why make the change.
&gt; Agree there could be an extra copy of up to 16 bytes to a stack array. But if
&gt; it&apos;s impossible to measure, why split the code at all?
&gt; 
&gt; r- because it needs a test.

For Dromaeo DOM core (which is one of our primary benchmarks now and the only benchmark we&apos;re lagging Safari for now), that gives ~2.5% speedup for overall score (4 runs, dropping the slowest) and, more importantly, ~10% for DOM query (which is, together with DOM Modification) is there we&apos;re behind Safari.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168470</commentid>
    <comment_count>16</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-12-03 11:12:10 -0800</bug_when>
    <thetext>ping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168840</commentid>
    <comment_count>17</comment_count>
      <attachid>43872</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-12-04 10:51:10 -0800</bug_when>
    <thetext>Comment on attachment 43872
Addressing Darin&apos;s concerns

Good improvement on Dromaeo! 
r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168842</commentid>
    <comment_count>18</comment_count>
    <who name="anton muhin">antonm</who>
    <bug_when>2009-12-04 10:55:52 -0800</bug_when>
    <thetext>Thanks a lot for review, Dmitry and Darin,

Attempting to commit-queue+ as is, but if it got rotten would upload fresh patch (just rebaselined to the current WebKit).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168868</commentid>
    <comment_count>19</comment_count>
      <attachid>43872</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-04 12:16:13 -0800</bug_when>
    <thetext>Comment on attachment 43872
Addressing Darin&apos;s concerns

Clearing flags on attachment: 43872

Committed r51707: &lt;http://trac.webkit.org/changeset/51707&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168869</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-04 12:16:21 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43070</attachid>
            <date>2009-11-12 09:50:50 -0800</date>
            <delta_ts>2009-11-12 11:09:22 -0800</delta_ts>
            <desc>First take</desc>
            <filename>WC.patch</filename>
            <type>text/plain</type>
            <size>4043</size>
            <attacher name="anton muhin">antonm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDg4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMTEtMTIgIEFudG9uIE11aGluICA8YW50b25tQGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBE
byBub3QgdXNlIFdlYkNvcmU6OlN0cmluZzo6U3RyaW5nKGNvbnN0IFVDaGFyKiwgaW50IGxlbmd0
aCkgdG8gY29udmVydAorICAgICAgICBzaG9ydCB2OCBzdHJpbmdzLgorCisgICAgICAgIFBsdXMg
YWRkZWQgc3RyaW5nIHRyYWl0cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTMxNDE1CisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OnY4U3RyaW5nVG9XZWJD
b3JlU3RyaW5nKToKKwogMjAwOS0xMS0xMiAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxl
LmNvbT4KIAogICAgICAgICBTbm93TGVvcGFyZCBidWlsZCBmaXguCkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9WOEJpbmRpbmcuY3BwCShyZXZpc2lvbiA1MDc1NikKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
VjhCaW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA0LDEwICsxMDQsNiBAQAogICAgICAg
ICByZXR1cm4gbV9hdG9taWNTdHJpbmc7CiAgICAgfQogCi0gICAgLy8gUmV0dXJucyByaWdodCBz
dHJpbmcgdHlwZSBiYXNlZCBvbiBhIGR1bW15IHBhcmFtZXRlci4KLSAgICBTdHJpbmcgc3RyaW5n
KFN0cmluZykgeyByZXR1cm4gd2ViY29yZVN0cmluZygpOyB9Ci0gICAgQXRvbWljU3RyaW5nIHN0
cmluZyhBdG9taWNTdHJpbmcpIHsgcmV0dXJuIGF0b21pY1N0cmluZygpOyB9Ci0KICAgICBzdGF0
aWMgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiB0b1N0cmluZ1Jlc291cmNlKHY4OjpIYW5kbGU8djg6
OlN0cmluZz4gdjhTdHJpbmcpCiAgICAgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2Vi
Q29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmctPkdldEV4dGVybmFsU3RyaW5nUmVzb3VyY2Uo
KSk7CkBAIC0xMzMsMTIgKzEyOSw1NyBAQAogICAgIERvTm90RXh0ZXJuYWxpemUKIH07CiAKKwor
dGVtcGxhdGUgPGNsYXNzIFM+IHN0cnVjdCBTdHJpbmdUcmFpdHMKK3sKKyAgICBzdGF0aWMgUyBn
ZXRGcm9tUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSk7CisKKyAgICBz
dGF0aWMgUyBjb252ZXJ0RnJvbVY4KHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGlu
dCBsZW5ndGgpOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IFN0cmluZ1RyYWl0czxTdHJpbmc+
Cit7CisgICAgc3RhdGljIFN0cmluZyBnZXRGcm9tUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291
cmNlKiByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2UtPndlYmNvcmVTdHJpbmco
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGcm9tVjgodjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiB2OFN0cmluZywgaW50IGxlbmd0aCkgeworICAgICAgICBVQ2hhciogYnVmZmVy
OworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxl
bmd0aCwgYnVmZmVyKTsKKyAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8
dWludDE2X3QqPihidWZmZXIpLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTdHJpbmdUcmFpdHM8QXRvbWljU3RyaW5n
PgoreworICAgIHN0YXRpYyBBdG9taWNTdHJpbmcgZ2V0RnJvbVJlc291cmNlKFdlYkNvcmVTdHJp
bmdSZXNvdXJjZSogcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlLT5hdG9taWNT
dHJpbmcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQXRvbWljU3RyaW5nIGNvbnZlcnRGcm9tVjgo
djg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgaW50IGxlbmd0aCkgeworICAgICAgICBz
dGF0aWMgY29uc3QgaW50IGlubGluZUJ1ZmZlclNpemUgPSAxNjsKKyAgICAgICAgaWYgKGxlbmd0
aCA8PSBpbmxpbmVCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBVQ2hhciBpbmxpbmVCdWZmZXJb
aW5saW5lQnVmZmVyU2l6ZV07CisgICAgICAgICAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnBy
ZXRfY2FzdDx1aW50MTZfdCo+KGlubGluZUJ1ZmZlciksIDAsIGxlbmd0aCk7CisgICAgICAgICAg
ICByZXR1cm4gQXRvbWljU3RyaW5nKGlubGluZUJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIFVDaGFyKiBidWZmZXI7CisgICAgICAgICAgICBTdHJpbmcgdG1w
ID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAg
ICAgIHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwg
MCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBBdG9taWNTdHJpbmcodG1wKTsKKyAgICAg
ICAgfQorICAgIH0KK307CisKIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgogc3RhdGlj
IFN0cmluZ1R5cGUgdjhTdHJpbmdUb1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5n
PiB2OFN0cmluZywgRXh0ZXJuYWxNb2RlIGV4dGVybmFsKQogewogICAgIFdlYkNvcmVTdHJpbmdS
ZXNvdXJjZSogc3RyaW5nUmVzb3VyY2UgPSBXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OnRvU3RyaW5n
UmVzb3VyY2UodjhTdHJpbmcpOwogICAgIGlmIChzdHJpbmdSZXNvdXJjZSkKLSAgICAgICAgcmV0
dXJuIHN0cmluZ1Jlc291cmNlLT5zdHJpbmcoU3RyaW5nVHlwZSgpKTsKKyAgICAgICAgcmV0dXJu
IFN0cmluZ1RyYWl0czxTdHJpbmdUeXBlPjo6Z2V0RnJvbVJlc291cmNlKHN0cmluZ1Jlc291cmNl
KTsKIAogICAgIGludCBsZW5ndGggPSB2OFN0cmluZy0+TGVuZ3RoKCk7CiAgICAgaWYgKCFsZW5n
dGgpIHsKQEAgLTE0NiwxOCArMTg3LDcgQEAKICAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmVt
cHR5KCk7CiAgICAgfQogCi0gICAgU3RyaW5nVHlwZSByZXN1bHQ7Ci0gICAgc3RhdGljIGNvbnN0
IGludCBpbmxpbmVCdWZmZXJTaXplID0gMTY7Ci0gICAgaWYgKGxlbmd0aCA8PSBpbmxpbmVCdWZm
ZXJTaXplKSB7Ci0gICAgICAgIFVDaGFyIGlubGluZUJ1ZmZlcltpbmxpbmVCdWZmZXJTaXplXTsK
LSAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihpbmxp
bmVCdWZmZXIpLCAwLCBsZW5ndGgpOwotICAgICAgICByZXN1bHQgPSBTdHJpbmdUeXBlKGlubGlu
ZUJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBVQ2hhciogYnVmZmVyOwot
ICAgICAgICBTdHJpbmcgdG1wID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwg
YnVmZmVyKTsKLSAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2
X3QqPihidWZmZXIpLCAwLCBsZW5ndGgpOwotICAgICAgICByZXN1bHQgPSBTdHJpbmdUeXBlKHRt
cCk7Ci0gICAgfQorICAgIFN0cmluZ1R5cGUgcmVzdWx0KFN0cmluZ1RyYWl0czxTdHJpbmdUeXBl
Pjo6Y29udmVydEZyb21WOCh2OFN0cmluZywgbGVuZ3RoKSk7CiAKICAgICBpZiAoZXh0ZXJuYWwg
PT0gRXh0ZXJuYWxpemUgJiYgdjhTdHJpbmctPkNhbk1ha2VFeHRlcm5hbCgpKSB7CiAgICAgICAg
IHN0cmluZ1Jlc291cmNlID0gbmV3IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShyZXN1bHQpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43080</attachid>
            <date>2009-11-12 11:09:22 -0800</date>
            <delta_ts>2009-11-25 15:19:08 -0800</delta_ts>
            <desc>Addressing Vitaly&apos;s comments</desc>
            <filename>WC.patch</filename>
            <type>text/plain</type>
            <size>4307</size>
            <attacher name="anton muhin">antonm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDg4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMTEtMTIgIEFudG9uIE11aGluICA8YW50b25tQGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBE
byBub3QgdXNlIFdlYkNvcmU6OlN0cmluZzo6U3RyaW5nKGNvbnN0IFVDaGFyKiwgaW50IGxlbmd0
aCkgdG8gY29udmVydAorICAgICAgICBzaG9ydCB2OCBzdHJpbmdzLgorCisgICAgICAgIFBsdXMg
YWRkZWQgc3RyaW5nIHRyYWl0cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTMxNDE1CisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OnY4U3RyaW5nVG9XZWJD
b3JlU3RyaW5nKToKKwogMjAwOS0xMS0xMiAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxl
LmNvbT4KIAogICAgICAgICBTbm93TGVvcGFyZCBidWlsZCBmaXguCkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9WOEJpbmRpbmcuY3BwCShyZXZpc2lvbiA1MDc1NikKKysrIFdlYkNvcmUvYmluZGluZ3Mvdjgv
VjhCaW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA0LDEwICsxMDQsNiBAQAogICAgICAg
ICByZXR1cm4gbV9hdG9taWNTdHJpbmc7CiAgICAgfQogCi0gICAgLy8gUmV0dXJucyByaWdodCBz
dHJpbmcgdHlwZSBiYXNlZCBvbiBhIGR1bW15IHBhcmFtZXRlci4KLSAgICBTdHJpbmcgc3RyaW5n
KFN0cmluZykgeyByZXR1cm4gd2ViY29yZVN0cmluZygpOyB9Ci0gICAgQXRvbWljU3RyaW5nIHN0
cmluZyhBdG9taWNTdHJpbmcpIHsgcmV0dXJuIGF0b21pY1N0cmluZygpOyB9Ci0KICAgICBzdGF0
aWMgV2ViQ29yZVN0cmluZ1Jlc291cmNlKiB0b1N0cmluZ1Jlc291cmNlKHY4OjpIYW5kbGU8djg6
OlN0cmluZz4gdjhTdHJpbmcpCiAgICAgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2Vi
Q29yZVN0cmluZ1Jlc291cmNlKj4odjhTdHJpbmctPkdldEV4dGVybmFsU3RyaW5nUmVzb3VyY2Uo
KSk7CkBAIC0xMzMsMTIgKzEyOSw2MSBAQAogICAgIERvTm90RXh0ZXJuYWxpemUKIH07CiAKKwor
dGVtcGxhdGUgPGNsYXNzIFM+IHN0cnVjdCBTdHJpbmdUcmFpdHMKK3sKKyAgICBzdGF0aWMgUyBn
ZXRGcm9tUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSk7CisKKyAgICBz
dGF0aWMgUyBjb252ZXJ0RnJvbVY4KHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGlu
dCBsZW5ndGgpOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IFN0cmluZ1RyYWl0czxTdHJpbmc+
Cit7CisgICAgc3RhdGljIFN0cmluZyBnZXRGcm9tUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291
cmNlKiByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2UtPndlYmNvcmVTdHJpbmco
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGcm9tVjgodjg6OkhhbmRsZTx2
ODo6U3RyaW5nPiB2OFN0cmluZywgaW50IGxlbmd0aCkgeworICAgICAgICBBU1NFUlQodjhTdHJp
bmctPkxlbmd0aCgpID09IGxlbmd0aCk7CisgICAgICAgIC8vIE5PVEU6IGFzIG9mIG5vdywgU3Ry
aW5nKGNvbnN0IFVDaGFyKiwgaW50KSBwZXJmb3JtcyBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6
ZWQKKyAgICAgICAgLy8gYW55d2F5LCBzbyBubyBuZWVkIHRvIG9wdGltaXplIGxpa2Ugd2UgZG8g
Zm9yIEF0b21pY1N0cmluZyBiZWxvdy4KKyAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKKyAgICAgICAg
U3RyaW5nIHJlc3VsdCA9IFN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZl
cik7CisgICAgICAgIHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4o
YnVmZmVyKSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9Owor
Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU3RyaW5nVHJhaXRzPEF0b21pY1N0cmluZz4KK3sKKyAgICBz
dGF0aWMgQXRvbWljU3RyaW5nIGdldEZyb21SZXNvdXJjZShXZWJDb3JlU3RyaW5nUmVzb3VyY2Uq
IHJlc291cmNlKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZS0+YXRvbWljU3RyaW5nKCk7Cisg
ICAgfQorCisgICAgc3RhdGljIEF0b21pY1N0cmluZyBjb252ZXJ0RnJvbVY4KHY4OjpIYW5kbGU8
djg6OlN0cmluZz4gdjhTdHJpbmcsIGludCBsZW5ndGgpIHsKKyAgICAgICAgQVNTRVJUKHY4U3Ry
aW5nLT5MZW5ndGgoKSA9PSBsZW5ndGgpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGlubGlu
ZUJ1ZmZlclNpemUgPSAxNjsKKyAgICAgICAgaWYgKGxlbmd0aCA8PSBpbmxpbmVCdWZmZXJTaXpl
KSB7CisgICAgICAgICAgICBVQ2hhciBpbmxpbmVCdWZmZXJbaW5saW5lQnVmZmVyU2l6ZV07Cisg
ICAgICAgICAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGlu
bGluZUJ1ZmZlciksIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gQXRvbWljU3RyaW5n
KGlubGluZUJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVD
aGFyKiBidWZmZXI7CisgICAgICAgICAgICBTdHJpbmcgdG1wID0gU3RyaW5nOjpjcmVhdGVVbmlu
aXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAgICAgIHY4U3RyaW5nLT5Xcml0ZShy
ZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwgbGVuZ3RoKTsKKyAgICAgICAg
ICAgIHJldHVybiBBdG9taWNTdHJpbmcodG1wKTsKKyAgICAgICAgfQorICAgIH0KK307CisKIHRl
bXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgogc3RhdGljIFN0cmluZ1R5cGUgdjhTdHJpbmdU
b1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6U3RyaW5nPiB2OFN0cmluZywgRXh0ZXJuYWxN
b2RlIGV4dGVybmFsKQogewogICAgIFdlYkNvcmVTdHJpbmdSZXNvdXJjZSogc3RyaW5nUmVzb3Vy
Y2UgPSBXZWJDb3JlU3RyaW5nUmVzb3VyY2U6OnRvU3RyaW5nUmVzb3VyY2UodjhTdHJpbmcpOwog
ICAgIGlmIChzdHJpbmdSZXNvdXJjZSkKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Jlc291cmNlLT5z
dHJpbmcoU3RyaW5nVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1RyYWl0czxTdHJpbmdU
eXBlPjo6Z2V0RnJvbVJlc291cmNlKHN0cmluZ1Jlc291cmNlKTsKIAogICAgIGludCBsZW5ndGgg
PSB2OFN0cmluZy0+TGVuZ3RoKCk7CiAgICAgaWYgKCFsZW5ndGgpIHsKQEAgLTE0NiwxOCArMTkx
LDcgQEAKICAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmVtcHR5KCk7CiAgICAgfQogCi0gICAg
U3RyaW5nVHlwZSByZXN1bHQ7Ci0gICAgc3RhdGljIGNvbnN0IGludCBpbmxpbmVCdWZmZXJTaXpl
ID0gMTY7Ci0gICAgaWYgKGxlbmd0aCA8PSBpbmxpbmVCdWZmZXJTaXplKSB7Ci0gICAgICAgIFVD
aGFyIGlubGluZUJ1ZmZlcltpbmxpbmVCdWZmZXJTaXplXTsKLSAgICAgICAgdjhTdHJpbmctPldy
aXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihpbmxpbmVCdWZmZXIpLCAwLCBsZW5ndGgp
OwotICAgICAgICByZXN1bHQgPSBTdHJpbmdUeXBlKGlubGluZUJ1ZmZlciwgbGVuZ3RoKTsKLSAg
ICB9IGVsc2UgewotICAgICAgICBVQ2hhciogYnVmZmVyOwotICAgICAgICBTdHJpbmcgdG1wID0g
U3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgdjhT
dHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihidWZmZXIpLCAwLCBsZW5n
dGgpOwotICAgICAgICByZXN1bHQgPSBTdHJpbmdUeXBlKHRtcCk7Ci0gICAgfQorICAgIFN0cmlu
Z1R5cGUgcmVzdWx0KFN0cmluZ1RyYWl0czxTdHJpbmdUeXBlPjo6Y29udmVydEZyb21WOCh2OFN0
cmluZywgbGVuZ3RoKSk7CiAKICAgICBpZiAoZXh0ZXJuYWwgPT0gRXh0ZXJuYWxpemUgJiYgdjhT
dHJpbmctPkNhbk1ha2VFeHRlcm5hbCgpKSB7CiAgICAgICAgIHN0cmluZ1Jlc291cmNlID0gbmV3
IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShyZXN1bHQpOwo=
</data>
<flag name="review"
          id="24736"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43872</attachid>
            <date>2009-11-25 15:19:08 -0800</date>
            <delta_ts>2009-12-04 12:16:13 -0800</delta_ts>
            <desc>Addressing Darin&apos;s concerns</desc>
            <filename>WC.patch</filename>
            <type>text/plain</type>
            <size>4262</size>
            <attacher name="anton muhin">antonm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTM2NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMTEtMTIgIEFudG9uIE11aGluICA8YW50b25tQGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBE
byBub3QgdXNlIFdlYkNvcmU6OlN0cmluZzo6U3RyaW5nKGNvbnN0IFVDaGFyKiwgaW50IGxlbmd0
aCkgdG8gY29udmVydAorICAgICAgICBzaG9ydCB2OCBzdHJpbmdzLgorCisgICAgICAgIFBsdXMg
YWRkZWQgc3RyaW5nIHRyYWl0cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTMxNDE1CisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OnY4U3RyaW5nVG9XZWJD
b3JlU3RyaW5nKToKKwogMjAwOS0xMS0yNCAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFw
cGxlLmNvbT4KIAogICAgICAgICBObyByZXZpZXcuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L1Y4QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEJpbmRp
bmcuY3BwCShyZXZpc2lvbiA1MTM2NykKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvVjhCaW5kaW5n
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA2LDEwICsxMDYsNiBAQAogICAgICAgICByZXR1cm4g
bV9hdG9taWNTdHJpbmc7CiAgICAgfQogCi0gICAgLy8gUmV0dXJucyByaWdodCBzdHJpbmcgdHlw
ZSBiYXNlZCBvbiBhIGR1bW15IHBhcmFtZXRlci4KLSAgICBTdHJpbmcgc3RyaW5nKFN0cmluZykg
eyByZXR1cm4gd2ViY29yZVN0cmluZygpOyB9Ci0gICAgQXRvbWljU3RyaW5nIHN0cmluZyhBdG9t
aWNTdHJpbmcpIHsgcmV0dXJuIGF0b21pY1N0cmluZygpOyB9Ci0KICAgICBzdGF0aWMgV2ViQ29y
ZVN0cmluZ1Jlc291cmNlKiB0b1N0cmluZ1Jlc291cmNlKHY4OjpIYW5kbGU8djg6OlN0cmluZz4g
djhTdHJpbmcpCiAgICAgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2ViQ29yZVN0cmlu
Z1Jlc291cmNlKj4odjhTdHJpbmctPkdldEV4dGVybmFsU3RyaW5nUmVzb3VyY2UoKSk7CkBAIC0y
NDQsMTIgKzI0MCw2MyBAQAogfQogCiAKK3RlbXBsYXRlIDxjbGFzcyBTPiBzdHJ1Y3QgU3RyaW5n
VHJhaXRzCit7CisgICAgc3RhdGljIFMgZnJvbVN0cmluZ1Jlc291cmNlKFdlYkNvcmVTdHJpbmdS
ZXNvdXJjZSogcmVzb3VyY2UpOworCisgICAgc3RhdGljIFMgZnJvbVY4U3RyaW5nKHY4OjpIYW5k
bGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGludCBsZW5ndGgpOworfTsKKwordGVtcGxhdGU8Pgor
c3RydWN0IFN0cmluZ1RyYWl0czxTdHJpbmc+Cit7CisgICAgc3RhdGljIFN0cmluZyBmcm9tU3Ry
aW5nUmVzb3VyY2UoV2ViQ29yZVN0cmluZ1Jlc291cmNlKiByZXNvdXJjZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiByZXNvdXJjZS0+d2ViY29yZVN0cmluZygpOworICAgIH0KKworICAgIHN0YXRp
YyBTdHJpbmcgZnJvbVY4U3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcsIGlu
dCBsZW5ndGgpCisgICAgeworICAgICAgICBBU1NFUlQodjhTdHJpbmctPkxlbmd0aCgpID09IGxl
bmd0aCk7CisgICAgICAgIC8vIE5PVEU6IGFzIG9mIG5vdywgU3RyaW5nKGNvbnN0IFVDaGFyKiwg
aW50KSBwZXJmb3JtcyBTdHJpbmc6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQKKyAgICAgICAgLy8gYW55
d2F5LCBzbyBubyBuZWVkIHRvIG9wdGltaXplIGxpa2Ugd2UgZG8gZm9yIEF0b21pY1N0cmluZyBi
ZWxvdy4KKyAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFN0
cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIHY4U3Ry
aW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVmZmVyKSwgMCwgbGVuZ3Ro
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1
Y3QgU3RyaW5nVHJhaXRzPEF0b21pY1N0cmluZz4KK3sKKyAgICBzdGF0aWMgQXRvbWljU3RyaW5n
IGZyb21TdHJpbmdSZXNvdXJjZShXZWJDb3JlU3RyaW5nUmVzb3VyY2UqIHJlc291cmNlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlLT5hdG9taWNTdHJpbmcoKTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgQXRvbWljU3RyaW5nIGZyb21WOFN0cmluZyh2ODo6SGFuZGxlPHY4OjpTdHJpbmc+
IHY4U3RyaW5nLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHY4U3RyaW5nLT5M
ZW5ndGgoKSA9PSBsZW5ndGgpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGlubGluZUJ1ZmZl
clNpemUgPSAxNjsKKyAgICAgICAgaWYgKGxlbmd0aCA8PSBpbmxpbmVCdWZmZXJTaXplKSB7Cisg
ICAgICAgICAgICBVQ2hhciBpbmxpbmVCdWZmZXJbaW5saW5lQnVmZmVyU2l6ZV07CisgICAgICAg
ICAgICB2OFN0cmluZy0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGlubGluZUJ1
ZmZlciksIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gQXRvbWljU3RyaW5nKGlubGlu
ZUJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBVQ2hhciogYnVmZmVyOworICAg
ICAgICBTdHJpbmcgdG1wID0gU3RyaW5nOjpjcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVm
ZmVyKTsKKyAgICAgICAgdjhTdHJpbmctPldyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3Qq
PihidWZmZXIpLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gQXRvbWljU3RyaW5nKHRtcCk7
CisgICAgfQorfTsKKwogdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CiBTdHJpbmdUeXBl
IHY4U3RyaW5nVG9XZWJDb3JlU3RyaW5nKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gdjhTdHJpbmcs
IEV4dGVybmFsTW9kZSBleHRlcm5hbCkKIHsKICAgICBXZWJDb3JlU3RyaW5nUmVzb3VyY2UqIHN0
cmluZ1Jlc291cmNlID0gV2ViQ29yZVN0cmluZ1Jlc291cmNlOjp0b1N0cmluZ1Jlc291cmNlKHY4
U3RyaW5nKTsKICAgICBpZiAoc3RyaW5nUmVzb3VyY2UpCi0gICAgICAgIHJldHVybiBzdHJpbmdS
ZXNvdXJjZS0+c3RyaW5nKFN0cmluZ1R5cGUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmdUcmFp
dHM8U3RyaW5nVHlwZT46OmZyb21TdHJpbmdSZXNvdXJjZShzdHJpbmdSZXNvdXJjZSk7CiAKICAg
ICBpbnQgbGVuZ3RoID0gdjhTdHJpbmctPkxlbmd0aCgpOwogICAgIGlmICghbGVuZ3RoKSB7CkBA
IC0yNTcsMTggKzMwNCw3IEBACiAgICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwog
ICAgIH0KIAotICAgIFN0cmluZ1R5cGUgcmVzdWx0OwotICAgIHN0YXRpYyBjb25zdCBpbnQgaW5s
aW5lQnVmZmVyU2l6ZSA9IDE2OwotICAgIGlmIChsZW5ndGggPD0gaW5saW5lQnVmZmVyU2l6ZSkg
ewotICAgICAgICBVQ2hhciBpbmxpbmVCdWZmZXJbaW5saW5lQnVmZmVyU2l6ZV07Ci0gICAgICAg
IHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oaW5saW5lQnVmZmVy
KSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nVHlwZShpbmxpbmVCdWZmZXIs
IGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVUNoYXIqIGJ1ZmZlcjsKLSAgICAgICAg
U3RyaW5nIHRtcCA9IFN0cmluZzo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7
Ci0gICAgICAgIHY4U3RyaW5nLT5Xcml0ZShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oYnVm
ZmVyKSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nVHlwZSh0bXApOwotICAg
IH0KKyAgICBTdHJpbmdUeXBlIHJlc3VsdChTdHJpbmdUcmFpdHM8U3RyaW5nVHlwZT46OmZyb21W
OFN0cmluZyh2OFN0cmluZywgbGVuZ3RoKSk7CiAKICAgICBpZiAoZXh0ZXJuYWwgPT0gRXh0ZXJu
YWxpemUgJiYgdjhTdHJpbmctPkNhbk1ha2VFeHRlcm5hbCgpKSB7CiAgICAgICAgIHN0cmluZ1Jl
c291cmNlID0gbmV3IFdlYkNvcmVTdHJpbmdSZXNvdXJjZShyZXN1bHQpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>