<?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>46746</bug_id>
          
          <creation_ts>2010-09-28 12:33:46 -0700</creation_ts>
          <short_desc>Large files via XHR : out-of-memory crashes</short_desc>
          <delta_ts>2011-01-31 01:50:56 -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 JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>S60 Hardware</rep_platform>
          <op_sys>S60 3rd edition</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Siddharth Mathur">s.mathur</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>ggaren</cc>
    
    <cc>hausmann</cc>
    
    <cc>kling</cc>
    
    <cc>koshuin</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>s.mathur</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>286449</commentid>
    <comment_count>0</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-09-28 12:33:46 -0700</bug_when>
    <thetext>When the attached code snippet it used to download a large file (say .js or .txt) via XHR, a null pointer crash results due to heap exhaustion in QtWebkit-Symbian application even when a large max heap size configured. 

Room for improvement ? 
a) reduce need for multiple small appends() in ScriptString/StringBuilder 
b) in case of allocation failure, gracefully indicate an XHR error condition  


63 User::Panic() W:\sf\os\kernelhwsrv\kernel\eka\euser\us_func.cpp:741
0x600173a0    
62 WTF::fastMalloc()
X:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\FastMalloc.cpp:259
0x2cc405e8    
61 WTF::VectorBufferBase&lt;wchar_t&gt;::allocateBuffer()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:286 0x2c27408c    
60 WTF::VectorBuffer&lt;wchar_t, 64&gt;::allocateBuffer()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:416 0x2c98c132    
59 WTF::Vector&lt;wchar_t, 64&gt;::reserveCapacity()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:854 0x2c98c0ce    
58 WTF::Vector&lt;wchar_t, 64&gt;::expandCapacity()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:771 0x2c98c1f9    
57 WTF::Vector&lt;wchar_t, 64&gt;::expandCapacity()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:778 0x2c98c02b    
56 WTF::Vector&lt;wchar_t, 64&gt;::append&lt;wchar_t&gt;()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\wtf\Vector.h:913 0x2cbe8d3a    
55 JSC::StringBuilder::append()
W:\sf\mw\qt\src\3rdparty\webkit\JavaScriptCore\runtime\StringBuilder.h:60
0x2cbe832b    
54 WebCore::ScriptString::operator +=()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\bindings\js\ScriptString.h:63
0x2cbe7eb5    
53 WebCore::XMLHttpRequest::didReceiveData()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\xml\XMLHttpRequest.cpp:945 0x2cbe894b   
52 WebCore::DocumentThreadableLoader::didReceiveData()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\loader\DocumentThreadableLoader.cpp:222
0x2c8453c7    
51 WebCore::SubresourceLoader::didReceiveData()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\loader\SubresourceLoader.cpp:171
0x2c87a79c    
50 WebCore::ResourceLoader::didReceiveData()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\loader\ResourceLoader.cpp:433
0x2c879013    
49 WebCore::QNetworkReplyHandler::forwardData()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\platform\network\qt\QNetworkReplyHandler.cpp:408
0x2c995414    
48 WebCore::QNetworkReplyHandler::qt_metacall()
W:\sf\mw\qt\src\3rdparty\webkit\WebCore\tmp\moc\debug_shared\moc_QNetworkReplyHandler.cpp:86
0x2c995e4e    
47 QMetaObject::metacall() W:\sf\mw\qt\src\corelib\kernel\qmetaobject.cpp:237
0x1491e6c4    
46 QMetaObject::activate() W:\sf\mw\qt\src\corelib\kernel\qobject.cpp:3272
0x1493320b    
45 QIODevice::readyRead()
W:\sf\mw\qt\src\corelib\tmp\moc\debug_shared\moc_qiodevice.cpp:91 0x149814c2    
44 MyApp::MyAppNetworkReply::handleReadyRead()
X:\cMyApp\MyApp\widgetcore\network\MyAppnetworkreply.cpp:98 0x483e885b    
43 MyApp::MyAppNetworkReply::qt_metacall()
X:\cMyApp\MyAppBuild\Debug\WidgetCore\tmp\moc_MyAppnetworkreply.cpp:82
0x483d1738    
42 QMetaObject::metacall() W:\sf\mw\qt\src\corelib\kernel\qmetaobject.cpp:237
0x1491e6c4    
41 QMetaObject::activate() W:\sf\mw\qt\src\corelib\kernel\qobject.cpp:3272
0x1493320b    
40 QIODevice::readyRead()
W:\sf\mw\qt\src\corelib\tmp\moc\debug_shared\moc_qiodevice.cpp:91 0x149814c2    
39 QNetworkReplyImplPrivate::appendDownstreamDataSignalEmissions()
W:\sf\mw\qt\src\network\access\qnetworkreplyimpl.cpp:559 0x16401c27    
38 QNetworkReplyImplPrivate::appendDownstreamData()
W:\sf\mw\qt\src\network\access\qnetworkreplyimpl.cpp:540 0x16401ac9    
37 QNetworkAccessBackend::writeDownstreamData()
W:\sf\mw\qt\src\network\access\qnetworkaccessbackend.cpp:248 0x163e90af    
36 QNetworkAccessHttpBackend::readFromHttp()
W:\sf\mw\qt\src\network\access\qnetworkaccesshttpbackend.cpp:740 0x163f29df    
35 QNetworkAccessHttpBackend::replyReadyRead()
W:\sf\mw\qt\src\network\access\qnetworkaccesshttpbackend.cpp:722 0x163f28e9    
34 QNetworkAccessHttpBackend::qt_metacall()
W:\sf\mw\qt\src\network\tmp\moc\debug_shared\moc_qnetworkaccesshttpbackend_p.cpp:87
0x164684db    
33 QMetaObject::metacall() W:\sf\mw\qt\src\corelib\kernel\qmetaobject.cpp:237
0x1491e6c4    
32 QMetaObject::activate() W:\sf\mw\qt\src\corelib\kernel\qobject.cpp:3272
0x1493320b    
31 QHttpNetworkReply::readyRead()
W:\sf\mw\qt\src\network\tmp\moc\debug_shared\moc_qhttpnetworkreply_p.cpp:113
0x16467f03    
30 QHttpNetworkConnectionChannel::_q_receiveReply()
W:\sf\mw\qt\src\network\access\qhttpnetworkconnectionchannel.cpp:425 0x163d9896 
29 QHttpNetworkConnectionChannel::_q_readyRead()
W:\sf\mw\qt\src\network\access\qhttpnetworkconnectionchannel.cpp:874 0x163dba94 
28 QHttpNetworkConnectionChannel::qt_metacall()
W:\sf\mw\qt\src\network\tmp\moc\debug_shared\moc_qhttpnetworkconnectionchannel_p.cpp:92
0x163dc30a    
27 QMetaObject::metacall() W:\sf\mw\qt\src\corelib\kernel\qmetaobject.cpp:237
0x1491e6c4    
26 QMetaObject::activate() W:\sf\mw\qt\src\corelib\kernel\qobject.cpp:3272
0x1493320b    
25 QIODevice::readyRead()
W:\sf\mw\qt\src\corelib\tmp\moc\debug_shared\moc_qiodevice.cpp:91 0x149814c2    
24 QAbstractSocketPrivate::canReadNotification()
W:\sf\mw\qt\src\network\socket\qabstractsocket.cpp:639 0x16440860    
23 QAbstractSocketPrivate::readNotification()
W:\sf\mw\qt\src\network\socket\qabstractsocket_p.h:77 0x16445579    
22 QAbstractSocketEngine::readNotification()
W:\sf\mw\qt\src\network\socket\qabstractsocketengine.cpp:155 0x16430de6    
21 QReadNotifier::event()
W:\sf\mw\qt\src\network\socket\qnativesocketengine.cpp:1104 0x1643387a    
20 QApplicationPrivate::notify_helper()
W:\sf\mw\qt\src\gui\kernel\qapplication.cpp:4392 0x14e4848c    
19 QApplication::notify() W:\sf\mw\qt\src\gui\kernel\qapplication.cpp:3794
0x14e456d9    
18 QCoreApplication::notifyInternal()
W:\sf\mw\qt\src\corelib\kernel\qcoreapplication.cpp:732 0x14916f0b    
17 QCoreApplication::sendEvent()
W:\sf\mw\qt\src\corelib\kernel\qcoreapplication.h:215 0x1488a433    
16 QEventDispatcherSymbian::socketFired()
W:\sf\mw\qt\src\corelib\kernel\qeventdispatcher_symbian.cpp:899 0x1494d914    
15 QSocketActiveObject::RunL()
W:\sf\mw\qt\src\corelib\kernel\qeventdispatcher_symbian.cpp:632 0x1494cbc1    
14 CActiveScheduler::RunIfReady()
W:\sf\os\kernelhwsrv\kernel\eka\euser\cbase\ub_act.cpp:1281 0x60002800    
13 QEventDispatcherSymbian::processEvents()
W:\sf\mw\qt\src\corelib\kernel\qeventdispatcher_symbian.cpp:831 0x1494d4cd    
12 QEventDispatcherS60::processEvents()
W:\sf\mw\qt\src\gui\kernel\qeventdispatcher_s60.cpp:74 0x14ebc425    
11 QEventLoop::processEvents()
W:\sf\mw\qt\src\corelib\kernel\qeventloop.cpp:149 0x14913fc0    
10 QEventLoop::exec() W:\sf\mw\qt\src\corelib\kernel\qeventloop.cpp:201
0x149141b9    
9 QCoreApplication::exec()
W:\sf\mw\qt\src\corelib\kernel\qcoreapplication.cpp:1009 0x14917543    
8 QApplication::exec() W:\sf\mw\qt\src\gui\kernel\qapplication.cpp:3668
0x14e45309    
7 main() X:\cMyApp\app\widget\MyAppWidgetUI\src\MyAppWidgetMain.cpp:104
0x4de525ad Collapse All Comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286451</commentid>
    <comment_count>1</comment_count>
      <attachid>69086</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-09-28 12:34:42 -0700</bug_when>
    <thetext>Created attachment 69086
test case</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294747</commentid>
    <comment_count>2</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-10-15 07:42:05 -0700</bug_when>
    <thetext>Per Janne K&apos;s comments, we should re-test this bug after Bug 43987 is fixed (and cherrypicked into QtWebkit 2.x)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300952</commentid>
    <comment_count>3</comment_count>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2010-10-28 02:14:48 -0700</bug_when>
    <thetext>Tested trunk with Bug 43987 changes in N8.
Downloading 10MB test file finishes and doesn&apos;t crash.
Problem is that the downloading still takes too much RAM. 10MB download took 90MB RAM when loaded using QtTestBrowser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301024</commentid>
    <comment_count>4</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-10-28 06:15:09 -0700</bug_when>
    <thetext>Downloading 10MB without crash is certainly a big improvement. Thanks Janne!
I am marking this as Resolved/Duplicate for now to Bug 43987, even though from a QtWebkit 2.1 point-of-view, the changes are proving hard to cherrypick. 
(please feel free to reopen)

*** This bug has been marked as a duplicate of bug 43987 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335772</commentid>
    <comment_count>5</comment_count>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2011-01-18 05:11:50 -0800</bug_when>
    <thetext>Re-opening. Rope fix done in Bug 43987 didn&apos;t fix the OOM issue in Symbian. It just delayed it a bit. The test case here is not the one in internal bug reporting and this test case attached here in this bug works and thats why the confusion. I&apos;ll mark this one as obsolete and attach the proper one.

Here is what is causing the OOM in symbian. Issue is amplified by the test case itself:

The one in internal bug reporting has a progress bar which queries responseText each time readyState is changed and the state is LOADING. The length of the responseText is then used to determine the progress of the download state and displayed to user &quot;xx/100&quot;.

Now the problem. Each call to responseText allocates new JSString which is not deleted until the garbage collector is run. Meaning after few chunks into the download we run out of memory.

WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
&gt;JSValue JSXMLHttpRequest::responseText(ExecState* exec) const
&gt;{
&gt;    return jsOwnedStringOrNull(exec, impl()-&gt;responseText());
&gt;}

jsOwnedStringOrNull doesn&apos;t get deleted until next collector cleanup. Quick and dirty hack would be to use jsStringOrNull instead which calls reportExtraMemoryCost and if there is not enough memory ends up reset()ting the Heap. Other alternative is to call CollectAllGarbage() each time responseText is called.

Ofc. the easiest way to deal with this is not to give user progress info ;) On a serious side the javascript code should be modified so that the progress info is changed once or twice a second to minimize memory consumption.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335774</commentid>
    <comment_count>6</comment_count>
      <attachid>79266</attachid>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2011-01-18 05:19:51 -0800</bug_when>
    <thetext>Created attachment 79266
Proper test case

I don&apos;t have a host where I could have that test file. So you need to modify URL to get ~5MB test file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337265</commentid>
    <comment_count>7</comment_count>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2011-01-20 04:37:37 -0800</bug_when>
    <thetext>After changing the responseText function to call CollectAllGarbage() we have a new issue. Due to massive allocation and deallocation during download causes the downloading to take long time. example here is 25MB file takes ~1h to complete and as added bonus heap gets completely trashed. So that is a no go.

Few Ideas:

1. Each instance of responseText would differ only by string lenght unless detached.
JSString associated with the downloaded content would be stored in single location.

2. responseText is null unless data is referenced
We would only update the length of the object but not allocate the string unless needed. The advantage over 1. is we can have larger downloads.

3. all JSStrings would be null unless used i.e. lazy allocation of all strings.
Would be fun to test :) Maybe such feature exists and I&apos;m not aware of it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337353</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-20 08:27:18 -0800</bug_when>
    <thetext>&gt; Ofc. the easiest way to deal with this is not to give user progress info ;)

Do you really need to repeatedly query responseText? Would listening for progress event provide the necessary information?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337390</commentid>
    <comment_count>9</comment_count>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2011-01-20 09:14:46 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; Ofc. the easiest way to deal with this is not to give user progress info ;)
&gt; 
&gt; Do you really need to repeatedly query responseText? Would listening for progress event provide the necessary information?

Not required to my understanding. I&apos;m trying to reach out for the guys who wrote the original report. If they say it is ok for them to use progress event instead then I can close this again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342505</commentid>
    <comment_count>10</comment_count>
    <who name="Janne Koskinen">koshuin</who>
    <bug_when>2011-01-31 01:50:56 -0800</bug_when>
    <thetext>Ok, I checked and the test case is speed test which doesn&apos;t actually need the data at all so closing this issue. Test case has been altered to not to show the progress and not to show the end result in HTML which is duplicate of 53416 .

Progress bar can be achieved by monitoring progress event.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>69086</attachid>
            <date>2010-09-28 12:34:42 -0700</date>
            <delta_ts>2011-01-18 05:19:51 -0800</delta_ts>
            <desc>test case</desc>
            <filename>largefilexhr.html</filename>
            <type>text/html</type>
            <size>888</size>
            <attacher name="Siddharth Mathur">s.mathur</attacher>
            
              <data encoding="base64">PGh0bWw+DQo8aGVhZD4NCgk8dGl0bGU+MXhocjwvdGl0bGU+DQo8L2hlYWQ+DQo8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBsb2FkWE1MRG9jKCkNCnsNCg0KdmFyIHVy
bCA9ICJodHRwOi8vZm9vLmNvbS9hZmV3TWJ5dGVGaWxlLnR4dCI7DQppZiAod2luZG93LlhNTEh0
dHBSZXF1ZXN0KQ0KICB7Ly8gY29kZSBmb3IgSUU3KywgRmlyZWZveCwgQ2hyb21lLCBPcGVyYSwg
U2FmYXJpDQogIHhtbGh0dHA9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogIH0NCmVsc2UNCiAgey8v
IGNvZGUgZm9yIElFNiwgSUU1DQogIHhtbGh0dHA9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29m
dC5YTUxIVFRQIik7DQogIH0NCnhtbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCkN
CiAgeyANCiAgaWYgKHhtbGh0dHAucmVhZHlTdGF0ZT09NCAmJiB4bWxodHRwLnN0YXR1cz09MjAw
KQ0KICAgIHsNCglhbGVydCgiRXhwIDQgKyBBY3QgcmVhZHlTdGF0ZSA9ICIgKyB4bWxodHRwLnJl
YWR5U3RhdGUpOw0KCWFsZXJ0KCJFeHAgMjAwICsgQWN0IHN0YXR1cyAgPSAiICsgeG1saHR0cC5z
dGF0dXMpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJteURpdiIpLmlubmVySFRNTD14
bWxodHRwLnJlc3BvbnNlVGV4dDsNCiAgICB9DQogIH0NCnhtbGh0dHAub3BlbigiR0VUIix1cmws
dHJ1ZSk7DQp4bWxodHRwLnNlbmQoKTsNCn0NCjwvc2NyaXB0Pg0KPGJvZHk+DQo8ZGl2IGlkPSJt
eURpdiI+PGgyPkRvd25sb2FkIGZpbGUgZ3JlYXRlciB0aGF0IDNNQjwvaDI+PC9kaXY+DQo8YnV0
dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0ibG9hZFhNTERvYygpIj5Eb3dubG9hZCB2aWEgWEhS
PC9idXR0b24+DQoNCjwvYm9keT4NCjwvaHRtbD4NCg0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>79266</attachid>
            <date>2011-01-18 05:19:51 -0800</date>
            <delta_ts>2011-01-18 05:19:51 -0800</delta_ts>
            <desc>Proper test case</desc>
            <filename>XHRDownload.html</filename>
            <type>text/html</type>
            <size>3675</size>
            <attacher name="Janne Koskinen">koshuin</attacher>
            
              <data encoding="base64">77u/PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlv
bmFsLy9FTiI+DQo8aHRtbD4NCjxoZWFkPg0KICAgIDx0aXRsZT5YSFJEb3dubG9hZDwvdGl0bGU+
DQogICAgPG1ldGEgaHR0cC1lcXVpdj0ia2V5d29yZHMiIGNvbnRlbnQ9ImtleXdvcmQxLGtleXdv
cmQyLGtleXdvcmQzIj4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJkZXNjcmlwdGlvbiIgY29udGVu
dD0idGhpcyBpcyBteSBwYWdlIj4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUi
IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+DQogICAgPCEtLTxsaW5rIHJlbD0i
c3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGVzLmNzcyI+LS0+DQo8L2hl
YWQ+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIGlucHV0W3R5cGU9YnV0dG9uXQ0KICAg
IHsNCiAgICAgICAgZm9udC1zaXplOiAzNnB4Ow0KICAgIH0NCjwvc3R5bGU+DQo8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgdmFyIHN0YXJ0RGF0ZTsNCiAgICB2YXIgbnVtID0g
MTAyNCAqIDEwMjQgKiA1Ow0KICAgIHZhciBjb3VudCA9IDA7DQogICAgZnVuY3Rpb24gc2VuZFJl
cShtZXRob2QpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgew0KICAgICAg
ICAgICAgeG1saHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgICAgICB9DQogICAgICAg
IGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7DQogICAgICAgICAgICB4bWxodHRwID0g
bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7DQogICAgICAgIH0NCiAgICAg
ICAgdHJ5IHsNCiAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7DQogICAgICAgICAg
ICB2YXIgdXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdldFVSTCIpLnZhbHVlOw0KICAg
ICAgICAgICAgdXJsICs9ICI/dCIgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpOw0KICAgICAgICAg
ICAgLy9hbGVydCh1cmwpOw0KICAgICAgICAgICAgeG1saHR0cC5vcGVuKCJnZXQiLCB1cmwsIG1l
dGhvZCk7DQogICAgICAgICAgICB4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZVJl
c3BvbnNlOw0KICAgICAgICAgICAgeG1saHR0cC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5
cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgiKTsN
CiAgICAgICAgICAgIHhtbGh0dHAuc2VuZChudWxsKTsNCiAgICAgICAgfSBjYXRjaCAoZSkgew0K
ICAgICAgICAgICAgYWxlcnQoMSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBo
YW5kbGVSZXNwb25zZSgpIHsNCiAgICAgICAgaWYgKHhtbGh0dHAucmVhZHlTdGF0ZSA9PSAzKSB7
DQogICAgICAgICAgICB2YXIgc3QgPSB4bWxodHRwLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgICAg
IHZhciBzID0gc3QubGVuZ3RoIC8gbnVtICogMTAwICsgIiI7DQogICAgICAgICAgICBpZiAocy5s
YXN0SW5kZXhPZigiLiIpICE9IC0xKQ0KICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygw
LCBzLmxhc3RJbmRleE9mKCIuIikpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoIm1tIikuaW5uZXJIVE1MID0gIkRvd25sb2FkaW5nLi4uLi4uLi4iICsgcyArICIgJSI7DQog
ICAgICAgIH0gZWxzZSBpZiAoeG1saHR0cC5yZWFkeVN0YXRlID09IDQpDQogICAgICAgICAgICBp
ZiAoeG1saHR0cC5zdGF0dXMgPT0gMjAwKSB7DQogICAgICAgICAgICAgICAgLy9hbGVydCh4bWxo
dHRwLnN0YXR1cysiCSIreG1saHR0cC5yZWFkeVN0YXRlKTsNCiAgICAgICAgICAgICAgICBkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2FnZSIpLmlubmVySFRNTCA9ICJUaW1lIENvbnN1bXB0
aW9uOiIgKyAobmV3IERhdGUoKSAtIHN0YXJ0RGF0ZSkgKyAiIG1zIjsNCiAgICAgICAgICAgICAg
ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW0iKS5pbm5lckhUTUwgPSAiZG93bmxvYWRpbmcu
Li4uLi4uLjEwMCAlIjsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi
ZGQiKS5pbm5lckhUTUwgPSAiIjsNCiAgICAgICAgICAgICAgICBjb3VudCA9IDA7DQogICAgICAg
ICAgICAgICAgLy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibTEiKS5pbm5lckhUTUw9eG1saHR0
cC5yZXNwb25zZVRleHQ7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHhtbGh0dHAuc3RhdHVzID09
IDApIHsNCiAgICAgICAgICAgICAgICBjb3VudCA9IDA7DQogICAgICAgICAgICAgICAgZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoIm1lc3NhZ2UiKS5pbm5lckhUTUwgPSAiPGZvbnQgY29sb3I9J3Jl
ZCc+U2VydmVyIGNhbiBub3QgYmUgY29ubmVjdGVkISBwbGVhc2UgbWFrZSBzdXJlIHRoZSBuZXR3
b3JrIHdvcmtzIHdlbGwgYW5kIHRoZSBzZXJ2ZXIgaGFzIGJlZW4gcnVubmluZy48L2ZvbnQ+IjsN
CiAgICAgICAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gY2hhbmdlTWV0aG9kKG0pIHsNCiAg
ICAgICAgbWV0aG9kID0gbTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInR5cGUi
KS5pbm5lckhUTUwgPSBtOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2Fn
ZSIpLmlubmVySFRNTCA9ICIiOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzdGFydCgpIHsNCiAgICAg
ICAgaWYgKGNvdW50ID09IDApIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCJtZXNzYWdlIikuaW5uZXJIVE1MID0gIiI7DQogICAgICAgICAgICBzZW5kUmVxKHRydWUpOw0K
ICAgICAgICAgICAgY291bnQgPSAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRkIikuaW5uZXJIVE1MID0gIjxmb250IGNvbG9yPSdncmVl
bic+QW5vdGhlciBkb3dubG9hZCBwcm9jZXNzIGlzIHJ1bm5pbmcuLi4gcGxlYXNlIHdhaXQhPC9m
b250PiI7DQogICAgICAgIH0NCiAgICB9DQo8L3NjcmlwdD4NCjxib2R5Pg0KICAgIDxmaWVsZHNl
dD4NCiAgICAgICAgPGxlZ2VuZD5EZXNjcmlwdGlvbjwvbGVnZW5kPkRvd25sb2FkIDUgTWIgdGV4
dCBmaWxlIHVzaW5nIFhtbEh0dHBSZXF1ZXN0LCBDbGljaw0KICAgICAgICB0aGUgYnV0dG9uIGJl
bG93IHRvIHN0YXJ0IGRvd25sb2FkLg0KICAgIDwvZmllbGRzZXQ+DQogICAgPGRpdiBhbGlnbj0i
Y2VudGVyIj4NCiAgICAgICAgSGVyZSBzZXQgeW91ciBTZXJ2ZXIgVVJMOg0KICAgICAgICA8aW5w
dXQgdHlwZT0idGV4dCIgc2l6ZT0iNDAiIGlkPSJnZXRVUkwiIHZhbHVlPSJodHRwOi8vMTkyLjE2
OC4xLjE4OC9kb3dubG9hZC50eHQiIC8+DQogICAgPC9kaXY+DQogICAgPGRpdiBhbGlnbj0iY2Vu
dGVyIj4NCiAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlN0YXJ0IERvd25Mb2Fk
IiBvbmNsaWNrPSJzdGFydCgpOyIgLz4NCiAgICA8L2Rpdj4NCiAgICA8ZGl2IGlkPSdtbScgYWxp
Z249ImNlbnRlciI+DQogICAgPC9kaXY+DQogICAgPGRpdiBhbGlnbj0iY2VudGVyIiBpZD0ibWVz
c2FnZSI+DQogICAgPC9kaXY+DQogICAgPGRpdiBpZD0iZGQiIGFsaWduPSJjZW50ZXIiPg0KICAg
IDwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K
</data>

          </attachment>
      

    </bug>

</bugzilla>