<?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>15861</bug_id>
          
          <creation_ts>2007-11-06 13:09:21 -0800</creation_ts>
          <short_desc>5.8% of string-validate-input.js is spent creating RegExpImps</short_desc>
          <delta_ts>2007-11-08 15:50:49 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</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>
          
          <blocked>15900</blocked>
    
    <blocked>15902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>ggaren</cc>
    
    <cc>mjs</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>60432</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-06 13:09:21 -0800</bug_when>
    <thetext>JavaScriptCore needs to pull constants out of loops

SpiderMonkey beats us on the &quot;validate-input&quot; test dramatically.
    validate-input:    58.2% *slower*   115.2ms +/- 1.2%    182.2ms +/- 0.7%     significant

I think much of that is due to them having some magical way to recognize constants and pull them out of for loops.

in doTest()

There is a &quot;pattern&quot; constant regexp, which we re-compile every time through the loop. If I hack the test to pull that out of the loop, we get a 14% speed increase in that one test:

    validate-input:    14.6% faster     162.8ms +/- 0.8%    139.0ms +/- 1.1%     significant</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60433</commentid>
    <comment_count>1</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-06 13:12:21 -0800</bug_when>
    <thetext>Another way to handle this specific case would be to just unique RegExp objects based on Identifier, then once any one of them is compiled, they all are.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60446</commentid>
    <comment_count>2</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-06 16:18:03 -0800</bug_when>
    <thetext>I&apos;m working on this. I think we can just store the compiled regexp in the node tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60479</commentid>
    <comment_count>3</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-11-06 21:05:59 -0800</bug_when>
    <thetext>Keep in mind that regexp literals are not truly constants, they create a new object every time and this difference can be observed. It should be safe to cache the compiled guts of the regexp, but not the JavaScript wrapper object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60485</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-06 21:30:46 -0800</bug_when>
    <thetext>It would be interesting to test this observation, and see what mozilla caches. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60519</commentid>
    <comment_count>5</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-11-06 23:33:50 -0800</bug_when>
    <thetext>This test program seems to show Mozilla caching the whole JS-level regexp object (we do not). I wonder what the standard says?

&lt;script&gt;
var a = &quot;&quot;;

for (var i = 0; i &lt; 5; i++) {
    var b = /a/;
    b.foo = &quot;foo&quot;;
    alert(a.foo);
    a = b;
}

&lt;/script&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60521</commentid>
    <comment_count>6</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-11-06 23:37:30 -0800</bug_when>
    <thetext>Wowsers. This test program seems to show even more thoroughly that Opera and Mozilla reuse the same regexp object for a regexp created repeatedly from the same source line:

&lt;script&gt;
var a = &quot;&quot;;

for (var i = 0; i &lt; 5; i++) {
    var b = /a/;
    b.foo = &quot;bar&quot;;
    alert(a.foo);
    alert(a ===	b);
    b.foo = &quot;&quot;;
    a = b;
}

&lt;/script&gt;

But not if you create a second instance of the /a/ regexp!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60522</commentid>
    <comment_count>7</comment_count>
      <attachid>17099</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-06 23:41:38 -0800</bug_when>
    <thetext>Created attachment 17099
Patch1

Buy this one, get the next one free!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60523</commentid>
    <comment_count>8</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-06 23:47:01 -0800</bug_when>
    <thetext>I don&apos;t think that re-using the JS wrapper is OK. The JS wrapper holds the lastIndex property, which influences the behavior of matching functions. If two regular expressions got their lastIndex properties tangled up, you&apos;d be in crazy-ville. (Population 2, apparently.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60524</commentid>
    <comment_count>9</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-06 23:54:05 -0800</bug_when>
    <thetext>ECMA 7.8.5:

A regular expression literal is an input element that is converted to a RegExp object (section 15.10) when it is scanned. The object is created before evaluation of the containing program or function begins. Evaluation of the literal produces a reference to that object; it does not create a new object.

OK, population 3 :).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60535</commentid>
    <comment_count>10</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-11-07 00:55:27 -0800</bug_when>
    <thetext>Do you still want your patch reviewed or would you like to do the more aggressive optimization that ECMA apparently mandates? :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60557</commentid>
    <comment_count>11</comment_count>
      <attachid>17099</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-07 08:24:23 -0800</bug_when>
    <thetext>Comment on attachment 17099
Patch1

An even better way to eliminate duplication of flags would be to have a way to ask a JSRegExp what its flags are.

I think subpatterns is a coined word, so the &quot;P&quot; should not be capitalized.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60561</commentid>
    <comment_count>12</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-07 09:14:55 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Do you still want your patch reviewed or would you like to do the more
&gt; aggressive optimization that ECMA apparently mandates? :-)

I&apos;m still going to check this one in -- constructing fewer RegExpImps will be great, but making RegExpImp construction faster is good, too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60562</commentid>
    <comment_count>13</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-07 09:22:59 -0800</bug_when>
    <thetext>Committed revision 27571.

Now I&apos;ll get to work on creating only one RegExpImp. Kind of tricky, since just putting a ProtectedPtr in the node tree will cause a retain cycle if you set the containing function as a property of the RegExpImp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60572</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-07 10:14:37 -0800</bug_when>
    <thetext>Wow, what a fantastic change!
ggaren++ !

This was landed in r27571, so closing.  I&apos;m assuming ggaren will file a second bug about &quot;creating only one RegExpImp&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60573</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-07 10:15:59 -0800</bug_when>
    <thetext>Maybe we can convince mjs to sent out updated numbers comparing against SpiderMonkey (or I just need to download the darn thing and run it myself).  I doubt we beat them on validate-input yet, but we&apos;re probably limited on ActivationImp or something else instead now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60699</commentid>
    <comment_count>16</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-08 15:50:49 -0800</bug_when>
    <thetext>Re-titling to reflect the patch that landed with this bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17099</attachid>
            <date>2007-11-06 23:41:38 -0800</date>
            <delta_ts>2007-11-07 08:24:23 -0800</delta_ts>
            <desc>Patch1</desc>
            <filename>patch-regexp.txt</filename>
            <type>text/plain</type>
            <size>26272</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3NTAyKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzggQEAKKzIwMDctMTEtMDYgIEdlb2ZmcmV5
IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIEZpeGVkIHBhcnQgb2YgaHR0cDovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NjEgCisgICAgICAgIDE1JSBvZiBzdHJpbmctdmFs
aWRhdGUtaW5wdXQuanMgaXMgc3BlbnQgY29tcGlsaW5nIHRoZSBzYW1lIHJlZ3VsYXIgZXhwcmVz
c2lvbi4KKworICAgICAgICBQdXQgUmVnRXhwSW1wIHByb3BlcnRpZXMgaW50byBhIHN0YXRpYyBo
YXNodGFibGUgdG8gYXZvaWQgYSBzbGV3IG9mCisgICAgICAgIFByb3BlcnR5TWFwIGNodXJuIHdo
ZW4gY3JlYXRpbmcgYSBSZWdFeHBJbXAuCisgICAgICAgIAorICAgICAgICBGYWN0b3JlZCBpbXBv
cnRhbnQgYml0cyBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24gb3V0IG9mCisg
ICAgICAgIFJlZ0V4cEltcCAodGhlIEpTIG9iamVjdCkgYW5kIGludG8gUmVnRXhwICh0aGUgUENS
RSB3cmFwcGVyIGNsYXNzKSwgCisgICAgICAgIG1ha2luZyBSZWdFeHAgYSByZWYtY291bnRlZCBj
bGFzcy4gKFRoaXMgd2lsbCBoZWxwIGxhdGVyLikKKworICAgICAgICBSZW1vdmVkIFBDUkVfUE9T
SVggc3VwcG9ydCBiZWNhdXNlIEkgZGlkbid0IHF1aXRlIGtub3cgaG93IHRvIHRlc3QgaXQgCisg
ICAgICAgIGFuZCBrZWVwIGl0IHdvcmtpbmcgd2l0aCB0aGVzZSBjaGFuZ2VzLgorICAgICAgICAK
KyAgICAgICAgMS4xJSBTdW5TcGlkZXIgc3BlZWR1cC4gNS44JSBzcGVlZHVwIG9uIHN0cmluZy12
YWxpZGF0ZS1pbnB1dC5qcy4KKworICAgICAgICAqIGtqcy9yZWdleHAuaDogQSBmZXcgaW50ZXJm
YWNlIGNoYW5nZXM6CisgICAgICAgIDEuIFJlbmFtZWQgInN1YnBhdHRlcm5zKCkiID0+ICJudW1T
dWJwYXR0ZXJucygpIgorICAgICAgICAyLiBNYWRlIGZsYWcgZW51bWVyYXRpb24gcHJpdmF0ZSBh
bmQgcmVwbGFjZWQgaXQgd2l0aCBwdWJsaWMgZ2V0dGVycyBmb3IKKyAgICAgICAgc3BlY2lmaWMg
ZmxhZ3MuCisgICAgICAgIDMuIE1hZGUgUmVnRXhwIHJlZi1jb3VudGVkIHNvIFJlZ0V4cHMgY2Fu
IGJlIHNoYXJlZCBieSBSZWdFeHBJbXBzLgorICAgICAgICA0LiBNYWRlIFJlZ0V4cCB0YWtlIGEg
c3RyaW5nIG9mIGZsYWdzIGluc3RlYWQgb2YgYW4gaW50LCBlbGltaW5hdGluZyAKKyAgICAgICAg
ZHVwbGljYXRlZCBmbGFnIHBhcnNpbmcgY29kZSBlbHNld2hlcmUuCisKKyAgICAgICAgKiBranMv
cmVnZXhwX29iamVjdC5jcHA6CisgICAgICAgIChLSlM6OlJlZ0V4cFByb3RvRnVuYzo6Y2FsbEFz
RnVuY3Rpb24pOiBGb3IgUmVnRXhwLmNvbXBpbGU6IAorICAgICAgICAtIEZpeGVkIGEgYnVnIHdo
ZXJlIGNvbXBpbGUodW5kZWZpbmVkKSB3b3VsZCB0aHJvdyBhbiBleGNlcHRpb24uIAorICAgICAg
ICAtIFJlbW92ZWQgc29tZSBub3ctcmVkdW5kYW50IGNvZGUuCisgICAgICAgIC0gVXNlZCBSZWdF
eHAgc2hhcmluZyB0byBlbGltaW5hdGUgYW4gYWxsb2NhdGlvbiBhbmQgYSBidW5jaCBvZiAKKyAg
ICAgICAgUHJvcGVydHlNYXAgdGhyYXNoLiAoTm90IGEgYmlnIHdpbiBzaW5jZSBjb21waWxlIGlz
IGEgZGVwcmVjYXRlZCAKKyAgICAgICAgZnVuY3Rpb24uIEkgbWFpbmx5IGRpZCB0aGlzIHRvIHRl
c3QgdGhlIHBsdWJtaW5nLikKKwogMjAwNy0xMS0wNiAgT2xpdmVyIEh1bnQgIDxvbGl2ZXJAYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE1hY2llai4KSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2tqcy9yZWdleHAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdl
eHAuY3BwCShyZXZpc2lvbiAyNzUwMSkKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHAuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2MSArMzAsNTIgQEAKIAogbmFtZXNwYWNlIEtKUyB7CiAK
LVJlZ0V4cDo6UmVnRXhwKGNvbnN0IFVTdHJpbmcgJnAsIGludCBmbGFncykKLSAgOiBtX2ZsYWdz
KGZsYWdzKSwgbV9jb25zdHJ1Y3Rpb25FcnJvcigwKSwgbV9udW1TdWJQYXR0ZXJucygwKQorUmVn
RXhwOjpSZWdFeHAoY29uc3QgVVN0cmluZyYgcGF0dGVybikKKyAgOiBtX3JlZkNvdW50KDApCisg
ICwgbV9wYXR0ZXJuKHBhdHRlcm4pCisgICwgbV9mbGFncygwKQorICAsIG1fY29uc3RydWN0aW9u
RXJyb3IoMCkKKyAgLCBtX251bVN1YlBhdHRlcm5zKDApCiB7Ci0jaWYgIVVTRShQT1NJWF9SRUdF
WCkKLQotICBpbnQgb3B0aW9ucyA9IDA7Ci0gIGlmIChmbGFncyAmIElnbm9yZUNhc2UpCi0gICAg
b3B0aW9ucyB8PSBKU19SRUdFWFBfQ0FTRUxFU1M7Ci0gIGlmIChmbGFncyAmIE11bHRpbGluZSkK
LSAgICBvcHRpb25zIHw9IEpTX1JFR0VYUF9NVUxUSUxJTkU7Ci0KLSAgY29uc3QgY2hhciogZXJy
b3JNZXNzYWdlOwotICBtX3JlZ2V4ID0ganNSZWdFeHBDb21waWxlKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgSlNSZWdFeHBDaGFyKj4ocC5kYXRhKCkpLCBwLnNpemUoKSwgb3B0aW9ucywKLSAgICAm
bV9udW1TdWJQYXR0ZXJucywgJmVycm9yTWVzc2FnZSk7Ci0gIGlmICghbV9yZWdleCkgewotICAg
IG1fY29uc3RydWN0aW9uRXJyb3IgPSBzdHJkdXAoZXJyb3JNZXNzYWdlKTsKLSAgICByZXR1cm47
Ci0gIH0KLQotI2Vsc2UgLyogVVNFKFBPU0lYX1JFR0VYKSAqLwotCi0gIGludCByZWdmbGFncyA9
IDA7Ci0jaWZkZWYgUkVHX0VYVEVOREVECi0gIHJlZ2ZsYWdzIHw9IFJFR19FWFRFTkRFRDsKLSNl
bmRpZgotI2lmZGVmIFJFR19JQ0FTRQotICBpZiAoZmxhZ3MgJiBJZ25vcmVDYXNlKQotICAgIHJl
Z2ZsYWdzIHw9IFJFR19JQ0FTRTsKLSNlbmRpZgotCi0gIC8vTk9URTogTXVsdGlsaW5lIGlzIG5v
dCBmZWFzaWJsZSB3aXRoIFBPU0lYIHJlZ2V4LgotICAvL2lmICggZiAmIE11bHRpbGluZSApCi0g
IC8vICAgIDsKLSAgLy8gTm90ZTogdGhlIEdsb2JhbCBmbGFnIGlzIGFscmVhZHkgaGFuZGxlZCBi
eSBSZWdFeHBQcm90b0Z1bmM6OmV4ZWN1dGUKLQotICAvLyBGSVhNRTogc3VwcG9ydCBcdSBVbmlj
b2RlIGVzY2FwZXMuCi0KLSAgaW50IGVycm9yQ29kZSA9IHJlZ2NvbXAoJm1fcmVnZXgsIHAuYXNj
aWkoKSwgcmVnZmxhZ3MpOwotICBpZiAoZXJyb3JDb2RlICE9IDApIHsKLSAgICBjaGFyIGVycm9y
TWVzc2FnZVs4MF07Ci0gICAgcmVnZXJyb3IoZXJyb3JDb2RlLCAmbV9yZWdleCwgZXJyb3JNZXNz
YWdlLCBzaXplb2YgZXJyb3JNZXNzYWdlKTsKLSAgICBtX2NvbnN0cnVjdGlvbkVycm9yID0gc3Ry
ZHVwKGVycm9yTWVzc2FnZSk7Ci0gIH0KKyAgICBjb25zdCBjaGFyKiBlcnJvck1lc3NhZ2U7Cisg
ICAgbV9yZWdFeHAgPSBqc1JlZ0V4cENvbXBpbGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBKU1Jl
Z0V4cENoYXIqPihtX3BhdHRlcm4uZGF0YSgpKSwgbV9wYXR0ZXJuLnNpemUoKSwgMCwgJm1fbnVt
U3ViUGF0dGVybnMsICZlcnJvck1lc3NhZ2UpOworICAgIGlmICghbV9yZWdFeHApCisgICAgICAg
IG1fY29uc3RydWN0aW9uRXJyb3IgPSBzdHJkdXAoZXJyb3JNZXNzYWdlKTsKK30KIAotI2VuZGlm
CitSZWdFeHA6OlJlZ0V4cChjb25zdCBVU3RyaW5nJiBwYXR0ZXJuLCBjb25zdCBVU3RyaW5nJiBm
bGFncykKKyAgOiBtX3JlZkNvdW50KDApCisgICwgbV9wYXR0ZXJuKHBhdHRlcm4pCisgICwgbV9m
bGFncygwKQorICAsIG1fY29uc3RydWN0aW9uRXJyb3IoMCkKKyAgLCBtX251bVN1YlBhdHRlcm5z
KDApCit7CisgICAgLy8gTk9URTogVGhlIGdsb2JhbCBmbGFnIGlzIGhhbmRsZWQgb24gYSBjYXNl
LWJ5LWNhc2UgYmFzaXMgYnkgZnVuY3Rpb25zIGxpa2UKKyAgICAvLyBTdHJpbmc6Om1hdGNoIGFu
ZCBSZWdFeHBJbXA6Om1hdGNoLgorICAgIGlmIChmbGFncy5maW5kKCdnJykgIT0gLTEpCisgICAg
ICAgIG1fZmxhZ3MgfD0gR2xvYmFsOworCisgICAgLy8gRklYTUU6IEVsaW1pbmF0ZSBkdXBsaWNh
dGlvbiBieSBtYWtpbmcgb3VyIGZsYWdzIG1hdGNoIHRoZSBKU19SRUdFWFAgZmxhZ3MuCisgICAg
aW50IG9wdGlvbnMgPSAwOworICAgIGlmIChmbGFncy5maW5kKCdpJykgIT0gLTEpIHsKKyAgICAg
ICAgbV9mbGFncyB8PSBJZ25vcmVDYXNlOworICAgICAgICBvcHRpb25zIHw9IEpTX1JFR0VYUF9D
QVNFTEVTUzsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MuZmluZCgnbScpICE9IC0xKSB7CisgICAg
ICAgIG1fZmxhZ3MgfD0gTXVsdGlsaW5lOworICAgICAgICBvcHRpb25zIHw9IEpTX1JFR0VYUF9N
VUxUSUxJTkU7CisgICAgfQorICAgIAorICAgIGNvbnN0IGNoYXIqIGVycm9yTWVzc2FnZTsKKyAg
ICBtX3JlZ0V4cCA9IGpzUmVnRXhwQ29tcGlsZShyZWludGVycHJldF9jYXN0PGNvbnN0IEpTUmVn
RXhwQ2hhcio+KG1fcGF0dGVybi5kYXRhKCkpLCBtX3BhdHRlcm4uc2l6ZSgpLCBvcHRpb25zLCAm
bV9udW1TdWJQYXR0ZXJucywgJmVycm9yTWVzc2FnZSk7CisgICAgaWYgKCFtX3JlZ0V4cCkKKyAg
ICAgICAgbV9jb25zdHJ1Y3Rpb25FcnJvciA9IHN0cmR1cChlcnJvck1lc3NhZ2UpOwogfQogCiBS
ZWdFeHA6On5SZWdFeHAoKQogewotI2lmICFVU0UoUE9TSVhfUkVHRVgpCi0gIGpzUmVnRXhwRnJl
ZShtX3JlZ2V4KTsKLSNlbHNlCi0gIC8qIFRPRE86IGlzIHRoaXMgcmVhbGx5IG9rYXkgYWZ0ZXIg
YW4gZXJyb3IgPyAqLwotICByZWdmcmVlKCZtX3JlZ2V4KTsKLSNlbmRpZgorICBqc1JlZ0V4cEZy
ZWUobV9yZWdFeHApOwogICBmcmVlKG1fY29uc3RydWN0aW9uRXJyb3IpOwogfQogCkBAIC05OCw5
ICs4OSw3IEBAIGludCBSZWdFeHA6Om1hdGNoKGNvbnN0IFVTdHJpbmcmIHMsIGludCAKICAgaWYg
KGkgPiBzLnNpemUoKSB8fCBzLmlzTnVsbCgpKQogICAgIHJldHVybiAtMTsKIAotI2lmICFVU0Uo
UE9TSVhfUkVHRVgpCi0KLSAgaWYgKCFtX3JlZ2V4KQorICBpZiAoIW1fcmVnRXhwKQogICAgIHJl
dHVybiAtMTsKIAogICAvLyBTZXQgdXAgdGhlIG9mZnNldCB2ZWN0b3IgZm9yIHRoZSByZXN1bHQu
CkBAIC0xMTcsNyArMTA2LDcgQEAgaW50IFJlZ0V4cDo6bWF0Y2goY29uc3QgVVN0cmluZyYgcywg
aW50IAogICAgIG92ZWN0b3ItPnNldChvZmZzZXRWZWN0b3IpOwogICB9CiAKLSAgaW50IG51bU1h
dGNoZXMgPSBqc1JlZ0V4cEV4ZWN1dGUobV9yZWdleCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBK
U1JlZ0V4cENoYXIqPihzLmRhdGEoKSksIHMuc2l6ZSgpLCBpLCBvZmZzZXRWZWN0b3IsIG9mZnNl
dFZlY3RvclNpemUpOworICBpbnQgbnVtTWF0Y2hlcyA9IGpzUmVnRXhwRXhlY3V0ZShtX3JlZ0V4
cCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBKU1JlZ0V4cENoYXIqPihzLmRhdGEoKSksIHMuc2l6
ZSgpLCBpLCBvZmZzZXRWZWN0b3IsIG9mZnNldFZlY3RvclNpemUpOwogCiAgIGlmIChudW1NYXRj
aGVzIDwgMCkgewogI2lmbmRlZiBOREVCVUcKQEAgLTEzMCw0MSArMTE5LDYgQEAgaW50IFJlZ0V4
cDo6bWF0Y2goY29uc3QgVVN0cmluZyYgcywgaW50IAogICB9CiAKICAgcmV0dXJuIG9mZnNldFZl
Y3RvclswXTsKLQotI2Vsc2UKLQotICBjb25zdCB1bnNpZ25lZCBtYXhNYXRjaCA9IDEwOwotICBy
ZWdtYXRjaF90IHJtYXRjaFttYXhNYXRjaF07Ci0KLSAgY2hhciAqc3RyID0gc3RyZHVwKHMuYXNj
aWkoKSk7IC8vIFRPRE86IHdoeSA/Pz8KLSAgaWYgKHJlZ2V4ZWMoJm1fcmVnZXgsIHN0ciArIGks
IG1heE1hdGNoLCBybWF0Y2gsIDApKSB7Ci0gICAgZnJlZShzdHIpOwotICAgIHJldHVybiBVU3Ry
aW5nOjpudWxsKCk7Ci0gIH0KLSAgZnJlZShzdHIpOwotCi0gIGlmICghb3ZlY3RvcikgewotICAg
ICpwb3MgPSBybWF0Y2hbMF0ucm1fc28gKyBpOwotICAgIHJldHVybiBzLnN1YnN0cihybWF0Y2hb
MF0ucm1fc28gKyBpLCBybWF0Y2hbMF0ucm1fZW8gLSBybWF0Y2hbMF0ucm1fc28pOwotICB9Ci0K
LSAgLy8gbWFwIHJtYXRjaCBhcnJheSB0byBvdmVjdG9yIHVzZWQgaW4gUENSRSBjYXNlCi0gIG1f
bnVtU3ViUGF0dGVybnMgPSAwOwotICBmb3IodW5zaWduZWQgaiA9IDE7IGogPCBtYXhNYXRjaCAm
JiBybWF0Y2hbal0ucm1fc28gPj0gMCA7IGorKykKLSAgICAgIG1fbnVtU3ViUGF0dGVybnMrKzsK
LSAgaW50IG92ZWNzaXplID0gKG1fbnVtU3ViUGF0dGVybnMrMSkqMzsgLy8gc2VlIGFib3ZlCi0g
ICpvdmVjdG9yID0gbmV3IGludFtvdmVjc2l6ZV07Ci0gIGZvciAodW5zaWduZWQgaiA9IDA7IGog
PCBtX251bVN1YlBhdHRlcm5zICsgMTsgaisrKSB7Ci0gICAgaWYgKGo+bWF4TWF0Y2gpCi0gICAg
ICBicmVhazsKLSAgICAoKm92ZWN0b3IpWzIqal0gPSBybWF0Y2hbal0ucm1fc28gKyBpOwotICAg
ICgqb3ZlY3RvcilbMipqKzFdID0gcm1hdGNoW2pdLnJtX2VvICsgaTsKLSAgfQotCi0gICpwb3Mg
PSAoKm92ZWN0b3IpWzBdOwotICByZXR1cm4gcy5zdWJzdHIoKCpvdmVjdG9yKVswXSwgKCpvdmVj
dG9yKVsxXSAtICgqb3ZlY3RvcilbMF0pOwotCi0jZW5kaWYKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
S0pTCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvcmVnZXhwLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUva2pzL3JlZ2V4cC5oCShyZXZpc2lvbiAyNzUwMSkKKysrIEphdmFTY3JpcHRD
b3JlL2tqcy9yZWdleHAuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsNDMgKzIyLDUyIEBACiAjaWZu
ZGVmIEtKU19SRUdFWFBfSAogI2RlZmluZSBLSlNfUkVHRVhQX0gKIAotI2luY2x1ZGUgPHN5cy90
eXBlcy5oPgotCi0jaWYgIVVTRShQT1NJWF9SRUdFWCkKLSNpbmNsdWRlIDxwY3JlLmg+Ci0jZWxz
ZQotLy8gUE9TSVggcmVnZXggLSBub3Qgc28gZ29vZC4KLWV4dGVybiAiQyIgeyAvLyBidWcgd2l0
aCBzb21lIGxpYmM1IGRpc3RyaWJ1dGlvbnMKLSNpbmNsdWRlIDxyZWdleC5oPgotfQotI2VuZGlm
Ci0KICNpbmNsdWRlICJ1c3RyaW5nLmgiCisjaW5jbHVkZSA8cGNyZS5oPgorI2luY2x1ZGUgPHN5
cy90eXBlcy5oPgogI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgogCiBuYW1lc3BhY2UgS0pT
IHsKIAogICBjbGFzcyBSZWdFeHAgOiBOb25jb3B5YWJsZSB7Ci0gIHB1YmxpYzoKLSAgICBlbnVt
IHsgTm9uZSA9IDAsIEdsb2JhbCA9IDEsIElnbm9yZUNhc2UgPSAyLCBNdWx0aWxpbmUgPSA0IH07
CisgIHByaXZhdGU6CisgICAgZW51bSB7IAorICAgICAgICBHbG9iYWwgPSAxLCAKKyAgICAgICAg
SWdub3JlQ2FzZSA9IDIsIAorICAgICAgICBNdWx0aWxpbmUgPSA0IAorICAgIH07CiAKLSAgICBS
ZWdFeHAoY29uc3QgVVN0cmluZyYgcGF0dGVybiwgaW50IGZsYWdzID0gTm9uZSk7CisgIHB1Ymxp
YzoKKyAgICBSZWdFeHAoY29uc3QgVVN0cmluZyYgcGF0dGVybik7CisgICAgUmVnRXhwKGNvbnN0
IFVTdHJpbmcmIHBhdHRlcm4sIGNvbnN0IFVTdHJpbmcmIGZsYWdzKTsKICAgICB+UmVnRXhwKCk7
CisgICAgCisgICAgdm9pZCByZWYoKSB7ICsrbV9yZWZDb3VudDsgfQorICAgIHZvaWQgZGVyZWYo
KSB7IGlmICgtLW1fcmVmQ291bnQgPT0gMCkgZGVsZXRlIHRoaXM7IH0KKyAgICBpbnQgcmVmQ291
bnQoKSB7IHJldHVybiBtX3JlZkNvdW50OyB9CisKKyAgICBib29sIGdsb2JhbCgpIGNvbnN0IHsg
cmV0dXJuIG1fZmxhZ3MgJiBHbG9iYWw7IH0KKyAgICBib29sIGlnbm9yZUNhc2UoKSBjb25zdCB7
IHJldHVybiBtX2ZsYWdzICYgSWdub3JlQ2FzZTsgfQorICAgIGJvb2wgbXVsdGlsaW5lKCkgY29u
c3QgeyByZXR1cm4gbV9mbGFncyAmIE11bHRpbGluZTsgfQorICAgIGNvbnN0IFVTdHJpbmcmIHBh
dHRlcm4oKSBjb25zdCB7IHJldHVybiBtX3BhdHRlcm47IH0KIAotICAgIGludCBmbGFncygpIGNv
bnN0IHsgcmV0dXJuIG1fZmxhZ3M7IH0KICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVy
biAhbV9jb25zdHJ1Y3Rpb25FcnJvcjsgfQogICAgIGNvbnN0IGNoYXIqIGVycm9yTWVzc2FnZSgp
IGNvbnN0IHsgcmV0dXJuIG1fY29uc3RydWN0aW9uRXJyb3I7IH0KIAogICAgIGludCBtYXRjaChj
b25zdCBVU3RyaW5nJiwgaW50IG9mZnNldCwgT3duQXJyYXlQdHI8aW50Piogb3ZlY3RvciA9IDAp
OwotICAgIHVuc2lnbmVkIHN1YlBhdHRlcm5zKCkgY29uc3QgeyByZXR1cm4gbV9udW1TdWJQYXR0
ZXJuczsgfQorICAgIHVuc2lnbmVkIG51bVN1YlBhdHRlcm5zKCkgY29uc3QgeyByZXR1cm4gbV9u
dW1TdWJQYXR0ZXJuczsgfQogCiAgIHByaXZhdGU6Ci0jaWYgIVVTRShQT1NJWF9SRUdFWCkKLSAg
ICBKU1JlZ0V4cCogbV9yZWdleDsKLSNlbHNlCi0gICAgcmVnZXhfdCBtX3JlZ2V4OwotI2VuZGlm
CisgICAgdm9pZCBjb21waWxlKCk7CisgICAgCisgICAgaW50IG1fcmVmQ291bnQ7CisgICAgCisg
ICAgLy8gRGF0YSBzdXBwbGllZCBieSBjYWxsZXIuCisgICAgVVN0cmluZyBtX3BhdHRlcm47CiAg
ICAgaW50IG1fZmxhZ3M7CisKKyAgICAvLyBEYXRhIHN1cHBsaWVkIGJ5IFBDUkUuCisgICAgSlNS
ZWdFeHAqIG1fcmVnRXhwOwogICAgIGNoYXIqIG1fY29uc3RydWN0aW9uRXJyb3I7CiAgICAgdW5z
aWduZWQgbV9udW1TdWJQYXR0ZXJuczsKICAgfTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9y
ZWdleHBfb2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvcmVnZXhw
X29iamVjdC5jcHAJKHJldmlzaW9uIDI3NTAxKQorKysgSmF2YVNjcmlwdENvcmUva2pzL3JlZ2V4
cF9vYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04NCw1MiArODQsMjUgQEAgSlNWYWx1ZSAq
UmVnRXhwUHJvdG9GdW5jOjpjYWxsQXNGdW5jdGlvbgogICAgICAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlZ0V4cEltcCo+KHRoaXNPYmopLT5leGVjKGV4ZWMsIGFyZ3MpOwogICBjYXNlIENv
bXBpbGU6CiAgIHsKLSAgICBVU3RyaW5nIHNvdXJjZTsKLSAgICBib29sIGdsb2JhbCA9IGZhbHNl
OwotICAgIGJvb2wgaWdub3JlQ2FzZSA9IGZhbHNlOwotICAgIGJvb2wgbXVsdGlsaW5lID0gZmFs
c2U7Ci0gICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgaWYgKGFyZ3NbMF0tPmlzT2Jq
ZWN0KCZSZWdFeHBJbXA6OmluZm8pKSB7Ci0gICAgICAgIGlmIChhcmdzLnNpemUoKSAhPSAxKQot
ICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvciwgImNhbm5vdCBzdXBw
bHkgZmxhZ3Mgd2hlbiBjb25zdHJ1Y3Rpbmcgb25lIFJlZ0V4cCBmcm9tIGFub3RoZXIuIik7Ci0K
LSAgICAgICAgLy8gRmxhZ3MgYXJlIG1pcnJvcmVkIG9uIHRoZSBKUyBvYmplY3QgYW5kIGluIHRo
ZSBpbXBsZW1lbnRhdGlvbiwgd2hpbGUgc291cmNlIGlzIG9ubHkgcHJlc2VydmVkIG9uIHRoZSBK
UyBvYmplY3QuCi0gICAgICAgIFJlZ0V4cCogcmhzUmVnRXhwID0gc3RhdGljX2Nhc3Q8UmVnRXhw
SW1wKj4oYXJnc1swXSktPnJlZ0V4cCgpOwotICAgICAgICBnbG9iYWwgPSByaHNSZWdFeHAtPmZs
YWdzKCkgJiBSZWdFeHA6Okdsb2JhbDsKLSAgICAgICAgaWdub3JlQ2FzZSA9IHJoc1JlZ0V4cC0+
ZmxhZ3MoKSAmIFJlZ0V4cDo6SWdub3JlQ2FzZTsKLSAgICAgICAgbXVsdGlsaW5lID0gcmhzUmVn
RXhwLT5mbGFncygpICYgUmVnRXhwOjpNdWx0aWxpbmU7Ci0gICAgICAgIHNvdXJjZSA9IHN0YXRp
Y19jYXN0PFJlZ0V4cEltcCo+KGFyZ3NbMF0pLT5nZXQoZXhlYywgZXhlYy0+cHJvcGVydHlOYW1l
cygpLnNvdXJjZSktPnRvU3RyaW5nKGV4ZWMpOwotICAgICAgfSBlbHNlCi0gICAgICAgIHNvdXJj
ZSA9IGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpOwotCi0gICAgICBpZiAoIWFyZ3NbMV0tPmlzVW5k
ZWZpbmVkKCkpIHsKLSAgICAgICAgVVN0cmluZyBmbGFncyA9IGFyZ3NbMV0tPnRvU3RyaW5nKGV4
ZWMpOwotCi0gICAgICAgIGdsb2JhbCA9IChmbGFncy5maW5kKCJnIikgPj0gMCk7Ci0gICAgICAg
IGlnbm9yZUNhc2UgPSAoZmxhZ3MuZmluZCgiaSIpID49IDApOwotICAgICAgICBtdWx0aWxpbmUg
PSAoZmxhZ3MuZmluZCgibSIpID49IDApOwotICAgICAgfQorICAgIFJlZlB0cjxSZWdFeHA+IHJl
Z0V4cDsKKyAgICBKU1ZhbHVlKiBhcmcwID0gYXJnc1swXTsKKyAgICBKU1ZhbHVlKiBhcmcxID0g
YXJnc1sxXTsKKyAgICAKKyAgICBpZiAoYXJnMC0+aXNPYmplY3QoJlJlZ0V4cEltcDo6aW5mbykp
IHsKKyAgICAgIGlmICghYXJnMS0+aXNVbmRlZmluZWQoKSkKKyAgICAgICAgcmV0dXJuIHRocm93
RXJyb3IoZXhlYywgVHlwZUVycm9yLCAiQ2Fubm90IHN1cHBseSBmbGFncyB3aGVuIGNvbnN0cnVj
dGluZyBvbmUgUmVnRXhwIGZyb20gYW5vdGhlci4iKTsKKyAgICAgIHJlZ0V4cCA9IHN0YXRpY19j
YXN0PFJlZ0V4cEltcCo+KGFyZzApLT5yZWdFeHAoKTsKKyAgICB9IGVsc2UgeworICAgICAgVVN0
cmluZyBwYXR0ZXJuID0gYXJncy5pc0VtcHR5KCkgPyBVU3RyaW5nKCIiKSA6IGFyZzAtPnRvU3Ry
aW5nKGV4ZWMpOworICAgICAgVVN0cmluZyBmbGFncyA9IGFyZzEtPmlzVW5kZWZpbmVkKCkgPyBV
U3RyaW5nKCIiKSA6IGFyZzEtPnRvU3RyaW5nKGV4ZWMpOworICAgICAgcmVnRXhwID0gbmV3IFJl
Z0V4cChwYXR0ZXJuLCBmbGFncyk7CiAgICAgfQogCi0gICAgaW50IHJlZmxhZ3MgPSBSZWdFeHA6
Ok5vbmU7Ci0gICAgaWYgKGdsb2JhbCkKLSAgICAgICAgcmVmbGFncyB8PSBSZWdFeHA6Okdsb2Jh
bDsKLSAgICBpZiAoaWdub3JlQ2FzZSkKLSAgICAgICAgcmVmbGFncyB8PSBSZWdFeHA6Oklnbm9y
ZUNhc2U7Ci0gICAgaWYgKG11bHRpbGluZSkKLSAgICAgICAgcmVmbGFncyB8PSBSZWdFeHA6Ok11
bHRpbGluZTsKLQotICAgIE93blB0cjxSZWdFeHA+IG5ld1JlZ0V4cChuZXcgUmVnRXhwKHNvdXJj
ZSwgcmVmbGFncykpOwotICAgIGlmICghbmV3UmVnRXhwLT5pc1ZhbGlkKCkpCi0gICAgICAgIHJl
dHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yLCBVU3RyaW5nKCJJbnZhbGlkIHJlZ3Vs
YXIgZXhwcmVzc2lvbjogIikuYXBwZW5kKG5ld1JlZ0V4cC0+ZXJyb3JNZXNzYWdlKCkpKTsKLQot
ICAgIHRoaXNPYmotPnB1dERpcmVjdChleGVjLT5wcm9wZXJ0eU5hbWVzKCkuZ2xvYmFsLCBqc0Jv
b2xlYW4oZ2xvYmFsKSwgRG9udERlbGV0ZSB8IFJlYWRPbmx5IHwgRG9udEVudW0pOwotICAgIHRo
aXNPYmotPnB1dERpcmVjdChleGVjLT5wcm9wZXJ0eU5hbWVzKCkuaWdub3JlQ2FzZSwganNCb29s
ZWFuKGlnbm9yZUNhc2UpLCBEb250RGVsZXRlIHwgUmVhZE9ubHkgfCBEb250RW51bSk7Ci0gICAg
dGhpc09iai0+cHV0RGlyZWN0KGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5tdWx0aWxpbmUsIGpzQm9v
bGVhbihtdWx0aWxpbmUpLCBEb250RGVsZXRlIHwgUmVhZE9ubHkgfCBEb250RW51bSk7Ci0gICAg
dGhpc09iai0+cHV0RGlyZWN0KGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5zb3VyY2UsIGpzU3RyaW5n
KHNvdXJjZSksIERvbnREZWxldGUgfCBSZWFkT25seSB8IERvbnRFbnVtKTsKLSAgICB0aGlzT2Jq
LT5wdXREaXJlY3QoZXhlYy0+cHJvcGVydHlOYW1lcygpLmxhc3RJbmRleCwganNOdW1iZXIoMCks
IERvbnREZWxldGUgfCBEb250RW51bSk7CisgICAgaWYgKCFyZWdFeHAtPmlzVmFsaWQoKSkKKyAg
ICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yLCBVU3RyaW5nKCJJbnZhbGlk
IHJlZ3VsYXIgZXhwcmVzc2lvbjogIikuYXBwZW5kKHJlZ0V4cC0+ZXJyb3JNZXNzYWdlKCkpKTsK
IAotICAgIHN0YXRpY19jYXN0PFJlZ0V4cEltcCo+KHRoaXNPYmopLT5zZXRSZWdFeHAobmV3UmVn
RXhwLnJlbGVhc2UoKSk7CisgICAgc3RhdGljX2Nhc3Q8UmVnRXhwSW1wKj4odGhpc09iaiktPnNl
dFJlZ0V4cChyZWdFeHAucmVsZWFzZSgpKTsKKyAgICBzdGF0aWNfY2FzdDxSZWdFeHBJbXAqPih0
aGlzT2JqKS0+cHV0KGV4ZWMsIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5sYXN0SW5kZXgsIGpzTnVt
YmVyKDApLCBEb250RGVsZXRlfERvbnRFbnVtKTsKICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsK
ICAgfQogICBjYXNlIFRvU3RyaW5nOgpAQCAtMTUxLDExICsxMjQsMjIgQEAgSlNWYWx1ZSAqUmVn
RXhwUHJvdG9GdW5jOjpjYWxsQXNGdW5jdGlvbgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gUmVnRXhwSW1wIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
Ci1jb25zdCBDbGFzc0luZm8gUmVnRXhwSW1wOjppbmZvID0geyAiUmVnRXhwIiwgMCwgMCB9Owor
Y29uc3QgQ2xhc3NJbmZvIFJlZ0V4cEltcDo6aW5mbyA9IHsgIlJlZ0V4cCIsIDAsICZSZWdFeHBJ
bXBUYWJsZSB9OwogCi1SZWdFeHBJbXA6OlJlZ0V4cEltcChSZWdFeHBQcm90b3R5cGUqIHJlZ2V4
cFByb3RvLCBSZWdFeHAqIGV4cCkKKy8qIFNvdXJjZSBmb3IgcmVnZXhwX29iamVjdC5sdXQuaAor
QGJlZ2luIFJlZ0V4cEltcFRhYmxlIDUKKyAgICBnbG9iYWwgICAgICAgIFJlZ0V4cEltcDo6R2xv
YmFsICAgICAgIERvbnREZWxldGV8UmVhZE9ubHl8RG9udEVudW0KKyAgICBpZ25vcmVDYXNlICAg
IFJlZ0V4cEltcDo6SWdub3JlQ2FzZSAgIERvbnREZWxldGV8UmVhZE9ubHl8RG9udEVudW0KKyAg
ICBtdWx0aWxpbmUgICAgIFJlZ0V4cEltcDo6TXVsdGlsaW5lICAgIERvbnREZWxldGV8UmVhZE9u
bHl8RG9udEVudW0KKyAgICBzb3VyY2UgICAgICAgIFJlZ0V4cEltcDo6U291cmNlICAgICAgIERv
bnREZWxldGV8UmVhZE9ubHl8RG9udEVudW0KKyAgICBsYXN0SW5kZXggICAgIFJlZ0V4cEltcDo6
TGFzdEluZGV4ICAgIERvbnREZWxldGV8RG9udEVudW0KK0BlbmQKKyovCisKK1JlZ0V4cEltcDo6
UmVnRXhwSW1wKFJlZ0V4cFByb3RvdHlwZSogcmVnZXhwUHJvdG8sIFBhc3NSZWZQdHI8UmVnRXhw
PiByZWdFeHApCiAgIDogSlNPYmplY3QocmVnZXhwUHJvdG8pCi0gICwgbV9yZWdFeHAoZXhwKQor
ICAsIG1fcmVnRXhwKHJlZ0V4cCkKKyAgLCBtX2xhc3RJbmRleCgwKQogewogfQogCkBAIC0xNjMs
NiArMTQ3LDQyIEBAIFJlZ0V4cEltcDo6flJlZ0V4cEltcCgpCiB7CiB9CiAKK2Jvb2wgUmVnRXhw
SW1wOjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgcmV0dXJuIGdldFN0YXRp
Y1ZhbHVlU2xvdDxSZWdFeHBJbXAsIEpTT2JqZWN0PihleGVjLCAmUmVnRXhwSW1wVGFibGUsIHRo
aXMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Cit9CisKK0pTVmFsdWUqIFJlZ0V4cEltcDo6Z2V0VmFs
dWVQcm9wZXJ0eShFeGVjU3RhdGUqLCBpbnQgdG9rZW4pIGNvbnN0Cit7CisgICAgc3dpdGNoICh0
b2tlbikgeworICAgICAgICBjYXNlIEdsb2JhbDoKKyAgICAgICAgICAgIHJldHVybiBqc0Jvb2xl
YW4obV9yZWdFeHAtPmdsb2JhbCgpKTsKKyAgICAgICAgY2FzZSBJZ25vcmVDYXNlOgorICAgICAg
ICAgICAgcmV0dXJuIGpzQm9vbGVhbihtX3JlZ0V4cC0+aWdub3JlQ2FzZSgpKTsKKyAgICAgICAg
Y2FzZSBNdWx0aWxpbmU6CisgICAgICAgICAgICByZXR1cm4ganNCb29sZWFuKG1fcmVnRXhwLT5t
dWx0aWxpbmUoKSk7CisgICAgICAgIGNhc2UgU291cmNlOgorICAgICAgICAgICAgcmV0dXJuIGpz
U3RyaW5nKG1fcmVnRXhwLT5wYXR0ZXJuKCkpOworICAgICAgICBjYXNlIExhc3RJbmRleDoKKyAg
ICAgICAgICAgIHJldHVybiBqc051bWJlcihtX2xhc3RJbmRleCk7CisgICAgfQorICAgIAorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFJlZ0V4cElt
cDo6cHV0KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBK
U1ZhbHVlKiB2YWx1ZSwgaW50IGF0dHJpYnV0ZXMpCit7CisgICAgbG9va3VwUHV0PFJlZ0V4cElt
cCwgSlNPYmplY3Q+KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMsICZSZWdF
eHBJbXBUYWJsZSwgdGhpcyk7Cit9CisKK3ZvaWQgUmVnRXhwSW1wOjpwdXRWYWx1ZVByb3BlcnR5
KEV4ZWNTdGF0ZSogZXhlYywgaW50IHRva2VuLCBKU1ZhbHVlKiB2YWx1ZSwgaW50KQoreworICAg
IFVOVVNFRF9QQVJBTSh0b2tlbik7CisgICAgQVNTRVJUKHRva2VuID09IExhc3RJbmRleCk7Cisg
ICAgbV9sYXN0SW5kZXggPSB2YWx1ZS0+dG9JbnRlZ2VyKGV4ZWMpOworfQorCiBib29sIFJlZ0V4
cEltcDo6bWF0Y2goRXhlY1N0YXRlKiBleGVjLCBjb25zdCBMaXN0JiBhcmdzKQogewogICAgIFJl
Z0V4cE9iamVjdEltcCogcmVnRXhwT2JqID0gZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmJ1
aWx0aW5SZWdFeHAoKTsKQEAgLTIyNSwxMCArMjQ1LDEwIEBAIEpTVmFsdWUqIFJlZ0V4cEltcDo6
Y2FsbEFzRnVuY3Rpb24oRXhlY1MKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
IFJlZ0V4cE9iamVjdEltcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY29uc3Qg
Q2xhc3NJbmZvIFJlZ0V4cE9iamVjdEltcDo6aW5mbyA9IHsgIkZ1bmN0aW9uIiwgJkludGVybmFs
RnVuY3Rpb25JbXA6OmluZm8sICZSZWdFeHBUYWJsZSB9OworY29uc3QgQ2xhc3NJbmZvIFJlZ0V4
cE9iamVjdEltcDo6aW5mbyA9IHsgIkZ1bmN0aW9uIiwgJkludGVybmFsRnVuY3Rpb25JbXA6Omlu
Zm8sICZSZWdFeHBPYmplY3RJbXBUYWJsZSB9OwogCiAvKiBTb3VyY2UgZm9yIHJlZ2V4cF9vYmpl
Y3QubHV0LmgKLUBiZWdpbiBSZWdFeHBUYWJsZSAyMAorQGJlZ2luIFJlZ0V4cE9iamVjdEltcFRh
YmxlIDIxCiAgIGlucHV0ICAgICAgICAgICBSZWdFeHBPYmplY3RJbXA6OklucHV0ICAgICAgICAg
IE5vbmUKICAgJF8gICAgICAgICAgICAgIFJlZ0V4cE9iamVjdEltcDo6SW5wdXQgICAgICAgICAg
RG9udEVudW0KICAgbXVsdGlsaW5lICAgICAgIFJlZ0V4cE9iamVjdEltcDo6TXVsdGlsaW5lICAg
ICAgTm9uZQpAQCAtMjkzLDcgKzMxMyw3IEBAIHZvaWQgUmVnRXhwT2JqZWN0SW1wOjpwZXJmb3Jt
TWF0Y2goUmVnRXgKIAogICAgIGQtPmxhc3RJbnB1dCA9IHM7CiAgICAgZC0+bGFzdE92ZWN0b3Iu
c2V0KHRtcE92ZWN0b3IucmVsZWFzZSgpKTsKLSAgICBkLT5sYXN0TnVtU3ViUGF0dGVybnMgPSBy
LT5zdWJQYXR0ZXJucygpOworICAgIGQtPmxhc3ROdW1TdWJQYXR0ZXJucyA9IHItPm51bVN1YlBh
dHRlcm5zKCk7CiAgIH0KIH0KIApAQCAtMzQ2LDcgKzM2Niw3IEBAIEpTVmFsdWUgKlJlZ0V4cE9i
amVjdEltcDo6Z2V0UmlnaHRDb250ZXgKIAogYm9vbCBSZWdFeHBPYmplY3RJbXA6OmdldE93blBy
b3BlcnR5U2xvdChFeGVjU3RhdGUgKmV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFt
ZSwgUHJvcGVydHlTbG90JiBzbG90KQogewotICByZXR1cm4gZ2V0U3RhdGljVmFsdWVTbG90PFJl
Z0V4cE9iamVjdEltcCwgSW50ZXJuYWxGdW5jdGlvbkltcD4oZXhlYywgJlJlZ0V4cFRhYmxlLCB0
aGlzLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworICByZXR1cm4gZ2V0U3RhdGljVmFsdWVTbG90PFJl
Z0V4cE9iamVjdEltcCwgSW50ZXJuYWxGdW5jdGlvbkltcD4oZXhlYywgJlJlZ0V4cE9iamVjdElt
cFRhYmxlLCB0aGlzLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwogfQogCiBKU1ZhbHVlICpSZWdFeHBP
YmplY3RJbXA6OmdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlKiwgaW50IHRva2VuKSBjb25zdApA
QCAtMzkxLDcgKzQxMSw3IEBAIEpTVmFsdWUgKlJlZ0V4cE9iamVjdEltcDo6Z2V0VmFsdWVQcm9w
ZXIKIAogdm9pZCBSZWdFeHBPYmplY3RJbXA6OnB1dChFeGVjU3RhdGUgKmV4ZWMsIGNvbnN0IElk
ZW50aWZpZXIgJnByb3BlcnR5TmFtZSwgSlNWYWx1ZSAqdmFsdWUsIGludCBhdHRyKQogewotICBs
b29rdXBQdXQ8UmVnRXhwT2JqZWN0SW1wLCBJbnRlcm5hbEZ1bmN0aW9uSW1wPihleGVjLCBwcm9w
ZXJ0eU5hbWUsIHZhbHVlLCBhdHRyLCAmUmVnRXhwVGFibGUsIHRoaXMpOworICBsb29rdXBQdXQ8
UmVnRXhwT2JqZWN0SW1wLCBJbnRlcm5hbEZ1bmN0aW9uSW1wPihleGVjLCBwcm9wZXJ0eU5hbWUs
IHZhbHVlLCBhdHRyLCAmUmVnRXhwT2JqZWN0SW1wVGFibGUsIHRoaXMpOwogfQogCiB2b2lkIFJl
Z0V4cE9iamVjdEltcDo6cHV0VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUgKmV4ZWMsIGludCB0b2tl
biwgSlNWYWx1ZSAqdmFsdWUsIGludCkKQEAgLTQxOSw0NCArNDM5LDE5IEBAIEpTT2JqZWN0ICpS
ZWdFeHBPYmplY3RJbXA6OmNvbnN0cnVjdChFeGUKICAgSlNWYWx1ZSogYXJnMCA9IGFyZ3NbMF07
CiAgIEpTVmFsdWUqIGFyZzEgPSBhcmdzWzFdOwogICAKLSAgSlNPYmplY3QqIG8gPSBhcmcwLT5n
ZXRPYmplY3QoKTsKLSAgaWYgKG8gJiYgby0+aW5oZXJpdHMoJlJlZ0V4cEltcDo6aW5mbykpIHsK
KyAgaWYgKGFyZzAtPmlzT2JqZWN0KCZSZWdFeHBJbXA6OmluZm8pKSB7CiAgICAgaWYgKCFhcmcx
LT5pc1VuZGVmaW5lZCgpKQotICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9y
KTsKLSAgICByZXR1cm4gbzsKKyAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJv
ciwgIkNhbm5vdCBzdXBwbHkgZmxhZ3Mgd2hlbiBjb25zdHJ1Y3Rpbmcgb25lIFJlZ0V4cCBmcm9t
IGFub3RoZXIuIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oYXJnMCk7CiAg
IH0KICAgCi0gIFVTdHJpbmcgcCA9IGFyZzAtPmlzVW5kZWZpbmVkKCkgPyBVU3RyaW5nKCIiKSA6
IGFyZzAtPnRvU3RyaW5nKGV4ZWMpOworICBVU3RyaW5nIHBhdHRlcm4gPSBhcmcwLT5pc1VuZGVm
aW5lZCgpID8gVVN0cmluZygiIikgOiBhcmcwLT50b1N0cmluZyhleGVjKTsKICAgVVN0cmluZyBm
bGFncyA9IGFyZzEtPmlzVW5kZWZpbmVkKCkgPyBVU3RyaW5nKCIiKSA6IGFyZzEtPnRvU3RyaW5n
KGV4ZWMpOworICBSZWZQdHI8UmVnRXhwPiByZWdFeHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZs
YWdzKTsKIAotICBSZWdFeHBQcm90b3R5cGUqIHByb3RvID0gc3RhdGljX2Nhc3Q8UmVnRXhwUHJv
dG90eXBlKj4oZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmJ1aWx0aW5SZWdFeHBQcm90b3R5
cGUoKSk7Ci0KLSAgYm9vbCBnbG9iYWwgPSAoZmxhZ3MuZmluZCgnZycpID49IDApOwotICBib29s
IGlnbm9yZUNhc2UgPSAoZmxhZ3MuZmluZCgnaScpID49IDApOwotICBib29sIG11bHRpbGluZSA9
IChmbGFncy5maW5kKCdtJykgPj0gMCk7Ci0KLSAgaW50IHJlZmxhZ3MgPSBSZWdFeHA6Ok5vbmU7
Ci0gIGlmIChnbG9iYWwpCi0gICAgICByZWZsYWdzIHw9IFJlZ0V4cDo6R2xvYmFsOwotICBpZiAo
aWdub3JlQ2FzZSkKLSAgICAgIHJlZmxhZ3MgfD0gUmVnRXhwOjpJZ25vcmVDYXNlOwotICBpZiAo
bXVsdGlsaW5lKQotICAgICAgcmVmbGFncyB8PSBSZWdFeHA6Ok11bHRpbGluZTsKLQotICBPd25Q
dHI8UmVnRXhwPiByZShuZXcgUmVnRXhwKHAsIHJlZmxhZ3MpKTsKLSAgaWYgKCFyZS0+aXNWYWxp
ZCgpKQotICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IsIFVTdHJpbmco
IkludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAiKS5hcHBlbmQocmUtPmVycm9yTWVzc2FnZSgp
KSk7Ci0KLSAgUmVnRXhwSW1wKiBkYXQgPSBuZXcgUmVnRXhwSW1wKHByb3RvLCByZS5yZWxlYXNl
KCkpOwotCi0gIGRhdC0+cHV0RGlyZWN0KGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5nbG9iYWwsIGpz
Qm9vbGVhbihnbG9iYWwpLCBEb250RGVsZXRlIHwgUmVhZE9ubHkgfCBEb250RW51bSk7Ci0gIGRh
dC0+cHV0RGlyZWN0KGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5pZ25vcmVDYXNlLCBqc0Jvb2xlYW4o
aWdub3JlQ2FzZSksIERvbnREZWxldGUgfCBSZWFkT25seSB8IERvbnRFbnVtKTsKLSAgZGF0LT5w
dXREaXJlY3QoZXhlYy0+cHJvcGVydHlOYW1lcygpLm11bHRpbGluZSwganNCb29sZWFuKG11bHRp
bGluZSksIERvbnREZWxldGUgfCBSZWFkT25seSB8IERvbnRFbnVtKTsKLQotICBkYXQtPnB1dERp
cmVjdChleGVjLT5wcm9wZXJ0eU5hbWVzKCkuc291cmNlLCBqc1N0cmluZyhwKSwgRG9udERlbGV0
ZSB8IFJlYWRPbmx5IHwgRG9udEVudW0pOwotICBkYXQtPnB1dERpcmVjdChleGVjLT5wcm9wZXJ0
eU5hbWVzKCkubGFzdEluZGV4LCBqc051bWJlcigwKSwgRG9udERlbGV0ZSB8IERvbnRFbnVtKTsK
LQotICByZXR1cm4gZGF0OworICByZXR1cm4gcmVnRXhwLT5pc1ZhbGlkKCkKKyAgICA/IG5ldyBS
ZWdFeHBJbXAoc3RhdGljX2Nhc3Q8UmVnRXhwUHJvdG90eXBlKj4oZXhlYy0+bGV4aWNhbEludGVy
cHJldGVyKCktPmJ1aWx0aW5SZWdFeHBQcm90b3R5cGUoKSksIHJlZ0V4cC5yZWxlYXNlKCkpCisg
ICAgOiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yLCBVU3RyaW5nKCJJbnZhbGlkIHJlZ3Vs
YXIgZXhwcmVzc2lvbjogIikuYXBwZW5kKHJlZ0V4cC0+ZXJyb3JNZXNzYWdlKCkpKTsKIH0KIAog
Ly8gRUNNQSAxNS4xMC4zCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvcmVnZXhwX29iamVjdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9yZWdleHBfb2JqZWN0LmgJKHJldmlz
aW9uIDI3NTAxKQorKysgSmF2YVNjcmlwdENvcmUva2pzL3JlZ2V4cF9vYmplY3QuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNDgsMTAgKzQ4LDEyIEBAIG5hbWVzcGFjZSBLSlMgewogCiAgICAgY2xhc3Mg
UmVnRXhwSW1wIDogcHVibGljIEpTT2JqZWN0IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFJlZ0V4
cEltcChSZWdFeHBQcm90b3R5cGUqLCBSZWdFeHAqKTsKKyAgICAgICAgZW51bSB7IEdsb2JhbCwg
SWdub3JlQ2FzZSwgTXVsdGlsaW5lLCBTb3VyY2UsIExhc3RJbmRleCB9OworCisgICAgICAgIFJl
Z0V4cEltcChSZWdFeHBQcm90b3R5cGUqLCBQYXNzUmVmUHRyPFJlZ0V4cD4pOwogICAgICAgICB2
aXJ0dWFsIH5SZWdFeHBJbXAoKTsKIAotICAgICAgICB2b2lkIHNldFJlZ0V4cChSZWdFeHAqIHIp
IHsgbV9yZWdFeHAuc2V0KHIpOyB9CisgICAgICAgIHZvaWQgc2V0UmVnRXhwKFBhc3NSZWZQdHI8
UmVnRXhwPiByKSB7IG1fcmVnRXhwID0gcjsgfQogICAgICAgICBSZWdFeHAqIHJlZ0V4cCgpIGNv
bnN0IHsgcmV0dXJuIG1fcmVnRXhwLmdldCgpOyB9CiAKICAgICAgICAgSlNWYWx1ZSogdGVzdChF
eGVjU3RhdGUqLCBjb25zdCBMaXN0JiBhcmdzKTsKQEAgLTU5LDEzICs2MSwxOSBAQCBuYW1lc3Bh
Y2UgS0pTIHsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaW1wbGVtZW50c0NhbGwoKSBjb25zdDsK
ICAgICAgICAgdmlydHVhbCBKU1ZhbHVlKiBjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqLCBKU09i
amVjdCosIGNvbnN0IExpc3QmKTsKKyAgICAgICAgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoRXhl
Y1N0YXRlKiwgY29uc3QgSWRlbnRpZmllciYsIFByb3BlcnR5U2xvdCYpOworICAgICAgICBKU1Zh
bHVlKiBnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSosIGludCB0b2tlbikgY29uc3Q7CisgICAg
ICAgIHZvaWQgcHV0KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBKU1ZhbHVlKiwgaW50
IGF0dHJpYnV0ZXMgPSBOb25lKTsKKyAgICAgICAgdm9pZCBwdXRWYWx1ZVByb3BlcnR5KEV4ZWNT
dGF0ZSosIGludCB0b2tlbiwgSlNWYWx1ZSosIGludCBhdHRyaWJ1dGVzKTsKKwogICAgICAgICB2
aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyogY2xhc3NJbmZvKCkgY29uc3QgeyByZXR1cm4gJmluZm87
IH0KICAgICAgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZvOwogCiAgICAgcHJpdmF0ZToK
ICAgICAgICAgYm9vbCBtYXRjaChFeGVjU3RhdGUqLCBjb25zdCBMaXN0JiBhcmdzKTsKIAotICAg
ICAgICBPd25QdHI8UmVnRXhwPiBtX3JlZ0V4cDsKKyAgICAgICAgUmVmUHRyPFJlZ0V4cD4gbV9y
ZWdFeHA7CisgICAgICAgIGRvdWJsZSBtX2xhc3RJbmRleDsKICAgICB9OwogCiAgICAgY2xhc3Mg
UmVnRXhwT2JqZWN0SW1wIDogcHVibGljIEludGVybmFsRnVuY3Rpb25JbXAgewpJbmRleDogSmF2
YVNjcmlwdENvcmUva2pzL3N0cmluZ19vYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2tqcy9zdHJpbmdfb2JqZWN0LmNwcAkocmV2aXNpb24gMjc1MDEpCisrKyBKYXZhU2Ny
aXB0Q29yZS9ranMvc3RyaW5nX29iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3NiwxMyAr
Mjc2LDEzIEBAIHN0YXRpYyBpbmxpbmUgVVN0cmluZyBzdWJzdGl0dXRlQmFja3JlZmUKICAgICB9
IGVsc2UgaWYgKHJlZiA+PSAnMCcgJiYgcmVmIDw9ICc5JykgewogICAgICAgICAvLyAxLSBhbmQg
Mi1kaWdpdCBiYWNrIHJlZmVyZW5jZXMgYXJlIGFsbG93ZWQKICAgICAgICAgdW5zaWduZWQgYmFj
a3JlZkluZGV4ID0gcmVmIC0gJzAnOwotICAgICAgICBpZiAoYmFja3JlZkluZGV4ID4gKHVuc2ln
bmVkKXJlZy0+c3ViUGF0dGVybnMoKSkKKyAgICAgICAgaWYgKGJhY2tyZWZJbmRleCA+IHJlZy0+
bnVtU3ViUGF0dGVybnMoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoc3Vi
c3RpdHV0ZWRSZXBsYWNlbWVudC5zaXplKCkgPiBpICsgMikgewogICAgICAgICAgICAgcmVmID0g
c3Vic3RpdHV0ZWRSZXBsYWNlbWVudFtpKzJdLnVuaWNvZGUoKTsKICAgICAgICAgICAgIGlmIChy
ZWYgPj0gJzAnICYmIHJlZiA8PSAnOScpIHsKICAgICAgICAgICAgICAgICBiYWNrcmVmSW5kZXgg
PSAxMCAqIGJhY2tyZWZJbmRleCArIHJlZiAtICcwJzsKLSAgICAgICAgICAgICAgICBpZiAoYmFj
a3JlZkluZGV4ID4gKHVuc2lnbmVkKXJlZy0+c3ViUGF0dGVybnMoKSkKKyAgICAgICAgICAgICAg
ICBpZiAoYmFja3JlZkluZGV4ID4gcmVnLT5udW1TdWJQYXR0ZXJucygpKQogICAgICAgICAgICAg
ICAgICAgICBiYWNrcmVmSW5kZXggPSBiYWNrcmVmSW5kZXggLyAxMDsgICAvLyBGYWxsIGJhY2sg
dG8gdGhlIDEtZGlnaXQgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAg
ICAgICAgICAgICBhZHZhbmNlID0gMTsKQEAgLTMzNCw3ICszMzQsNyBAQCBzdGF0aWMgSlNWYWx1
ZSAqcmVwbGFjZShFeGVjU3RhdGUgKmV4ZWMsCiAKICAgaWYgKHBhdHRlcm4tPmlzT2JqZWN0KCkg
JiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QgKj4ocGF0dGVybiktPmluaGVyaXRzKCZSZWdFeHBJbXA6
OmluZm8pKSB7CiAgICAgUmVnRXhwICpyZWcgPSBzdGF0aWNfY2FzdDxSZWdFeHBJbXAgKj4ocGF0
dGVybiktPnJlZ0V4cCgpOwotICAgIGJvb2wgZ2xvYmFsID0gcmVnLT5mbGFncygpICYgUmVnRXhw
OjpHbG9iYWw7CisgICAgYm9vbCBnbG9iYWwgPSByZWctPmdsb2JhbCgpOwogCiAgICAgUmVnRXhw
T2JqZWN0SW1wKiByZWdFeHBPYmogPSBzdGF0aWNfY2FzdDxSZWdFeHBPYmplY3RJbXAqPihleGVj
LT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpblJlZ0V4cCgpKTsKIApAQCAtMzY0LDcgKzM2
NCw3IEBAIHN0YXRpYyBKU1ZhbHVlICpyZXBsYWNlKEV4ZWNTdGF0ZSAqZXhlYywKICAgICAgICAg
ICBpbnQgY29tcGxldGVNYXRjaFN0YXJ0ID0gb3ZlY3RvclswXTsKICAgICAgICAgICBMaXN0IGFy
Z3M7CiAKLSAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVnLT5zdWJQYXR0ZXJu
cygpICsgMTsgaSsrKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZy0+
bnVtU3ViUGF0dGVybnMoKSArIDE7IGkrKykgewogICAgICAgICAgICAgICBpbnQgbWF0Y2hTdGFy
dCA9IG92ZWN0b3JbaSAqIDJdOwogICAgICAgICAgICAgICBpbnQgbWF0Y2hMZW4gPSBvdmVjdG9y
W2kgKiAyICsgMV0gLSBtYXRjaFN0YXJ0OwogCkBAIC01MTksNyArNTE5LDcgQEAgSlNWYWx1ZSog
U3RyaW5nUHJvdG9GdW5jOjpjYWxsQXNGdW5jdGlvbgogICAgICAgICogIElmIHJlZ2V4cCBpcyBu
b3QgYW4gb2JqZWN0IHdob3NlIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyAiUmVnRXhwIiwgaXQgaXMK
ICAgICAgICAqICByZXBsYWNlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gbmV3
IFJlZ0V4cChyZWdleHApLgogICAgICAgICovCi0gICAgICByZWcgPSB0bXBSZWcgPSBuZXcgUmVn
RXhwKGEwLT50b1N0cmluZyhleGVjKSwgUmVnRXhwOjpOb25lKTsKKyAgICAgIHJlZyA9IHRtcFJl
ZyA9IG5ldyBSZWdFeHAoYTAtPnRvU3RyaW5nKGV4ZWMpKTsKICAgICB9CiAgICAgUmVnRXhwT2Jq
ZWN0SW1wKiByZWdFeHBPYmogPSBzdGF0aWNfY2FzdDxSZWdFeHBPYmplY3RJbXAqPihleGVjLT5s
ZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpblJlZ0V4cCgpKTsKICAgICBpbnQgcG9zOwpAQCAt
NTI5LDcgKzUyOSw3IEBAIEpTVmFsdWUqIFN0cmluZ1Byb3RvRnVuYzo6Y2FsbEFzRnVuY3Rpb24K
ICAgICAgIHJlc3VsdCA9IGpzTnVtYmVyKHBvcyk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIE1h
dGNoCi0gICAgICBpZiAoKHJlZy0+ZmxhZ3MoKSAmIFJlZ0V4cDo6R2xvYmFsKSA9PSAwKSB7Cisg
ICAgICBpZiAoIShyZWctPmdsb2JhbCgpKSkgewogICAgICAgICAvLyBjYXNlIHdpdGhvdXQgJ2cn
IGZsYWcgaXMgaGFuZGxlZCBsaWtlIFJlZ0V4cC5wcm90b3R5cGUuZXhlYwogICAgICAgICBpZiAo
cG9zIDwgMCkKICAgICAgICAgICByZXN1bHQgPSBqc051bGwoKTsKQEAgLTU0Niw3ICs1NDYsNyBA
QCBKU1ZhbHVlKiBTdHJpbmdQcm90b0Z1bmM6OmNhbGxBc0Z1bmN0aW9uCiAgICAgICAgICAgcmVn
RXhwT2JqLT5wZXJmb3JtTWF0Y2gocmVnLCB1LCBwb3MsIHBvcywgbWF0Y2hMZW5ndGgpOwogICAg
ICAgICB9CiAgICAgICAgIGlmIChpbXApCi0gICAgICAgICAgaW1wLT5wdXQoZXhlYywgImxhc3RJ
bmRleCIsIGpzTnVtYmVyKGxhc3RJbmRleCksIERvbnREZWxldGV8RG9udEVudW0pOworICAgICAg
ICAgIGltcC0+cHV0KGV4ZWMsIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5sYXN0SW5kZXgsIGpzTnVt
YmVyKGxhc3RJbmRleCksIERvbnREZWxldGV8RG9udEVudW0pOwogICAgICAgICBpZiAobGlzdC5p
c0VtcHR5KCkpIHsKICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcyBhdCBhbGws
IGl0J3MgaW1wb3J0YW50IHRvIHJldHVybgogICAgICAgICAgIC8vIE51bGwgaW5zdGVhZCBvZiBh
biBlbXB0eSBhcnJheSwgYmVjYXVzZSB0aGlzIG1hdGNoZXMKQEAgLTYxMyw3ICs2MTMsNyBAQCBK
U1ZhbHVlKiBTdHJpbmdQcm90b0Z1bmM6OmNhbGxBc0Z1bmN0aW9uCiAgICAgICAgICAgcDAgPSBt
cG9zICsgbWxlbjsKICAgICAgICAgICBpKys7CiAgICAgICAgIH0KLSAgICAgICAgZm9yICh1bnNp
Z25lZCBzaSA9IDE7IHNpIDw9IHJlZy0+c3ViUGF0dGVybnMoKTsgKytzaSkgeworICAgICAgICBm
b3IgKHVuc2lnbmVkIHNpID0gMTsgc2kgPD0gcmVnLT5udW1TdWJQYXR0ZXJucygpOyArK3NpKSB7
CiAgICAgICAgICAgaW50IHNwb3MgPSBvdmVjdG9yW3NpICogMl07CiAgICAgICAgICAgaWYgKHNw
b3MgPCAwKQogICAgICAgICAgICAgcmVzLT5wdXQoZXhlYywgaSsrLCBqc1VuZGVmaW5lZCgpKTsK
SW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDI3NTAxKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAKKzIwMDctMTEtMDYgIEdlb2ZmcmV5IEdhcmVuICA8
Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KyAgICAgICAgCisgICAgICAgIEJlZWZlZCB1cCB0aGUgUmVnRXhwLmNvbXBpbGUgdGVzdGNhc2Ug
dG8gY292ZXIgYSBtaXN0YWtlIGluIHRoZSAKKyAgICAgICAgb3JpZ2luYWwgY2hlY2staW4gYW5k
IGEgbWlzdGFrZSBJIG1hZGUgd2hpbGUgZGV2ZWxvcGluZyBteSBuZXcgcGF0Y2guCisKKyAgICAg
ICAgKiBmYXN0L2pzL3Jlc291cmNlcy9yZWdleHAtY29tcGlsZS5qczoKKwogMjAwNy0xMS0wNiAg
QmV0aCBEYWtpbiAgPGJkYWtpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2Ft
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9qcy9yZWdleHAtY29tcGlsZS1leHBlY3RlZC50eHQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9qcy9yZWdleHAtY29tcGlsZS1leHBlY3Rl
ZC50eHQJKHJldmlzaW9uIDI3NTAxKQorKysgTGF5b3V0VGVzdHMvZmFzdC9qcy9yZWdleHAtY29t
cGlsZS1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE0LDEyICsxNCwxNSBAQCBQQVNT
IHJlLnRvU3RyaW5nKCkgaXMgJy9jLycKIFBBU1MgcmUuaWdub3JlQ2FzZSBpcyB0cnVlCiBQQVNT
IHJlLnRlc3QoJ0MnKSBpcyB0cnVlCiBQQVNTIHJlLnRvU3RyaW5nKCkgaXMgJy9jL2knCi1QQVNT
IHJlLmNvbXBpbGUobmV3IFJlZ0V4cCgnYycpLCAnaScpOyB0aHJldyBleGNlcHRpb24gVHlwZUVy
cm9yOiBjYW5ub3Qgc3VwcGx5IGZsYWdzIHdoZW4gY29uc3RydWN0aW5nIG9uZSBSZWdFeHAgZnJv
bSBhbm90aGVyLi4KK1BBU1MgcmUuY29tcGlsZShuZXcgUmVnRXhwKCdjJyksICdpJyk7IHRocmV3
IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IENhbm5vdCBzdXBwbHkgZmxhZ3Mgd2hlbiBjb25zdHJ1Y3Rp
bmcgb25lIFJlZ0V4cCBmcm9tIGFub3RoZXIuLgorUEFTUyByZS50b1N0cmluZygpIGlzICcvYy9p
JwogUEFTUyByZS5jb21waWxlKG5ldyBSZWdFeHAoJysnKSk7IHRocmV3IGV4Y2VwdGlvbiBTeW50
YXhFcnJvcjogSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IG5vdGhpbmcgdG8gcmVwZWF0Lgog
UEFTUyByZS50b1N0cmluZygpIGlzICcvdW5kZWZpbmVkLycKIFBBU1MgcmUudG9TdHJpbmcoKSBp
cyAnL251bGwvJwogUEFTUyByZS50b1N0cmluZygpIGlzICcvLycKIFBBU1MgcmUudG9TdHJpbmco
KSBpcyAnL3ovJworUEFTUyByZS5sYXN0SW5kZXggaXMgMAorUEFTUyByZS5sYXN0SW5kZXggaXMg
MQogUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQogCiBURVNUIENPTVBMRVRFCkluZGV4
OiBMYXlvdXRUZXN0cy9mYXN0L2pzL3Jlc291cmNlcy9yZWdleHAtY29tcGlsZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2pzL3Jlc291cmNlcy9yZWdleHAtY29tcGlsZS5qcwko
cmV2aXNpb24gMjc1MDEpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2pzL3Jlc291cmNlcy9yZWdleHAt
Y29tcGlsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsMTAgQEAgc2hvdWxkQmUoInJl
LnRvU3RyaW5nKCkiLCAiJy9jL2knIik7CiAKIHNob3VsZFRocm93KCJyZS5jb21waWxlKG5ldyBS
ZWdFeHAoJ2MnKSwgJ2knKTsiKTsKIAorLy8gSXQncyBPSyB0byBzdXBwbHkgYSBzZWNvbmQgYXJn
dW1lbnQsIGFzIGxvbmcgYXMgdGhlIGFyZ3VtZW50IGlzICJ1bmRlZmluZWQiLgorcmUuY29tcGls
ZShyZSwgdW5kZWZpbmVkKTsKK3Nob3VsZEJlKCJyZS50b1N0cmluZygpIiwgIicvYy9pJyIpOwor
CiBzaG91bGRUaHJvdygicmUuY29tcGlsZShuZXcgUmVnRXhwKCcrJykpOyIpOwogCiByZS5jb21w
aWxlKHVuZGVmaW5lZCk7CkBAIC0zOSw0ICs0MywxMSBAQCBzaG91bGRCZSgicmUudG9TdHJpbmco
KSIsICInLy8nIik7IC8vIC8oCiByZS5jb21waWxlKCJ6IiwgdW5kZWZpbmVkKTsKIHNob3VsZEJl
KCJyZS50b1N0cmluZygpIiwgIicvei8nIik7CiAKKy8vIENvbXBpbGluZyBzaG91bGQgcmVzZXQg
bGFzdEluZGV4LgorcmUubGFzdEluZGV4ID0gMTAwOworcmUuY29tcGlsZSgvYS9nKTsKK3Nob3Vs
ZEJlKCJyZS5sYXN0SW5kZXgiLCAiMCIpOworcmUuZXhlYygiYWFhIik7CitzaG91bGRCZSgicmUu
bGFzdEluZGV4IiwgIjEiKTsKKwogdmFyIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRydWU7Cg==
</data>
<flag name="review"
          id="7271"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>