<?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>59405</bug_id>
          
          <creation_ts>2011-04-25 17:20:25 -0700</creation_ts>
          <short_desc>DFG JIT - add type speculation for integer &amp; array types, for vars &amp; args.</short_desc>
          <delta_ts>2011-04-25 18:43:25 -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>PC</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="Gavin Barraclough">barraclough</reporter>
          <assigned_to name="Gavin Barraclough">barraclough</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>392149</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-04-25 17:20:25 -0700</bug_when>
    <thetext>If a var or argument is used as the base for a GetByVal or PutByVal access we are speculating that it is of type Array (we only generate code on the speculative path to perform array accesses).  By typing the var or args slot as Array, and checking on entry to the function (in the case of args), and each time the local is written to, we can avoid a type check at each point the array is accessed.  This will typically hoist type checks out of loops.

Similarly, any local that is incremented or decremented, or is the input or output or a bitwise operator, is likely to be an integer.  By typing the local as int32 we can avoid speculation checks on access, and tagging when writing to the slot.  All accesses can become 32bit instead of 64.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392152</commentid>
    <comment_count>1</comment_count>
      <attachid>91030</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-04-25 17:22:29 -0700</bug_when>
    <thetext>Created attachment 91030
The patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392154</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-25 17:24:07 -0700</bug_when>
    <thetext>Attachment 91030 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source...&quot; exit_code: 1

Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:931:  Should only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp:177:  Should only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/JavaScriptCore/dfg/DFGGraph.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 3 in 10 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392159</commentid>
    <comment_count>3</comment_count>
      <attachid>91030</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-04-25 17:30:46 -0700</bug_when>
    <thetext>Comment on attachment 91030
The patch

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

r=me

&gt; Source/JavaScriptCore/dfg/DFGGraph.h:141
&gt; +        if (operand &lt; 0) {

Probably worth a helper function to abstract away the fact that a negative number means an argument.

&gt; Source/JavaScriptCore/dfg/DFGGraph.h:151
&gt; +        if (operand &lt; 0) {

Ditto.

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:290
&gt; +            // integerResult, but don&apos;t useChildren!

Not new to this patch, but it would be good to explain the why here (phi nodes), instead of the what.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392176</commentid>
    <comment_count>4</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-04-25 18:43:25 -0700</bug_when>
    <thetext>Fixed in r84860.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91030</attachid>
            <date>2011-04-25 17:22:29 -0700</date>
            <delta_ts>2011-04-25 17:30:46 -0700</delta_ts>
            <desc>The patch</desc>
            <filename>59405.patch</filename>
            <type>text/plain</type>
            <size>25532</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gODQ4NTUpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDggQEAK
KzIwMTEtMDQtMjUgIEdhdmluIEJhcnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01OTQwNQorICAgICAgICBERkcgSklUIC0g
YWRkIHR5cGUgc3BlY3VsYXRpb24gZm9yIGludGVnZXIgJiBhcnJheSB0eXBlcywgZm9yIHZhcnMg
JiBhcmdzLgorCisgICAgICAgIElmIGEgdmFyIG9yIGFyZ3VtZW50IGlzIHVzZWQgYXMgdGhlIGJh
c2UgZm9yIGEgR2V0QnlWYWwgb3IgUHV0QnlWYWwgYWNjZXNzCisgICAgICAgIHdlIGFyZSBzcGVj
dWxhdGluZyB0aGF0IGl0IGlzIG9mIHR5cGUgQXJyYXkgKHdlIG9ubHkgZ2VuZXJhdGUgY29kZSBv
biB0aGUKKyAgICAgICAgc3BlY3VsYXRpdmUgcGF0aCB0byBwZXJmb3JtIGFycmF5IGFjY2Vzc2Vz
KS4gQnkgdHlwaW5nIHRoZSB2YXIgb3IgYXJncyBzbG90CisgICAgICAgIGFzIEFycmF5LCBhbmQg
Y2hlY2tpbmcgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uIChpbiB0aGUgY2FzZSBvZiBhcmdzKSwg
YW5kCisgICAgICAgIGVhY2ggdGltZSB0aGUgbG9jYWwgaXMgd3JpdHRlbiB0bywgd2UgY2FuIGF2
b2lkIGEgdHlwZSBjaGVjayBhdCBlYWNoIHBvaW50CisgICAgICAgIHRoZSBhcnJheSBpcyBhY2Nl
c3NlZC4gVGhpcyB3aWxsIHR5cGljYWxseSBob2lzdCB0eXBlIGNoZWNrcyBvdXQgb2YgbG9vcHMu
CisKKyAgICAgICAgU2ltaWxhcmx5LCBhbnkgbG9jYWwgdGhhdCBpcyBpbmNyZW1lbnRlZCBvciBk
ZWNyZW1lbnRlZCwgb3IgaXMgdGhlIGlucHV0IG9yCisgICAgICAgIG91dHB1dCBvciBhIGJpdHdp
c2Ugb3BlcmF0b3IsIGlzIGxpa2VseSB0byBiZSBhbiBpbnRlZ2VyLiBCeSB0eXBpbmcgdGhlCisg
ICAgICAgIGxvY2FsIGFzIGludDMyIHdlIGNhbiBhdm9pZCBzcGVjdWxhdGlvbiBjaGVja3Mgb24g
YWNjZXNzLCBhbmQgdGFnZ2luZyB3aGVuCisgICAgICAgIHdyaXRpbmcgdG8gdGhlIHNsb3QuIEFs
bCBhY2Nlc3NlcyBjYW4gYmVjb21lIDMyYml0IGluc3RlYWQgb2YgNjQuCisKKyAgICAgICAgKiBk
ZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFy
c2VyOjpzZXQpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwcmVkaWN0QXJy
YXkpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwcmVkaWN0SW50MzIpOgor
ICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAg
KiBkZmcvREZHR3JhcGguaDoKKyAgICAgICAgKEpTQzo6REZHOjpQcmVkaWN0aW9uU2xvdDo6UHJl
ZGljdGlvblNsb3QpOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjpHcmFwaCk6CisgICAgICAg
IChKU0M6OkRGRzo6R3JhcGg6OnByZWRpY3QpOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjpn
ZXRQcmVkaWN0aW9uKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29tcGlsZXIuY3BwOgorICAgICAg
ICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpjb21waWxlRnVuY3Rpb24pOgorICAgICAgICAqIGRm
Zy9ERkdKSVRDb21waWxlci5oOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjp0YWdG
b3IpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKToKKyAgICAg
ICAgKiBkZmcvREZHTm9kZS5oOgorICAgICAgICAqIGRmZy9ERkdOb25TcGVjdWxhdGl2ZUpJVC5j
cHA6CisgICAgICAgIChKU0M6OkRGRzo6Tm9uU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAg
ICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3Bl
Y3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklU
OjpjaGVja0FyZ3VtZW50VHlwZXMpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklU
Ojppbml0aWFsaXplVmFyaWFibGVUeXBlcyk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZl
SklULmg6CisgICAgICAgICogcnVudGltZS9FeGVjdXRhYmxlLmNwcDoKKyAgICAgICAgKEpTQzo6
dHJ5REZHQ29tcGlsZSk6CisKIDIwMTEtMDQtMjUgIERhdmlkIExldmluICA8bGV2aW5AY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEphbWVzIFJvYmluc29uLgpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlz
aW9uIDg0NzQ4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk3LDggKzk3LDEwIEBAIHByaXZhdGU6CiAgICAgICAg
IC8vIE11c3QgYmUgYSBsb2NhbC4KICAgICAgICAgcmV0dXJuIGdldExvY2FsKCh1bnNpZ25lZClv
cGVyYW5kKTsKICAgICB9Ci0gICAgdm9pZCBzZXQoaW50IG9wZXJhbmQsIE5vZGVJbmRleCB2YWx1
ZSkKKyAgICB2b2lkIHNldChpbnQgb3BlcmFuZCwgTm9kZUluZGV4IHZhbHVlLCBQcmVkaWN0ZWRU
eXBlIHByZWRpY3Rpb24gPSBQcmVkaWN0Tm9uZSkKICAgICB7CisgICAgICAgIG1fZ3JhcGgucHJl
ZGljdChvcGVyYW5kLCBwcmVkaWN0aW9uKTsKKwogICAgICAgICAvLyBJcyB0aGlzIGFuIGFyZ3Vt
ZW50PwogICAgICAgICBpZiAob3BlcmFuZCA8IDApIHsKICAgICAgICAgICAgIHNldEFyZ3VtZW50
KG9wZXJhbmQsIHZhbHVlKTsKQEAgLTQ0MCw2ICs0NDIsMzEgQEAgcHJpdmF0ZToKICAgICAgICAg
cmV0dXJuIHJlc3VsdEluZGV4OwogICAgIH0KIAorICAgIHZvaWQgcHJlZGljdEFycmF5KE5vZGVJ
bmRleCBub2RlSW5kZXgpCisgICAgeworICAgICAgICBOb2RlKiBub2RlUHRyID0gJm1fZ3JhcGhb
bm9kZUluZGV4XTsKKworICAgICAgICBpZiAobm9kZVB0ci0+b3AgPT0gR2V0TG9jYWwpCisgICAg
ICAgICAgICBtX2dyYXBoLnByZWRpY3Qobm9kZVB0ci0+bG9jYWwoKSwgUHJlZGljdEFycmF5KTsK
KyAgICB9CisKKyAgICB2b2lkIHByZWRpY3RJbnQzMihOb2RlSW5kZXggbm9kZUluZGV4KQorICAg
IHsKKyAgICAgICAgTm9kZSogbm9kZVB0ciA9ICZtX2dyYXBoW25vZGVJbmRleF07CisKKyAgICAg
ICAgaWYgKG5vZGVQdHItPm9wID09IFZhbHVlVG9OdW1iZXIpCisgICAgICAgICAgICBub2RlUHRy
ID0gJm1fZ3JhcGhbbm9kZVB0ci0+Y2hpbGQxXTsKKworICAgICAgICBpZiAobm9kZVB0ci0+b3Ag
PT0gVmFsdWVUb0ludDMyKQorICAgICAgICAgICAgbm9kZVB0ciA9ICZtX2dyYXBoW25vZGVQdHIt
PmNoaWxkMV07CisKKyAgICAgICAgaWYgKG5vZGVQdHItPm9wID09IE51bWJlclRvSW50MzIpCisg
ICAgICAgICAgICBub2RlUHRyID0gJm1fZ3JhcGhbbm9kZVB0ci0+Y2hpbGQxXTsKKworICAgICAg
ICBpZiAobm9kZVB0ci0+b3AgPT0gR2V0TG9jYWwpCisgICAgICAgICAgICBtX2dyYXBoLnByZWRp
Y3Qobm9kZVB0ci0+bG9jYWwoKSwgUHJlZGljdEludDMyKTsKKyAgICB9CisKICAgICBKU0dsb2Jh
bERhdGEqIG1fZ2xvYmFsRGF0YTsKICAgICBDb2RlQmxvY2sqIG1fY29kZUJsb2NrOwogICAgIEdy
YXBoJiBtX2dyYXBoOwpAQCAtNTYwLDUzICs1ODcsNjUgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6
cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICBjYXNlIG9wX2JpdGFuZDogewogICAgICAgICAg
ICAgTm9kZUluZGV4IG9wMSA9IGdldFRvSW50MzIoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3Bl
cmFuZCk7CiAgICAgICAgICAgICBOb2RlSW5kZXggb3AyID0gZ2V0VG9JbnQzMihjdXJyZW50SW5z
dHJ1Y3Rpb25bM10udS5vcGVyYW5kKTsKLSAgICAgICAgICAgIHNldChjdXJyZW50SW5zdHJ1Y3Rp
b25bMV0udS5vcGVyYW5kLCBhZGRUb0dyYXBoKEJpdEFuZCwgb3AxLCBvcDIpKTsKKyAgICAgICAg
ICAgIHByZWRpY3RJbnQzMihvcDEpOworICAgICAgICAgICAgcHJlZGljdEludDMyKG9wMik7Cisg
ICAgICAgICAgICBzZXQoY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZCwgYWRkVG9HcmFw
aChCaXRBbmQsIG9wMSwgb3AyKSwgUHJlZGljdEludDMyKTsKICAgICAgICAgICAgIE5FWFRfT1BD
T0RFKG9wX2JpdGFuZCk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIG9wX2JpdG9yOiB7CiAg
ICAgICAgICAgICBOb2RlSW5kZXggb3AxID0gZ2V0VG9JbnQzMihjdXJyZW50SW5zdHJ1Y3Rpb25b
Ml0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDIgPSBnZXRUb0ludDMyKGN1
cnJlbnRJbnN0cnVjdGlvblszXS51Lm9wZXJhbmQpOwotICAgICAgICAgICAgc2V0KGN1cnJlbnRJ
bnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIGFkZFRvR3JhcGgoQml0T3IsIG9wMSwgb3AyKSk7Cisg
ICAgICAgICAgICBwcmVkaWN0SW50MzIob3AxKTsKKyAgICAgICAgICAgIHByZWRpY3RJbnQzMihv
cDIpOworICAgICAgICAgICAgc2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIGFk
ZFRvR3JhcGgoQml0T3IsIG9wMSwgb3AyKSwgUHJlZGljdEludDMyKTsKICAgICAgICAgICAgIE5F
WFRfT1BDT0RFKG9wX2JpdG9yKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ugb3BfYml0eG9y
OiB7CiAgICAgICAgICAgICBOb2RlSW5kZXggb3AxID0gZ2V0VG9JbnQzMihjdXJyZW50SW5zdHJ1
Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDIgPSBnZXRUb0lu
dDMyKGN1cnJlbnRJbnN0cnVjdGlvblszXS51Lm9wZXJhbmQpOwotICAgICAgICAgICAgc2V0KGN1
cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIGFkZFRvR3JhcGgoQml0WG9yLCBvcDEsIG9w
MikpOworICAgICAgICAgICAgcHJlZGljdEludDMyKG9wMSk7CisgICAgICAgICAgICBwcmVkaWN0
SW50MzIob3AyKTsKKyAgICAgICAgICAgIHNldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVy
YW5kLCBhZGRUb0dyYXBoKEJpdFhvciwgb3AxLCBvcDIpLCBQcmVkaWN0SW50MzIpOwogICAgICAg
ICAgICAgTkVYVF9PUENPREUob3BfYml0eG9yKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ug
b3BfcnNoaWZ0OiB7CiAgICAgICAgICAgICBOb2RlSW5kZXggb3AxID0gZ2V0VG9JbnQzMihjdXJy
ZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDIg
PSBnZXRUb0ludDMyKGN1cnJlbnRJbnN0cnVjdGlvblszXS51Lm9wZXJhbmQpOworICAgICAgICAg
ICAgcHJlZGljdEludDMyKG9wMSk7CisgICAgICAgICAgICBwcmVkaWN0SW50MzIob3AyKTsKICAg
ICAgICAgICAgIE5vZGVJbmRleCByZXN1bHQ7CiAgICAgICAgICAgICAvLyBPcHRpbWl6ZSBvdXQg
c2hpZnRzIGJ5IHplcm8uCiAgICAgICAgICAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG9wMikgJiYg
ISh2YWx1ZU9mSW50MzJDb25zdGFudChvcDIpICYgMHgxZikpCiAgICAgICAgICAgICAgICAgcmVz
dWx0ID0gb3AxOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFk
ZFRvR3JhcGgoQml0UlNoaWZ0LCBvcDEsIG9wMik7Ci0gICAgICAgICAgICBzZXQoY3VycmVudElu
c3RydWN0aW9uWzFdLnUub3BlcmFuZCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHNldChjdXJyZW50
SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kLCByZXN1bHQsIFByZWRpY3RJbnQzMik7CiAgICAgICAg
ICAgICBORVhUX09QQ09ERShvcF9yc2hpZnQpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBv
cF9sc2hpZnQ6IHsKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDEgPSBnZXRUb0ludDMyKGN1cnJl
bnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IG9wMiA9
IGdldFRvSW50MzIoY3VycmVudEluc3RydWN0aW9uWzNdLnUub3BlcmFuZCk7CisgICAgICAgICAg
ICBwcmVkaWN0SW50MzIob3AxKTsKKyAgICAgICAgICAgIHByZWRpY3RJbnQzMihvcDIpOwogICAg
ICAgICAgICAgTm9kZUluZGV4IHJlc3VsdDsKICAgICAgICAgICAgIC8vIE9wdGltaXplIG91dCBz
aGlmdHMgYnkgemVyby4KICAgICAgICAgICAgIGlmIChpc0ludDMyQ29uc3RhbnQob3AyKSAmJiAh
KHZhbHVlT2ZJbnQzMkNvbnN0YW50KG9wMikgJiAweDFmKSkKICAgICAgICAgICAgICAgICByZXN1
bHQgPSBvcDE7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWRk
VG9HcmFwaChCaXRMU2hpZnQsIG9wMSwgb3AyKTsKLSAgICAgICAgICAgIHNldChjdXJyZW50SW5z
dHJ1Y3Rpb25bMV0udS5vcGVyYW5kLCByZXN1bHQpOworICAgICAgICAgICAgc2V0KGN1cnJlbnRJ
bnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIHJlc3VsdCwgUHJlZGljdEludDMyKTsKICAgICAgICAg
ICAgIE5FWFRfT1BDT0RFKG9wX2xzaGlmdCk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIG9w
X3Vyc2hpZnQ6IHsKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDEgPSBnZXRUb0ludDMyKGN1cnJl
bnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IG9wMiA9
IGdldFRvSW50MzIoY3VycmVudEluc3RydWN0aW9uWzNdLnUub3BlcmFuZCk7CisgICAgICAgICAg
ICBwcmVkaWN0SW50MzIob3AxKTsKKyAgICAgICAgICAgIHByZWRpY3RJbnQzMihvcDIpOwogICAg
ICAgICAgICAgTm9kZUluZGV4IHJlc3VsdDsKICAgICAgICAgICAgIC8vIFRoZSByZXN1bHQgb2Yg
YSB6ZXJvLWV4dGVuZGluZyByaWdodCBzaGlmdCBpcyB0cmVhdGVkIGFzIGFuIHVuc2lnbmVkIHZh
bHVlLgogICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIHRoZSB0b3AgYml0IGlzIHNl
dCwgdGhlIHJlc3VsdCBpcyBub3QgaW4gdGhlIGludDMyIHJhbmdlLApAQCAtNjI3LDcgKzY2Niw3
IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAg
ICAgICByZXN1bHQgPSBhZGRUb0dyYXBoKEJpdFVSU2hpZnQsIG9wMSwgb3AyKTsKICAgICAgICAg
ICAgICAgICByZXN1bHQgPSBhZGRUb0dyYXBoKFVJbnQzMlRvTnVtYmVyLCByZXN1bHQpOwogICAg
ICAgICAgICAgfQotICAgICAgICAgICAgc2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJh
bmQsIHJlc3VsdCk7CisgICAgICAgICAgICBzZXQoY3VycmVudEluc3RydWN0aW9uWzFdLnUub3Bl
cmFuZCwgcmVzdWx0LCBQcmVkaWN0SW50MzIpOwogICAgICAgICAgICAgTkVYVF9PUENPREUob3Bf
dXJzaGlmdCk7CiAgICAgICAgIH0KIApAQCAtNjM2LDYgKzY3NSw3IEBAIGJvb2wgQnl0ZUNvZGVQ
YXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9wcmVfaW5jOiB7CiAg
ICAgICAgICAgICB1bnNpZ25lZCBzcmNEc3QgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVy
YW5kOwogICAgICAgICAgICAgTm9kZUluZGV4IG9wID0gZ2V0VG9OdW1iZXIoc3JjRHN0KTsKKyAg
ICAgICAgICAgIHByZWRpY3RJbnQzMihvcCk7CiAgICAgICAgICAgICBzZXQoc3JjRHN0LCBhZGRU
b0dyYXBoKEFyaXRoQWRkLCBvcCwgb25lKCkpKTsKICAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9w
X3ByZV9pbmMpOwogICAgICAgICB9CkBAIC02NDQsNiArNjg0LDcgQEAgYm9vbCBCeXRlQ29kZVBh
cnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgdW5zaWduZWQgcmVzdWx0ID0g
Y3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKICAgICAgICAgICAgIHVuc2lnbmVkIHNy
Y0RzdCA9IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CiAgICAgICAgICAgICBOb2Rl
SW5kZXggb3AgPSBnZXRUb051bWJlcihzcmNEc3QpOworICAgICAgICAgICAgcHJlZGljdEludDMy
KG9wKTsKICAgICAgICAgICAgIHNldChyZXN1bHQsIG9wKTsKICAgICAgICAgICAgIHNldChzcmNE
c3QsIGFkZFRvR3JhcGgoQXJpdGhBZGQsIG9wLCBvbmUoKSkpOwogICAgICAgICAgICAgTkVYVF9P
UENPREUob3BfcG9zdF9pbmMpOwpAQCAtNjUyLDYgKzY5Myw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJz
ZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9wcmVfZGVjOiB7CiAgICAg
ICAgICAgICB1bnNpZ25lZCBzcmNEc3QgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5k
OwogICAgICAgICAgICAgTm9kZUluZGV4IG9wID0gZ2V0VG9OdW1iZXIoc3JjRHN0KTsKKyAgICAg
ICAgICAgIHByZWRpY3RJbnQzMihvcCk7CiAgICAgICAgICAgICBzZXQoc3JjRHN0LCBhZGRUb0dy
YXBoKEFyaXRoU3ViLCBvcCwgb25lKCkpKTsKICAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX3By
ZV9kZWMpOwogICAgICAgICB9CkBAIC02NjAsNiArNzAyLDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNl
cjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgdW5zaWduZWQgcmVzdWx0ID0gY3Vy
cmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKICAgICAgICAgICAgIHVuc2lnbmVkIHNyY0Rz
dCA9IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CiAgICAgICAgICAgICBOb2RlSW5k
ZXggb3AgPSBnZXRUb051bWJlcihzcmNEc3QpOworICAgICAgICAgICAgcHJlZGljdEludDMyKG9w
KTsKICAgICAgICAgICAgIHNldChyZXN1bHQsIG9wKTsKICAgICAgICAgICAgIHNldChzcmNEc3Qs
IGFkZFRvR3JhcGgoQXJpdGhTdWIsIG9wLCBvbmUoKSkpOwogICAgICAgICAgICAgTkVYVF9PUENP
REUob3BfcG9zdF9kZWMpOwpAQCAtNzk0LDYgKzgzNyw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6
OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9nZXRfYnlfdmFsOiB7CiAgICAg
ICAgICAgICBOb2RlSW5kZXggYmFzZSA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVy
YW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBwcm9wZXJ0eSA9IGdldChjdXJyZW50SW5zdHJ1
Y3Rpb25bM10udS5vcGVyYW5kKTsKKyAgICAgICAgICAgIHByZWRpY3RBcnJheShiYXNlKTsKKyAg
ICAgICAgICAgIHByZWRpY3RJbnQzMihwcm9wZXJ0eSk7CiAKICAgICAgICAgICAgIE5vZGVJbmRl
eCBnZXRCeVZhbCA9IGFkZFRvR3JhcGgoR2V0QnlWYWwsIGJhc2UsIHByb3BlcnR5LCBhbGlhc2Vz
Lmxvb2t1cEdldEJ5VmFsKGJhc2UsIHByb3BlcnR5KSk7CiAgICAgICAgICAgICBzZXQoY3VycmVu
dEluc3RydWN0aW9uWzFdLnUub3BlcmFuZCwgZ2V0QnlWYWwpOwpAQCAtODA2LDYgKzg1MSw4IEBA
IGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIE5v
ZGVJbmRleCBiYXNlID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQpOwogICAg
ICAgICAgICAgTm9kZUluZGV4IHByb3BlcnR5ID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsyXS51
Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IHZhbHVlID0gZ2V0KGN1cnJlbnRJbnN0
cnVjdGlvblszXS51Lm9wZXJhbmQpOworICAgICAgICAgICAgcHJlZGljdEFycmF5KGJhc2UpOwor
ICAgICAgICAgICAgcHJlZGljdEludDMyKHByb3BlcnR5KTsKIAogICAgICAgICAgICAgTm9kZUlu
ZGV4IGFsaWFzZWRHZXQgPSBhbGlhc2VzLmxvb2t1cEdldEJ5VmFsKGJhc2UsIHByb3BlcnR5KTsK
ICAgICAgICAgICAgIE5vZGVJbmRleCBwdXRCeVZhbCA9IGFkZFRvR3JhcGgoYWxpYXNlZEdldCAh
PSBOb05vZGUgPyBQdXRCeVZhbEFsaWFzIDogUHV0QnlWYWwsIGJhc2UsIHByb3BlcnR5LCB2YWx1
ZSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCShyZXZpc2lvbiA4NDc0
OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAkod29ya2luZyBjb3B5
KQpAQCAtMjksNiArMjksNyBAQAogI2lmIEVOQUJMRShERkdfSklUKQogCiAjaW5jbHVkZSA8ZGZn
L0RGR05vZGUuaD4KKyNpbmNsdWRlIDxSZWdpc3RlckZpbGUuaD4KICNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgogCkBAIC0zOCw2ICszOSwyMSBA
QCBjbGFzcyBDb2RlQmxvY2s7CiAKIG5hbWVzcGFjZSBERkcgewogCit0eXBlZGVmIHVpbnQ4X3Qg
UHJlZGljdGVkVHlwZTsKK3N0YXRpYyBjb25zdCBQcmVkaWN0ZWRUeXBlIFByZWRpY3ROb25lICA9
IDA7CitzdGF0aWMgY29uc3QgUHJlZGljdGVkVHlwZSBQcmVkaWN0Q2VsbCAgPSAweDAxOworc3Rh
dGljIGNvbnN0IFByZWRpY3RlZFR5cGUgUHJlZGljdEFycmF5ID0gMHgwMzsKK3N0YXRpYyBjb25z
dCBQcmVkaWN0ZWRUeXBlIFByZWRpY3RJbnQzMiA9IDB4MDQ7CisKK3N0cnVjdCBQcmVkaWN0aW9u
U2xvdCB7CitwdWJsaWM6CisgICAgUHJlZGljdGlvblNsb3QoKQorICAgICAgICA6IG1fdmFsdWUo
UHJlZGljdE5vbmUpCisgICAgeworICAgIH0KKyAgICBQcmVkaWN0ZWRUeXBlIG1fdmFsdWU7Cit9
OworCiB0eXBlZGVmIHVpbnQzMl90IEJsb2NrSW5kZXg7CiAKIC8vIEZvciBldmVyeSBsb2NhbCB2
YXJpYWJsZSB3ZSB0cmFjayBhbnkgZXhpc3RpbmcgZ2V0IG9yIHNldCBvZiB0aGUgdmFsdWUuCkBA
IC04Niw2ICsxMDIsMTIgQEAgc3RydWN0IEJhc2ljQmxvY2sgewogLy8gTm9kZXMgdGhhdCBhcmUg
J2RlYWQnIHJlbWFpbiBpbiB0aGUgdmVjdG9yIHdpdGggcmVmQ291bnQgMC4KIGNsYXNzIEdyYXBo
IDogcHVibGljIFZlY3RvcjxOb2RlLCA2ND4gewogcHVibGljOgorICAgIEdyYXBoKHVuc2lnbmVk
IG51bUFyZ3VtZW50cywgdW5zaWduZWQgbnVtVmFyaWFibGVzKQorICAgICAgICA6IG1fYXJndW1l
bnRQcmVkaWN0aW9ucyhudW1Bcmd1bWVudHMpCisgICAgICAgICwgbV92YXJpYWJsZVByZWRpY3Rp
b25zKG51bVZhcmlhYmxlcykKKyAgICB7CisgICAgfQorCiAgICAgLy8gTWFyayBhIG5vZGUgYXMg
YmVpbmcgcmVmZXJlbmNlZC4KICAgICB2b2lkIHJlZihOb2RlSW5kZXggbm9kZUluZGV4KQogICAg
IHsKQEAgLTEwMSw4ICsxMjMsNiBAQCBwdWJsaWM6CiAgICAgdm9pZCBkdW1wKE5vZGVJbmRleCwg
Q29kZUJsb2NrKiA9IDApOwogI2VuZGlmCiAKLSAgICBWZWN0b3I8IE93blB0cjxCYXNpY0Jsb2Nr
PiAsIDg+IG1fYmxvY2tzOwotCiAgICAgQmxvY2tJbmRleCBibG9ja0luZGV4Rm9yQnl0ZWNvZGVP
ZmZzZXQodW5zaWduZWQgYnl0ZWNvZGVCZWdpbikKICAgICB7CiAgICAgICAgIE93blB0cjxCYXNp
Y0Jsb2NrPiogYmVnaW4gPSBtX2Jsb2Nrcy5iZWdpbigpOwpAQCAtMTE2LDkgKzEzNiwzNCBAQCBw
dWJsaWM6CiAgICAgICAgIHJldHVybiAqbV9ibG9ja3NbYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zm
c2V0KGJ5dGVjb2RlQmVnaW4pXTsKICAgICB9CiAKKyAgICB2b2lkIHByZWRpY3QoaW50IG9wZXJh
bmQsIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbikKKyAgICB7CisgICAgICAgIGlmIChvcGVyYW5k
IDwgMCkgeworICAgICAgICAgICAgdW5zaWduZWQgYXJndW1lbnQgPSBvcGVyYW5kICsgbV9hcmd1
bWVudFByZWRpY3Rpb25zLnNpemUoKSArIFJlZ2lzdGVyRmlsZTo6Q2FsbEZyYW1lSGVhZGVyU2l6
ZTsKKyAgICAgICAgICAgIG1fYXJndW1lbnRQcmVkaWN0aW9uc1thcmd1bWVudF0ubV92YWx1ZSB8
PSBwcmVkaWN0aW9uOworICAgICAgICB9IGVsc2UgaWYgKCh1bnNpZ25lZClvcGVyYW5kIDwgbV92
YXJpYWJsZVByZWRpY3Rpb25zLnNpemUoKSkKKyAgICAgICAgICAgIG1fdmFyaWFibGVQcmVkaWN0
aW9uc1tvcGVyYW5kXS5tX3ZhbHVlIHw9IHByZWRpY3Rpb247CisgICAgICAgICAgICAKKyAgICB9
CisKKyAgICBQcmVkaWN0ZWRUeXBlIGdldFByZWRpY3Rpb24oaW50IG9wZXJhbmQpCisgICAgewor
ICAgICAgICBpZiAob3BlcmFuZCA8IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFyZ3VtZW50
ID0gb3BlcmFuZCArIG1fYXJndW1lbnRQcmVkaWN0aW9ucy5zaXplKCkgKyBSZWdpc3RlckZpbGU6
OkNhbGxGcmFtZUhlYWRlclNpemU7CisgICAgICAgICAgICByZXR1cm4gbV9hcmd1bWVudFByZWRp
Y3Rpb25zW2FyZ3VtZW50XS5tX3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICgodW5zaWdu
ZWQpb3BlcmFuZCA8IG1fdmFyaWFibGVQcmVkaWN0aW9ucy5zaXplKCkpCisgICAgICAgICAgICBy
ZXR1cm4gbV92YXJpYWJsZVByZWRpY3Rpb25zW29wZXJhbmRdLm1fdmFsdWU7CisgICAgICAgIHJl
dHVybiBQcmVkaWN0Tm9uZTsKKyAgICB9CisKKyAgICBWZWN0b3I8IE93blB0cjxCYXNpY0Jsb2Nr
PiAsIDg+IG1fYmxvY2tzOwogcHJpdmF0ZToKICAgICAvLyBXaGVuIGEgbm9kZSdzIHJlZkNvdW50
IGdvZXMgZnJvbSAwIHRvIDEsIGl0IG11c3QgKGxvZ2ljYWxseSkgcmVjdXJzaXZlbHkgcmVmIGFs
bCBvZiBpdHMgY2hpbGRyZW4sIGFuZCB2aWNlIHZlcnNhLgogICAgIHZvaWQgcmVmQ2hpbGRyZW4o
Tm9kZUluZGV4KTsKKworICAgIFZlY3RvcjxQcmVkaWN0aW9uU2xvdCwgMTY+IG1fYXJndW1lbnRQ
cmVkaWN0aW9uczsKKyAgICBWZWN0b3I8UHJlZGljdGlvblNsb3QsIDE2PiBtX3ZhcmlhYmxlUHJl
ZGljdGlvbnM7CiB9OwogCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmNwcAkocmV2aXNpb24gODQ3NDgp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjY0LDcgKzI2NCwxMSBAQCB2b2lkIEpJVENvbXBpbGVyOjpjb21waWxlRnVu
Y3Rpb24oSklUQ29kCiAgICAgLy8gRmlyc3QgZ2VuZXJhdGUgdGhlIHNwZWN1bGF0aXZlIHBhdGgu
CiAgICAgTGFiZWwgc3BlY3VsYXRpdmVQYXRoQmVnaW4gPSBsYWJlbCgpOwogICAgIFNwZWN1bGF0
aXZlSklUIHNwZWN1bGF0aXZlKCp0aGlzKTsKKyNpZiAhREZHX0RFQlVHX0xPQ0FMX0RJU0JBTEVf
U1BFQ1VMQVRJVkUKICAgICBib29sIGNvbXBpbGVkU3BlY3VsYXRpdmUgPSBzcGVjdWxhdGl2ZS5j
b21waWxlKCk7CisjZWxzZQorICAgIGJvb2wgY29tcGlsZWRTcGVjdWxhdGl2ZSA9IGZhbHNlOwor
I2VuZGlmCiAKICAgICAvLyBOZXh0LCBnZW5lcmF0ZSB0aGUgbm9uLXNwZWN1bGF0aXZlIHBhdGgu
IFdlIHBhc3MgdGhpcyBhIFNwZWN1bGF0aW9uQ2hlY2tJbmRleEl0ZXJhdG9yCiAgICAgLy8gdG8g
YWxsb3cgaXQgdG8gY2hlY2sgd2hpY2ggbm9kZXMgaW4gdGhlIGdyYXBoIG1heSBiYWlsIG91dCwg
YW5kIG1heSBuZWVkIHRvIHJlZW50ZXIgdGhlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiA4NDc0OCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjA1LDExICsy
MDUsNiBAQCBwdWJsaWM6CiAgICAgfQogI2VuZGlmCiAKLSAgICBBZGRyZXNzIGFkZHJlc3NGb3JB
cmd1bWVudChpbnQzMl90IGFyZ3VtZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFkZHJlc3Mo
Y2FsbEZyYW1lUmVnaXN0ZXIsIChhcmd1bWVudCAtIChtX2NvZGVCbG9jay0+bV9udW1QYXJhbWV0
ZXJzICsgUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplKSkgKiBzaXplb2YoUmVnaXN0
ZXIpKTsKLSAgICB9Ci0KICAgICBzdGF0aWMgQWRkcmVzcyBhZGRyZXNzRm9yR2xvYmFsVmFyKFJl
Z2lzdGVySUQgZ2xvYmFsLCBpbnQzMl90IHZhck51bWJlcikKICAgICB7CiAgICAgICAgIHJldHVy
biBBZGRyZXNzKGdsb2JhbCwgdmFyTnVtYmVyICogc2l6ZW9mKFJlZ2lzdGVyKSk7CkBAIC0yMjAs
NiArMjE1LDE2IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIEFkZHJlc3MoY2FsbEZyYW1lUmVn
aXN0ZXIsIHZpcnR1YWxSZWdpc3RlciAqIHNpemVvZihSZWdpc3RlcikpOwogICAgIH0KIAorICAg
IHN0YXRpYyBBZGRyZXNzIHRhZ0ZvcihWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIHZpcnR1YWxS
ZWdpc3RlciAqIHNpemVvZihSZWdpc3RlcikgKyBPQkpFQ1RfT0ZGU0VUT0YoRW5jb2RlZFZhbHVl
RGVzY3JpcHRvciwgYXNCaXRzLnRhZykpOworICAgIH0KKworICAgIHN0YXRpYyBBZGRyZXNzIHBh
eWxvYWRGb3IoVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlcikKKyAgICB7CisgICAgICAg
IHJldHVybiBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCB2aXJ0dWFsUmVnaXN0ZXIgKiBzaXpl
b2YoUmVnaXN0ZXIpICsgT0JKRUNUX09GRlNFVE9GKEVuY29kZWRWYWx1ZURlc2NyaXB0b3IsIGFz
Qml0cy5wYXlsb2FkKSk7CisgICAgfQorCiAgICAgLy8gVGhlc2UgbWV0aG9kcyBwcm92aWRlIG1h
cHBpbmcgZnJvbSBzZXF1ZW50aWFsIHJlZ2lzdGVyIG51bWJlcmluZyAoR1BSUmVnL0ZQUlJlZykK
ICAgICAvLyB0byBtYWNoaW5lIHJlZ2lzdGVyIG51bWJlcmluZyAoUmVnaXN0ZXJJRC9GUFJlZ2lz
dGVySUQpLgogICAgIHN0YXRpYyBSZWdpc3RlcklEIGdwclRvUmVnaXN0ZXJJRChHUFJSZWcgcmVn
KQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgJKHJldmlzaW9uIDg0NzQ4KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQwLDYgKzQwLDggQEAKICNkZWZpbmUgREZHX0pJVF9CUkVBS19PTl9FVkVSWV9OT0RFIDAKIC8v
IERpc2FibGUgdGhlIERGRyBKSVQgd2l0aG91dCBoYXZpbmcgdG8gdG91Y2ggUGxhdGZvcm0uaCEK
ICNkZWZpbmUgREZHX0RFQlVHX0xPQ0FMX0RJU0JBTEUgMAorLy8gRGlzYWJsZSB0aGUgU3BlY3Vs
YXRpdmVKSVQgd2l0aG91dCBoYXZpbmcgdG8gdG91Y2ggUGxhdGZvcm0uaCEKKyNkZWZpbmUgREZH
X0RFQlVHX0xPQ0FMX0RJU0JBTEVfU1BFQ1VMQVRJVkUgMAogLy8gR2VuZXJhdGUgc3RhdHMgb24g
aG93IHN1Y2Nlc3NmdWwgd2Ugd2VyZSBpbiBtYWtpbmcgdXNlIG9mIHRoZSBERkcgaml0LCBhbmQg
cmVtYWluaW5nIG9uIHRoZSBob3QgcGF0aC4KICNkZWZpbmUgREZHX1NVQ0NFU1NfU1RBVFMgMAog
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vblNwZWN1bGF0aXZlSklULmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vblNwZWN1bGF0
aXZlSklULmNwcAkocmV2aXNpb24gODQ3NDgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR05vblNwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTczLDggKzE3Mywx
MyBAQCBib29sIE5vblNwZWN1bGF0aXZlSklUOjppc0tub3duTnVtZXJpYyhOCiAKIHZvaWQgTm9u
U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoU3BlY3VsYXRpb25DaGVja0luZGV4SXRlcmF0b3ImIGNo
ZWNrSXRlcmF0b3IsIE5vZGUmIG5vZGUpCiB7Ci0gICAgLy8gLi4uCi0gICAgaWYgKGNoZWNrSXRl
cmF0b3IuaGFzQ2hlY2tBdEluZGV4KG1fY29tcGlsZUluZGV4KSkKKyAgICAvLyBDaGVjayBmb3Ig
c3BlY3VsYXRpb24gY2hlY2tzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gaW4g
dGhlCisgICAgLy8gc3BlY3VsYXRpdmUgcGF0aC4gIERvIG5vdCBjaGVjayBmb3IgTm9kZUluZGV4
IDAsIHNpbmNlIHRoaXMgaXMgY2hlY2tlZAorICAgIC8vIGluIHRoZSBvdXRlcm1vc3QgY29tcGls
ZSBsYXllciwgYXQgdGhlIGhlYWQgb2YgdGhlIG5vbi1zcGVjdWxhdGl2ZSBwYXRoCisgICAgLy8g
KGZvciBpbmRleCAwIHdlIG1heSBuZWVkIHRvIGNoZWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBv
ciBub3QgdGhlIG5vZGUKKyAgICAvLyB3aWxsIGJlIGdlbmVyYXRlZCwgc2luY2UgYXJndW1lbnQg
dHlwZSBzcGVjdWxhdGlvbiBjaGVja3Mgd2lsbCBhcHBlYXIKKyAgICAvLyBhcyBzcGVjdWxhdGlv
biBjaGVja3MgYXQgdGhpcyBpbmRleCkuCisgICAgaWYgKG1fY29tcGlsZUluZGV4ICYmIGNoZWNr
SXRlcmF0b3IuaGFzQ2hlY2tBdEluZGV4KG1fY29tcGlsZUluZGV4KSkKICAgICAgICAgdHJhY2tF
bnRyeShtX2ppdC5sYWJlbCgpKTsKIAogICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKQEAgLTY4
Myw2ICs2ODgsMTAgQEAgdm9pZCBOb25TcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShTcGVjdWxhdAog
CiB2b2lkIE5vblNwZWN1bGF0aXZlSklUOjpjb21waWxlKFNwZWN1bGF0aW9uQ2hlY2tJbmRleEl0
ZXJhdG9yJiBjaGVja0l0ZXJhdG9yKQogeworICAgIC8vIENoZWNrIGZvciBzcGVjdWxhdGlvbiBj
aGVja3MgYWRkZWQgYXQgZnVuY3Rpb24gZW50cnkgKGNoZWNraW5nIGFyZ3VtZW50IHR5cGVzKS4K
KyAgICBpZiAoY2hlY2tJdGVyYXRvci5oYXNDaGVja0F0SW5kZXgobV9jb21waWxlSW5kZXgpKQor
ICAgICAgICB0cmFja0VudHJ5KG1faml0LmxhYmVsKCkpOworCiAgICAgQVNTRVJUKCFtX2NvbXBp
bGVJbmRleCk7CiAgICAgZm9yIChtX2Jsb2NrID0gMDsgbV9ibG9jayA8IG1faml0LmdyYXBoKCku
bV9ibG9ja3Muc2l6ZSgpOyArK21fYmxvY2spCiAgICAgICAgIGNvbXBpbGUoY2hlY2tJdGVyYXRv
ciwgKm1faml0LmdyYXBoKCkubV9ibG9ja3NbbV9ibG9ja10pOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDg0NzQ4
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI4NSwxOSArMjg1LDQ1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNv
bXBpbGUoTm9kZSYgbm9kZSkKIAogICAgIGNhc2UgR2V0TG9jYWw6IHsKICAgICAgICAgR1BSVGVt
cG9yYXJ5IHJlc3VsdCh0aGlzKTsKLSAgICAgICAgbV9qaXQubG9hZFB0cihKSVRDb21waWxlcjo6
YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpLCByZXN1bHQucmVnaXN0ZXJJRCgpKTsKLQotICAgICAg
ICAvLyBqc1ZhbHVlUmVzdWx0LCBidXQgZG9uJ3QgdXNlQ2hpbGRyZW4hCi0gICAgICAgIFZpcnR1
YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwotICAg
ICAgICBtX2dwcnMucmV0YWluKHJlc3VsdC5ncHIoKSwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9y
ZGVySlMpOwotICAgICAgICBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl0uaW5pdEpT
VmFsdWUobV9jb21waWxlSW5kZXgsIG5vZGUucmVmQ291bnQoKSwgcmVzdWx0LmdwcigpLCBEYXRh
Rm9ybWF0SlMpOworICAgICAgICBQcmVkaWN0ZWRUeXBlIHByZWRpY3Rpb24gPSBtX2ppdC5ncmFw
aCgpLmdldFByZWRpY3Rpb24obm9kZS5sb2NhbCgpKTsKKyAgICAgICAgaWYgKHByZWRpY3Rpb24g
PT0gUHJlZGljdEludDMyKSB7CisgICAgICAgICAgICAvLyBpbnRlZ2VyUmVzdWx0LCBidXQgZG9u
J3QgdXNlQ2hpbGRyZW4hCisgICAgICAgICAgICBtX2ppdC5sb2FkMzIoSklUQ29tcGlsZXI6OnBh
eWxvYWRGb3Iobm9kZS5sb2NhbCgpKSwgcmVzdWx0LnJlZ2lzdGVySUQoKSk7CisgICAgICAgICAg
ICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIo
KTsKKyAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4ocmVzdWx0LmdwcigpLCB2aXJ0dWFsUmVnaXN0
ZXIsIFNwaWxsT3JkZXJJbnRlZ2VyKTsKKyAgICAgICAgICAgIG1fZ2VuZXJhdGlvbkluZm9bdmly
dHVhbFJlZ2lzdGVyXS5pbml0SW50ZWdlcihtX2NvbXBpbGVJbmRleCwgbm9kZS5yZWZDb3VudCgp
LCByZXN1bHQuZ3ByKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8ganNWYWx1
ZVJlc3VsdCwgYnV0IGRvbid0IHVzZUNoaWxkcmVuIQorICAgICAgICAgICAgbV9qaXQubG9hZFB0
cihKSVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpLCByZXN1bHQucmVnaXN0ZXJJ
RCgpKTsKKyAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2Rl
LnZpcnR1YWxSZWdpc3RlcigpOworICAgICAgICAgICAgbV9ncHJzLnJldGFpbihyZXN1bHQuZ3By
KCksIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlckpTKTsKKyAgICAgICAgICAgIG1fZ2VuZXJh
dGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXS5pbml0SlNWYWx1ZShtX2NvbXBpbGVJbmRleCwgbm9k
ZS5yZWZDb3VudCgpLCByZXN1bHQuZ3ByKCksIChwcmVkaWN0aW9uID09IFByZWRpY3RBcnJheSkg
PyBEYXRhRm9ybWF0SlNDZWxsIDogRGF0YUZvcm1hdEpTKTsKKyAgICAgICAgfQogICAgICAgICBi
cmVhazsKICAgICB9CiAKICAgICBjYXNlIFNldExvY2FsOiB7Ci0gICAgICAgIEpTVmFsdWVPcGVy
YW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKTsKLSAgICAgICAgbV9qaXQuc3RvcmVQdHIodmFs
dWUucmVnaXN0ZXJJRCgpLCBKSVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsK
LSAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgpOworICAgICAgICBzd2l0Y2ggKG1faml0
LmdyYXBoKCkuZ2V0UHJlZGljdGlvbihub2RlLmxvY2FsKCkpKSB7CisgICAgICAgIGNhc2UgUHJl
ZGljdEludDMyOiB7CisgICAgICAgICAgICBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCB2YWx1ZSh0
aGlzLCBub2RlLmNoaWxkMSk7CisgICAgICAgICAgICBtX2ppdC5zdG9yZTMyKHZhbHVlLnJlZ2lz
dGVySUQoKSwgSklUQ29tcGlsZXI6OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7CisgICAgICAg
ICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIFByZWRpY3RBcnJheTogeworICAgICAgICAgICAgU3BlY3VsYXRl
Q2VsbE9wZXJhbmQgY2VsbCh0aGlzLCBub2RlLmNoaWxkMSk7CisgICAgICAgICAgICBtX2ppdC5z
dG9yZVB0cihjZWxsLnJlZ2lzdGVySUQoKSwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9kZS5s
b2NhbCgpKSk7CisgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAg
IEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKTsKKyAgICAgICAgICAgIG1f
aml0LnN0b3JlUHRyKHZhbHVlLnJlZ2lzdGVySUQoKSwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Io
bm9kZS5sb2NhbCgpKSk7CisgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGJyZWFrOwog
ICAgIH0KIApAQCAtNjMwLDcgKzY1NiwxMCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxl
KE5vZGUmIG5vZGUpCiAgICAgICAgIG1faml0LmxvYWRQdHIoTWFjcm9Bc3NlbWJsZXI6OkFkZHJl
c3MoYmFzZVJlZywgSlNBcnJheTo6c3RvcmFnZU9mZnNldCgpKSwgc3RvcmFnZVJlZyk7CiAKICAg
ICAgICAgLy8gQ2hlY2sgdGhhdCBiYXNlIGlzIGFuIGFycmF5LCBhbmQgdGhhdCBwcm9wZXJ0eSBp
cyBjb250YWluZWQgd2l0aGluIG1fdmVjdG9yICg8IG1fdmVjdG9yTGVuZ3RoKS4KLSAgICAgICAg
c3BlY3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFs
LCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhiYXNlUmVnKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0
ZWRJbW1QdHIobV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0FycmF5VlB0cikpKTsKKyAgICAgICAgLy8g
SWYgd2UgaGF2ZSBwcmVkaWN0ZWQgdGhlIGJhc2UgdG8gYmUgdHlwZSBhcnJheSwgd2UgY2FuIHNr
aXAgdGhlIGNoZWNrLgorICAgICAgICBOb2RlJiBiYXNlTm9kZSA9IG1faml0LmdyYXBoKClbbm9k
ZS5jaGlsZDFdOworICAgICAgICBpZiAoYmFzZU5vZGUub3AgIT0gR2V0TG9jYWwgfHwgbV9qaXQu
Z3JhcGgoKS5nZXRQcmVkaWN0aW9uKGJhc2VOb2RlLmxvY2FsKCkpICE9IFByZWRpY3RBcnJheSkK
KyAgICAgICAgICAgIHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1i
bGVyOjpOb3RFcXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoYmFzZVJlZyksIE1hY3JvQXNz
ZW1ibGVyOjpUcnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNBcnJheVZQdHIpKSk7
CiAgICAgICAgIHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6
OkFib3ZlT3JFcXVhbCwgcHJvcGVydHlSZWcsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKGJhc2VS
ZWcsIEpTQXJyYXk6OnZlY3Rvckxlbmd0aE9mZnNldCgpKSkpOwogCiAgICAgICAgIC8vIEZJWE1F
OiBJbiBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgc3Vic2VxdWVudCBieV92YWwgYWNjZXNzZXMgdG8g
dGhlIHNhbWUgYmFzZSBpdCBtaWdodCBoZWxwIHRvIGNhY2hlCkBAIC02NTcsNyArNjg2LDEwIEBA
IHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgTWFjcm9B
c3NlbWJsZXI6OlJlZ2lzdGVySUQgc3RvcmFnZVJlZyA9IHN0b3JhZ2UucmVnaXN0ZXJJRCgpOwog
CiAgICAgICAgIC8vIENoZWNrIHRoYXQgYmFzZSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgcHJvcGVy
dHkgaXMgY29udGFpbmVkIHdpdGhpbiBtX3ZlY3RvciAoPCBtX3ZlY3Rvckxlbmd0aCkuCi0gICAg
ICAgIHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpOb3RF
cXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoYmFzZVJlZyksIE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNBcnJheVZQdHIpKSk7CisgICAgICAg
IC8vIElmIHdlIGhhdmUgcHJlZGljdGVkIHRoZSBiYXNlIHRvIGJlIHR5cGUgYXJyYXksIHdlIGNh
biBza2lwIHRoZSBjaGVjay4KKyAgICAgICAgTm9kZSYgYmFzZU5vZGUgPSBtX2ppdC5ncmFwaCgp
W25vZGUuY2hpbGQxXTsKKyAgICAgICAgaWYgKGJhc2VOb2RlLm9wICE9IEdldExvY2FsIHx8IG1f
aml0LmdyYXBoKCkuZ2V0UHJlZGljdGlvbihiYXNlTm9kZS5sb2NhbCgpKSAhPSBQcmVkaWN0QXJy
YXkpCisgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fz
c2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKGJhc2VSZWcpLCBNYWNy
b0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX2ppdC5nbG9iYWxEYXRhKCktPmpzQXJyYXlWUHRy
KSkpOwogICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaDMyKE1hY3JvQXNzZW1i
bGVyOjpBYm92ZU9yRXF1YWwsIHByb3BlcnR5UmVnLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhi
YXNlUmVnLCBKU0FycmF5Ojp2ZWN0b3JMZW5ndGhPZmZzZXQoKSkpKTsKIAogICAgICAgICAvLyBH
ZXQgdGhlIGFycmF5IHN0b3JhZ2UuCkBAIC04NjgsOCArOTAwLDUxIEBAIHZvaWQgU3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKICAgICB9CiB9CiAKKy8vIElmIHdlIGFyZSBtYWtp
bmcgdHlwZSBwcmVkaWN0aW9ucyBhYm91dCBvdXIgYXJndW1lbnRzIHRoZW4KKy8vIHdlIG5lZWQg
dG8gY2hlY2sgdGhhdCB0aGV5IGFyZSBjb3JyZWN0IG9uIGZ1bmN0aW9uIGVudHJ5Lgordm9pZCBT
cGVjdWxhdGl2ZUpJVDo6Y2hlY2tBcmd1bWVudFR5cGVzKCkKK3sKKyAgICBBU1NFUlQoIW1fY29t
cGlsZUluZGV4KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1faml0LmNvZGVCbG9jaygpLT5t
X251bVBhcmFtZXRlcnM7ICsraSkgeworICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJl
Z2lzdGVyID0gKFZpcnR1YWxSZWdpc3RlcikobV9qaXQuY29kZUJsb2NrKCktPnRoaXNSZWdpc3Rl
cigpICsgaSk7CisgICAgICAgIGlmIChtX2ppdC5ncmFwaCgpLmdldFByZWRpY3Rpb24odmlydHVh
bFJlZ2lzdGVyKSA9PSBQcmVkaWN0SW50MzIpCisgICAgICAgIHN3aXRjaCAobV9qaXQuZ3JhcGgo
KS5nZXRQcmVkaWN0aW9uKHZpcnR1YWxSZWdpc3RlcikpIHsKKyAgICAgICAgY2FzZSBQcmVkaWN0
SW50MzI6CisgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNy
b0Fzc2VtYmxlcjo6QmVsb3csIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKHZpcnR1YWxSZWdpc3Rl
ciksIEpJVENvbXBpbGVyOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGNhc2UgUHJlZGljdEFycmF5OiB7CisgICAgICAgICAgICBHUFJUZW1w
b3JhcnkgdGVtcCh0aGlzKTsKKyAgICAgICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6
OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgdGVtcC5yZWdpc3RlcklEKCkpOworICAgICAg
ICAgICAgc3BlY3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVy
OjpOb25aZXJvLCB0ZW1wLnJlZ2lzdGVySUQoKSwgSklUQ29tcGlsZXI6OnRhZ01hc2tSZWdpc3Rl
cikpOworICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hQdHIoTWFjcm9B
c3NlbWJsZXI6Ok5vdEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyh0ZW1wLnJlZ2lzdGVy
SUQoKSksIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+
anNBcnJheVZQdHIpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8g
Rm9yIGFueSB2YXJzIHRoYXQgd2Ugd2lsbCBiZSB0cmVhdGluZyBhcyBudW1lcmljLCB3cml0ZSAw
IHRvCisvLyB0aGUgdmFyIG9uIGVudHJ5LiAgVGhyb3VnaG91dCB0aGUgYmxvY2sgd2Ugd2lsbCBv
bmx5IHJlYWQvd3JpdGUKKy8vIHRvIHRoZSBwYXlsb2FkLCBieSB3cml0aW5nIHRoZSB0YWcgbm93
IHdlIHByZXZlbnQgdGhlIEdDIGZyb20KKy8vIG1pc2ludGVycHJldGluZyB2YWx1ZXMgYXMgcG9p
bnRlcnMuCit2b2lkIFNwZWN1bGF0aXZlSklUOjppbml0aWFsaXplVmFyaWFibGVUeXBlcygpCit7
CisgICAgQVNTRVJUKCFtX2NvbXBpbGVJbmRleCk7CisgICAgZm9yIChpbnQgdmFyID0gMDsgdmFy
IDwgbV9qaXQuY29kZUJsb2NrKCktPm1fbnVtVmFyczsgKyt2YXIpIHsKKyAgICAgICAgaWYgKG1f
aml0LmdyYXBoKCkuZ2V0UHJlZGljdGlvbih2YXIpID09IFByZWRpY3RJbnQzMikKKyAgICAgICAg
ICAgIG1faml0LnN0b3JlUHRyKEpJVENvbXBpbGVyOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIEpJ
VENvbXBpbGVyOjphZGRyZXNzRm9yKChWaXJ0dWFsUmVnaXN0ZXIpdmFyKSk7CisgICAgfQorfQor
CiBib29sIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKCkKIHsKKyAgICBjaGVja0FyZ3VtZW50VHlw
ZXMoKTsKKyAgICBpbml0aWFsaXplVmFyaWFibGVUeXBlcygpOworCiAgICAgQVNTRVJUKCFtX2Nv
bXBpbGVJbmRleCk7CiAgICAgZm9yIChtX2Jsb2NrID0gMDsgbV9ibG9jayA8IG1faml0LmdyYXBo
KCkubV9ibG9ja3Muc2l6ZSgpOyArK21fYmxvY2spIHsKICAgICAgICAgY29tcGlsZSgqbV9qaXQu
Z3JhcGgoKS5tX2Jsb2Nrc1ttX2Jsb2NrXSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShyZXZpc2lvbiA4NDc0OCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkod29ya2luZyBjb3B5KQpAQCAt
MTM1LDYgKzEzNSw5IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21waWxlKE5vZGUmKTsKICAgICB2
b2lkIGNvbXBpbGUoQmFzaWNCbG9jayYpOwogCisgICAgdm9pZCBjaGVja0FyZ3VtZW50VHlwZXMo
KTsKKyAgICB2b2lkIGluaXRpYWxpemVWYXJpYWJsZVR5cGVzKCk7CisKICAgICBib29sIGlzRG91
YmxlQ29uc3RhbnRXaXRoSW50MzJWYWx1ZShOb2RlSW5kZXggbm9kZUluZGV4LCBpbnQzMl90JiBv
dXQpCiAgICAgewogICAgICAgICBpZiAoIW1faml0LmlzRG91YmxlQ29uc3RhbnQobm9kZUluZGV4
KSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3Bw
CShyZXZpc2lvbiA4NDc0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1
dGFibGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMDQsNyArMjA0LDcgQEAgc3RhdGljIGJvb2wg
dHJ5REZHQ29tcGlsZShKU0dsb2JhbERhdGEqIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAjZW5k
aWYKIAotICAgIERGRzo6R3JhcGggZGZnOworICAgIERGRzo6R3JhcGggZGZnKGNvZGVCbG9jay0+
bV9udW1QYXJhbWV0ZXJzLCBjb2RlQmxvY2stPm1fbnVtVmFycyk7CiAgICAgaWYgKCFwYXJzZShk
ZmcsIGdsb2JhbERhdGEsIGNvZGVCbG9jaykpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAo=
</data>
<flag name="review"
          id="83803"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>