<?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>21203</bug_id>
          
          <creation_ts>2008-09-28 19:56:22 -0700</creation_ts>
          <short_desc>Optimize appending a number to a string</short_desc>
          <delta_ts>2008-09-29 18:31:50 -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>Mac</rep_platform>
          <op_sys>OS X 10.5</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="Maciej Stachowiak">mjs</reporter>
          <assigned_to name="Maciej Stachowiak">mjs</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>93195</commentid>
    <comment_count>0</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-09-28 19:56:22 -0700</bug_when>
    <thetext>Optimize appending a number to a string. It&apos;s pretty common in real-world code (and on some of the v8 benchmarks) to do this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93196</commentid>
    <comment_count>1</comment_count>
      <attachid>23900</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-09-28 19:57:18 -0700</bug_when>
    <thetext>Created attachment 23900
patch to do it. Some sad code duplication here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93199</commentid>
    <comment_count>2</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-09-28 20:01:01 -0700</bug_when>
    <thetext>I sadly duplicated the logic for UString::from(int) and UString::from(double)
though fortunately not the actual append logic. Perhaps I should try harder to
refactor to make it ot duplicat, though it was not 100% clear how to do this
except maybe using a template. UString::from(int) is not much code but the
double case is nontrivial.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93202</commentid>
    <comment_count>3</comment_count>
      <attachid>23900</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-09-28 20:12:20 -0700</bug_when>
    <thetext>Comment on attachment 23900
patch to do it. Some sad code duplication here.

+    if ((leftIsString = v1-&gt;isString()) &amp;&amp; v2-&gt;isString()) {

Why not just put the leftIsString boolean initialization separate in front of the if statement in a more conventional way?

+        RefPtr&lt;UString::Rep&gt; value;
+        if (JSImmediate::isImmediate(v2))
+            value = concatenate(static_cast&lt;JSString*&gt;(v1)-&gt;value().rep(), JSImmediate::getTruncatedInt32(v2));
+        else
+            value = concatenate(static_cast&lt;JSString*&gt;(v1)-&gt;value().rep(), right);

I believe would be more efficient if done with the ternary operator instead of an if statement. I believe it would save a null check and a branch over deref code on the assignment to the value local.

+inline size_t expandedSize(size_t size, size_t otherSize)

If this isn&apos;t going to be a static member function, then I suggest internal linkage -- add the static keyword.

+inline bool expandCapacity(UString::Rep* rep, int requiredLength)

This should also be marked static to get internal linkage.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93322</commentid>
    <comment_count>4</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-09-29 18:31:50 -0700</bug_when>
    <thetext>Landed as r37089</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23900</attachid>
            <date>2008-09-28 19:57:18 -0700</date>
            <delta_ts>2008-09-28 20:12:20 -0700</delta_ts>
            <desc>patch to do it. Some sad code duplication here.</desc>
            <filename>fast-str-plus-num.patch.txt</filename>
            <type>text/plain</type>
            <size>20826</size>
            <attacher name="Maciej Stachowiak">mjs</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM3MDQ4
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzQgQEAKKzIwMDgtMDkt
MjggIE1hY2llaiBTdGFjaG93aWFrICA8bWpzQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIC0gb3B0aW1pemUgYXBwZW5k
aW5nIGEgbnVtYmVyIHRvIGEgc3RyaW5nCisgICAgICAgIAorICAgICAgICBJdCdzIHByZXR0eSBj
b21tb24gaW4gcmVhbC13b3JsZCBjb2RlIChhbmQgb24gc29tZSBvZiB0aGUgdjgKKyAgICAgICAg
YmVuY2htYXJrcykgdG8gYXBwZW5kIGEgbnVtYmVyIHRvIGEgc3RyaW5nLCBzbyBJIG1hZGUgdGhp
cyBvbmUgb2YKKyAgICAgICAgdGhlIGZhc3QgY2FzZXMsIGFuZCBhbHNvIGFkZGVkIHN1cHBvcnQg
dG8gVVN0cmluZyB0byBkbyBpdAorICAgICAgICBkaXJlY3RseSB3aXRob3V0IGFsbG9jYXRpbmcg
YSB0ZW1wb3JhcnkgVVN0cmluZy4KKworICAgICAgICAqIFZNL01hY2hpbmUuY3BwOgorICAgICAg
ICAoSlNDOjpqc0FkZFNsb3dDYXNlKTogTWFrZSB0aGlzIE5FVkVSX0lOTElORSBiZWNhdXNlIHNv
bWVob3cgb3RoZXJ3aXNlCisgICAgICAgIHRoZSBjaGFuZ2UgaXMgYSByZWdyZXNzaW9uLgorICAg
ICAgICAoSlNDOjpqc0FkZCk6IEhhbmRsZSBudW1iZXIgKyBzdHJpbmcgc3BlY2lhbCBjYXNlLgor
ICAgICAgICAoSlNDOjpNYWNoaW5lOjpjdGlfb3BfYWRkKTogSW50ZWdyYXRlIG11Y2ggb2YgdGhl
IGxvZ2ljIG9mIGpzQWRkIHRvCisgICAgICAgIGF2b2lkIGV4Y2VwdGlvbiBjaGVjayBpbiB0aGUg
c3RyICsgc3RyLCBudW0gKyBudW0gYW5kIHN0ciArIG51bSBjYXNlcy4KKyAgICAgICAgKiBranMv
dXN0cmluZy5jcHA6CisgICAgICAgIChKU0M6OmV4cGFuZGVkU2l6ZSk6IE1ha2UgdGhpcyBhIG5v
bi1tZW1iZXIgZnVuY3Rpb24sIHNpbmNlIGl0IG5lZWRzIHRvIGJlIAorICAgICAgICBjYWxsZWQg
aW4gbm9uLW1lbWJlciBmdW5jdGlvbnMgYnV0IG5vdCBvdXRzaWRlIHRoaXMgZmlsZS4KKyAgICAg
ICAgKEpTQzo6ZXhwYW5kQ2FwYWNpdHkpOiBEaXR0by4KKyAgICAgICAgKEpTQzo6VVN0cmluZzo6
ZXhwYW5kQ2FwYWNpdHkpOiBDYWxsIHRoZSBub24tbWVtYmVyIHZlcnNpb24uIAorICAgICAgICAo
SlNDOjpjcmVhdGVSZXApOiBIZWxwZXIgdG8gbWFrZSBhIHJlcCBmcm9tIGEgY2hhciouCisgICAg
ICAgIChKU0M6OlVTdHJpbmc6OlVTdHJpbmcpOiBVc2UgYWJvdmUgaGVscGVyLgorICAgICAgICAo
SlNDOjpjb25jYXRlbmF0ZSk6IEd1dHMgb2YgY29uY2F0ZW5hdGluZyBjb25zdHJ1Y3RvciBmb3Ig
Y2FzZXMgd2hlcmUgZmlyc3QKKyAgICAgICAgaXRlbSBpcyBhIFVTdHJpbmc6OlJlcCwgYW5kIHNl
Y29uZCBpcyBhIFVDaGFyKiBhbmQgbGVuZ3RoLCBvciBhIGNoYXIqLgorICAgICAgICAoSlNDOjpV
U3RyaW5nOjphcHBlbmQpOiBJbXBsZW1lbnQgZm9yIGNhc2VzIHdoZXJlIGZpcnN0IGl0ZW0gaXMg
YSBVU3RyaW5nOjpSZXAsCisgICAgICAgIGFuZCBzZWNvbmQgaXMgYW4gaW50IG9yIGRvdWJsZS4g
U2FkbHkgZHVwbGljYXRlcyBsb2dpYyBvZiBVU3RyaW5nOjpmcm9tKGludCkKKyAgICAgICAgYW5k
IFVTdHJpbmc6OmZyb20oZG91YmxlKS4KKyAgICAgICAgKiBranMvdXN0cmluZy5oOgorCiAyMDA4
LTA5LTI4ICBNYXJrIFJvd2UgIDxtcm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgQ2FtZXJvbiBad2FyaWNoLgpJbmRleDogVk0vTWFjaGluZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
Vk0vTWFjaGluZS5jcHAJKHJldmlzaW9uIDM3MDQ4KQorKysgVk0vTWFjaGluZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIxMSw3ICsyMTEsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wganNMZXNzRXEo
RXhlY1N0YXRlKiBlCiAgICAgcmV0dXJuICEoc3RhdGljX2Nhc3Q8Y29uc3QgSlNTdHJpbmcqPihw
MiktPnZhbHVlKCkgPCBzdGF0aWNfY2FzdDxjb25zdCBKU1N0cmluZyo+KHAxKS0+dmFsdWUoKSk7
CiB9CiAKLXN0YXRpYyBKU1ZhbHVlKiBqc0FkZFNsb3dDYXNlKEV4ZWNTdGF0ZSogZXhlYywgSlNW
YWx1ZSogdjEsIEpTVmFsdWUqIHYyKQorc3RhdGljIE5FVkVSX0lOTElORSBKU1ZhbHVlKiBqc0Fk
ZFNsb3dDYXNlKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSogdjEsIEpTVmFsdWUqIHYyKQogewog
ICAgIC8vIGV4Y2VwdGlvbiBmb3IgdGhlIERhdGUgZXhjZXB0aW9uIGluIGRlZmF1bHRWYWx1ZSgp
CiAgICAgSlNWYWx1ZSogcDEgPSB2MS0+dG9QcmltaXRpdmUoZXhlYyk7CkBAIC0yMzYsMjAgKzIz
NiwzNSBAQCBzdGF0aWMgSlNWYWx1ZSoganNBZGRTbG93Q2FzZShFeGVjU3RhdGUqCiAvLyAgICAx
Mzk2MiAgIEFkZCBjYXNlOiA1IDMKIC8vICAgIDQwMDAgICAgQWRkIGNhc2U6IDMgNQogCi1zdGF0
aWMgaW5saW5lIEpTVmFsdWUqIGpzQWRkKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSogdjEsIEpT
VmFsdWUqIHYyKQorc3RhdGljIEFMV0FZU19JTkxJTkUgSlNWYWx1ZSoganNBZGQoRXhlY1N0YXRl
KiBleGVjLCBKU1ZhbHVlKiB2MSwgSlNWYWx1ZSogdjIpCiB7CiAgICAgZG91YmxlIGxlZnQ7Ci0g
ICAgZG91YmxlIHJpZ2h0OwotICAgIGlmIChmYXN0SXNOdW1iZXIodjEsIGxlZnQpICYmIGZhc3RJ
c051bWJlcih2MiwgcmlnaHQpKQorICAgIGRvdWJsZSByaWdodCA9IDAuMDsKKyAgICBib29sIGxl
ZnRJc1N0cmluZzsKKworICAgIGJvb2wgcmlnaHRJc051bWJlciA9IGZhc3RJc051bWJlcih2Miwg
cmlnaHQpOworICAgIGlmIChyaWdodElzTnVtYmVyICYmIGZhc3RJc051bWJlcih2MSwgbGVmdCkp
CiAgICAgICAgIHJldHVybiBqc051bWJlcihleGVjLCBsZWZ0ICsgcmlnaHQpOwogICAgIAotICAg
IGlmICh2MS0+aXNTdHJpbmcoKSAmJiB2Mi0+aXNTdHJpbmcoKSkgeworICAgIGlmICgobGVmdElz
U3RyaW5nID0gdjEtPmlzU3RyaW5nKCkpICYmIHYyLT5pc1N0cmluZygpKSB7CiAgICAgICAgIFJl
ZlB0cjxVU3RyaW5nOjpSZXA+IHZhbHVlID0gY29uY2F0ZW5hdGUoc3RhdGljX2Nhc3Q8SlNTdHJp
bmcqPih2MSktPnZhbHVlKCkucmVwKCksIHN0YXRpY19jYXN0PEpTU3RyaW5nKj4odjIpLT52YWx1
ZSgpLnJlcCgpKTsKICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgIHJldHVybiB0aHJv
d091dE9mTWVtb3J5RXJyb3IoZXhlYyk7CiAgICAgICAgIHJldHVybiBqc1N0cmluZyhleGVjLCB2
YWx1ZS5yZWxlYXNlKCkpOwogICAgIH0KIAorICAgIGlmIChyaWdodElzTnVtYmVyICYgbGVmdElz
U3RyaW5nKSB7CisgICAgICAgIFJlZlB0cjxVU3RyaW5nOjpSZXA+IHZhbHVlOworICAgICAgICBp
ZiAoSlNJbW1lZGlhdGU6OmlzSW1tZWRpYXRlKHYyKSkKKyAgICAgICAgICAgIHZhbHVlID0gY29u
Y2F0ZW5hdGUoc3RhdGljX2Nhc3Q8SlNTdHJpbmcqPih2MSktPnZhbHVlKCkucmVwKCksIEpTSW1t
ZWRpYXRlOjpnZXRUcnVuY2F0ZWRJbnQzMih2MikpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB2YWx1ZSA9IGNvbmNhdGVuYXRlKHN0YXRpY19jYXN0PEpTU3RyaW5nKj4odjEpLT52YWx1ZSgp
LnJlcCgpLCByaWdodCk7CisKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVy
biB0aHJvd091dE9mTWVtb3J5RXJyb3IoZXhlYyk7CisgICAgICAgIHJldHVybiBqc1N0cmluZyhl
eGVjLCB2YWx1ZS5yZWxlYXNlKCkpOworICAgIH0KKwogICAgIC8vIEFsbCBvdGhlciBjYXNlcyBh
cmUgcHJldHR5IHVuY29tbW9uCiAgICAgcmV0dXJuIGpzQWRkU2xvd0Nhc2UoZXhlYywgdjEsIHYy
KTsKIH0KQEAgLTQxODQsMTEgKzQxOTksNDYgQEAgdm9pZCBNYWNoaW5lOjpjdGlfb3BfZW5kKENU
SV9BUkdTKQogCiBKU1ZhbHVlKiBNYWNoaW5lOjpjdGlfb3BfYWRkKENUSV9BUkdTKQogewotICAg
IEpTVmFsdWUqIHNyYzEgPSBBUkdfc3JjMTsKLSAgICBKU1ZhbHVlKiBzcmMyID0gQVJHX3NyYzI7
CisgICAgSlNWYWx1ZSogdjEgPSBBUkdfc3JjMTsKKyAgICBKU1ZhbHVlKiB2MiA9IEFSR19zcmMy
OwogCiAgICAgRXhlY1N0YXRlKiBleGVjID0gQVJHX2V4ZWM7Ci0gICAgSlNWYWx1ZSogcmVzdWx0
ID0ganNBZGQoZXhlYywgc3JjMSwgc3JjMik7CisgICAgZG91YmxlIGxlZnQ7CisgICAgZG91Ymxl
IHJpZ2h0ID0gMC4wOworICAgIGJvb2wgbGVmdElzU3RyaW5nOworCisgICAgYm9vbCByaWdodElz
TnVtYmVyID0gZmFzdElzTnVtYmVyKHYyLCByaWdodCk7CisgICAgaWYgKHJpZ2h0SXNOdW1iZXIg
JiYgZmFzdElzTnVtYmVyKHYxLCBsZWZ0KSkKKyAgICAgICAgcmV0dXJuIGpzTnVtYmVyKGV4ZWMs
IGxlZnQgKyByaWdodCk7CisgICAgCisgICAgaWYgKChsZWZ0SXNTdHJpbmcgPSB2MS0+aXNTdHJp
bmcoKSkgJiYgdjItPmlzU3RyaW5nKCkpIHsKKyAgICAgICAgUmVmUHRyPFVTdHJpbmc6OlJlcD4g
dmFsdWUgPSBjb25jYXRlbmF0ZShzdGF0aWNfY2FzdDxKU1N0cmluZyo+KHYxKS0+dmFsdWUoKS5y
ZXAoKSwgc3RhdGljX2Nhc3Q8SlNTdHJpbmcqPih2MiktPnZhbHVlKCkucmVwKCkpOworICAgICAg
ICBpZiAoVU5MSUtFTFkoIXZhbHVlKSkgeworICAgICAgICAgICAgSlNWYWx1ZSogcmVzdWx0ID0g
dGhyb3dPdXRPZk1lbW9yeUVycm9yKGV4ZWMpOworICAgICAgICAgICAgVk1fQ0hFQ0tfRVhDRVBU
SU9OX0FUX0VORCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiBqc1N0cmluZyhleGVjLCB2YWx1ZS5yZWxlYXNlKCkpOworICAgIH0KKwor
ICAgIGlmIChyaWdodElzTnVtYmVyICYgbGVmdElzU3RyaW5nKSB7CisgICAgICAgIFJlZlB0cjxV
U3RyaW5nOjpSZXA+IHZhbHVlOworICAgICAgICBpZiAoSlNJbW1lZGlhdGU6OmlzSW1tZWRpYXRl
KHYyKSkKKyAgICAgICAgICAgIHZhbHVlID0gY29uY2F0ZW5hdGUoc3RhdGljX2Nhc3Q8SlNTdHJp
bmcqPih2MSktPnZhbHVlKCkucmVwKCksIEpTSW1tZWRpYXRlOjpnZXRUcnVuY2F0ZWRJbnQzMih2
MikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZSA9IGNvbmNhdGVuYXRlKHN0YXRp
Y19jYXN0PEpTU3RyaW5nKj4odjEpLT52YWx1ZSgpLnJlcCgpLCByaWdodCk7CisKKyAgICAgICAg
aWYgKFVOTElLRUxZKCF2YWx1ZSkpIHsKKyAgICAgICAgICAgIEpTVmFsdWUqIHJlc3VsdCA9IHRo
cm93T3V0T2ZNZW1vcnlFcnJvcihleGVjKTsKKyAgICAgICAgICAgIFZNX0NIRUNLX0VYQ0VQVElP
Tl9BVF9FTkQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIGpzU3RyaW5nKGV4ZWMsIHZhbHVlLnJlbGVhc2UoKSk7CisgICAgfQorCisgICAg
Ly8gQWxsIG90aGVyIGNhc2VzIGFyZSBwcmV0dHkgdW5jb21tb24KKyAgICBKU1ZhbHVlKiByZXN1
bHQgPSBqc0FkZFNsb3dDYXNlKGV4ZWMsIHYxLCB2Mik7CiAgICAgVk1fQ0hFQ0tfRVhDRVBUSU9O
X0FUX0VORCgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CkluZGV4OiBranMvdXN0cmluZy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga2pzL3VzdHJpbmcuY3BwCShyZXZpc2lvbiAzNzA0OCkKKysrIGtqcy91
c3RyaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDA5LDcgKzQwOSw3IEBAIHZvaWQgVVN0cmlu
Zzo6UmVwOjpjaGVja0NvbnNpc3RlbmN5KCkgY28KICNlbmRpZgogCiAvLyBwdXQgdGhlc2UgZWFy
bHkgc28gdGhleSBjYW4gYmUgaW5saW5lZAotaW5saW5lIHNpemVfdCBVU3RyaW5nOjpleHBhbmRl
ZFNpemUoc2l6ZV90IHNpemUsIHNpemVfdCBvdGhlclNpemUpCitpbmxpbmUgc2l6ZV90IGV4cGFu
ZGVkU2l6ZShzaXplX3Qgc2l6ZSwgc2l6ZV90IG90aGVyU2l6ZSkKIHsKICAgICAvLyBEbyB0aGUg
c2l6ZSBjYWxjdWxhdGlvbiBpbiB0d28gcGFydHMsIHJldHVybmluZyBvdmVyZmxvd0luZGljYXRv
ciBpZgogICAgIC8vIHdlIG92ZXJmbG93IHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgd2UgY2FuIGhh
bmRsZS4KQEAgLTQzNCwxMSArNDM0LDEyIEBAIGlubGluZSBpbnQgVVN0cmluZzo6dXNlZFByZUNh
cGFjaXR5KCkgY28KICAgICByZXR1cm4gbV9yZXAtPmJhc2VTdHJpbmctPnVzZWRQcmVDYXBhY2l0
eTsKIH0KIAotdm9pZCBVU3RyaW5nOjpleHBhbmRDYXBhY2l0eShpbnQgcmVxdWlyZWRMZW5ndGgp
CisKK2lubGluZSBib29sIGV4cGFuZENhcGFjaXR5KFVTdHJpbmc6OlJlcCogcmVwLCBpbnQgcmVx
dWlyZWRMZW5ndGgpCiB7Ci0gICAgbV9yZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKKyAgICByZXAt
PmNoZWNrQ29uc2lzdGVuY3koKTsKIAotICAgIFJlcCogciA9IG1fcmVwLT5iYXNlU3RyaW5nOwor
ICAgIFVTdHJpbmc6OlJlcCogciA9IHJlcC0+YmFzZVN0cmluZzsKIAogICAgIGlmIChyZXF1aXJl
ZExlbmd0aCA+IHItPmNhcGFjaXR5KSB7CiAgICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4
cGFuZGVkU2l6ZShyZXF1aXJlZExlbmd0aCwgci0+cHJlQ2FwYWNpdHkpOwpAQCAtNDQ2LDE1ICs0
NDcsMjEgQEAgdm9pZCBVU3RyaW5nOjpleHBhbmRDYXBhY2l0eShpbnQgcmVxdWlyZQogICAgICAg
ICByLT5idWYgPSByZWFsbG9jQ2hhcnMoci0+YnVmLCBuZXdDYXBhY2l0eSk7CiAgICAgICAgIGlm
ICghci0+YnVmKSB7CiAgICAgICAgICAgICByLT5idWYgPSBvbGRCdWY7Ci0gICAgICAgICAgICBt
YWtlTnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgICAgICB9CiAgICAgICAgIHItPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHkgLSByLT5wcmVD
YXBhY2l0eTsKICAgICB9CiAgICAgaWYgKHJlcXVpcmVkTGVuZ3RoID4gci0+dXNlZENhcGFjaXR5
KQogICAgICAgICByLT51c2VkQ2FwYWNpdHkgPSByZXF1aXJlZExlbmd0aDsKIAotICAgIG1fcmVw
LT5jaGVja0NvbnNpc3RlbmN5KCk7CisgICAgcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVVN0cmluZzo6ZXhwYW5kQ2FwYWNpdHkoaW50IHJlcXVp
cmVkTGVuZ3RoKQoreworICAgIGlmICghSlNDOjpleHBhbmRDYXBhY2l0eShtX3JlcC5nZXQoKSwg
cmVxdWlyZWRMZW5ndGgpKQorICAgICAgICBtYWtlTnVsbCgpOwogfQogCiB2b2lkIFVTdHJpbmc6
OmV4cGFuZFByZUNhcGFjaXR5KGludCByZXF1aXJlZFByZUNhcCkKQEAgLTQ4NCwyNyArNDkxLDI5
IEBAIHZvaWQgVVN0cmluZzo6ZXhwYW5kUHJlQ2FwYWNpdHkoaW50IHJlcXUKICAgICBtX3JlcC0+
Y2hlY2tDb25zaXN0ZW5jeSgpOwogfQogCi1VU3RyaW5nOjpVU3RyaW5nKGNvbnN0IGNoYXIqIGMp
CitQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY3JlYXRlUmVwKGNvbnN0IGNoYXIqIGMpCiB7Ci0g
ICAgaWYgKCFjKSB7Ci0gICAgICAgIG1fcmVwID0gJlJlcDo6bnVsbDsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiAmVVN0cmluZzo6UmVwOjpudWxs
OwogCi0gICAgaWYgKCFjWzBdKSB7Ci0gICAgICAgIG1fcmVwID0gJlJlcDo6ZW1wdHk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9CisgICAgaWYgKCFjWzBdKQorICAgICAgICByZXR1cm4gJlVTdHJp
bmc6OlJlcDo6ZW1wdHk7CiAKICAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGMpOwogICAgIFVD
aGFyKiBkID0gYWxsb2NDaGFycyhsZW5ndGgpOwogICAgIGlmICghZCkKLSAgICAgICAgbWFrZU51
bGwoKTsKKyAgICAgICAgcmV0dXJuICZVU3RyaW5nOjpSZXA6Om51bGw7CiAgICAgZWxzZSB7CiAg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICBk
W2ldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1tpXSk7IC8vIHVzZSB1bnNpZ25lZCBj
aGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgbV9yZXAg
PSBSZXA6OmNyZWF0ZShkLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCkpOworICAgICAgICByZXR1
cm4gVVN0cmluZzo6UmVwOjpjcmVhdGUoZCwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKTsKICAg
ICB9CisKK30KKworVVN0cmluZzo6VVN0cmluZyhjb25zdCBjaGFyKiBjKQorICAgIDogbV9yZXAo
Y3JlYXRlUmVwKGMpKQorewogfQogCiBVU3RyaW5nOjpVU3RyaW5nKGNvbnN0IFVDaGFyKiBjLCBp
bnQgbGVuZ3RoKQpAQCAtNTMzLDYgKzU0MiwxMTQgQEAgVVN0cmluZzo6VVN0cmluZyhjb25zdCBW
ZWN0b3I8VUNoYXI+JiBidQogICAgICAgICBtX3JlcCA9IFJlcDo6Y3JlYXRlQ29weWluZyhidWZm
ZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKIH0KIAorc3RhdGljIEFMV0FZU19JTkxJTkUgUGFz
c1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFBhc3NSZWZQdHI8VVN0cmluZzo6UmVw
PiByLCBjb25zdCBVQ2hhciogdERhdGEsIGludCB0U2l6ZSkKK3sKKyAgICBSZWZQdHI8VVN0cmlu
Zzo6UmVwPiByZXAgPSByOworCisgICAgcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7CisKKyAgICBp
bnQgdGhpc1NpemUgPSByZXAtPnNpemUoKTsKKyAgICBpbnQgdGhpc09mZnNldCA9IHJlcC0+b2Zm
c2V0OworICAgIGludCBsZW5ndGggPSB0aGlzU2l6ZSArIHRTaXplOworCisgICAgLy8gcG9zc2li
bGUgY2FzZXM6CisgICAgaWYgKHRTaXplID09IDApIHsKKyAgICAgICAgLy8gdCBpcyBlbXB0eQor
ICAgIH0gZWxzZSBpZiAodGhpc1NpemUgPT0gMCkgeworICAgICAgICAvLyB0aGlzIGlzIGVtcHR5
CisgICAgICAgIHJlcCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlQ29weWluZyh0RGF0YSwgdFNpemUp
OworICAgIH0gZWxzZSBpZiAocmVwLT5iYXNlSXNTZWxmKCkgJiYgcmVwLT5yYyA9PSAxKSB7Cisg
ICAgICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMgcmVmY291bnQgb2YgMSAoc28gd2UgY2Fu
IGp1c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCisgICAgICAgIGlmICghZXhwYW5kQ2FwYWNpdHkocmVw
LmdldCgpLCB0aGlzT2Zmc2V0ICsgbGVuZ3RoKSkKKyAgICAgICAgICAgIHJlcCA9ICZVU3RyaW5n
OjpSZXA6Om51bGw7CisgICAgICAgIGlmIChyZXAtPmRhdGEoKSkgeworICAgICAgICAgICAgY29w
eUNoYXJzKHJlcC0+ZGF0YSgpICsgdGhpc1NpemUsIHREYXRhLCB0U2l6ZSk7CisgICAgICAgICAg
ICByZXAtPmxlbiA9IGxlbmd0aDsKKyAgICAgICAgICAgIHJlcC0+X2hhc2ggPSAwOworICAgICAg
ICB9CisgICAgfSBlbHNlIGlmICh0aGlzT2Zmc2V0ICsgdGhpc1NpemUgPT0gcmVwLT5iYXNlU3Ry
aW5nLT51c2VkQ2FwYWNpdHkgJiYgdGhpc1NpemUgPj0gbWluU2hhcmVTaXplKSB7CisgICAgICAg
IC8vIHRoaXMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIgLSBleHRlbmQgaXQgaWYgaXQn
cyBsb25nIGVub3VnaCB0byBhcHBlbmQgdG8KKyAgICAgICAgaWYgKCFleHBhbmRDYXBhY2l0eShy
ZXAuZ2V0KCksIHRoaXNPZmZzZXQgKyBsZW5ndGgpKQorICAgICAgICAgICAgcmVwID0gJlVTdHJp
bmc6OlJlcDo6bnVsbDsKKyAgICAgICAgaWYgKHJlcC0+ZGF0YSgpKSB7CisgICAgICAgICAgICBj
b3B5Q2hhcnMocmVwLT5kYXRhKCkgKyB0aGlzU2l6ZSwgdERhdGEsIHRTaXplKTsKKyAgICAgICAg
ICAgIHJlcCA9IFVTdHJpbmc6OlJlcDo6Y3JlYXRlKHJlcCwgMCwgbGVuZ3RoKTsKKyAgICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRoaXMgaXMgc2hhcmVkIHdpdGggc29tZW9uZSB1
c2luZyBtb3JlIGNhcGFjaXR5LCBnb3R0YSBtYWtlIGEgd2hvbGUgbmV3IHN0cmluZworICAgICAg
ICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsKKyAgICAgICAg
VUNoYXIqIGQgPSBhbGxvY0NoYXJzKG5ld0NhcGFjaXR5KTsKKyAgICAgICAgaWYgKCFkKQorICAg
ICAgICAgICAgcmVwID0gJlVTdHJpbmc6OlJlcDo6bnVsbDsKKyAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICBjb3B5Q2hhcnMoZCwgcmVwLT5kYXRhKCksIHRoaXNTaXplKTsKKyAgICAgICAgICAg
IGNvcHlDaGFycyhkICsgdGhpc1NpemUsIHREYXRhLCB0U2l6ZSk7CisgICAgICAgICAgICByZXAg
PSBVU3RyaW5nOjpSZXA6OmNyZWF0ZShkLCBsZW5ndGgpOworICAgICAgICAgICAgcmVwLT5jYXBh
Y2l0eSA9IG5ld0NhcGFjaXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcmVwLT5jaGVja0Nv
bnNpc3RlbmN5KCk7CisKKyAgICByZXR1cm4gcmVwLnJlbGVhc2UoKTsKK30KKworc3RhdGljIEFM
V0FZU19JTkxJTkUgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFBhc3NSZWZQ
dHI8VVN0cmluZzo6UmVwPiByLCBjb25zdCBjaGFyKiB0KQoreworICAgIFJlZlB0cjxVU3RyaW5n
OjpSZXA+IHJlcCA9IHI7CisKKyAgICByZXAtPmNoZWNrQ29uc2lzdGVuY3koKTsKKworICAgIGlu
dCB0aGlzU2l6ZSA9IHJlcC0+c2l6ZSgpOworICAgIGludCB0aGlzT2Zmc2V0ID0gcmVwLT5vZmZz
ZXQ7CisgICAgaW50IHRTaXplID0gc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4odCkpOworICAgIGlu
dCBsZW5ndGggPSB0aGlzU2l6ZSArIHRTaXplOworCisgICAgLy8gcG9zc2libGUgY2FzZXM6Cisg
ICAgaWYgKHRoaXNTaXplID09IDApIHsKKyAgICAgICAgLy8gdGhpcyBpcyBlbXB0eQorICAgICAg
ICByZXAgPSBjcmVhdGVSZXAodCk7CisgICAgfSBlbHNlIGlmICh0U2l6ZSA9PSAwKSB7CisgICAg
ICAgIC8vIHQgaXMgZW1wdHksIHdlJ2xsIGp1c3QgcmV0dXJuICp0aGlzIGJlbG93LgorICAgIH0g
ZWxzZSBpZiAocmVwLT5iYXNlSXNTZWxmKCkgJiYgcmVwLT5yYyA9PSAxKSB7CisgICAgICAgIC8v
IHRoaXMgaXMgZGlyZWN0IGFuZCBoYXMgcmVmY291bnQgb2YgMSAoc28gd2UgY2FuIGp1c3QgYWx0
ZXIgaXQgZGlyZWN0bHkpCisgICAgICAgIGV4cGFuZENhcGFjaXR5KHJlcC5nZXQoKSwgdGhpc09m
ZnNldCArIGxlbmd0aCk7CisgICAgICAgIFVDaGFyKiBkID0gcmVwLT5kYXRhKCk7CisgICAgICAg
IGlmIChkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRTaXplOyArK2kpCisg
ICAgICAgICAgICAgICAgZFt0aGlzU2l6ZSArIGldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hh
cj4odFtpXSk7IC8vIHVzZSB1bnNpZ25lZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Yg
c2lnbi1leHRlbmQKKyAgICAgICAgICAgIHJlcC0+bGVuID0gbGVuZ3RoOworICAgICAgICAgICAg
cmVwLT5faGFzaCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRoaXNPZmZzZXQgKyB0
aGlzU2l6ZSA9PSByZXAtPmJhc2VTdHJpbmctPnVzZWRDYXBhY2l0eSAmJiB0aGlzU2l6ZSA+PSBt
aW5TaGFyZVNpemUpIHsKKyAgICAgICAgLy8gdGhpcyBzdHJpbmcgcmVhY2hlcyB0aGUgZW5kIG9m
IHRoZSBidWZmZXIgLSBleHRlbmQgaXQKKyAgICAgICAgZXhwYW5kQ2FwYWNpdHkocmVwLmdldCgp
LCB0aGlzT2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgICAgVUNoYXIqIGQgPSByZXAtPmRhdGEoKTsK
KyAgICAgICAgaWYgKGQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdFNpemU7
ICsraSkKKyAgICAgICAgICAgICAgICBkW3RoaXNTaXplICsgaV0gPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyPih0W2ldKTsgLy8gdXNlIHVuc2lnbmVkIGNoYXIgdG8gemVyby1leHRlbmQgaW5z
dGVhZCBvZiBzaWduLWV4dGVuZAorICAgICAgICAgICAgcmVwID0gVVN0cmluZzo6UmVwOjpjcmVh
dGUocmVwLCAwLCBsZW5ndGgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8g
dGhpcyBpcyBzaGFyZWQgd2l0aCBzb21lb25lIHVzaW5nIG1vcmUgY2FwYWNpdHksIGdvdHRhIG1h
a2UgYSB3aG9sZSBuZXcgc3RyaW5nCisgICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IGV4cGFu
ZGVkU2l6ZShsZW5ndGgsIDApOworICAgICAgICBVQ2hhciogZCA9IGFsbG9jQ2hhcnMobmV3Q2Fw
YWNpdHkpOworICAgICAgICBpZiAoIWQpCisgICAgICAgICAgICByZXAgPSAmVVN0cmluZzo6UmVw
OjpudWxsOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlDaGFycyhkLCByZXAtPmRh
dGEoKSwgdGhpc1NpemUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0U2l6ZTsg
KytpKQorICAgICAgICAgICAgICAgIGRbdGhpc1NpemUgKyBpXSA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIGNoYXI+KHRbaV0pOyAvLyB1c2UgdW5zaWduZWQgY2hhciB0byB6ZXJvLWV4dGVuZCBpbnN0
ZWFkIG9mIHNpZ24tZXh0ZW5kCisgICAgICAgICAgICByZXAgPSBVU3RyaW5nOjpSZXA6OmNyZWF0
ZShkLCBsZW5ndGgpOworICAgICAgICAgICAgcmVwLT5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5Owor
ICAgICAgICB9CisgICAgfQorCisgICAgcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7CisKKyAgICBy
ZXR1cm4gcmVwLnJlbGVhc2UoKTsKK30KKwogUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNh
dGVuYXRlKFVTdHJpbmc6OlJlcCogYSwgVVN0cmluZzo6UmVwKiBiKQogewogICAgIGEtPmNoZWNr
Q29uc2lzdGVuY3koKTsKQEAgLTU5OSw3ICs3MTYsNyBAQCBQYXNzUmVmUHRyPFVTdHJpbmc6OlJl
cD4gY29uY2F0ZW5hdGUoVVN0CiAgICAgfQogCiAgICAgLy8gYSBkb2VzIG5vdCBxdWFsaWZ5IGZv
ciBhcHBlbmQsIGFuZCBiIGRvZXMgbm90IHF1YWxpZnkgZm9yIHByZXBlbmQsIGdvdHRhIG1ha2Ug
YSB3aG9sZSBuZXcgc3RyaW5nCi0gICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gVVN0cmluZzo6ZXhw
YW5kZWRTaXplKGxlbmd0aCwgMCk7CisgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gZXhwYW5kZWRT
aXplKGxlbmd0aCwgMCk7CiAgICAgVUNoYXIqIGQgPSBhbGxvY0NoYXJzKG5ld0NhcGFjaXR5KTsK
ICAgICBpZiAoIWQpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNjE1LDYgKzczMiwxMDIgQEAgUGFz
c1JlZlB0cjxVU3RyaW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdAogICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKK1Bhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShVU3RyaW5nOjpSZXAq
IHJlcCwgaW50IGkpCit7CisgICAgVUNoYXIgYnVmWzEgKyBzaXplb2YoaSkgKiAzXTsKKyAgICBV
Q2hhciogZW5kID0gYnVmICsgc2l6ZW9mKGJ1ZikgLyBzaXplb2YoVUNoYXIpOworICAgIFVDaGFy
KiBwID0gZW5kOworICAKKyAgICBpZiAoaSA9PSAwKQorICAgICAgICAqLS1wID0gJzAnOworICAg
IGVsc2UgaWYgKGkgPT0gSU5UX01JTikgeworICAgICAgICBjaGFyIG1pbkJ1ZlsxICsgc2l6ZW9m
KGkpICogM107CisgICAgICAgIHNwcmludGYobWluQnVmLCAiJWQiLCBJTlRfTUlOKTsKKyAgICAg
ICAgcmV0dXJuIGNvbmNhdGVuYXRlKHJlcCwgbWluQnVmKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBib29sIG5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAg
ICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgICAgICAgaSA9IC1pOworICAgICAgICB9CisgICAg
ICAgIHdoaWxlIChpKSB7CisgICAgICAgICAgICAqLS1wID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg
c2hvcnQ+KChpICUgMTApICsgJzAnKTsKKyAgICAgICAgICAgIGkgLz0gMTA7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG5lZ2F0aXZlKQorICAgICAgICAgICAgKi0tcCA9ICctJzsKKyAgICB9CisK
KyAgICByZXR1cm4gY29uY2F0ZW5hdGUocmVwLCBwLCBzdGF0aWNfY2FzdDxpbnQ+KGVuZCAtIHAp
KTsKKworfQorCitQYXNzUmVmUHRyPFVTdHJpbmc6OlJlcD4gY29uY2F0ZW5hdGUoVVN0cmluZzo6
UmVwKiByZXAsIGRvdWJsZSBkKQoreworICAgIC8vIGF2b2lkIGV2ZXIgcHJpbnRpbmcgLU5hTiwg
aW4gSlMgY29uY2VwdHVhbGx5IHRoZXJlIGlzIG9ubHkgb25lIE5hTiB2YWx1ZQorICAgIGlmIChp
c25hbihkKSkKKyAgICAgICAgcmV0dXJuIGNvbmNhdGVuYXRlKHJlcCwgIk5hTiIpOworCisgICAg
Y2hhciBidWZbODBdOworICAgIGludCBkZWNpbWFsUG9pbnQ7CisgICAgaW50IHNpZ247CisKKyAg
ICBjaGFyKiByZXN1bHQgPSBkdG9hKGQsIDAsICZkZWNpbWFsUG9pbnQsICZzaWduLCBOVUxMKTsK
KyAgICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4ocmVzdWx0KSk7CisgIAor
ICAgIGludCBpID0gMDsKKyAgICBpZiAoc2lnbikKKyAgICAgICAgYnVmW2krK10gPSAnLSc7Cisg
IAorICAgIGlmIChkZWNpbWFsUG9pbnQgPD0gMCAmJiBkZWNpbWFsUG9pbnQgPiAtNikgeworICAg
ICAgICBidWZbaSsrXSA9ICcwJzsKKyAgICAgICAgYnVmW2krK10gPSAnLic7CisgICAgICAgIGZv
ciAoaW50IGogPSBkZWNpbWFsUG9pbnQ7IGogPCAwOyBqKyspCisgICAgICAgICAgICBidWZbaSsr
XSA9ICcwJzsKKyAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJlc3VsdCk7CisgICAgfSBlbHNlIGlm
IChkZWNpbWFsUG9pbnQgPD0gMjEgJiYgZGVjaW1hbFBvaW50ID4gMCkgeworICAgICAgICBpZiAo
bGVuZ3RoIDw9IGRlY2ltYWxQb2ludCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJl
c3VsdCk7CisgICAgICAgICAgICBpICs9IGxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGog
PSAwOyBqIDwgZGVjaW1hbFBvaW50IC0gbGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgYnVm
W2krK10gPSAnMCc7CisgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgc3RybmNweShidWYgKyBpLCByZXN1bHQsIGRlY2ltYWxQb2ludCk7Cisg
ICAgICAgICAgICBpICs9IGRlY2ltYWxQb2ludDsKKyAgICAgICAgICAgIGJ1ZltpKytdID0gJy4n
OworICAgICAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJlc3VsdCArIGRlY2ltYWxQb2ludCk7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlc3VsdFswXSA8ICcwJyB8fCByZXN1bHRbMF0gPiAn
OScpCisgICAgICAgIHN0cmNweShidWYgKyBpLCByZXN1bHQpOworICAgIGVsc2UgeworICAgICAg
ICBidWZbaSsrXSA9IHJlc3VsdFswXTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDEpIHsKKyAgICAg
ICAgICAgIGJ1ZltpKytdID0gJy4nOworICAgICAgICAgICAgc3RyY3B5KGJ1ZiArIGksIHJlc3Vs
dCArIDEpOworICAgICAgICAgICAgaSArPSBsZW5ndGggLSAxOworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICBidWZbaSsrXSA9ICdlJzsKKyAgICAgICAgYnVmW2krK10gPSAoZGVjaW1hbFBv
aW50ID49IDApID8gJysnIDogJy0nOworICAgICAgICAvLyBkZWNpbWFsUG9pbnQgY2FuJ3QgYmUg
bW9yZSB0aGFuIDMgZGlnaXRzIGRlY2ltYWwgZ2l2ZW4gdGhlCisgICAgICAgIC8vIG5hdHVyZSBv
ZiBmbG9hdCByZXByZXNlbnRhdGlvbgorICAgICAgICBpbnQgZXhwb25lbnRpYWwgPSBkZWNpbWFs
UG9pbnQgLSAxOworICAgICAgICBpZiAoZXhwb25lbnRpYWwgPCAwKQorICAgICAgICAgICAgZXhw
b25lbnRpYWwgPSAtZXhwb25lbnRpYWw7CisgICAgICAgIGlmIChleHBvbmVudGlhbCA+PSAxMDAp
CisgICAgICAgICAgICBidWZbaSsrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIGV4cG9uZW50
aWFsIC8gMTAwKTsKKyAgICAgICAgaWYgKGV4cG9uZW50aWFsID49IDEwKQorICAgICAgICAgICAg
YnVmW2krK10gPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyAoZXhwb25lbnRpYWwgJSAxMDApIC8g
MTApOworICAgICAgICBidWZbaSsrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIGV4cG9uZW50
aWFsICUgMTApOworICAgICAgICBidWZbaSsrXSA9ICdcMCc7CisgICAgfQorICAgIAorICBmcmVl
ZHRvYShyZXN1bHQpOworCisgIHJldHVybiBjb25jYXRlbmF0ZShyZXAsIGJ1Zik7Cit9CisKIGNv
bnN0IFVTdHJpbmcmIFVTdHJpbmc6Om51bGwoKQogewogICAgIHN0YXRpYyBVU3RyaW5nKiBuID0g
bmV3IFVTdHJpbmc7IC8vIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBtYWluIHRocmVhZCBhdCBsZWFz
dCBvbmNlIHRvIGJlIHNhZmVseSBpbml0aWFsaXplZC4KQEAgLTg1OCwxMDMgKzEwNzEsMTMgQEAg
VVN0cmluZyYgVVN0cmluZzo6YXBwZW5kKGNvbnN0IFVTdHJpbmcgJgogCiBVU3RyaW5nJiBVU3Ry
aW5nOjphcHBlbmQoY29uc3QgVUNoYXIqIHREYXRhLCBpbnQgdFNpemUpCiB7Ci0gICAgbV9yZXAt
PmNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIGludCB0aGlzU2l6ZSA9IHNpemUoKTsKLSAgICBp
bnQgdGhpc09mZnNldCA9IG1fcmVwLT5vZmZzZXQ7Ci0gICAgaW50IGxlbmd0aCA9IHRoaXNTaXpl
ICsgdFNpemU7Ci0KLSAgICAvLyBwb3NzaWJsZSBjYXNlczoKLSAgICBpZiAodFNpemUgPT0gMCkg
ewotICAgICAgICAvLyB0IGlzIGVtcHR5Ci0gICAgfSBlbHNlIGlmICh0aGlzU2l6ZSA9PSAwKSB7
Ci0gICAgICAgIC8vIHRoaXMgaXMgZW1wdHkKLSAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0ZUNv
cHlpbmcodERhdGEsIHRTaXplKTsKLSAgICB9IGVsc2UgaWYgKG1fcmVwLT5iYXNlSXNTZWxmKCkg
JiYgbV9yZXAtPnJjID09IDEpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBkaXJlY3QgYW5kIGhhcyBy
ZWZjb3VudCBvZiAxIChzbyB3ZSBjYW4ganVzdCBhbHRlciBpdCBkaXJlY3RseSkKLSAgICAgICAg
ZXhwYW5kQ2FwYWNpdHkodGhpc09mZnNldCArIGxlbmd0aCk7Ci0gICAgICAgIGlmIChkYXRhKCkp
IHsKLSAgICAgICAgICAgIGNvcHlDaGFycyhtX3JlcC0+ZGF0YSgpICsgdGhpc1NpemUsIHREYXRh
LCB0U2l6ZSk7Ci0gICAgICAgICAgICBtX3JlcC0+bGVuID0gbGVuZ3RoOwotICAgICAgICAgICAg
bV9yZXAtPl9oYXNoID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodGhpc09mZnNldCAr
IHRoaXNTaXplID09IHVzZWRDYXBhY2l0eSgpICYmIHRoaXNTaXplID49IG1pblNoYXJlU2l6ZSkg
ewotICAgICAgICAvLyB0aGlzIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIC0gZXh0ZW5k
IGl0IGlmIGl0J3MgbG9uZyBlbm91Z2ggdG8gYXBwZW5kIHRvCi0gICAgICAgIGV4cGFuZENhcGFj
aXR5KHRoaXNPZmZzZXQgKyBsZW5ndGgpOwotICAgICAgICBpZiAoZGF0YSgpKSB7Ci0gICAgICAg
ICAgICBjb3B5Q2hhcnMobV9yZXAtPmRhdGEoKSArIHRoaXNTaXplLCB0RGF0YSwgdFNpemUpOwot
ICAgICAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0ZShtX3JlcCwgMCwgbGVuZ3RoKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgc2hhcmVkIHdpdGggc29tZW9u
ZSB1c2luZyBtb3JlIGNhcGFjaXR5LCBnb3R0YSBtYWtlIGEgd2hvbGUgbmV3IHN0cmluZwotICAg
ICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBleHBhbmRlZFNpemUobGVuZ3RoLCAwKTsKLSAgICAg
ICAgVUNoYXIqIGQgPSBhbGxvY0NoYXJzKG5ld0NhcGFjaXR5KTsKLSAgICAgICAgaWYgKCFkKQot
ICAgICAgICAgICAgbWFrZU51bGwoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb3B5
Q2hhcnMoZCwgZGF0YSgpLCB0aGlzU2l6ZSk7Ci0gICAgICAgICAgICBjb3B5Q2hhcnMoZCArIHRo
aXNTaXplLCB0RGF0YSwgdFNpemUpOwotICAgICAgICAgICAgbV9yZXAgPSBSZXA6OmNyZWF0ZShk
LCBsZW5ndGgpOwotICAgICAgICAgICAgbV9yZXAtPmNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX3JlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCisgICAg
bV9yZXAgPSBjb25jYXRlbmF0ZShtX3JlcC5yZWxlYXNlKCksIHREYXRhLCB0U2l6ZSk7CiAgICAg
cmV0dXJuICp0aGlzOwogfQogCiBVU3RyaW5nJiBVU3RyaW5nOjphcHBlbmQoY29uc3QgY2hhciog
dCkKIHsKLSAgICBtX3JlcC0+Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgaW50IHRoaXNTaXpl
ID0gc2l6ZSgpOwotICAgIGludCB0aGlzT2Zmc2V0ID0gbV9yZXAtPm9mZnNldDsKLSAgICBpbnQg
dFNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbih0KSk7Ci0gICAgaW50IGxlbmd0aCA9IHRo
aXNTaXplICsgdFNpemU7Ci0KLSAgICAvLyBwb3NzaWJsZSBjYXNlczoKLSAgICBpZiAodGhpc1Np
emUgPT0gMCkgewotICAgICAgICAvLyB0aGlzIGlzIGVtcHR5Ci0gICAgICAgICp0aGlzID0gdDsK
LSAgICB9IGVsc2UgaWYgKHRTaXplID09IDApIHsKLSAgICAgICAgLy8gdCBpcyBlbXB0eSwgd2Un
bGwganVzdCByZXR1cm4gKnRoaXMgYmVsb3cuCi0gICAgfSBlbHNlIGlmIChtX3JlcC0+YmFzZUlz
U2VsZigpICYmIG1fcmVwLT5yYyA9PSAxKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZGlyZWN0IGFu
ZCBoYXMgcmVmY291bnQgb2YgMSAoc28gd2UgY2FuIGp1c3QgYWx0ZXIgaXQgZGlyZWN0bHkpCi0g
ICAgICAgIGV4cGFuZENhcGFjaXR5KHRoaXNPZmZzZXQgKyBsZW5ndGgpOwotICAgICAgICBVQ2hh
ciogZCA9IG1fcmVwLT5kYXRhKCk7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IHRTaXplOyArK2kpCi0gICAgICAgICAgICAgICAgZFt0aGlzU2l6ZSAr
IGldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odFtpXSk7IC8vIHVzZSB1bnNpZ25lZCBj
aGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgICAgIG1f
cmVwLT5sZW4gPSBsZW5ndGg7Ci0gICAgICAgICAgICBtX3JlcC0+X2hhc2ggPSAwOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmICh0aGlzT2Zmc2V0ICsgdGhpc1NpemUgPT0gdXNlZENhcGFjaXR5
KCkgJiYgdGhpc1NpemUgPj0gbWluU2hhcmVTaXplKSB7Ci0gICAgICAgIC8vIHRoaXMgc3RyaW5n
IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIC0gZXh0ZW5kIGl0Ci0gICAgICAgIGV4cGFu
ZENhcGFjaXR5KHRoaXNPZmZzZXQgKyBsZW5ndGgpOwotICAgICAgICBVQ2hhciogZCA9IG1fcmVw
LT5kYXRhKCk7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IHRTaXplOyArK2kpCi0gICAgICAgICAgICAgICAgZFt0aGlzU2l6ZSArIGldID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgY2hhcj4odFtpXSk7IC8vIHVzZSB1bnNpZ25lZCBjaGFyIHRvIHplcm8t
ZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgICAgIG1fcmVwID0gUmVwOjpj
cmVhdGUobV9yZXAsIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAg
ICAvLyB0aGlzIGlzIHNoYXJlZCB3aXRoIHNvbWVvbmUgdXNpbmcgbW9yZSBjYXBhY2l0eSwgZ290
dGEgbWFrZSBhIHdob2xlIG5ldyBzdHJpbmcKLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0g
ZXhwYW5kZWRTaXplKGxlbmd0aCwgMCk7Ci0gICAgICAgIFVDaGFyKiBkID0gYWxsb2NDaGFycyhu
ZXdDYXBhY2l0eSk7Ci0gICAgICAgIGlmICghZCkKLSAgICAgICAgICAgIG1ha2VOdWxsKCk7Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29weUNoYXJzKGQsIGRhdGEoKSwgdGhpc1NpemUp
OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0U2l6ZTsgKytpKQotICAgICAgICAg
ICAgICAgIGRbdGhpc1NpemUgKyBpXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHRbaV0p
OyAvLyB1c2UgdW5zaWduZWQgY2hhciB0byB6ZXJvLWV4dGVuZCBpbnN0ZWFkIG9mIHNpZ24tZXh0
ZW5kCi0gICAgICAgICAgICBtX3JlcCA9IFJlcDo6Y3JlYXRlKGQsIGxlbmd0aCk7Ci0gICAgICAg
ICAgICBtX3JlcC0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIG1fcmVwLT5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KKyAgICBtX3JlcCA9IGNvbmNhdGVuYXRl
KG1fcmVwLnJlbGVhc2UoKSwgdCk7CiAgICAgcmV0dXJuICp0aGlzOwogfQogCkluZGV4OiBranMv
dXN0cmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtqcy91c3RyaW5nLmgJKHJldmlzaW9uIDM3MDQ4KQor
Kysga2pzL3VzdHJpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMjQ0LDcgKzI0NCw2IEBAIG5hbWVz
cGFjZSBKU0MgewogICAgICAgICBzaXplX3QgY29zdCgpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToK
LSAgICAgICAgc3RhdGljIHNpemVfdCBleHBhbmRlZFNpemUoc2l6ZV90IHNpemUsIHNpemVfdCBv
dGhlclNpemUpOwogICAgICAgICBpbnQgdXNlZENhcGFjaXR5KCkgY29uc3Q7CiAgICAgICAgIGlu
dCB1c2VkUHJlQ2FwYWNpdHkoKSBjb25zdDsKICAgICAgICAgdm9pZCBleHBhbmRDYXBhY2l0eShp
bnQgcmVxdWlyZWRMZW5ndGgpOwpAQCAtMjU3LDYgKzI1Niw5IEBAIG5hbWVzcGFjZSBKU0Mgewog
ICAgICAgICBmcmllbmQgUGFzc1JlZlB0cjxSZXA+IGNvbmNhdGVuYXRlKFJlcCosIFJlcCopOyAv
LyByZXR1cm5zIDAgaWYgb3V0IG9mIG1lbW9yeQogICAgIH07CiAgICAgUGFzc1JlZlB0cjxVU3Ry
aW5nOjpSZXA+IGNvbmNhdGVuYXRlKFVTdHJpbmc6OlJlcCosIFVTdHJpbmc6OlJlcCopOworICAg
IFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShVU3RyaW5nOjpSZXAqLCBpbnQp
OworICAgIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBjb25jYXRlbmF0ZShVU3RyaW5nOjpSZXAq
LCBkb3VibGUpOworCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVTdHJpbmcmLCBjb25zdCBV
U3RyaW5nJik7CiAKICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVTdHJpbmcmIHMx
LCBjb25zdCBVU3RyaW5nJiBzMikK
</data>
<flag name="review"
          id="10779"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>