<?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>15749</bug_id>
          
          <creation_ts>2007-10-29 02:45:38 -0700</creation_ts>
          <short_desc>RegExp/RegExpObjectImp cause needless UString creation</short_desc>
          <delta_ts>2007-10-31 07:58:11 -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>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</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="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          <cc>darin</cc>
    
    <cc>mjs</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>59782</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-29 02:45:38 -0700</bug_when>
    <thetext>RegExp/RegExpObjectImp cause needless UString creation

performMatch/match return a UString, which is only used by very few callers (and I&apos;m not sure those are even necessary).  Instead it just needs to return the size of the match.  if the size is non-zero, then there was a match (what most callers care about) and the callers which care about the size have that too.  There are a couple cases (replacement) where we need to actually be able to generate the match string, but that can be done using the returned offset vector and some sort of helper function.  I expect this will be a couple percentage points speedup, due to the reduce malloc pressure.

I&apos;m too tired to write it (and busy much of tomorrow).  Anyone who feels the urge should feel free.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59899</commentid>
    <comment_count>1</comment_count>
      <attachid>16958</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-30 21:54:27 -0700</bug_when>
    <thetext>Created attachment 16958
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59902</commentid>
    <comment_count>2</comment_count>
      <attachid>16958</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-30 22:37:18 -0700</bug_when>
    <thetext>Comment on attachment 16958
patch

Hum... I wonder if there isn&apos;t a clean way to use a local OwnArrayPtr to make sure that any early exit cleans up the storage... meaning, only calling localPtr.release() and setting ovector at the very end of the success case.  You&apos;d of course need a local raw ptr which pointed at either at the stack buffer (of size 3) or the newly allocated localPtr&apos;s array.  I&apos;m not sure that would be any less complex than the current solution though.  I guess this is sorta what vector is for.

Anyway, sorry not enough brain cells for a full review.  Slightly surprised it wasn&apos;t more of a gain (since in at least some tests this was a major cause of UString creation).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59910</commentid>
    <comment_count>3</comment_count>
      <attachid>16958</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-30 23:03:06 -0700</bug_when>
    <thetext>Comment on attachment 16958
patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59931</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-31 07:51:53 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; I guess this is sorta what vector is for.

I toyed with multiple implementations. The first thing I tried was Vector&lt;int&gt;. But it was not more elegant, and in fact it was less efficient since a Vector has overhead to allow for resizing. So I went with this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59932</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-10-31 07:58:11 -0700</bug_when>
    <thetext>Committed revision 27320.
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>16958</attachid>
            <date>2007-10-30 21:54:27 -0700</date>
            <delta_ts>2007-10-30 23:03:06 -0700</delta_ts>
            <desc>patch</desc>
            <filename>RegExpStringPatch.txt</filename>
            <type>text/plain</type>
            <size>21657</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3MjkxKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDUgQEAKKzIwMDctMTAtMzAgIERhcmluIEFk
bGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIC0gZml4IGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1NzQ5CisgICAgICAgICAgUmVnRXhwL1JlZ0V4cE9iamVjdEltcCBjYXVzZSBuZWVkbGVz
cyBVU3RyaW5nIGNyZWF0aW9uCisKKyAgICAgICAgU3BlZWRzIHRoaW5ncyB1cCAwLjQlIGFjY29y
ZGluZyB0byBTdW5TcGlkZXIuCisKKyAgICAgICAgKiBranMvY29uZmlnLmg6IERlZmluZSBVU0Uo
UENSRTE2KSBpbnN0ZWFkIG9mIEhBVkUoUENSRVBPU0lYKSwKKyAgICAgICAgYmVjYXVzZSB0aGlz
IGxpYnJhcnkgZG9lc24ndCB1c2UgdGhlIHJlYWwgUENSRSAtLSBpdCB1c2VzIGl0cworICAgICAg
ICBvd24gUENSRSB0aGF0IHdvcmtzIG9uIFVURi0xNi4KKworICAgICAgICAqIGtqcy9yZWdleHAu
aDogUmVtb3ZlZCBhIGZldyB1bnVzZWQgZnVuY3Rpb25zLiBDaGFuZ2VkIHRoZSBpZmRlZi4KKyAg
ICAgICAgVXNlIE5vbmNvcHlhYmxlLiBDaGFuZ2UgdGhlIHJldHVybiB2YWx1ZSBvZiBtYXRjaC4K
KyAgICAgICAgKiBranMvcmVnZXhwLmNwcDoKKyAgICAgICAgKEtKUzo6UmVnRXhwOjpSZWdFeHAp
OiBDYWxsIHBjcmVfY29tcGlsZTIsIGZvciBhIHNsaWdodCBzcGVlZCBib29zdC4KKyAgICAgICAg
KEtKUzo6UmVnRXhwOjp+UmVnRXhwKTogUENSRTE2IHJhdGhlciB0aGFuIFBDUkVQT1NJWC4KKyAg
ICAgICAgKEtKUzo6UmVnRXhwOjptYXRjaCk6IENoYW5nZSB0byByZXR1cm4gdGhlIHBvc2l0aW9u
IGFzIGFuIGludCBhbmQgdGhlCisgICAgICAgIG92ZWN0b3IgYXMgYSBPd25BcnJheVB0cjxpbnQ+
IGZvciBlZmZpY2llbmN5IGFuZCBjbGVhcmVyIHN0b3JhZ2UgbWFuYWdlbWVudC4KKworICAgICAg
ICAqIGtqcy9yZWdleHBfb2JqZWN0Lmg6IENoYW5nZSBwZXJmb3JtTWF0Y2ggYW5kIGFycmF5T2ZN
YXRjaGVzIHRvIG5vIGxvbmdlcgorICAgICAgICByZXF1aXJlIGEgcmVzdWx0IHN0cmluZy4KKyAg
ICAgICAgKiBranMvcmVnZXhwX29iamVjdC5jcHA6CisgICAgICAgIChSZWdFeHBQcm90b0Z1bmM6
OmNhbGxBc0Z1bmN0aW9uKTogVXBkYXRlIGZvciBuZXcgc2lnbmF0dXJlIG9mIHBlcmZvcm1NYXRj
aC4KKyAgICAgICAgKFJlZ0V4cE9iamVjdEltcDo6cGVyZm9ybU1hdGNoKTogQ2hhbmdlIHNvIGl0
IGRvZXNuJ3QgcmV0dXJuIGEgc3RyaW5nLgorICAgICAgICAoUmVnRXhwT2JqZWN0SW1wOjphcnJh
eU9mTWF0Y2hlcyk6IFNpbXBsaWZ5IGJ5IHVuaWZ5aW5nIHRoZSBoYW5kbGluZyBvZgorICAgICAg
ICB0aGUgbWFpbiByZXN1bHQgd2l0aCB0aGUgYmFja3JlZmVyZW5jZXM7IG5vdyBpdCBkb2Vzbid0
IG5lZWQgdG8gdGFrZQorICAgICAgICBhIHJlc3VsdCBwYXJhbWV0ZXIuCisgICAgICAgIChSZWdF
eHBPYmplY3RJbXA6OmdldEJhY2tyZWYpOiBNaW5vciB0d2Vha3MuCisgICAgICAgIChSZWdFeHBP
YmplY3RJbXA6OmdldExhc3RQYXJlbik6IERpdHRvLgorICAgICAgICAoUmVnRXhwT2JqZWN0SW1w
OjpnZXRMZWZ0Q29udGV4dCk6IERpdHRvLgorICAgICAgICAoUmVnRXhwT2JqZWN0SW1wOjpnZXRS
aWdodENvbnRleHQpOiBEaXR0by4KKyAgICAgICAgKFJlZ0V4cE9iamVjdEltcDo6Z2V0VmFsdWVQ
cm9wZXJ0eSk6IENoYW5nZSBMYXN0TWF0Y2ggY2FzZSB0byBjYWxsCisgICAgICAgIGdldEJhY2ty
ZWYoMCkgc28gd2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIGdldExhc3RNYXRjaCBmdW5jdGlvbi4K
KworICAgICAgICAqIGtqcy9zdHJpbmdfb2JqZWN0LmNwcDoKKyAgICAgICAgKEtKUzo6cmVwbGFj
ZSk6IFVwZGF0ZSB0byB1c2UgbmV3IHBlcmZvcm1NYXRjaCwgaW5jbHVkaW5nIG1lcmdpbmcgdGhl
CisgICAgICAgIG1hdGNoZWQgc3RyaW5nIHNlY3Rpb24gd2l0aCB0aGUgb3RoZXIgc3Vic3RyaW5n
cy4KKyAgICAgICAgKEtKUzo6U3RyaW5nUHJvdG9GdW5jOjpjYWxsQXNGdW5jdGlvbik6IFVwZGF0
ZSBmdW5jdGlvbnMgdG8gdXNlIHRoZQorICAgICAgICBuZXcgcGVyZm9ybU1hdGNoIGFuZCBtYXRj
aC4gQWxzbyBjaGFuZ2UgdG8gdXNlIE93bkFycmF5UHRyLgorCiAyMDA3LTEwLTMwICBHZW9mZnJl
eSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBS
b2JlbiwgU2FtIFdlaW5pZy4KSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9jb25maWcuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvY29uZmlnLmgJKHJldmlzaW9uIDI3MjgxKQor
KysgSmF2YVNjcmlwdENvcmUva2pzL2NvbmZpZy5oCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw3ICs2
Nyw3IEBACiAjZGVmaW5lIEhBVkVfUFRIUkVBRF9OUF9IIDEKICNlbmRpZgogCi0jZGVmaW5lIEhB
VkVfUENSRVBPU0lYIDEKKyNkZWZpbmUgV1RGX1VTRV9QQ1JFMTYgMQogCiAvKiBGSVhNRTogaWYg
YWxsIHBsYXRmb3JtcyBoYXZlIHRoZXNlLCBkbyB0aGV5IHJlYWxseSBuZWVkICNkZWZpbmVzPyAq
LwogI2RlZmluZSBIQVZFX1NURElOVF9IIDEKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9yZWdl
eHAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHAuY3BwCShyZXZp
c2lvbiAyNzI4MSkKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHAuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMywzMiArMzMsMjcgQEAgbmFtZXNwYWNlIEtKUyB7CiBSZWdFeHA6OlJlZ0V4cChj
b25zdCBVU3RyaW5nICZwLCBpbnQgZmxhZ3MpCiAgIDogbV9mbGFncyhmbGFncyksIG1fY29uc3Ry
dWN0aW9uRXJyb3IoMCksIG1fbnVtU3ViUGF0dGVybnMoMCkKIHsKLSNpZiBIQVZFKFBDUkVQT1NJ
WCkKKyNpZiBVU0UoUENSRTE2KQogCiAgIGludCBvcHRpb25zID0gUENSRV9VVEY4OwotICAvLyBO
b3RlOiB0aGUgR2xvYmFsIGZsYWcgaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IFJlZ0V4cFByb3RvRnVu
Yzo6ZXhlY3V0ZS4KLSAgLy8gRklYTUU6IFRoYXQgbGFzdCBjb21tZW50IGlzIGR1YmlvdXMuIE5v
dCBhbGwgUmVnRXhwcyBnZXQgcnVuIHRocm91Z2ggUmVnRXhwUHJvdG9GdW5jOjpleGVjdXRlLgog
ICBpZiAoZmxhZ3MgJiBJZ25vcmVDYXNlKQogICAgIG9wdGlvbnMgfD0gUENSRV9DQVNFTEVTUzsK
ICAgaWYgKGZsYWdzICYgTXVsdGlsaW5lKQogICAgIG9wdGlvbnMgfD0gUENSRV9NVUxUSUxJTkU7
CiAKLSAgY29uc3QgY2hhciAqZXJyb3JNZXNzYWdlOworICBjb25zdCBjaGFyKiBlcnJvck1lc3Nh
Z2U7CiAgIGludCBlcnJvck9mZnNldDsKLSAgCi0gIG1fcmVnZXggPSBwY3JlX2NvbXBpbGUocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KHAuZGF0YSgpKSwgcC5zaXplKCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCAmZXJyb3JNZXNzYWdlLCAmZXJyb3JPZmZzZXQs
IE5VTEwpOworICBtX3JlZ2V4ID0gcGNyZV9jb21waWxlMihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQxNl90Kj4ocC5kYXRhKCkpLCBwLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3B0aW9ucywgTlVMTCwgJmVycm9yTWVzc2FnZSwgJmVycm9yT2Zmc2V0LCBOVUxMKTsKICAg
aWYgKCFtX3JlZ2V4KSB7CiAgICAgbV9jb25zdHJ1Y3Rpb25FcnJvciA9IHN0cmR1cChlcnJvck1l
c3NhZ2UpOwogICAgIHJldHVybjsKICAgfQogCi0jaWZkZWYgUENSRV9JTkZPX0NBUFRVUkVDT1VO
VAogICAvLyBHZXQgbnVtYmVyIG9mIHN1YnBhdHRlcm5zIHRoYXQgd2lsbCBiZSByZXR1cm5lZC4K
ICAgcGNyZV9mdWxsaW5mbyhtX3JlZ2V4LCBOVUxMLCBQQ1JFX0lORk9fQ0FQVFVSRUNPVU5ULCAm
bV9udW1TdWJQYXR0ZXJucyk7Ci0jZW5kaWYKIAotI2Vsc2UgLyogSEFWRShQQ1JFUE9TSVgpICov
CisjZWxzZSAvKiBVU0UoUENSRTE2KSAqLwogCiAgIGludCByZWdmbGFncyA9IDA7CiAjaWZkZWYg
UkVHX0VYVEVOREVECkBAIC04OCw3ICs4Myw3IEBAIFJlZ0V4cDo6UmVnRXhwKGNvbnN0IFVTdHJp
bmcgJnAsIGludCBmbGEKIAogUmVnRXhwOjp+UmVnRXhwKCkKIHsKLSNpZiBIQVZFKFBDUkVQT1NJ
WCkKKyNpZiBVU0UoUENSRTE2KQogICBwY3JlX2ZyZWUobV9yZWdleCk7CiAjZWxzZQogICAvKiBU
T0RPOiBpcyB0aGlzIHJlYWxseSBva2F5IGFmdGVyIGFuIGVycm9yID8gKi8KQEAgLTk3LDI4ICs5
MiwyNCBAQCBSZWdFeHA6On5SZWdFeHAoKQogICBmcmVlKG1fY29uc3RydWN0aW9uRXJyb3IpOwog
fQogCi1VU3RyaW5nIFJlZ0V4cDo6bWF0Y2goY29uc3QgVVN0cmluZyAmcywgaW50IGksIGludCAq
cG9zLCBpbnQgKipvdmVjdG9yKQoraW50IFJlZ0V4cDo6bWF0Y2goY29uc3QgVVN0cmluZyYgcywg
aW50IGksIE93bkFycmF5UHRyPGludD4qIG92ZWN0b3IpCiB7CiAgIGlmIChpIDwgMCkKICAgICBp
ID0gMDsKLSAgaW50IGR1bW15UG9zOwotICBpZiAoIXBvcykKLSAgICBwb3MgPSAmZHVtbXlQb3M7
Ci0gICpwb3MgPSAtMTsKICAgaWYgKG92ZWN0b3IpCi0gICAgKm92ZWN0b3IgPSAwOworICAgIG92
ZWN0b3ItPmNsZWFyKCk7CiAKICAgaWYgKGkgPiBzLnNpemUoKSB8fCBzLmlzTnVsbCgpKQotICAg
IHJldHVybiBVU3RyaW5nOjpudWxsKCk7CisgICAgcmV0dXJuIC0xOwogCi0jaWYgSEFWRShQQ1JF
UE9TSVgpCisjaWYgVVNFKFBDUkUxNikKIAogICBpZiAoIW1fcmVnZXgpCi0gICAgcmV0dXJuIFVT
dHJpbmc6Om51bGwoKTsKKyAgICByZXR1cm4gLTE7CiAKICAgLy8gU2V0IHVwIHRoZSBvZmZzZXQg
dmVjdG9yIGZvciB0aGUgcmVzdWx0LgogICAvLyBGaXJzdCAyLzMgdXNlZCBmb3IgcmVzdWx0LCB0
aGUgbGFzdCB0aGlyZCB1c2VkIGJ5IFBDUkUuCi0gIGludCAqb2Zmc2V0VmVjdG9yOworICBpbnQq
IG9mZnNldFZlY3RvcjsKICAgaW50IG9mZnNldFZlY3RvclNpemU7CiAgIGludCBmaXhlZFNpemVP
ZmZzZXRWZWN0b3JbM107CiAgIGlmICghb3ZlY3RvcikgewpAQCAtMTI3LDI0ICsxMTgsMjIgQEAg
VVN0cmluZyBSZWdFeHA6Om1hdGNoKGNvbnN0IFVTdHJpbmcgJnMsIAogICB9IGVsc2UgewogICAg
IG9mZnNldFZlY3RvclNpemUgPSAobV9udW1TdWJQYXR0ZXJucyArIDEpICogMzsKICAgICBvZmZz
ZXRWZWN0b3IgPSBuZXcgaW50IFtvZmZzZXRWZWN0b3JTaXplXTsKKyAgICBvdmVjdG9yLT5zZXQo
b2Zmc2V0VmVjdG9yKTsKICAgfQogCi0gIGNvbnN0IGludCBudW1NYXRjaGVzID0gcGNyZV9leGVj
KG1fcmVnZXgsIE5VTEwsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4ocy5kYXRh
KCkpLCBzLnNpemUoKSwgaSwgMCwgb2Zmc2V0VmVjdG9yLCBvZmZzZXRWZWN0b3JTaXplKTsKKyAg
aW50IG51bU1hdGNoZXMgPSBwY3JlX2V4ZWMobV9yZWdleCwgTlVMTCwgcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50MTZfdCAqPihzLmRhdGEoKSksIHMuc2l6ZSgpLCBpLCAwLCBvZmZzZXRWZWN0
b3IsIG9mZnNldFZlY3RvclNpemUpOwogCiAgIGlmIChudW1NYXRjaGVzIDwgMCkgewogI2lmbmRl
ZiBOREVCVUcKICAgICBpZiAobnVtTWF0Y2hlcyAhPSBQQ1JFX0VSUk9SX05PTUFUQ0gpCiAgICAg
ICBmcHJpbnRmKHN0ZGVyciwgIktKUzogcGNyZV9leGVjKCkgZmFpbGVkIHdpdGggcmVzdWx0ICVk
XG4iLCBudW1NYXRjaGVzKTsKICNlbmRpZgotICAgIGlmIChvZmZzZXRWZWN0b3IgIT0gZml4ZWRT
aXplT2Zmc2V0VmVjdG9yKQotICAgICAgZGVsZXRlIFtdIG9mZnNldFZlY3RvcjsKLSAgICByZXR1
cm4gVVN0cmluZzo6bnVsbCgpOworICAgIGlmIChvdmVjdG9yKQorICAgICAgb3ZlY3Rvci0+Y2xl
YXIoKTsKKyAgICByZXR1cm4gLTE7CiAgIH0KIAotICAqcG9zID0gb2Zmc2V0VmVjdG9yWzBdOwot
ICBpZiAob3ZlY3RvcikKLSAgICAqb3ZlY3RvciA9IG9mZnNldFZlY3RvcjsKLSAgcmV0dXJuIHMu
c3Vic3RyKG9mZnNldFZlY3RvclswXSwgb2Zmc2V0VmVjdG9yWzFdIC0gb2Zmc2V0VmVjdG9yWzBd
KTsKKyAgcmV0dXJuIG9mZnNldFZlY3RvclswXTsKIAogI2Vsc2UKIApAQCAtMTgyLDM2ICsxNzEs
NCBAQCBVU3RyaW5nIFJlZ0V4cDo6bWF0Y2goY29uc3QgVVN0cmluZyAmcywgCiAjZW5kaWYKIH0K
IAotYm9vbCBSZWdFeHA6OmlzSGV4RGlnaXQoVUNoYXIgdWMpCi17Ci0gIGludCBjID0gdWMudW5p
Y29kZSgpOwotICByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknIHx8Ci0gICAgICAgICAgYyA+
PSAnYScgJiYgYyA8PSAnZicgfHwKLSAgICAgICAgICBjID49ICdBJyAmJiBjIDw9ICdGJyk7Ci19
Ci0KLXVuc2lnbmVkIGNoYXIgUmVnRXhwOjpjb252ZXJ0SGV4KGludCBjKQotewotICBpZiAoYyA+
PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+
KGMgLSAnMCcpOwotICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgcmV0dXJuIHN0YXRp
Y19jYXN0PHVuc2lnbmVkIGNoYXI+KGMgLSAnYScgKyAxMCk7Ci0gIHJldHVybiBzdGF0aWNfY2Fz
dDx1bnNpZ25lZCBjaGFyPihjIC0gJ0EnICsgMTApOwotfQotCi11bnNpZ25lZCBjaGFyIFJlZ0V4
cDo6Y29udmVydEhleChpbnQgYzEsIGludCBjMikKLXsKLSAgcmV0dXJuICgoY29udmVydEhleChj
MSkgPDwgNCkgKyBjb252ZXJ0SGV4KGMyKSk7Ci19Ci0KLVVDaGFyIFJlZ0V4cDo6Y29udmVydFVu
aWNvZGUoVUNoYXIgdWMxLCBVQ2hhciB1YzIsIFVDaGFyIHVjMywgVUNoYXIgdWM0KQotewotICBp
bnQgYzEgPSB1YzEudW5pY29kZSgpOwotICBpbnQgYzIgPSB1YzIudW5pY29kZSgpOwotICBpbnQg
YzMgPSB1YzMudW5pY29kZSgpOwotICBpbnQgYzQgPSB1YzQudW5pY29kZSgpOwotICByZXR1cm4g
VUNoYXIoKGNvbnZlcnRIZXgoYzEpIDw8IDQpICsgY29udmVydEhleChjMiksCi0gICAgICAgICAg
ICAgICAoY29udmVydEhleChjMykgPDwgNCkgKyBjb252ZXJ0SGV4KGM0KSk7Ci19Ci0KIH0gLy8g
bmFtZXNwYWNlIEtKUwpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL3JlZ2V4cC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHAuaAkocmV2aXNpb24gMjcyODEpCisrKyBK
YXZhU2NyaXB0Q29yZS9ranMvcmVnZXhwLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNyArMSw3IEBA
CiAvLyAtKi0gYy1iYXNpYy1vZmZzZXQ6IDIgLSotCiAvKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0
IG9mIHRoZSBLREUgbGlicmFyaWVzCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgSGFycmkg
UG9ydGVuIChwb3J0ZW5Aa2RlLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtMTksNTQgKzE5
LDQ4IEBACiAgKgogICovCiAKLSNpZm5kZWYgX0tKU19SRUdFWFBfSF8KLSNkZWZpbmUgX0tKU19S
RUdFWFBfSF8KKyNpZm5kZWYgS0pTX1JFR0VYUF9ICisjZGVmaW5lIEtKU19SRUdFWFBfSAogCiAj
aW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpZiBIQVZFKFBDUkVQT1NJWCkKKyNpZiBVU0UoUENS
RTE2KQogI2luY2x1ZGUgPHBjcmUuaD4KLSNlbHNlICAvLyBQT1NJWCByZWdleCAtIG5vdCBzbyBn
b29kLi4uCisjZWxzZQorLy8gUE9TSVggcmVnZXggLSBub3Qgc28gZ29vZC4KIGV4dGVybiAiQyIg
eyAvLyBidWcgd2l0aCBzb21lIGxpYmM1IGRpc3RyaWJ1dGlvbnMKICNpbmNsdWRlIDxyZWdleC5o
PgogfQotI2VuZGlmIC8vIEhBVkUoUENSRVBPU0lYKQorI2VuZGlmCiAKICNpbmNsdWRlICJ1c3Ry
aW5nLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgS0pTIHsKIAotICBj
bGFzcyBSZWdFeHAgeworICBjbGFzcyBSZWdFeHAgOiBOb25jb3B5YWJsZSB7CiAgIHB1YmxpYzoK
ICAgICBlbnVtIHsgTm9uZSA9IDAsIEdsb2JhbCA9IDEsIElnbm9yZUNhc2UgPSAyLCBNdWx0aWxp
bmUgPSA0IH07CiAKLSAgICBSZWdFeHAoY29uc3QgVVN0cmluZyAmcGF0dGVybiwgaW50IGZsYWdz
ID0gTm9uZSk7CisgICAgUmVnRXhwKGNvbnN0IFVTdHJpbmcmIHBhdHRlcm4sIGludCBmbGFncyA9
IE5vbmUpOwogICAgIH5SZWdFeHAoKTsKIAogICAgIGludCBmbGFncygpIGNvbnN0IHsgcmV0dXJu
IG1fZmxhZ3M7IH0KICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiAhbV9jb25zdHJ1
Y3Rpb25FcnJvcjsgfQogICAgIGNvbnN0IGNoYXIqIGVycm9yTWVzc2FnZSgpIGNvbnN0IHsgcmV0
dXJuIG1fY29uc3RydWN0aW9uRXJyb3I7IH0KIAotICAgIFVTdHJpbmcgbWF0Y2goY29uc3QgVVN0
cmluZyAmcywgaW50IGksIGludCAqcG9zID0gMCwgaW50ICoqb3ZlY3RvciA9IDApOworICAgIGlu
dCBtYXRjaChjb25zdCBVU3RyaW5nJiwgaW50IG9mZnNldCwgT3duQXJyYXlQdHI8aW50Piogb3Zl
Y3RvciA9IDApOwogICAgIHVuc2lnbmVkIHN1YlBhdHRlcm5zKCkgY29uc3QgeyByZXR1cm4gbV9u
dW1TdWJQYXR0ZXJuczsgfQogCiAgIHByaXZhdGU6Ci0jaWYgSEFWRShQQ1JFUE9TSVgpCi0gICAg
cGNyZSAqbV9yZWdleDsKKyNpZiBVU0UoUENSRTE2KQorICAgIHBjcmUqIG1fcmVnZXg7CiAjZWxz
ZQogICAgIHJlZ2V4X3QgbV9yZWdleDsKICNlbmRpZgogICAgIGludCBtX2ZsYWdzOwogICAgIGNo
YXIqIG1fY29uc3RydWN0aW9uRXJyb3I7CiAgICAgdW5zaWduZWQgbV9udW1TdWJQYXR0ZXJuczsK
LQotICAgIFJlZ0V4cChjb25zdCBSZWdFeHAgJik7Ci0gICAgUmVnRXhwICZvcGVyYXRvcj0oY29u
c3QgUmVnRXhwICYpOwotCi0gICAgc3RhdGljIGJvb2wgaXNIZXhEaWdpdChVQ2hhcik7Ci0gICAg
c3RhdGljIHVuc2lnbmVkIGNoYXIgY29udmVydEhleChpbnQpOwotICAgIHN0YXRpYyB1bnNpZ25l
ZCBjaGFyIGNvbnZlcnRIZXgoaW50LCBpbnQpOwotICAgIHN0YXRpYyBVQ2hhciBjb252ZXJ0VW5p
Y29kZShVQ2hhciwgVUNoYXIsIFVDaGFyLCBVQ2hhcik7CiAgIH07CiAKIH0gLy8gbmFtZXNwYWNl
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvcmVnZXhwX29iamVjdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gSmF2YVNjcmlwdENvcmUva2pzL3JlZ2V4cF9vYmplY3QuY3BwCShyZXZpc2lvbiAyNzI4MSkK
KysrIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHBfb2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTAwLDI1ICsxMDAsMjMgQEAgSlNWYWx1ZSAqUmVnRXhwUHJvdG9GdW5jOjpjYWxsQXNGdW5j
dGlvbgogICAgIH0KIAogICAgIGludCBmb3VuZEluZGV4OwotICAgIFVTdHJpbmcgbWF0Y2ggPSBy
ZWdFeHBPYmotPnBlcmZvcm1NYXRjaChyZWdFeHAsIGlucHV0LCBzdGF0aWNfY2FzdDxpbnQ+KGxh
c3RJbmRleCksICZmb3VuZEluZGV4KTsKLSAgICBib29sIGRpZE1hdGNoID0gIW1hdGNoLmlzTnVs
bCgpOworICAgIGludCBmb3VuZExlbmd0aDsKKyAgICByZWdFeHBPYmotPnBlcmZvcm1NYXRjaChy
ZWdFeHAsIGlucHV0LCBzdGF0aWNfY2FzdDxpbnQ+KGxhc3RJbmRleCksIGZvdW5kSW5kZXgsIGZv
dW5kTGVuZ3RoKTsKIAogICAgIC8vIFRlc3QKICAgICBpZiAoaWQgPT0gVGVzdCkKLSAgICAgIHJl
dHVybiBqc0Jvb2xlYW4oZGlkTWF0Y2gpOworICAgICAgcmV0dXJuIGpzQm9vbGVhbihmb3VuZElu
ZGV4ID49IDApOwogCiAgICAgLy8gRXhlYwotICAgIGlmIChkaWRNYXRjaCkgewotICAgICAgaWYg
KGdsb2JhbEZsYWcpCi0gICAgICAgIHRoaXNPYmotPnB1dChleGVjLCBleGVjLT5wcm9wZXJ0eU5h
bWVzKCkubGFzdEluZGV4LCBqc051bWJlcihmb3VuZEluZGV4ICsgbWF0Y2guc2l6ZSgpKSwgRG9u
dERlbGV0ZSB8IERvbnRFbnVtKTsKLSAgICAgIHJldHVybiByZWdFeHBPYmotPmFycmF5T2ZNYXRj
aGVzKGV4ZWMsIG1hdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGdsb2JhbEZsYWcpCisg
ICAgaWYgKGZvdW5kSW5kZXggPCAwKSB7CisgICAgICAgaWYgKGdsb2JhbEZsYWcpCiAgICAgICAg
IHRoaXNPYmotPnB1dChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkubGFzdEluZGV4LCBqc051
bWJlcigwKSwgRG9udERlbGV0ZSB8IERvbnRFbnVtKTsKICAgICAgIHJldHVybiBqc051bGwoKTsK
ICAgICB9CisgICAgaWYgKGdsb2JhbEZsYWcpCisgICAgICB0aGlzT2JqLT5wdXQoZXhlYywgZXhl
Yy0+cHJvcGVydHlOYW1lcygpLmxhc3RJbmRleCwganNOdW1iZXIoZm91bmRJbmRleCArIGZvdW5k
TGVuZ3RoKSwgRG9udERlbGV0ZSB8IERvbnRFbnVtKTsKKyAgICByZXR1cm4gcmVnRXhwT2JqLT5h
cnJheU9mTWF0Y2hlcyhleGVjKTsKICAgfQotICBicmVhazsKICAgY2FzZSBUb1N0cmluZzoKICAg
ICBVU3RyaW5nIHJlc3VsdCA9ICIvIiArIHRoaXNPYmotPmdldChleGVjLCBleGVjLT5wcm9wZXJ0
eU5hbWVzKCkuc291cmNlKS0+dG9TdHJpbmcoZXhlYykgKyAiLyI7CiAgICAgaWYgKHRoaXNPYmot
PmdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuZ2xvYmFsKS0+dG9Cb29sZWFuKGV4ZWMp
KSB7CkBAIC0yMDUsODkgKzIwMyw2MCBAQCBSZWdFeHBPYmplY3RJbXA6OlJlZ0V4cE9iamVjdElt
cChFeGVjU3RhCiAgIGV4cHJlc3Npb24gbWF0Y2hpbmcgdGhyb3VnaCB0aGUgcGVyZm9ybU1hdGNo
IGZ1bmN0aW9uLiBXZSB1c2UgY2FjaGVkIHJlc3VsdHMgdG8gY2FsY3VsYXRlLCAKICAgZS5nLiwg
UmVnRXhwLmxhc3RNYXRjaCBhbmQgUmVnRXhwLmxlZnRQYXJlbi4KICovCi1VU3RyaW5nIFJlZ0V4
cE9iamVjdEltcDo6cGVyZm9ybU1hdGNoKFJlZ0V4cCogciwgY29uc3QgVVN0cmluZyYgcywgaW50
IHN0YXJ0T2Zmc2V0LCBpbnQgKmVuZE9mZnNldCwgaW50ICoqb3ZlY3RvcikKK3ZvaWQgUmVnRXhw
T2JqZWN0SW1wOjpwZXJmb3JtTWF0Y2goUmVnRXhwKiByLCBjb25zdCBVU3RyaW5nJiBzLCBpbnQg
c3RhcnRPZmZzZXQsIGludCYgcG9zaXRpb24sIGludCYgbGVuZ3RoLCBpbnQqKiBvdmVjdG9yKQog
ewotICBpbnQgdG1wT2Zmc2V0OwotICBpbnQgKnRtcE92ZWN0b3I7Ci0gIFVTdHJpbmcgbWF0Y2gg
PSByLT5tYXRjaChzLCBzdGFydE9mZnNldCwgJnRtcE9mZnNldCwgJnRtcE92ZWN0b3IpOworICBP
d25BcnJheVB0cjxpbnQ+IHRtcE92ZWN0b3I7CisgIHBvc2l0aW9uID0gci0+bWF0Y2gocywgc3Rh
cnRPZmZzZXQsICZ0bXBPdmVjdG9yKTsKIAotICBpZiAoZW5kT2Zmc2V0KQotICAgICplbmRPZmZz
ZXQgPSB0bXBPZmZzZXQ7CiAgIGlmIChvdmVjdG9yKQotICAgICpvdmVjdG9yID0gdG1wT3ZlY3Rv
cjsKKyAgICAqb3ZlY3RvciA9IHRtcE92ZWN0b3IuZ2V0KCk7CiAgIAotICBpZiAoIW1hdGNoLmlz
TnVsbCgpKSB7CisgIGlmIChwb3NpdGlvbiAhPSAtMSkgewogICAgIEFTU0VSVCh0bXBPdmVjdG9y
KTsKLSAgICAKKworICAgIGxlbmd0aCA9IHRtcE92ZWN0b3JbMV0gLSB0bXBPdmVjdG9yWzBdOwor
CiAgICAgZC0+bGFzdElucHV0ID0gczsKLSAgICBkLT5sYXN0T3ZlY3Rvci5zZXQodG1wT3ZlY3Rv
cik7CisgICAgZC0+bGFzdE92ZWN0b3Iuc2V0KHRtcE92ZWN0b3IucmVsZWFzZSgpKTsKICAgICBk
LT5sYXN0TnVtU3ViUGF0dGVybnMgPSByLT5zdWJQYXR0ZXJucygpOwogICB9Ci0gIAotICByZXR1
cm4gbWF0Y2g7CiB9CiAKLUpTT2JqZWN0ICpSZWdFeHBPYmplY3RJbXA6OmFycmF5T2ZNYXRjaGVz
KEV4ZWNTdGF0ZSAqZXhlYywgY29uc3QgVVN0cmluZyAmcmVzdWx0KSBjb25zdAorSlNPYmplY3Qq
IFJlZ0V4cE9iamVjdEltcDo6YXJyYXlPZk1hdGNoZXMoRXhlY1N0YXRlKiBleGVjKSBjb25zdAog
ewotICBMaXN0IGxpc3Q7Ci0gIC8vIFRoZSByZXR1cm5lZCBhcnJheSBjb250YWlucyAncmVzdWx0
JyBhcyBmaXJzdCBpdGVtLCBmb2xsb3dlZCBieSB0aGUgbGlzdCBvZiBtYXRjaGVzCi0gIGxpc3Qu
YXBwZW5kKGpzU3RyaW5nKHJlc3VsdCkpOwotICBpZiAoZC0+bGFzdE92ZWN0b3IpCi0gICAgZm9y
ICh1bnNpZ25lZCBpID0gMSA7IGkgPCBkLT5sYXN0TnVtU3ViUGF0dGVybnMgKyAxIDsgKytpKQot
ICAgIHsKLSAgICAgIGludCBzdGFydCA9IGQtPmxhc3RPdmVjdG9yWzIqaV07Ci0gICAgICBpZiAo
c3RhcnQgPT0gLTEpCi0gICAgICAgIGxpc3QuYXBwZW5kKGpzVW5kZWZpbmVkKCkpOwotICAgICAg
ZWxzZSB7Ci0gICAgICAgIFVTdHJpbmcgc3Vic3RyaW5nID0gZC0+bGFzdElucHV0LnN1YnN0cihz
dGFydCwgZC0+bGFzdE92ZWN0b3JbMippKzFdIC0gc3RhcnQpOwotICAgICAgICBsaXN0LmFwcGVu
ZChqc1N0cmluZyhzdWJzdHJpbmcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIEpTT2JqZWN0ICphcnIg
PSBleGVjLT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpbkFycmF5KCktPmNvbnN0cnVjdChl
eGVjLCBsaXN0KTsKKyAgdW5zaWduZWQgbGFzdE51bVN1YnBhdHRlcm5zID0gZC0+bGFzdE51bVN1
YlBhdHRlcm5zOworICBBcnJheUluc3RhbmNlKiBhcnIgPSBuZXcgQXJyYXlJbnN0YW5jZShleGVj
LT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpbkFycmF5UHJvdG90eXBlKCksIGxhc3ROdW1T
dWJwYXR0ZXJucyArIDEpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDw9IGxhc3ROdW1TdWJw
YXR0ZXJuczsgKytpKSB7CisgICAgaW50IHN0YXJ0ID0gZC0+bGFzdE92ZWN0b3JbMiAqIGldOwor
ICAgIGlmIChzdGFydCA+PSAwKQorICAgICAgYXJyLT5wdXQoZXhlYywgaSwganNTdHJpbmcoZC0+
bGFzdElucHV0LnN1YnN0cihzdGFydCwgZC0+bGFzdE92ZWN0b3JbMiAqIGkgKyAxXSAtIHN0YXJ0
KSkpOworICB9CiAgIGFyci0+cHV0KGV4ZWMsIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5pbmRleCwg
anNOdW1iZXIoZC0+bGFzdE92ZWN0b3JbMF0pKTsKICAgYXJyLT5wdXQoZXhlYywgZXhlYy0+cHJv
cGVydHlOYW1lcygpLmlucHV0LCBqc1N0cmluZyhkLT5sYXN0SW5wdXQpKTsKICAgcmV0dXJuIGFy
cjsKIH0KIAotSlNWYWx1ZSAqUmVnRXhwT2JqZWN0SW1wOjpnZXRCYWNrcmVmKHVuc2lnbmVkIGkp
IGNvbnN0CitKU1ZhbHVlKiBSZWdFeHBPYmplY3RJbXA6OmdldEJhY2tyZWYodW5zaWduZWQgaSkg
Y29uc3QKIHsKLSAgaWYgKGQtPmxhc3RPdmVjdG9yICYmIGkgPCBkLT5sYXN0TnVtU3ViUGF0dGVy
bnMgKyAxKSB7Ci0gICAgVVN0cmluZyBzdWJzdHJpbmcgPSBkLT5sYXN0SW5wdXQuc3Vic3RyKGQt
Pmxhc3RPdmVjdG9yWzIqaV0sIGQtPmxhc3RPdmVjdG9yWzIqaSsxXSAtIGQtPmxhc3RPdmVjdG9y
WzIqaV0gKTsKLSAgICByZXR1cm4ganNTdHJpbmcoc3Vic3RyaW5nKTsKLSAgfSAKLQorICBpZiAo
ZC0+bGFzdE92ZWN0b3IgJiYgaSA8PSBkLT5sYXN0TnVtU3ViUGF0dGVybnMpCisgICAgcmV0dXJu
IGpzU3RyaW5nKGQtPmxhc3RJbnB1dC5zdWJzdHIoZC0+bGFzdE92ZWN0b3JbMiAqIGldLCBkLT5s
YXN0T3ZlY3RvclsyICogaSArIDFdIC0gZC0+bGFzdE92ZWN0b3JbMiAqIGldKSk7CiAgIHJldHVy
biBqc1N0cmluZygiIik7CiB9CiAKLUpTVmFsdWUgKlJlZ0V4cE9iamVjdEltcDo6Z2V0TGFzdE1h
dGNoKCkgY29uc3QKK0pTVmFsdWUqIFJlZ0V4cE9iamVjdEltcDo6Z2V0TGFzdFBhcmVuKCkgY29u
c3QKIHsKLSAgaWYgKGQtPmxhc3RPdmVjdG9yKSB7Ci0gICAgVVN0cmluZyBzdWJzdHJpbmcgPSBk
LT5sYXN0SW5wdXQuc3Vic3RyKGQtPmxhc3RPdmVjdG9yWzBdLCBkLT5sYXN0T3ZlY3RvclsxXSAt
IGQtPmxhc3RPdmVjdG9yWzBdKTsKLSAgICByZXR1cm4ganNTdHJpbmcoc3Vic3RyaW5nKTsKLSAg
fQotICAKLSAgcmV0dXJuIGpzU3RyaW5nKCIiKTsKLX0KLQotSlNWYWx1ZSAqUmVnRXhwT2JqZWN0
SW1wOjpnZXRMYXN0UGFyZW4oKSBjb25zdAotewotICBpbnQgaSA9IGQtPmxhc3ROdW1TdWJQYXR0
ZXJuczsKKyAgdW5zaWduZWQgaSA9IGQtPmxhc3ROdW1TdWJQYXR0ZXJuczsKICAgaWYgKGkgPiAw
KSB7CiAgICAgQVNTRVJUKGQtPmxhc3RPdmVjdG9yKTsKLSAgICBVU3RyaW5nIHN1YnN0cmluZyA9
IGQtPmxhc3RJbnB1dC5zdWJzdHIoZC0+bGFzdE92ZWN0b3JbMippXSwgZC0+bGFzdE92ZWN0b3Jb
MippKzFdIC0gZC0+bGFzdE92ZWN0b3JbMippXSk7Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHN1YnN0
cmluZyk7CisgICAgcmV0dXJuIGpzU3RyaW5nKGQtPmxhc3RJbnB1dC5zdWJzdHIoZC0+bGFzdE92
ZWN0b3JbMiAqIGldLCBkLT5sYXN0T3ZlY3RvclsyICogaSArIDFdIC0gZC0+bGFzdE92ZWN0b3Jb
MiAqIGldKSk7CiAgIH0KLSAgICAKICAgcmV0dXJuIGpzU3RyaW5nKCIiKTsKIH0KIAogSlNWYWx1
ZSAqUmVnRXhwT2JqZWN0SW1wOjpnZXRMZWZ0Q29udGV4dCgpIGNvbnN0CiB7Ci0gIGlmIChkLT5s
YXN0T3ZlY3RvcikgewotICAgIFVTdHJpbmcgc3Vic3RyaW5nID0gZC0+bGFzdElucHV0LnN1YnN0
cigwLCBkLT5sYXN0T3ZlY3RvclswXSk7Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHN1YnN0cmluZyk7
Ci0gIH0KLSAgCisgIGlmIChkLT5sYXN0T3ZlY3RvcikKKyAgICByZXR1cm4ganNTdHJpbmcoZC0+
bGFzdElucHV0LnN1YnN0cigwLCBkLT5sYXN0T3ZlY3RvclswXSkpOwogICByZXR1cm4ganNTdHJp
bmcoIiIpOwogfQogCkBAIC0yOTUsMTAgKzI2NCw4IEBAIEpTVmFsdWUgKlJlZ0V4cE9iamVjdElt
cDo6Z2V0UmlnaHRDb250ZXgKIHsKICAgaWYgKGQtPmxhc3RPdmVjdG9yKSB7CiAgICAgVVN0cmlu
ZyBzID0gZC0+bGFzdElucHV0OwotICAgIFVTdHJpbmcgc3Vic3RyaW5nID0gcy5zdWJzdHIoZC0+
bGFzdE92ZWN0b3JbMV0sIHMuc2l6ZSgpIC0gZC0+bGFzdE92ZWN0b3JbMV0pOwotICAgIHJldHVy
biBqc1N0cmluZyhzdWJzdHJpbmcpOworICAgIHJldHVybiBqc1N0cmluZyhzLnN1YnN0cihkLT5s
YXN0T3ZlY3RvclsxXSwgcy5zaXplKCkgLSBkLT5sYXN0T3ZlY3RvclsxXSkpOwogICB9Ci0gIAog
ICByZXR1cm4ganNTdHJpbmcoIiIpOwogfQogCkBAIC0zMzMsNyArMzAwLDcgQEAgSlNWYWx1ZSAq
UmVnRXhwT2JqZWN0SW1wOjpnZXRWYWx1ZVByb3BlcgogICAgIGNhc2UgTXVsdGlsaW5lOgogICAg
ICAgcmV0dXJuIGpzQm9vbGVhbihkLT5tdWx0aWxpbmUpOwogICAgIGNhc2UgTGFzdE1hdGNoOgot
ICAgICAgcmV0dXJuIGdldExhc3RNYXRjaCgpOworICAgICAgcmV0dXJuIGdldEJhY2tyZWYoMCk7
CiAgICAgY2FzZSBMYXN0UGFyZW46CiAgICAgICByZXR1cm4gZ2V0TGFzdFBhcmVuKCk7CiAgICAg
Y2FzZSBMZWZ0Q29udGV4dDoKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHBfb2JqZWN0
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL3JlZ2V4cF9vYmplY3QuaAkocmV2
aXNpb24gMjcyODEpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvcmVnZXhwX29iamVjdC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC03OCwxMyArNzgsMTIgQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgdm9pZCBw
dXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSAqLCBpbnQgdG9rZW4sIEpTVmFsdWUgKiwgaW50IGF0
dHIpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlICosIGNv
bnN0IElkZW50aWZpZXImLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBKU1ZhbHVlICpnZXRWYWx1ZVBy
b3BlcnR5KEV4ZWNTdGF0ZSAqLCBpbnQgdG9rZW4pIGNvbnN0OwotICAgIFVTdHJpbmcgcGVyZm9y
bU1hdGNoKFJlZ0V4cCAqLCBjb25zdCBVU3RyaW5nJiwgaW50IHN0YXJ0T2Zmc2V0ID0gMCwgaW50
ICplbmRPZmZzZXQgPSAwLCBpbnQgKipvdmVjdG9yID0gMCk7Ci0gICAgSlNPYmplY3QgKmFycmF5
T2ZNYXRjaGVzKEV4ZWNTdGF0ZSAqZXhlYywgY29uc3QgVVN0cmluZyAmcmVzdWx0KSBjb25zdDsK
KyAgICB2b2lkIHBlcmZvcm1NYXRjaChSZWdFeHAqLCBjb25zdCBVU3RyaW5nJiwgaW50IHN0YXJ0
T2Zmc2V0LCBpbnQmIHBvc2l0aW9uLCBpbnQmIGxlbmd0aCwgaW50Kiogb3ZlY3RvciA9IDApOwor
ICAgIEpTT2JqZWN0KiBhcnJheU9mTWF0Y2hlcyhFeGVjU3RhdGUqKSBjb25zdDsKICAgICAKICAg
ICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyAqY2xhc3NJbmZvKCkgY29uc3QgeyByZXR1cm4gJmlu
Zm87IH0KICAgcHJpdmF0ZToKICAgICBKU1ZhbHVlICpnZXRCYWNrcmVmKHVuc2lnbmVkKSBjb25z
dDsKLSAgICBKU1ZhbHVlICpnZXRMYXN0TWF0Y2goKSBjb25zdDsKICAgICBKU1ZhbHVlICpnZXRM
YXN0UGFyZW4oKSBjb25zdDsKICAgICBKU1ZhbHVlICpnZXRMZWZ0Q29udGV4dCgpIGNvbnN0Owog
ICAgIEpTVmFsdWUgKmdldFJpZ2h0Q29udGV4dCgpIGNvbnN0OwpJbmRleDogSmF2YVNjcmlwdENv
cmUva2pzL3N0cmluZ19vYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tq
cy9zdHJpbmdfb2JqZWN0LmNwcAkocmV2aXNpb24gMjcyODEpCisrKyBKYXZhU2NyaXB0Q29yZS9r
anMvc3RyaW5nX29iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzOCw3ICszMzgsNiBAQCBz
dGF0aWMgSlNWYWx1ZSAqcmVwbGFjZShFeGVjU3RhdGUgKmV4ZWMsCiAKICAgICBSZWdFeHBPYmpl
Y3RJbXAqIHJlZ0V4cE9iaiA9IHN0YXRpY19jYXN0PFJlZ0V4cE9iamVjdEltcCo+KGV4ZWMtPmxl
eGljYWxJbnRlcnByZXRlcigpLT5idWlsdGluUmVnRXhwKCkpOwogCi0gICAgaW50IG1hdGNoSW5k
ZXggPSAwOwogICAgIGludCBsYXN0SW5kZXggPSAwOwogICAgIGludCBzdGFydFBvc2l0aW9uID0g
MDsKIApAQCAtMzUxLDExICszNTAsMTIgQEAgc3RhdGljIEpTVmFsdWUgKnJlcGxhY2UoRXhlY1N0
YXRlICpleGVjLAogCiAgICAgLy8gVGhpcyBpcyBlaXRoZXIgYSBsb29wIChpZiBnbG9iYWwgaXMg
c2V0KSBvciBhIG9uZS13YXkgKGlmIG5vdCkuCiAgICAgZG8gewotICAgICAgaW50ICpvdmVjdG9y
OwotICAgICAgVVN0cmluZyBtYXRjaFN0cmluZyA9IHJlZ0V4cE9iai0+cGVyZm9ybU1hdGNoKHJl
Zywgc291cmNlLCBzdGFydFBvc2l0aW9uLCAmbWF0Y2hJbmRleCwgJm92ZWN0b3IpOwotICAgICAg
aWYgKG1hdGNoSW5kZXggPT0gLTEpCisgICAgICBpbnQgbWF0Y2hJbmRleDsKKyAgICAgIGludCBt
YXRjaExlbjsKKyAgICAgIGludCogb3ZlY3RvcjsKKyAgICAgIHJlZ0V4cE9iai0+cGVyZm9ybU1h
dGNoKHJlZywgc291cmNlLCBzdGFydFBvc2l0aW9uLCBtYXRjaEluZGV4LCBtYXRjaExlbiwgJm92
ZWN0b3IpOworICAgICAgaWYgKG1hdGNoSW5kZXggPCAwKQogICAgICAgICBicmVhazsKLSAgICAg
IGludCBtYXRjaExlbiA9IG1hdGNoU3RyaW5nLnNpemUoKTsKIAogICAgICAgcHVzaFNvdXJjZVJh
bmdlKHNvdXJjZVJhbmdlcywgc291cmNlUmFuZ2VDb3VudCwgc291cmNlUmFuZ2VDYXBhY2l0eSwg
VVN0cmluZzo6UmFuZ2UobGFzdEluZGV4LCBtYXRjaEluZGV4IC0gbGFzdEluZGV4KSk7CiAKQEAg
LTM2NCwxMSArMzY0LDkgQEAgc3RhdGljIEpTVmFsdWUgKnJlcGxhY2UoRXhlY1N0YXRlICpleGVj
LAogICAgICAgICAgIGludCBjb21wbGV0ZU1hdGNoU3RhcnQgPSBvdmVjdG9yWzBdOwogICAgICAg
ICAgIExpc3QgYXJnczsKIAotICAgICAgICAgIGFyZ3MuYXBwZW5kKGpzU3RyaW5nKG1hdGNoU3Ry
aW5nKSk7Ci0KLSAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVnLT5zdWJQYXR0
ZXJucygpOyBpKyspIHsKLSAgICAgICAgICAgICAgaW50IG1hdGNoU3RhcnQgPSBvdmVjdG9yWyhp
ICsgMSkgKiAyXTsKLSAgICAgICAgICAgICAgaW50IG1hdGNoTGVuID0gb3ZlY3RvclsoaSArIDEp
ICogMiArIDFdIC0gbWF0Y2hTdGFydDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgcmVnLT5zdWJQYXR0ZXJucygpICsgMTsgaSsrKSB7CisgICAgICAgICAgICAgIGludCBtYXRj
aFN0YXJ0ID0gb3ZlY3RvcltpICogMl07CisgICAgICAgICAgICAgIGludCBtYXRjaExlbiA9IG92
ZWN0b3JbaSAqIDIgKyAxXSAtIG1hdGNoU3RhcnQ7CiAKICAgICAgICAgICAgICAgaWYgKG1hdGNo
U3RhcnQgPCAwKQogICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGpzVW5kZWZpbmVkKCkpOwpA
QCAtNTI0LDMwICs1MjIsMjggQEAgSlNWYWx1ZSogU3RyaW5nUHJvdG9GdW5jOjpjYWxsQXNGdW5j
dGlvbgogICAgICAgcmVnID0gdG1wUmVnID0gbmV3IFJlZ0V4cChhMC0+dG9TdHJpbmcoZXhlYyks
IFJlZ0V4cDo6Tm9uZSk7CiAgICAgfQogICAgIFJlZ0V4cE9iamVjdEltcCogcmVnRXhwT2JqID0g
c3RhdGljX2Nhc3Q8UmVnRXhwT2JqZWN0SW1wKj4oZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCkt
PmJ1aWx0aW5SZWdFeHAoKSk7Ci0gICAgVVN0cmluZyBtc3RyID0gcmVnRXhwT2JqLT5wZXJmb3Jt
TWF0Y2gocmVnLCB1LCAwLCAmcG9zKTsKKyAgICBpbnQgcG9zOworICAgIGludCBtYXRjaExlbmd0
aDsKKyAgICByZWdFeHBPYmotPnBlcmZvcm1NYXRjaChyZWcsIHUsIDAsIHBvcywgbWF0Y2hMZW5n
dGgpOwogICAgIGlmIChpZCA9PSBTZWFyY2gpIHsKICAgICAgIHJlc3VsdCA9IGpzTnVtYmVyKHBv
cyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIC8vIEV4ZWMKKyAgICAgIC8vIE1hdGNoCiAgICAgICBp
ZiAoKHJlZy0+ZmxhZ3MoKSAmIFJlZ0V4cDo6R2xvYmFsKSA9PSAwKSB7CiAgICAgICAgIC8vIGNh
c2Ugd2l0aG91dCAnZycgZmxhZyBpcyBoYW5kbGVkIGxpa2UgUmVnRXhwLnByb3RvdHlwZS5leGVj
Ci0gICAgICAgIGlmIChtc3RyLmlzTnVsbCgpKSB7CisgICAgICAgIGlmIChwb3MgPCAwKQogICAg
ICAgICAgIHJlc3VsdCA9IGpzTnVsbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJl
c3VsdCA9IHJlZ0V4cE9iai0+YXJyYXlPZk1hdGNoZXMoZXhlYyxtc3RyKTsKLSAgICAgICAgfQor
ICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0ID0gcmVnRXhwT2JqLT5hcnJheU9mTWF0Y2hl
cyhleGVjKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHJldHVybiBhcnJheSBvZiBtYXRj
aGVzCiAgICAgICAgIExpc3QgbGlzdDsKICAgICAgICAgaW50IGxhc3RJbmRleCA9IDA7CiAgICAg
ICAgIHdoaWxlIChwb3MgPj0gMCkgewotICAgICAgICAgIGlmIChtc3RyLmlzTnVsbCgpKQotICAg
ICAgICAgICAgbGlzdC5hcHBlbmQoanNVbmRlZmluZWQoKSk7Ci0gICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgbGlzdC5hcHBlbmQoanNTdHJpbmcobXN0cikpOworICAgICAgICAgIGxpc3QuYXBw
ZW5kKGpzU3RyaW5nKHUuc3Vic3RyKHBvcywgbWF0Y2hMZW5ndGgpKSk7CiAgICAgICAgICAgbGFz
dEluZGV4ID0gcG9zOwotICAgICAgICAgIHBvcyArPSBtc3RyLmlzRW1wdHkoKSA/IDEgOiBtc3Ry
LnNpemUoKTsKLSAgICAgICAgICBtc3RyID0gcmVnRXhwT2JqLT5wZXJmb3JtTWF0Y2gocmVnLCB1
LCBwb3MsICZwb3MpOworICAgICAgICAgIHBvcyArPSBtYXRjaExlbmd0aCA9PSAwID8gMSA6IG1h
dGNoTGVuZ3RoOworICAgICAgICAgIHJlZ0V4cE9iai0+cGVyZm9ybU1hdGNoKHJlZywgdSwgcG9z
LCBwb3MsIG1hdGNoTGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW1wKQogICAgICAg
ICAgIGltcC0+cHV0KGV4ZWMsICJsYXN0SW5kZXgiLCBqc051bWJlcihsYXN0SW5kZXgpLCBEb250
RGVsZXRlfERvbnRFbnVtKTsKQEAgLTU5OSwyNCArNTk1LDIyIEBAIEpTVmFsdWUqIFN0cmluZ1By
b3RvRnVuYzo6Y2FsbEFzRnVuY3Rpb24KICAgICB1aW50MzJfdCBsaW1pdCA9IGExLT5pc1VuZGVm
aW5lZCgpID8gMHhGRkZGRkZGRlUgOiBhMS0+dG9VSW50MzIoZXhlYyk7CiAgICAgaWYgKGEwLT5p
c09iamVjdCgpICYmIHN0YXRpY19jYXN0PEpTT2JqZWN0ICo+KGEwKS0+aW5oZXJpdHMoJlJlZ0V4
cEltcDo6aW5mbykpIHsKICAgICAgIFJlZ0V4cCAqcmVnID0gc3RhdGljX2Nhc3Q8UmVnRXhwSW1w
ICo+KGEwKS0+cmVnRXhwKCk7Ci0gICAgICBpZiAodS5pc0VtcHR5KCkgJiYgIXJlZy0+bWF0Y2go
dSwgMCkuaXNOdWxsKCkpIHsKKyAgICAgIGlmICh1LmlzRW1wdHkoKSAmJiByZWctPm1hdGNoKHUs
IDApID49IDApIHsKICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1hdGNoZWQgYnkgcmVnZXhwIC0+
IGVtcHR5IGFycmF5CiAgICAgICAgIHJlcy0+cHV0KGV4ZWMsIGV4ZWMtPnByb3BlcnR5TmFtZXMo
KS5sZW5ndGgsIGpzTnVtYmVyKDApKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBw
b3MgPSAwOwogICAgICAgd2hpbGUgKHN0YXRpY19jYXN0PHVpbnQzMl90PihpKSAhPSBsaW1pdCAm
JiBwb3MgPCB1LnNpemUoKSkgewotICAgICAgICBpbnQgbXBvczsKLSAgICAgICAgaW50KiBvdmVj
dG9yOwotICAgICAgICBVU3RyaW5nIG1zdHIgPSByZWctPm1hdGNoKHUsIHBvcywgJm1wb3MsICZv
dmVjdG9yKTsKLSAgICAgICAgaWYgKG1wb3MgPCAwKSB7Ci0gICAgICAgICAgZGVsZXRlIFtdIG92
ZWN0b3I7CisgICAgICAgIE93bkFycmF5UHRyPGludD4gb3ZlY3RvcjsKKyAgICAgICAgaW50IG1w
b3MgPSByZWctPm1hdGNoKHUsIHBvcywgJm92ZWN0b3IpOworICAgICAgICBpZiAobXBvcyA8IDAp
CiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zID0gbXBvcyArIChtc3Ry
LmlzRW1wdHkoKSA/IDEgOiBtc3RyLnNpemUoKSk7Ci0gICAgICAgIGlmIChtcG9zICE9IHAwIHx8
ICFtc3RyLmlzRW1wdHkoKSkgeworICAgICAgICBpbnQgbWxlbiA9IG92ZWN0b3JbMV0gLSBvdmVj
dG9yWzBdOworICAgICAgICBwb3MgPSBtcG9zICsgKG1sZW4gPT0gMCA/IDEgOiBtbGVuKTsKKyAg
ICAgICAgaWYgKG1wb3MgIT0gcDAgfHwgbWxlbikgewogICAgICAgICAgIHJlcy0+cHV0KGV4ZWMs
aSwganNTdHJpbmcodS5zdWJzdHIocDAsIG1wb3MtcDApKSk7Ci0gICAgICAgICAgcDAgPSBtcG9z
ICsgbXN0ci5zaXplKCk7CisgICAgICAgICAgcDAgPSBtcG9zICsgbWxlbjsKICAgICAgICAgICBp
Kys7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1bnNpZ25lZCBzaSA9IDE7IHNpIDw9IHJlZy0+
c3ViUGF0dGVybnMoKTsgKytzaSkgewpAQCAtNjI2LDcgKzYyMCw2IEBAIEpTVmFsdWUqIFN0cmlu
Z1Byb3RvRnVuYzo6Y2FsbEFzRnVuY3Rpb24KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBy
ZXMtPnB1dChleGVjLCBpKyssIGpzU3RyaW5nKHUuc3Vic3RyKHNwb3MsIG92ZWN0b3Jbc2kgKiAy
ICsgMV0gLSBzcG9zKSkpOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBbXSBvdmVjdG9yOwog
ICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICB1MiA9IGEwLT50b1N0cmluZyhleGVjKTsK
</data>
<flag name="review"
          id="7199"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>