<?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>146260</bug_id>
          
          <creation_ts>2015-06-23 16:41:52 -0700</creation_ts>
          <short_desc>Array.concat should be fast for integer or double arrays</short_desc>
          <delta_ts>2015-07-06 13:20: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>JavaScriptCore</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="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>achristensen</cc>
    
    <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>kling</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1104237</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2015-06-23 16:41:52 -0700</bug_when>
    <thetext>Make it faster!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1104242</commentid>
    <comment_count>1</comment_count>
      <attachid>255449</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2015-06-23 16:44:05 -0700</bug_when>
    <thetext>Created attachment 255449
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107054</commentid>
    <comment_count>2</comment_count>
      <attachid>256202</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2015-07-06 01:44:29 -0700</bug_when>
    <thetext>Created attachment 256202
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107056</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2015-07-06 01:50:09 -0700</bug_when>
    <thetext>                                                           ToT                     Patched                                      
SunSpider:
   3d-cube                                            4.2256+-0.2080            4.1486+-0.1228          might be 1.0186x faster
   3d-morph                                           5.1026+-0.5274            4.8358+-0.1522          might be 1.0552x faster
   3d-raytrace                                        5.3484+-0.6021            4.9348+-0.1349          might be 1.0838x faster
   access-binary-trees                                2.7130+-1.6508            2.1113+-0.2080          might be 1.2850x faster
   access-fannkuch                                    5.0765+-0.1759     ?      5.1047+-0.1920        ?
   access-nbody                                       2.4000+-0.1861            2.3014+-0.0689          might be 1.0428x faster
   access-nsieve                                      3.2500+-0.2123            3.1671+-0.1682          might be 1.0262x faster
   bitops-3bit-bits-in-byte                           1.3497+-0.0580     ?      1.3560+-0.0258        ?
   bitops-bits-in-byte                                3.2062+-0.2491     ?      3.3033+-0.3411        ? might be 1.0303x slower
   bitops-bitwise-and                                 1.9884+-0.3176            1.9120+-0.0617          might be 1.0400x faster
   bitops-nsieve-bits                                 2.9948+-0.6010            2.7932+-0.0961          might be 1.0722x faster
   controlflow-recursive                              2.4005+-0.3053            2.2630+-0.2697          might be 1.0608x faster
   crypto-aes                                         3.8080+-0.4321            3.6125+-0.1643          might be 1.0541x faster
   crypto-md5                                         2.4933+-0.6524            2.3353+-0.1614          might be 1.0677x faster
   crypto-sha1                                        2.9265+-0.7769            2.6860+-0.2184          might be 1.0896x faster
   date-format-tofte                                  6.5455+-0.8765            6.1035+-0.2283          might be 1.0724x faster
   date-format-xparb                                  4.5027+-0.1354     ?      4.6120+-0.9595        ? might be 1.0243x slower
   math-cordic                                        2.5932+-0.1076     ?      2.7600+-0.4219        ? might be 1.0643x slower
   math-partial-sums                                  4.2813+-0.2447     ?      4.3400+-0.2924        ? might be 1.0137x slower
   math-spectral-norm                                 1.8025+-0.1362            1.7240+-0.0404          might be 1.0455x faster
   regexp-dna                                         6.3435+-0.3175            6.2752+-0.5174          might be 1.0109x faster
   string-base64                                      4.2049+-0.1331     ?      4.2401+-0.1050        ?
   string-fasta                                       5.8904+-0.7815            5.8338+-0.5782        
   string-tagcloud                                    8.7347+-1.6620            8.3389+-0.9243          might be 1.0475x faster
   string-unpack-code                                18.7471+-1.1970     ?     19.2507+-2.1459        ? might be 1.0269x slower
   string-validate-input                              4.9433+-0.2834     ?      5.1698+-0.2136        ? might be 1.0458x slower

   &lt;arithmetic&gt;                                       4.5336+-0.1186            4.4428+-0.1392          might be 1.0204x faster

                                                           ToT                     Patched                                      
LongSpider:
   3d-cube                                          732.4911+-17.6962         732.0290+-10.2143       
   3d-morph                                        1430.1607+-18.0872    ?   1434.8452+-26.4035       ?
   3d-raytrace                                      596.0754+-7.6586     ?    599.5426+-1.8276        ?
   access-binary-trees                              781.2598+-2.7399     ?    784.9316+-24.1927       ?
   access-fannkuch                                  271.4528+-24.5880         262.6239+-3.3812          might be 1.0336x faster
   access-nbody                                     485.5085+-4.3272     ?    499.2198+-45.4226       ? might be 1.0282x slower
   access-nsieve                                    353.0665+-5.4384     ?    370.4830+-24.7586       ? might be 1.0493x slower
   bitops-3bit-bits-in-byte                          41.5132+-6.6918           38.5641+-2.4091          might be 1.0765x faster
   bitops-bits-in-byte                               74.2993+-8.7717           74.0218+-6.2145        
   bitops-nsieve-bits                               392.9969+-7.6091          389.0017+-9.2592          might be 1.0103x faster
   controlflow-recursive                            392.9302+-0.8604     ?    409.9299+-18.8462       ? might be 1.0433x slower
   crypto-aes                                       553.3612+-44.8798         552.0107+-6.3426        
   crypto-md5                                       457.0887+-35.6345         444.5355+-2.4949          might be 1.0282x faster
   crypto-sha1                                      603.7267+-1.3899          602.5683+-3.4080        
   date-format-tofte                                475.3430+-6.6626     ?    502.3791+-39.1386       ? might be 1.0569x slower
   date-format-xparb                                606.6652+-17.4584    ?    610.6105+-32.9028       ?
   hash-map                                         156.7812+-2.5357          154.7148+-2.6661          might be 1.0134x faster
   math-cordic                                      463.6342+-11.6011         462.2351+-5.8737        
   math-partial-sums                                394.3937+-3.7936     ?    396.2653+-9.3538        ?
   math-spectral-norm                               539.7730+-43.9003         523.9571+-5.8828          might be 1.0302x faster
   string-base64                                    327.7774+-4.6003          324.7231+-5.5633        
   string-fasta                                     352.8232+-35.0304         344.6918+-3.7037          might be 1.0236x faster
   string-tagcloud                                  173.8855+-4.5186          171.7451+-5.2591          might be 1.0125x faster

   &lt;geometric&gt;                                      373.6247+-6.0726          372.9615+-1.9751          might be 1.0018x faster

                                                           ToT                     Patched                                      
V8Spider:
   crypto                                            48.7357+-4.2400           48.6815+-3.2025        
   deltablue                                         79.6133+-21.4432          78.2777+-7.8502          might be 1.0171x faster
   earley-boyer                                      38.2008+-1.6078     !     40.7530+-0.7233        ! definitely 1.0668x slower
   raytrace                                          34.3981+-12.4652          30.8655+-2.6446          might be 1.1144x faster
   regexp                                            63.7994+-6.6769           60.8007+-4.2471          might be 1.0493x faster
   richards                                          68.0728+-7.1028     ?     68.4914+-5.8730        ?
   splay                                             33.2208+-2.1391     ?     34.9760+-5.7262        ? might be 1.0528x slower

   &lt;geometric&gt;                                       49.3750+-3.5622           49.1452+-1.2383          might be 1.0047x faster

                                                           ToT                     Patched                                      
Octane:
   encrypt                                           0.19499+-0.00326          0.19406+-0.00144       
   decrypt                                           3.20066+-0.02016          3.16506+-0.05610         might be 1.0112x faster
   deltablue                                x2       0.14692+-0.00567    ?     0.15166+-0.00693       ? might be 1.0323x slower
   earley                                            0.27452+-0.04017          0.26486+-0.00502         might be 1.0365x faster
   boyer                                             4.08647+-0.41190          3.98210+-0.07456         might be 1.0262x faster
   navier-stokes                            x2       4.72553+-0.05136          4.69365+-0.01734       
   raytrace                                 x2       1.02673+-0.18760          0.94837+-0.05858         might be 1.0826x faster
   richards                                 x2       0.09792+-0.00469          0.09715+-0.00302       
   splay                                    x2       0.33353+-0.00701    ?     0.33555+-0.00657       ?
   regexp                                   x2      23.97925+-0.36176    ?    24.29159+-2.46113       ? might be 1.0130x slower
   pdfjs                                    x2      36.43494+-1.38061         36.38408+-0.47574       
   mandreel                                 x2      41.94183+-0.89732         41.93924+-0.97913       
   gbemu                                    x2      32.38843+-0.35382    ?    34.03859+-3.46676       ? might be 1.0509x slower
   closure                                           0.52639+-0.01189          0.52277+-0.00248       
   jquery                                            6.64410+-0.07917          6.61718+-0.06709       
   box2d                                    x2       9.43033+-0.09989    ?     9.43754+-0.19752       ?
   zlib                                     x2     368.38127+-17.47167       354.91610+-33.68531        might be 1.0379x faster
   typescript                               x2     627.64178+-28.46865   ?   706.43146+-206.08316     ? might be 1.1255x slower

   &lt;geometric&gt;                                       5.38737+-0.03327    ?     5.40005+-0.13357       ? might be 1.0024x slower

                                                           ToT                     Patched                                      
Kraken:
   ai-astar                                          227.345+-1.622      ^     212.479+-2.620         ^ definitely 1.0700x faster
   audio-beat-detection                               69.711+-1.397             69.674+-0.514         
   audio-dft                                         106.789+-8.551            102.338+-2.838           might be 1.0435x faster
   audio-fft                                          60.339+-9.890      ?      62.430+-1.107         ? might be 1.0347x slower
   audio-oscillator                                   59.859+-3.140      ?      60.376+-3.963         ?
   imaging-darkroom                                   87.248+-2.666      ?      89.140+-5.429         ? might be 1.0217x slower
   imaging-desaturate                                 54.181+-3.706             50.404+-5.320           might be 1.0749x faster
   imaging-gaussian-blur                              79.132+-0.749      ?      79.543+-0.762         ?
   json-parse-financial                               38.369+-2.436      ?      38.392+-2.100         ?
   json-stringify-tinderbox                           23.974+-2.558             23.196+-0.687           might be 1.0335x faster
   stanford-crypto-aes                                51.694+-1.405      ?      51.740+-3.546         ?
   stanford-crypto-ccm                                39.247+-3.695             37.200+-0.773           might be 1.0550x faster
   stanford-crypto-pbkdf2                             93.993+-1.661             90.963+-1.474           might be 1.0333x faster
   stanford-crypto-sha256-iterative                   36.762+-4.860             35.634+-2.017           might be 1.0317x faster

   &lt;arithmetic&gt;                                       73.475+-1.349             71.679+-0.583           might be 1.0250x faster

                                                           ToT                     Patched                                      
JSRegress:
...
   &lt;geometric&gt;                                        7.5597+-0.0689            7.5557+-0.0360          might be 1.0005x faster

                                                           ToT                     Patched                                      
AsmBench:
   bigfib.cpp                                       434.4980+-3.7348     ?    437.9674+-6.1751        ?
   cray.c                                           389.1498+-21.8900         380.0905+-3.2306          might be 1.0238x faster
   dry.c                                            414.1210+-4.7908          411.1771+-1.1559        
   FloatMM.c                                        714.1605+-178.6274        655.5754+-11.8194         might be 1.0894x faster
   gcc-loops.cpp                                   3272.2238+-27.8167    ?   3290.7650+-73.6878       ?
   n-body.c                                         791.6000+-3.8892          787.7072+-2.7899        
   Quicksort.c                                      387.2892+-8.8518     ?    390.2397+-1.9515        ?
   stepanov_container.cpp                          3498.7477+-65.9944    ?   3678.1403+-418.7784      ? might be 1.0513x slower
   Towers.c                                         229.7942+-18.4149         225.6820+-3.1262          might be 1.0182x faster

   &lt;geometric&gt;                                      699.2493+-18.2802         694.5520+-10.5689         might be 1.0068x faster

                                                           ToT                     Patched                                      
CompressionBench:
   huffman                                          206.4354+-4.3874     ^     55.4592+-2.2574        ^ definitely 3.7223x faster
   arithmetic-simple                                253.7523+-3.9196          253.3229+-2.7846        
   arithmetic-precise                               233.4282+-7.2750          230.3280+-3.9559          might be 1.0135x faster
   arithmetic-complex-precise                       230.4389+-2.1971          227.9658+-2.8130          might be 1.0108x faster
   arithmetic-precise-order-0                       267.6912+-26.2054         261.8588+-7.4961          might be 1.0223x faster
   arithmetic-precise-order-1                       306.4816+-43.2585         289.4307+-10.6825         might be 1.0589x faster
   arithmetic-precise-order-2                       325.4543+-5.1850          323.8975+-1.3957        
   arithmetic-simple-order-1                        305.2067+-3.6842     ?    305.6675+-2.6961        ?
   arithmetic-simple-order-2                        353.4729+-4.4366     ?    359.8098+-7.7455        ? might be 1.0179x slower
   lz-string                                        311.3513+-2.5801     ?    318.9263+-24.8698       ? might be 1.0243x slower

   &lt;geometric&gt;                                      275.4657+-2.3287     ^    240.0061+-1.4349        ^ definitely 1.1477x faster

                                                           ToT                     Patched                                      
Geomean of preferred means:
   &lt;scaled-result&gt;                                   51.3268+-0.7692     ^     50.0994+-0.3844        ^ definitely 1.0245x faster

rniwa-rmbp:safari rniwa$</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107120</commentid>
    <comment_count>4</comment_count>
      <attachid>256202</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-07-06 09:58:06 -0700</bug_when>
    <thetext>Comment on attachment 256202
Patch

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

&gt; Source/JavaScriptCore/runtime/ArrayPrototype.cpp:529
&gt; +    if (argCount == 1 &amp;&amp; previousArray &amp;&amp; currentArray &amp;&amp; finalArraySize.unsafeGet() &lt; MIN_SPARSE_ARRAY_INDEX) {

I’m not sure why we would limit ourselves to doing this optimization when there are exactly two arrays being concatenated. I think we could easily to do the optimization any time we are concatenating a large number of arrays with compatible types.

I’m not entirely sure why we can’t do this for arrays that end up longer than MIN_SPARSE_ARRAY_INDEX.

&gt; Source/JavaScriptCore/runtime/ArrayPrototype.cpp:532
&gt; +        IndexingType type = JSArray::fastConcatType(exec-&gt;vm(), *previousArray, *currentArray);
&gt; +        if (type != NonArray)
&gt; +            return previousArray-&gt;fastConcatWith(*exec, *currentArray);

It’s not a great pattern to make all these optimized functions be members of the JSArray class. I believe it’s excessively specific to limit this optimization to JSArray objects. I’m pretty sure that the same optimization would work with two array-like objects.

I also think it’s a shame that the entire fastConcatType function ends up in a header because of this. It should be here, in this cpp file.

An advantage of keeping more of the code here in ArrayPrototype.cpp is that we can write various helper functions here that make these optimized code paths easier to read with less written out.

&gt; Source/JavaScriptCore/runtime/JSArray.cpp:718
&gt; +    ASSERT(thisArraySize + otherArraySize &lt; MIN_SPARSE_ARRAY_INDEX);

Why is this assertion needed?

&gt; Source/JavaScriptCore/runtime/JSArray.cpp:734
&gt; +        auto buffer = resultButterfly.contiguous().data();
&gt; +        memcpy(buffer, m_butterfly-&gt;contiguous().data(), sizeof(JSValue) * thisArraySize);
&gt; +        memcpy(buffer + thisArraySize, otherButterfly.contiguous().data(), sizeof(JSValue) * otherArraySize);

Seems icky to merge the Int32 case and the contiguous() case like this. Not at all sure why the double case needs to be separate and the integer one doesn’t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107136</commentid>
    <comment_count>5</comment_count>
      <attachid>256202</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-07-06 10:46:32 -0700</bug_when>
    <thetext>Comment on attachment 256202
Patch

Clearing flags on attachment: 256202

Committed r186358: &lt;http://trac.webkit.org/changeset/186358&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107137</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-07-06 10:46:38 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107154</commentid>
    <comment_count>7</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-07-06 11:15:48 -0700</bug_when>
    <thetext>build fix in http://trac.webkit.org/changeset/186363</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107209</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2015-07-06 13:17:44 -0700</bug_when>
    <thetext>Looks like this broke the GTK build?

[355/2761] Building CXX object Source/JavaScriptCore/CMakeFiles/JavaScriptCore.dir/runtime/JSArrayBufferPrototype.cpp.o
FAILED: /usr/lib/ccache/g++-4.9   -DBUILDING_GTK__=1 -DBUILDING_JavaScriptCore -DBUILDING_WITH_CMAKE=1 -DDATA_DIR=\&quot;share\&quot; -DGETTEXT_PACKAGE=\&quot;WebKit2GTK-4.0\&quot; -DHAVE_CONFIG_H=1 -DJavaScriptCore_EXPORTS -DSTATICALLY_LINKED_WITH_WTF -DUSER_AGENT_GTK_MAJOR_VERSION=601 -DUSER_AGENT_GTK_MINOR_VERSION=1 -DWEBKITGTK_API_VERSION_STRING=\&quot;4.0\&quot; -pipe  -std=c++11 -g -fPIC -I. -I../../Source/JavaScriptCore -I../../Source/JavaScriptCore/API -I../../Source/JavaScriptCore/ForwardingHeaders -I../../Source/JavaScriptCore/assembler -I../../Source/JavaScriptCore/bindings -I../../Source/JavaScriptCore/builtins -I../../Source/JavaScriptCore/bytecode -I../../Source/JavaScriptCore/bytecompiler -I../../Source/JavaScriptCore/dfg -I../../Source/JavaScriptCore/disassembler -I../../Source/JavaScriptCore/ftl -I../../Source/JavaScriptCore/heap -I../../Source/JavaScriptCore/debugger -I../../Source/JavaScriptCore/inspector -I../../Source/JavaScriptCore/inspector/agents -I../../Source/JavaScriptCore/inspector/augmentable -I../../Source/JavaScriptCore/inspector/remote -I../../Source/JavaScriptCore/interpreter -I../../Source/JavaScriptCore/jit -I../../Source/JavaScriptCore/llint -I../../Source/JavaScriptCore/llvm -I../../Source/JavaScriptCore/parser -I../../Source/JavaScriptCore/profiler -I../../Source/JavaScriptCore/replay -I../../Source/JavaScriptCore/runtime -I../../Source/JavaScriptCore/tools -I../../Source/JavaScriptCore/yarr -I../../Source/WTF -IDerivedSources -IDerivedSources/ForwardingHeaders -IDerivedSources/JavaScriptCore -IDerivedSources/JavaScriptCore/inspector -I../../Source -I../../Source/JavaScriptCore/disassembler/udis86 -isystem /usr/include/x86_64-linux-gnu -isystem ../DependenciesGTK/Root/include/glib-2.0 -isystem ../DependenciesGTK/Root/lib64/glib-2.0/include    -Wall -Wextra -Wcast-align -Wformat-security -Wmissing-format-attribute -Wpointer-arith -Wundef -Wwrite-strings -MMD -MT Source/JavaScriptCore/CMakeFiles/JavaScriptCore.dir/runtime/JSArray.cpp.o -MF Source/JavaScriptCore/CMakeFiles/JavaScriptCore.dir/runtime/JSArray.cpp.o.d -o Source/JavaScriptCore/CMakeFiles/JavaScriptCore.dir/runtime/JSArray.cpp.o -c ../../Source/JavaScriptCore/runtime/JSArray.cpp
../../Source/JavaScriptCore/runtime/JSArray.cpp: In member function ‘JSC::EncodedJSValue JSC::JSArray::fastConcatWith(JSC::ExecState&amp;, JSC::JSArray&amp;)’:
../../Source/JavaScriptCore/runtime/JSArray.cpp:713:56: error: no matching function for call to ‘JSC::JSArray::fastConcatType(JSC::JSArray&amp;, JSC::JSArray&amp;)’
     ASSERT(newArrayType == fastConcatType(*this, otherArray));
                                                        ^
../../Source/JavaScriptCore/runtime/JSArray.cpp:713:56: note: candidate is:
In file included from ../../Source/JavaScriptCore/runtime/JSArray.cpp:24:0:
../../Source/JavaScriptCore/runtime/JSArray.h:81:25: note: static JSC::IndexingType JSC::JSArray::fastConcatType(JSC::VM&amp;, JSC::JSArray&amp;, JSC::JSArray&amp;)
     static IndexingType fastConcatType(VM&amp; vm, JSArray&amp; firstArray, JSArray&amp; secondArray)
                         ^
../../Source/JavaScriptCore/runtime/JSArray.h:81:25: note:   candidate expects 3 arguments, 2 provided
ninja: build stopped: subcommand failed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1107210</commentid>
    <comment_count>9</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-07-06 13:20:03 -0700</bug_when>
    <thetext>Just the GTK debug build.  My fix fixes that, too</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>255449</attachid>
            <date>2015-06-23 16:44:05 -0700</date>
            <delta_ts>2015-07-06 01:44:21 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>wip146260.patch</filename>
            <type>text/plain</type>
            <size>6607</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBl
LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcApp
bmRleCBiYzllYzdlLi41NGFhZTljIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9BcnJheVByb3RvdHlwZS5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvQXJyYXlQcm90b3R5cGUuY3BwCkBAIC00MjEsMTMgKzQyMSwxNiBAQCBFbmNvZGVkSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5UHJvdG9GdW5jQ29uY2F0KEV4ZWNTdGF0ZSogZXhlYykK
ICAgICBKU1ZhbHVlIGN1ckFyZyA9IHRoaXNWYWx1ZS50b09iamVjdChleGVjKTsKICAgICBDaGVj
a2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVyZmxvdz4gZmluYWxBcnJheVNpemUgPSAwOwogCisgICAg
Ym9vbCBvbmx5Q29udGFpbnNBcnJheSA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7Oykg
ewogICAgICAgICBpZiAoSlNBcnJheSogY3VycmVudEFycmF5ID0ganNEeW5hbWljQ2FzdDxKU0Fy
cmF5Kj4oY3VyQXJnKSkgewogICAgICAgICAgICAgZmluYWxBcnJheVNpemUgKz0gZ2V0TGVuZ3Ro
KGV4ZWMsIGN1cnJlbnRBcnJheSk7CiAgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgp
KTsKLSAgICAgICAgfSBlbHNlCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmaW5hbEFy
cmF5U2l6ZSsrOworICAgICAgICAgICAgb25seUNvbnRhaW5zQXJyYXkgPSBmYWxzZTsKKyAgICAg
ICAgfQogICAgICAgICBpZiAoaSA9PSBhcmdDb3VudCkKICAgICAgICAgICAgIGJyZWFrOwogICAg
ICAgICBjdXJBcmcgPSBleGVjLT51bmNoZWNrZWRBcmd1bWVudChpKTsKQEAgLTQzNyw2ICs0NDAs
MTIgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBhcnJheVByb3RvRnVuY0NvbmNhdChF
eGVjU3RhdGUqIGV4ZWMpCiAgICAgaWYgKGZpbmFsQXJyYXlTaXplLmhhc092ZXJmbG93ZWQoKSkK
ICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhl
YykpOwogCisgICAgaWYgKGFyZ0NvdW50ID09IDEgJiYgb25seUNvbnRhaW5zQXJyYXkgJiYgZmlu
YWxBcnJheVNpemUudW5zYWZlR2V0KCkgPCBNSU5fU1BBUlNFX0FSUkFZX0lOREVYKSB7CisgICAg
ICAgIEVuY29kZWRKU1ZhbHVlIHJlc3VsdDsKKyAgICAgICAgaWYgKGpzRHluYW1pY0Nhc3Q8SlNB
cnJheSo+KHRoaXNWYWx1ZS50b09iamVjdChleGVjKSktPmZhc3RDb25jYXRXaXRoKCpleGVjLCBq
c0R5bmFtaWNDYXN0PEpTQXJyYXkqPihleGVjLT51bmNoZWNrZWRBcmd1bWVudCgwKSksIHJlc3Vs
dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIEpTQXJyYXkqIGFy
ciA9IGNvbnN0cnVjdEVtcHR5QXJyYXkoZXhlYywgbnVsbHB0ciwgZmluYWxBcnJheVNpemUudW5z
YWZlR2V0KCkpOwogICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKICAgICAgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0pTQXJyYXkuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNBcnJheS5jcHAKaW5kZXggMDBmZGU4OS4uMzI2OGE4MSAxMDA2NDQKLS0tIGEvU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5jcHAKKysrIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5jcHAKQEAgLTcwMCw2ICs3MDAsOTAgQEAgYm9vbCBK
U0FycmF5OjpmYXN0U2xpY2UoRXhlY1N0YXRlJiBleGVjLCB1bnNpZ25lZCBzdGFydEluZGV4LCB1
bnNpZ25lZCBjb3VudCwgRW4KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgSlNBcnJheTo6
ZmFzdENvbmNhdFdpdGgoRXhlY1N0YXRlJiBleGVjLCBKU0FycmF5KiBvdGhlckFycmF5LCBFbmNv
ZGVkSlNWYWx1ZSYgcmVzdWx0KQoreworICAgIGF1dG8gdGhpc0FycmF5VHlwZSA9IGluZGV4aW5n
VHlwZSgpOworICAgIGF1dG8gb3RoZXJBcnJheVR5cGUgPSBvdGhlckFycmF5LT5pbmRleGluZ1R5
cGUoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChvdGhlckFycmF5KTsKKworICAgIC8vIENvbnZlcnQg
aW50L2RvdWJsZSB0byBkb3VibGUgYXMgZG9uZSBpbiBBcnJheU1vZGU6OnJlZmluZS4KKyAgICBJ
bmRleGluZ1R5cGUgbmV3QXJyYXlUeXBlOworICAgIHN3aXRjaCAodGhpc0FycmF5VHlwZSkgewor
ICAgIGNhc2UgQXJyYXlXaXRoRG91YmxlOgorICAgICAgICBpZiAob3RoZXJBcnJheVR5cGUgPT0g
QXJyYXlXaXRoRG91YmxlKQorICAgICAgICAgICAgbmV3QXJyYXlUeXBlID0gQXJyYXlXaXRoRG91
YmxlOworICAgICAgICBlbHNlIGlmIChvdGhlckFycmF5VHlwZSA9PSBBcnJheVdpdGhJbnQzMikK
KyAgICAgICAgICAgIG5ld0FycmF5VHlwZSA9IEFycmF5V2l0aERvdWJsZTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFy
cmF5V2l0aEludDMyOgorICAgICAgICBpZiAob3RoZXJBcnJheVR5cGUgPT0gQXJyYXlXaXRoSW50
MzIpCisgICAgICAgICAgICBuZXdBcnJheVR5cGUgPSBBcnJheVdpdGhJbnQzMjsKKyAgICAgICAg
ZWxzZSBpZiAob3RoZXJBcnJheVR5cGUgPT0gQXJyYXlXaXRoRG91YmxlKQorICAgICAgICAgICAg
bmV3QXJyYXlUeXBlID0gQXJyYXlXaXRoRG91YmxlOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXJyYXlXaXRoQ29udGln
dW91czoKKyAgICAgICAgaWYgKG90aGVyQXJyYXlUeXBlID09IEFycmF5V2l0aENvbnRpZ3VvdXMp
CisgICAgICAgICAgICBuZXdBcnJheVR5cGUgPSBBcnJheVdpdGhDb250aWd1b3VzOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWTSYgdm0gPSBleGVj
LnZtKCk7CisgICAgdW5zaWduZWQgdGhpc0FycmF5U2l6ZSA9IG1fYnV0dGVyZmx5LT5wdWJsaWNM
ZW5ndGgoKTsKKyAgICB1bnNpZ25lZCBvdGhlckFycmF5U2l6ZSA9IG90aGVyQXJyYXktPm1fYnV0
dGVyZmx5LT5wdWJsaWNMZW5ndGgoKTsKKyAgICBBU1NFUlQodGhpc0FycmF5U2l6ZSArIG90aGVy
QXJyYXlTaXplIDwgTUlOX1NQQVJTRV9BUlJBWV9JTkRFWCk7CisgICAgaWYgKHN0cnVjdHVyZSh2
bSktPmhvbGVzTXVzdEZvcndhcmRUb1Byb3RvdHlwZSh2bSkgfHwgb3RoZXJBcnJheS0+c3RydWN0
dXJlKHZtKS0+aG9sZXNNdXN0Rm9yd2FyZFRvUHJvdG90eXBlKHZtKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgU3RydWN0dXJlKiByZXN1bHRTdHJ1Y3R1cmUgPSBleGVjLmxleGljYWxH
bG9iYWxPYmplY3QoKS0+YXJyYXlTdHJ1Y3R1cmVGb3JJbmRleGluZ1R5cGVEdXJpbmdBbGxvY2F0
aW9uKG5ld0FycmF5VHlwZSk7CisgICAgSlNBcnJheSogcmVzdWx0QXJyYXkgPSBKU0FycmF5Ojp0
cnlDcmVhdGVVbmluaXRpYWxpemVkKHZtLCByZXN1bHRTdHJ1Y3R1cmUsIHRoaXNBcnJheVNpemUg
KyBvdGhlckFycmF5U2l6ZSk7CisgICAgaWYgKCFyZXN1bHRBcnJheSkgeworICAgICAgICB0aHJv
d091dE9mTWVtb3J5RXJyb3IoJmV4ZWMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICBhdXRvJiByZXN1bHRCdXR0ZXJmbHkgPSAqcmVzdWx0QXJyYXktPmJ1dHRlcmZseSgpOwor
ICAgIGlmICh0aGlzQXJyYXlUeXBlID09IG5ld0FycmF5VHlwZSkgeworICAgICAgICBpZiAobmV3
QXJyYXlUeXBlID09IEFycmF5V2l0aERvdWJsZSkKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHRC
dXR0ZXJmbHkuY29udGlndW91c0RvdWJsZSgpLmRhdGEoKSwgbV9idXR0ZXJmbHktPmNvbnRpZ3Vv
dXNEb3VibGUoKS5kYXRhKCksIHNpemVvZihKU1ZhbHVlKSAqIHRoaXNBcnJheVNpemUpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBtZW1jcHkocmVzdWx0QnV0dGVyZmx5LmNvbnRpZ3VvdXMo
KS5kYXRhKCksIG1fYnV0dGVyZmx5LT5jb250aWd1b3VzKCkuZGF0YSgpLCBzaXplb2YoSlNWYWx1
ZSkgKiB0aGlzQXJyYXlTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VChuZXdBcnJheVR5cGUgPT0gQXJyYXlXaXRoRG91YmxlICYmIHRoaXNBcnJheVR5cGUgPT0gQXJy
YXlXaXRoSW50MzIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXNBcnJheVNp
emU7IGkrKykgeworICAgICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IG1fYnV0dGVyZmx5LT5jb250
aWd1b3VzSW50MzIoKVtpXS5nZXQoKTsKKyAgICAgICAgICAgIHJlc3VsdEJ1dHRlcmZseS5jb250
aWd1b3VzRG91YmxlKClbaV0gPSB2YWx1ZSA/IHZhbHVlLmFzSW50MzIoKSA6IFBOYU47CisgICAg
ICAgIH0KKworICAgIH0KKworICAgIGF1dG8mIG90aGVyQnV0dGVyZmx5ID0gKm90aGVyQXJyYXkt
PmJ1dHRlcmZseSgpOworICAgIGlmIChvdGhlckFycmF5VHlwZSA9PSBuZXdBcnJheVR5cGUpIHsK
KyAgICAgICAgaWYgKG5ld0FycmF5VHlwZSA9PSBBcnJheVdpdGhEb3VibGUpCisgICAgICAgICAg
ICBtZW1jcHkocmVzdWx0QnV0dGVyZmx5LmNvbnRpZ3VvdXNEb3VibGUoKS5kYXRhKCkgKyB0aGlz
QXJyYXlTaXplLCBvdGhlckJ1dHRlcmZseS5jb250aWd1b3VzRG91YmxlKCkuZGF0YSgpLCBzaXpl
b2YoSlNWYWx1ZSkgKiBvdGhlckFycmF5U2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG1lbWNweShyZXN1bHRCdXR0ZXJmbHkuY29udGlndW91cygpLmRhdGEoKSArIHRoaXNBcnJheVNp
emUsIG90aGVyQnV0dGVyZmx5LmNvbnRpZ3VvdXMoKS5kYXRhKCksIHNpemVvZihKU1ZhbHVlKSAq
IG90aGVyQXJyYXlTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChu
ZXdBcnJheVR5cGUgPT0gQXJyYXlXaXRoRG91YmxlICYmIG90aGVyQXJyYXlUeXBlID09IEFycmF5
V2l0aEludDMyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdGhlckFycmF5VHlw
ZTsgaSsrKSB7CisgICAgICAgICAgICBKU1ZhbHVlIHZhbHVlID0gb3RoZXJCdXR0ZXJmbHkuY29u
dGlndW91c0ludDMyKClbaV0uZ2V0KCk7CisgICAgICAgICAgICByZXN1bHRCdXR0ZXJmbHkuY29u
dGlndW91c0RvdWJsZSgpW2ldID0gdmFsdWUgPyB2YWx1ZS5hc0ludDMyKCkgOiBQTmFOOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmVzdWx0QnV0dGVyZmx5LnNldFB1YmxpY0xlbmd0aCh0aGlz
QXJyYXlTaXplICsgb3RoZXJBcnJheVNpemUpOworICAgIHJlc3VsdCA9IEpTVmFsdWU6OmVuY29k
ZShyZXN1bHRBcnJheSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKwogYm9vbCBKU0FycmF5Ojpz
aGlmdENvdW50V2l0aEFycmF5U3RvcmFnZShWTSYgdm0sIHVuc2lnbmVkIHN0YXJ0SW5kZXgsIHVu
c2lnbmVkIGNvdW50LCBBcnJheVN0b3JhZ2UqIHN0b3JhZ2UpCiB7CiAgICAgdW5zaWduZWQgb2xk
TGVuZ3RoID0gc3RvcmFnZS0+bGVuZ3RoKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU0FycmF5LmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9K
U0FycmF5LmgKaW5kZXggZDllMTNlZC4uNTYyMzNjMSAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTQXJyYXkuaApAQCAtNzQsNiArNzQsNyBAQCBwdWJsaWM6CiAgICAgSlNfRVhQT1JU
X1BSSVZBVEUgSlNWYWx1ZSBwb3AoRXhlY1N0YXRlKik7CiAKICAgICBib29sIGZhc3RTbGljZShF
eGVjU3RhdGUmLCB1bnNpZ25lZCBzdGFydEluZGV4LCB1bnNpZ25lZCBjb3VudCwgRW5jb2RlZEpT
VmFsdWUmKTsKKyAgICBib29sIGZhc3RDb25jYXRXaXRoKEV4ZWNTdGF0ZSYsIEpTQXJyYXkqLCBF
bmNvZGVkSlNWYWx1ZSYpOwogCiAgICAgZW51bSBTaGlmdENvdW50TW9kZSB7CiAgICAgICAgIC8v
IFRoaXMgZm9ybSBvZiBzaGlmdCBoaW50cyB0aGF0IHdlJ3JlIGRvaW5nIHF1ZXVlaW5nLiBXaXRo
IHRoaXMgYXNzdW1wdGlvbiBpbiBoYW5kLApAQCAtMTUzLDcgKzE1NCw3IEBAIHByaXZhdGU6CiAg
ICAgICAgIFNwYXJzZUFycmF5VmFsdWVNYXAqIG1hcCA9IHN0b3JhZ2UtPm1fc3BhcnNlTWFwLmdl
dCgpOwogICAgICAgICByZXR1cm4gIW1hcCB8fCAhbWFwLT5sZW5ndGhJc1JlYWRPbmx5KCk7CiAg
ICAgfQotICAgICAgICAKKwogICAgIGJvb2wgc2hpZnRDb3VudFdpdGhBbnlJbmRleGluZ1R5cGUo
RXhlY1N0YXRlKiwgdW5zaWduZWQmIHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGNvdW50KTsKICAgICBK
U19FWFBPUlRfUFJJVkFURSBib29sIHNoaWZ0Q291bnRXaXRoQXJyYXlTdG9yYWdlKFZNJiwgdW5z
aWduZWQgc3RhcnRJbmRleCwgdW5zaWduZWQgY291bnQsIEFycmF5U3RvcmFnZSopOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>256202</attachid>
            <date>2015-07-06 01:44:29 -0700</date>
            <delta_ts>2015-07-06 10:46:32 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-146260-20150706014331.patch</filename>
            <type>text/plain</type>
            <size>5967</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg2MzE4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBA
CisyMDE1LTA3LTA2ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAg
IEFycmF5LmNvbmNhdCBzaG91bGQgYmUgZmFzdCBmb3IgaW50ZWdlciBvciBkb3VibGUgYXJyYXlz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDYyNjAK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBh
IGZhc3QgcGF0aCB0byBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBXaGVuIGNvbmNhdGVuYXRpbmcg
dHdvIEludDMyLCBEb3VibGUsIG9yIENvbnRpZ3VvdXMKKyAgICAgICAgYXJyYXlzLCBzaW1wbHkg
bWVtY29weSB0aGUgYXJyYXlzIGludG8gYSBuZXcgdW5pbml0aWFsaXplZCBidWZmZXIuCisKKyAg
ICAgICAgVGhpcyBpbXByb3ZlcyBodWZmbWFuIGVuY29kaW5nIGluIENvbXByZXNzaW9uQmVuY2gg
YnkgMy43eCBvbiBhIE1pZCAyMDE0IE1hY0Jvb2tQcm8uCisKKyAgICAgICAgKiBydW50aW1lL0Fy
cmF5UHJvdG90eXBlLmNwcDoKKyAgICAgICAgKEpTQzo6YXJyYXlQcm90b0Z1bmNDb25jYXQpOgor
ICAgICAgICAqIHJ1bnRpbWUvSlNBcnJheS5jcHA6CisgICAgICAgIChKU0M6OkpTQXJyYXk6OmZh
c3RDb25jYXRXaXRoKTogQWRkZWQuCisgICAgICAgICogcnVudGltZS9KU0FycmF5Lmg6CisgICAg
ICAgIChKU0M6OkpTQXJyYXk6OmZhc3RDb25jYXRUeXBlKTogQWRkZWQuIFJldHVybnMgdGhlIHJl
c3VsdGFudCBhcnJheSdzIGluZGV4aW5nIHR5cGUgaWYgd2UgY2FuIHVzZQorICAgICAgICB0aGUg
ZmFjdCBwYXRoLiBSZXR1cm5zIE5vbkFycmF5IG90aGVyd2lzZS4KKwogMjAxNS0wNy0wNSAgWXVz
dWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KIAogICAgICAgICBbRVM2XSBJbXBs
ZW1lbnQgdGhlIGxhdGVzdCBQcm9taXNlIHNwZWMgaW4gSlMKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9BcnJheVByb3RvdHlwZS5jcHAJKHJldmlzaW9uIDE4NjI5
NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FycmF5UHJvdG90eXBlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTA2LDggKzUwNiwxMiBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIGFycmF5UHJvdG9GCiAgICAgSlNWYWx1ZSBjdXJBcmcgPSB0aGlzVmFsdWUudG9PYmpl
Y3QoZXhlYyk7CiAgICAgQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZsb3c+IGZpbmFsQXJy
YXlTaXplID0gMDsKIAorICAgIEpTQXJyYXkqIGN1cnJlbnRBcnJheSA9IG51bGxwdHI7CisgICAg
SlNBcnJheSogcHJldmlvdXNBcnJheSA9IG51bGxwdHI7CiAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgOyArK2kpIHsKLSAgICAgICAgaWYgKEpTQXJyYXkqIGN1cnJlbnRBcnJheSA9IGpzRHluYW1p
Y0Nhc3Q8SlNBcnJheSo+KGN1ckFyZykpIHsKKyAgICAgICAgcHJldmlvdXNBcnJheSA9IGN1cnJl
bnRBcnJheTsKKyAgICAgICAgY3VycmVudEFycmF5ID0ganNEeW5hbWljQ2FzdDxKU0FycmF5Kj4o
Y3VyQXJnKTsKKyAgICAgICAgaWYgKGN1cnJlbnRBcnJheSkgewogICAgICAgICAgICAgLy8gQ2Fu
J3QgdXNlIEpTQXJyYXk6Omxlbmd0aCBoZXJlIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIFJ1bnRp
bWVBcnJheSEKICAgICAgICAgICAgIGZpbmFsQXJyYXlTaXplICs9IGdldExlbmd0aChleGVjLCBj
dXJyZW50QXJyYXkpOwogICAgICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQpAQCAt
NTIyLDYgKzUyNiwxMiBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGFycmF5UHJvdG9G
CiAgICAgaWYgKGZpbmFsQXJyYXlTaXplLmhhc092ZXJmbG93ZWQoKSkKICAgICAgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZSh0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhlYykpOwogCisgICAgaWYg
KGFyZ0NvdW50ID09IDEgJiYgcHJldmlvdXNBcnJheSAmJiBjdXJyZW50QXJyYXkgJiYgZmluYWxB
cnJheVNpemUudW5zYWZlR2V0KCkgPCBNSU5fU1BBUlNFX0FSUkFZX0lOREVYKSB7CisgICAgICAg
IEluZGV4aW5nVHlwZSB0eXBlID0gSlNBcnJheTo6ZmFzdENvbmNhdFR5cGUoZXhlYy0+dm0oKSwg
KnByZXZpb3VzQXJyYXksICpjdXJyZW50QXJyYXkpOworICAgICAgICBpZiAodHlwZSAhPSBOb25B
cnJheSkKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0FycmF5LT5mYXN0Q29uY2F0V2l0aCgq
ZXhlYywgKmN1cnJlbnRBcnJheSk7CisgICAgfQorCiAgICAgSlNBcnJheSogYXJyID0gY29uc3Ry
dWN0RW1wdHlBcnJheShleGVjLCBudWxscHRyLCBmaW5hbEFycmF5U2l6ZS51bnNhZmVHZXQoKSk7
CiAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQogICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSlNBcnJheS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSlNBcnJheS5jcHAJKHJldmlzaW9uIDE4NjI5NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0pTQXJyYXkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MDcsNiArNzA3LDM3IEBA
IEpTQXJyYXkqIEpTQXJyYXk6OmZhc3RTbGljZShFeGVjU3RhdGUmIGUKICAgICB9CiB9CiAKK0Vu
Y29kZWRKU1ZhbHVlIEpTQXJyYXk6OmZhc3RDb25jYXRXaXRoKEV4ZWNTdGF0ZSYgZXhlYywgSlNB
cnJheSYgb3RoZXJBcnJheSkKK3sKKyAgICBhdXRvIG5ld0FycmF5VHlwZSA9IGluZGV4aW5nVHlw
ZSgpOworICAgIEFTU0VSVChuZXdBcnJheVR5cGUgPT0gZmFzdENvbmNhdFR5cGUoKnRoaXMsIG90
aGVyQXJyYXkpKTsKKworICAgIFZNJiB2bSA9IGV4ZWMudm0oKTsKKyAgICB1bnNpZ25lZCB0aGlz
QXJyYXlTaXplID0gbV9idXR0ZXJmbHktPnB1YmxpY0xlbmd0aCgpOworICAgIHVuc2lnbmVkIG90
aGVyQXJyYXlTaXplID0gb3RoZXJBcnJheS5tX2J1dHRlcmZseS0+cHVibGljTGVuZ3RoKCk7Cisg
ICAgQVNTRVJUKHRoaXNBcnJheVNpemUgKyBvdGhlckFycmF5U2l6ZSA8IE1JTl9TUEFSU0VfQVJS
QVlfSU5ERVgpOworCisgICAgU3RydWN0dXJlKiByZXN1bHRTdHJ1Y3R1cmUgPSBleGVjLmxleGlj
YWxHbG9iYWxPYmplY3QoKS0+YXJyYXlTdHJ1Y3R1cmVGb3JJbmRleGluZ1R5cGVEdXJpbmdBbGxv
Y2F0aW9uKG5ld0FycmF5VHlwZSk7CisgICAgSlNBcnJheSogcmVzdWx0QXJyYXkgPSBKU0FycmF5
Ojp0cnlDcmVhdGVVbmluaXRpYWxpemVkKHZtLCByZXN1bHRTdHJ1Y3R1cmUsIHRoaXNBcnJheVNp
emUgKyBvdGhlckFycmF5U2l6ZSk7CisgICAgaWYgKCFyZXN1bHRBcnJheSkKKyAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd091dE9mTWVtb3J5RXJyb3IoJmV4ZWMpKTsKKworICAg
IGF1dG8mIHJlc3VsdEJ1dHRlcmZseSA9ICpyZXN1bHRBcnJheS0+YnV0dGVyZmx5KCk7CisgICAg
YXV0byYgb3RoZXJCdXR0ZXJmbHkgPSAqb3RoZXJBcnJheS5idXR0ZXJmbHkoKTsKKyAgICBpZiAo
bmV3QXJyYXlUeXBlID09IEFycmF5V2l0aERvdWJsZSkgeworICAgICAgICBhdXRvIGJ1ZmZlciA9
IHJlc3VsdEJ1dHRlcmZseS5jb250aWd1b3VzRG91YmxlKCkuZGF0YSgpOworICAgICAgICBtZW1j
cHkoYnVmZmVyLCBtX2J1dHRlcmZseS0+Y29udGlndW91c0RvdWJsZSgpLmRhdGEoKSwgc2l6ZW9m
KEpTVmFsdWUpICogdGhpc0FycmF5U2l6ZSk7CisgICAgICAgIG1lbWNweShidWZmZXIgKyB0aGlz
QXJyYXlTaXplLCBvdGhlckJ1dHRlcmZseS5jb250aWd1b3VzRG91YmxlKCkuZGF0YSgpLCBzaXpl
b2YoSlNWYWx1ZSkgKiBvdGhlckFycmF5U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0
byBidWZmZXIgPSByZXN1bHRCdXR0ZXJmbHkuY29udGlndW91cygpLmRhdGEoKTsKKyAgICAgICAg
bWVtY3B5KGJ1ZmZlciwgbV9idXR0ZXJmbHktPmNvbnRpZ3VvdXMoKS5kYXRhKCksIHNpemVvZihK
U1ZhbHVlKSAqIHRoaXNBcnJheVNpemUpOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgdGhpc0Fy
cmF5U2l6ZSwgb3RoZXJCdXR0ZXJmbHkuY29udGlndW91cygpLmRhdGEoKSwgc2l6ZW9mKEpTVmFs
dWUpICogb3RoZXJBcnJheVNpemUpOworICAgIH0KKworICAgIHJlc3VsdEJ1dHRlcmZseS5zZXRQ
dWJsaWNMZW5ndGgodGhpc0FycmF5U2l6ZSArIG90aGVyQXJyYXlTaXplKTsKKyAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKHJlc3VsdEFycmF5KTsKK30KKwogYm9vbCBKU0FycmF5OjpzaGlmdENv
dW50V2l0aEFycmF5U3RvcmFnZShWTSYgdm0sIHVuc2lnbmVkIHN0YXJ0SW5kZXgsIHVuc2lnbmVk
IGNvdW50LCBBcnJheVN0b3JhZ2UqIHN0b3JhZ2UpCiB7CiAgICAgdW5zaWduZWQgb2xkTGVuZ3Ro
ID0gc3RvcmFnZS0+bGVuZ3RoKCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU0FycmF5LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SlNBcnJheS5oCShyZXZpc2lvbiAxODYyOTYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU0FycmF5LmgJKHdvcmtpbmcgY29weSkKQEAgLTc4LDYgKzc4LDIwIEBAIHB1YmxpYzoK
IAogICAgIEpTQXJyYXkqIGZhc3RTbGljZShFeGVjU3RhdGUmLCB1bnNpZ25lZCBzdGFydEluZGV4
LCB1bnNpZ25lZCBjb3VudCk7CiAKKyAgICBzdGF0aWMgSW5kZXhpbmdUeXBlIGZhc3RDb25jYXRU
eXBlKFZNJiB2bSwgSlNBcnJheSYgZmlyc3RBcnJheSwgSlNBcnJheSYgc2Vjb25kQXJyYXkpCisg
ICAgeworICAgICAgICBJbmRleGluZ1R5cGUgdHlwZSA9IGZpcnN0QXJyYXkuaW5kZXhpbmdUeXBl
KCk7CisgICAgICAgIGlmICh0eXBlICE9IHNlY29uZEFycmF5LmluZGV4aW5nVHlwZSgpKQorICAg
ICAgICAgICAgcmV0dXJuIE5vbkFycmF5OworICAgICAgICBpZiAodHlwZSAhPSBBcnJheVdpdGhE
b3VibGUgJiYgdHlwZSAhPSBBcnJheVdpdGhJbnQzMiAmJiB0eXBlICE9IEFycmF5V2l0aENvbnRp
Z3VvdXMpCisgICAgICAgICAgICByZXR1cm4gTm9uQXJyYXk7CisgICAgICAgIGlmIChmaXJzdEFy
cmF5LnN0cnVjdHVyZSh2bSktPmhvbGVzTXVzdEZvcndhcmRUb1Byb3RvdHlwZSh2bSkKKyAgICAg
ICAgICAgIHx8IHNlY29uZEFycmF5LnN0cnVjdHVyZSh2bSktPmhvbGVzTXVzdEZvcndhcmRUb1By
b3RvdHlwZSh2bSkpCisgICAgICAgICAgICByZXR1cm4gTm9uQXJyYXk7CisgICAgICAgIHJldHVy
biB0eXBlOworICAgIH0KKyAgICBFbmNvZGVkSlNWYWx1ZSBmYXN0Q29uY2F0V2l0aChFeGVjU3Rh
dGUmLCBKU0FycmF5Jik7CisKICAgICBlbnVtIFNoaWZ0Q291bnRNb2RlIHsKICAgICAgICAgLy8g
VGhpcyBmb3JtIG9mIHNoaWZ0IGhpbnRzIHRoYXQgd2UncmUgZG9pbmcgcXVldWVpbmcuIFdpdGgg
dGhpcyBhc3N1bXB0aW9uIGluIGhhbmQsCiAgICAgICAgIC8vIHdlIGNvbnZlcnQgdG8gQXJyYXlT
dG9yYWdlLCB3aGljaCBoYXMgcXVldWUgb3B0aW1pemF0aW9ucy4K
</data>

          </attachment>
      

    </bug>

</bugzilla>