<?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>74170</bug_id>
          
          <creation_ts>2011-12-08 23:44:28 -0800</creation_ts>
          <short_desc>DFG&apos;s interpretation of rare case profiles should be frequency-based not count-based</short_desc>
          <delta_ts>2011-12-09 16:10:29 -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>All</rep_platform>
          <op_sys>All</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="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>518145</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-08 23:44:28 -0800</bug_when>
    <thetext>Consider the following code:

function foo(...) {
    a = b / c; // b and c are integers, but b / c returns a fractional number
    for (var i = 0; i &lt; 100000; ++i) { ... }
}

This will get optimized while in the loop, so the rare case counter for b / c will be 1 - not enough to force b / c to be a double division.  foo() will then fail speculation the next time it is called, but even then, the rare case counter will just be at 2 - still not enough.  The threshold is currently around 100 before b / c would be viewed by the DFG as a double division - but in this case, that won&apos;t happen for a very long time, so the loop will never benefit from DFG optimization due to this one overzealous speculation.

The solution is to decide b / c is double based on the frequency of slow path execution, rather than the absolute count of how many times it was taken.  This requires knowing the total number of times that an instruction executed, which in turn requires a bit more profiling in the old JIT.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518146</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-08 23:45:21 -0800</bug_when>
    <thetext>The easiest way to get a rate rather than an absolute count is to count the number of times each basic block executes.  This requires counters only at jump targets, and immediately following branches.  I implemented this, and it&apos;s really cheap - I can&apos;t see any performance degradation.


Benchmark report for SunSpider, V8, and Kraken on oldmac.local (MacPro4,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r102385)
&quot;CountBB&quot; at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc (r102385)

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                            TipOfTree                CountBB                                     
SunSpider:
   3d-cube                                8.8183+-0.0418    ?     8.8363+-0.0535       ?
   3d-morph                              10.1214+-0.0387    ?    10.1393+-0.0775       ?
   3d-raytrace                            9.3476+-0.1096          9.2083+-0.0700         might be 1.0151x faster
   access-binary-trees                    1.9328+-0.0373    ?     1.9617+-0.0373       ? might be 1.0150x slower
   access-fannkuch                        8.9966+-0.0166    !     9.1016+-0.0566       ! definitely 1.0117x slower
   access-nbody                           4.7551+-0.0418          4.7248+-0.0083       
   access-nsieve                          3.7196+-0.0121    ?     3.7310+-0.0119       ?
   bitops-3bit-bits-in-byte               1.5102+-0.0225    ?     1.5232+-0.0294       ?
   bitops-bits-in-byte                    5.9291+-0.0192    !     5.9748+-0.0233       ! definitely 1.0077x slower
   bitops-bitwise-and                     3.9838+-0.0191    ?     4.0024+-0.0467       ?
   bitops-nsieve-bits                     6.8696+-0.0404          6.8539+-0.0441       
   controlflow-recursive                  2.7657+-0.0195    ?     2.7738+-0.0122       ?
   crypto-aes                             8.7318+-0.0918          8.7155+-0.0921       
   crypto-md5                             2.9179+-0.0189    ?     2.9627+-0.0286       ? might be 1.0154x slower
   crypto-sha1                            2.5999+-0.0151    ?     2.6182+-0.0207       ?
   date-format-tofte                     13.3252+-0.1260         13.1250+-0.1467         might be 1.0153x faster
   date-format-xparb                     11.9514+-0.0594    ?    12.0433+-0.0878       ?
   math-cordic                            8.6429+-0.0445    ?     8.6963+-0.0691       ?
   math-partial-sums                     12.6434+-0.0336         12.6069+-0.0228       
   math-spectral-norm                     3.1378+-0.0201    ?     3.1393+-0.0184       ?
   regexp-dna                            15.8619+-0.1243         15.7403+-0.0863       
   string-base64                          4.7747+-0.0419    ?     4.8000+-0.0489       ?
   string-fasta                           8.8949+-0.0507          8.8560+-0.0287       
   string-tagcloud                       15.0438+-0.0765    ?    15.0568+-0.0822       ?
   string-unpack-code                    25.9398+-0.0298    !    26.5210+-0.2463       ! definitely 1.0224x slower
   string-validate-input                  6.7550+-0.0779    ?     6.7989+-0.0832       ?

   &lt;arithmetic&gt; *                         8.0758+-0.0236    ?     8.0966+-0.0343       ? might be 1.0026x slower
   &lt;geometric&gt;                            6.4493+-0.0230    ?     6.4674+-0.0271       ? might be 1.0028x slower
   &lt;harmonic&gt;                             5.0302+-0.0242    ?     5.0551+-0.0246       ? might be 1.0050x slower

                                            TipOfTree                CountBB                                     
V8:
   crypto                                92.3103+-0.3728    ?    92.5307+-0.4690       ?
   deltablue                            204.9305+-1.6018        204.4549+-1.6621       
   earley-boyer                         120.8883+-1.4748    ?   121.7168+-1.2146       ?
   raytrace                              69.9284+-0.2411         69.8041+-0.2873       
   regexp                               149.0791+-0.7718        148.3416+-0.5401       
   richards                             171.1122+-1.6146    ^   167.8128+-1.0429       ^ definitely 1.0197x faster
   splay                                107.8526+-1.1289    ?   108.0241+-1.2968       ?

   &lt;arithmetic&gt;                         130.8716+-0.5034        130.3836+-0.3249         might be 1.0037x faster
   &lt;geometric&gt; *                        123.5641+-0.4652        123.2515+-0.2999         might be 1.0025x faster
   &lt;harmonic&gt;                           116.4428+-0.4195        116.2714+-0.2818         might be 1.0015x faster

                                            TipOfTree                CountBB                                     
Kraken:
   ai-astar                             900.4571+-1.3743    ?   900.4581+-0.8574       ?
   audio-beat-detection                 247.8751+-0.5911    ?   248.3219+-0.8955       ?
   audio-dft                            320.1299+-3.1069        319.5416+-3.4951       
   audio-fft                            160.9397+-0.4120        160.5048+-0.2567       
   audio-oscillator                     343.0422+-7.1926    ?   352.6219+-6.6597       ? might be 1.0279x slower
   imaging-darkroom                     403.1950+-5.5486    ?   404.6109+-5.9675       ?
   imaging-desaturate                   288.5352+-0.3384    ?   288.7382+-0.3635       ?
   imaging-gaussian-blur                740.5361+-2.3800        738.8561+-0.5093       
   json-parse-financial                  86.2767+-0.2412    !    87.2189+-0.2078       ! definitely 1.0109x slower
   json-stringify-tinderbox              99.1519+-0.2664         99.1123+-0.2535       
   stanford-crypto-aes                  142.6808+-0.6472    ?   145.4456+-3.9557       ? might be 1.0194x slower
   stanford-crypto-ccm                  138.1201+-1.0647        137.1065+-1.0269       
   stanford-crypto-pbkdf2               281.7826+-2.0743    ?   283.1335+-2.1555       ?
   stanford-crypto-sha256-iterative     114.8826+-0.2872    ?   115.0961+-0.5195       ?

   &lt;arithmetic&gt; *                       304.8289+-0.5537    ?   305.7690+-0.7952       ? might be 1.0031x slower
   &lt;geometric&gt;                          237.8354+-0.5344    ?   238.7712+-0.7594       ? might be 1.0039x slower
   &lt;harmonic&gt;                           192.1020+-0.4203    ?   192.8865+-0.6767       ? might be 1.0041x slower

                                            TipOfTree                CountBB                                     
All benchmarks:
   &lt;arithmetic&gt;                         114.7591+-0.2254    ?   114.9779+-0.2364       ? might be 1.0019x slower
   &lt;geometric&gt;                           29.3225+-0.0838    ?    29.3910+-0.0855       ? might be 1.0023x slower
   &lt;harmonic&gt;                             8.8650+-0.0420    ?     8.9081+-0.0426       ? might be 1.0049x slower

                                            TipOfTree                CountBB                                     
Geomean of preferred means:
   &lt;scaled-result&gt;                       67.2527+-0.1669    ?    67.3225+-0.1479       ? might be 1.0010x slower</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518190</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 02:11:11 -0800</bug_when>
    <thetext>Well this is interesting.  What I was trying to say is that we want a test like:

rateOfFailure / rateOfExecution &gt;= threshold

to determine if we should assume the worst for this instruction.  But that&apos;s not quite right.  Consider the following code:

for (var i = 0; i &lt; 10000; ++i)
    doSomethingThatTakesSlowPathOneInEveryLoopIterations()

In this case, rateOfFailure = rateOfExecution/10.  So it seems like we can assume that it rarely fails and then compile the code as such.

But this would be wrong!  Our goal is not to maximize the probability of a single speculation check succeeding; it is instead to maximize the probability that the function completes without any speculation failures.  Thus if we have a 1/10 chance that any iteration of the loop fails, and the loop executes 10,000 times, then the probability that we will fail at some point during the execution of this loop is essentially 1.  Formally, it is something like:

1 - (1 - rateOfFailure / rateOfExecution) ^ 10000

or more broadly:

1 - (1 - rateOfFailure / rateOfExecution) ^ (rateOfExecution / numbeOfFunctionInvocations)

We have two choices.  We can either perform the formal computation, or we can be clever.  Consider that we do not count the total number of executions of an operation (rateOfExecution) but we do count the number of times the function executes and test:

rateOfFailure / numberOfFunctionExecutions &gt;= threshold

then oddly, we get something much closer to the more general formulation, in terms of its behavior when you plot it for varying inputs.  This is actually great news, because it means that we don&apos;t even have to track the execution rate of basic blocks - all we need is the total number of times that a code block executed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518193</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 02:21:48 -0800</bug_when>
    <thetext>&gt; for (var i = 0; i &lt; 10000; ++i)
&gt;     doSomethingThatTakesSlowPathOneInEveryLoopIterations()

This was meant to be doSomethingThatTakesSlowPathOneInEveryTenLoopIterations().  As in s/OneInEveryLoop/OneInEveryTenLoop/.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518448</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 13:24:56 -0800</bug_when>
    <thetext>It turns out that this is necessary, but insufficient to precisely catch operations that often take slow path.  The early phase of the program&apos;s execution is often not representative of how the program will behave in steady-state.  Hence if we try to make an operation safe by switching it to use a double addition instead of an integer addition, for example, just because 1/2 of the initial executions took slow path then we may run the risk that in steady state that number will actually be &lt;1/10.

So we need a rule like:

Make the operation safe only when:
(It has taken slow path some minimum number of times (probably close to 100),
 and It has taken slow path more than some fraction of total executions (probably 1/10))
or The speculation failures that have led to recompilation being triggered were caused by this operation not being safe.

In this bug, I&apos;ll only solve the first two parts, and fix the last part in another bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518455</commentid>
    <comment_count>5</comment_count>
      <attachid>118623</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 13:31:52 -0800</bug_when>
    <thetext>Created attachment 118623
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518469</commentid>
    <comment_count>6</comment_count>
      <attachid>118627</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 13:48:32 -0800</bug_when>
    <thetext>Created attachment 118627
the patch

Fixed some #if&apos;s.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518473</commentid>
    <comment_count>7</comment_count>
      <attachid>118627</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-12-09 13:49:51 -0800</bug_when>
    <thetext>Comment on attachment 118627
the patch

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

r=me

&gt; Source/JavaScriptCore/runtime/Heuristics.cpp:148
&gt; +    SET(likelyToTakeSlowCaseMinimumCount, 100);

It seems like this 100 limit is still problematic in the first example you gave.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518482</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 13:54:29 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 118627 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118627&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/Heuristics.cpp:148
&gt; &gt; +    SET(likelyToTakeSlowCaseMinimumCount, 100);
&gt; 
&gt; It seems like this 100 limit is still problematic in the first example you gave.

Yup.  But making it lower will cause us to become overly pessimistic for code that takes many slow cases in the early part of its execution.  That&apos;s why we also need a story for realizing that the reason why recompilation was triggered, was because of some slow case in the DFG.  I&apos;ll do that in a follow-on patch, since this one is big enough already.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518623</commentid>
    <comment_count>9</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-09 16:10:15 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/102489</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118623</attachid>
            <date>2011-12-09 13:31:52 -0800</date>
            <delta_ts>2011-12-09 13:48:32 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>proportionalrare_patch_1.diff</filename>
            <type>text/plain</type>
            <size>14911</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAyNDcwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM2IEBA
CisyMDExLTEyLTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHJ3MgaW50ZXJwcmV0YXRpb24gb2YgcmFyZSBjYXNlIHByb2ZpbGVzIHNob3VsZCBiZSBmcmVx
dWVuY3ktYmFzZWQgbm90IGNvdW50LWJhc2VkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD03NDE3MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorICAgICAgICAKKyAgICAgICAgREZHIG9wdGltaXplcyBmb3IgcmFyZSBjYXNlcyBv
bmx5IHdoZW4gdGhlIHJhcmUgY2FzZSBjb3VudGVyIGlzIGFib3ZlIHNvbWUgdGhyZXNob2xkCisg
ICAgICAgIGFuZCBpdCBhbHNvIGNvbnN0aXR1dGVzIGEgbGFyZ2UgZW5vdWdoIGZyYWN0aW9uIG9m
IHRvdGFsIGZ1bmN0aW9uIGV4ZWN1dGlvbnMuIEFsc28KKyAgICAgICAgYWRkZWQgc29tZSBtaW5v
ciBkZWJ1ZyBsb2dpYy4KKworICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAg
ICAgIChKU0M6OkNvZGVCbG9jazo6Q29kZUJsb2NrKToKKyAgICAgICAgKiBieXRlY29kZS9Db2Rl
QmxvY2suaDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpsaWtlbHlUb1Rha2VTbG93Q2FzZSk6
CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6Y291bGRUYWtlU2xvd0Nhc2UpOgorICAgICAgICAo
SlNDOjpDb2RlQmxvY2s6Omxpa2VseVRvVGFrZVNwZWNpYWxGYXN0Q2FzZSk6CisgICAgICAgIChK
U0M6OkNvZGVCbG9jazo6bGlrZWx5VG9UYWtlRGVlcGVzdFNsb3dDYXNlKToKKyAgICAgICAgKEpT
Qzo6Q29kZUJsb2NrOjpsaWtlbHlUb1Rha2VBbnlTbG93Q2FzZSk6CisgICAgICAgIChKU0M6OkNv
ZGVCbG9jazo6ZXhlY3V0aW9uRW50cnlDb3VudCk6CisgICAgICAgICogZGZnL0RGR0J5dGVDb2Rl
UGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6bWFrZVNhZmUp
OgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjptYWtlRGl2U2FmZSk6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAgKiBkZmcvREZHRHJp
dmVyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpjb21waWxlKToKKyAgICAgICAgKiBqaXQvSklU
LmNwcDoKKyAgICAgICAgKEpTQzo6SklUOjpwcml2YXRlQ29tcGlsZSk6CisgICAgICAgICogcnVu
dGltZS9IZXVyaXN0aWNzLmNwcDoKKyAgICAgICAgKEpTQzo6SGV1cmlzdGljczo6aW5pdGlhbGl6
ZUhldXJpc3RpY3MpOgorICAgICAgICAqIHJ1bnRpbWUvSGV1cmlzdGljcy5oOgorCiAyMDExLTEy
LTA5ICBBZHJpZW5uZSBXYWxrZXIgIDxlbm5lQGdvb2dsZS5jb20+CiAKICAgICAgICAgRml4IEhh
c2hNYXA8Li4uLCBPd25QdHI8Li4uPiA+OjphZGQgY29tcGlsYXRpb24gZXJyb3JzCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkocmV2aXNpb24g
MTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTE0MzMsNiArMTQzMyw5IEBAIENvZGVCbG9jazo6Q29kZUJsb2Nr
KENvcHlQYXJzZWRCbG9ja1RhZywKICNpZiBFTkFCTEUoSklUKQogICAgICwgbV9nbG9iYWxSZXNv
bHZlSW5mb3Mob3RoZXIubV9nbG9iYWxSZXNvbHZlSW5mb3MpCiAjZW5kaWYKKyNpZiBFTkFCTEUo
VkFMVUVfUFJPRklMRVIpCisgICAgLCBtX2V4ZWN1dGlvbkVudHJ5Q291bnQoMCkKKyNlbmRpZgog
ICAgICwgbV9qdW1wVGFyZ2V0cyhvdGhlci5tX2p1bXBUYXJnZXRzKQogICAgICwgbV9sb29wVGFy
Z2V0cyhvdGhlci5tX2xvb3BUYXJnZXRzKQogICAgICwgbV9pZGVudGlmaWVycyhvdGhlci5tX2lk
ZW50aWZpZXJzKQpAQCAtMTQ4MSw2ICsxNDg0LDcgQEAgQ29kZUJsb2NrOjpDb2RlQmxvY2soU2Ny
aXB0RXhlY3V0YWJsZSogbwogICAgICwgbV9jb2RlVHlwZShjb2RlVHlwZSkKICAgICAsIG1fc291
cmNlKHNvdXJjZVByb3ZpZGVyKQogICAgICwgbV9zb3VyY2VPZmZzZXQoc291cmNlT2Zmc2V0KQor
ICAgICwgbV9leGVjdXRpb25FbnRyeUNvdW50KDApCiAgICAgLCBtX3N5bWJvbFRhYmxlKHN5bVRh
YikKICAgICAsIG1fYWx0ZXJuYXRpdmUoYWx0ZXJuYXRpdmUpCiAgICAgLCBtX3NwZWN1bGF0aXZl
U3VjY2Vzc0NvdW50ZXIoMCkKQEAgLTIyMzUsMTYgKzIyMzksNiBAQCBib29sIENvZGVCbG9jazo6
c2hvdWxkT3B0aW1pemVOb3coKQogfQogI2VuZGlmCiAKLSNpZiBFTkFCTEUoVkFMVUVfUFJPRklM
RVIpCi12b2lkIENvZGVCbG9jazo6cmVzZXRSYXJlQ2FzZVByb2ZpbGVzKCkKLXsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtYmVyT2ZSYXJlQ2FzZVByb2ZpbGVzKCk7ICsraSkKLSAg
ICAgICAgcmFyZUNhc2VQcm9maWxlKGkpLT5tX2NvdW50ZXIgPSAwOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBudW1iZXJPZlNwZWNpYWxGYXN0Q2FzZVByb2ZpbGVzKCk7ICsraSkKLSAg
ICAgICAgc3BlY2lhbEZhc3RDYXNlUHJvZmlsZShpKS0+bV9jb3VudGVyID0gMDsKLX0KLSNlbmRp
ZgotCiAjaWYgRU5BQkxFKFZFUkJPU0VfVkFMVUVfUFJPRklMRSkKIHZvaWQgQ29kZUJsb2NrOjpk
dW1wVmFsdWVQcm9maWxlcygpCiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNv
ZGUvQ29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL0NvZGVCbG9jay5oCShyZXZpc2lvbiAxMDI0NjgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTY3NiwxMiArNjc2LDE0
IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICAKICAgICAgICAgYm9vbCBsaWtlbHlUb1Rha2VT
bG93Q2FzZShpbnQgYnl0ZWNvZGVPZmZzZXQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVy
biByYXJlQ2FzZVByb2ZpbGVGb3JCeXRlY29kZU9mZnNldChieXRlY29kZU9mZnNldCktPm1fY291
bnRlciA+PSBIZXVyaXN0aWNzOjpsaWtlbHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZDsKKyAgICAg
ICAgICAgIHVuc2lnbmVkIHZhbHVlID0gcmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQo
Ynl0ZWNvZGVPZmZzZXQpLT5tX2NvdW50ZXI7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPj0g
SGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VNaW5pbXVtQ291bnQgJiYgc3RhdGljX2Nh
c3Q8ZG91YmxlPih2YWx1ZSkgLyBtX2V4ZWN1dGlvbkVudHJ5Q291bnQgPj0gSGV1cmlzdGljczo6
bGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAg
ICAgIGJvb2wgY291bGRUYWtlU2xvd0Nhc2UoaW50IGJ5dGVjb2RlT2Zmc2V0KQogICAgICAgICB7
Ci0gICAgICAgICAgICByZXR1cm4gcmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0
ZWNvZGVPZmZzZXQpLT5tX2NvdW50ZXIgPj0gSGV1cmlzdGljczo6Y291bGRUYWtlU2xvd0Nhc2VU
aHJlc2hvbGQ7CisgICAgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA9IHJhcmVDYXNlUHJvZmlsZUZv
ckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlT2Zmc2V0KS0+bV9jb3VudGVyOworICAgICAgICAgICAg
cmV0dXJuIHZhbHVlID49IEhldXJpc3RpY3M6OmNvdWxkVGFrZVNsb3dDYXNlTWluaW11bUNvdW50
ICYmIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpIC8gbV9leGVjdXRpb25FbnRyeUNvdW50ID49
IEhldXJpc3RpY3M6OmNvdWxkVGFrZVNsb3dDYXNlVGhyZXNob2xkOwogICAgICAgICB9CiAgICAg
ICAgIAogICAgICAgICBSYXJlQ2FzZVByb2ZpbGUqIGFkZFNwZWNpYWxGYXN0Q2FzZVByb2ZpbGUo
aW50IGJ5dGVjb2RlT2Zmc2V0KQpAQCAtNjk5LDI0ICs3MDEsMjYgQEAgbmFtZXNwYWNlIEpTQyB7
CiAgICAgICAgIGJvb2wgbGlrZWx5VG9UYWtlU3BlY2lhbEZhc3RDYXNlKGludCBieXRlY29kZU9m
ZnNldCkKICAgICAgICAgewogICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lhbEZhc3RDYXNlQ291
bnQgPSBzcGVjaWFsRmFzdENhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVPZmZz
ZXQpLT5tX2NvdW50ZXI7Ci0gICAgICAgICAgICByZXR1cm4gc3BlY2lhbEZhc3RDYXNlQ291bnQg
Pj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CisgICAgICAgICAg
ICByZXR1cm4gc3BlY2lhbEZhc3RDYXNlQ291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtl
U2xvd0Nhc2VNaW5pbXVtQ291bnQgJiYgc3RhdGljX2Nhc3Q8ZG91YmxlPihzcGVjaWFsRmFzdENh
c2VDb3VudCkgLyBtX2V4ZWN1dGlvbkVudHJ5Q291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9U
YWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGJvb2wg
bGlrZWx5VG9UYWtlRGVlcGVzdFNsb3dDYXNlKGludCBieXRlY29kZU9mZnNldCkKICAgICAgICAg
ewogICAgICAgICAgICAgdW5zaWduZWQgc2xvd0Nhc2VDb3VudCA9IHJhcmVDYXNlUHJvZmlsZUZv
ckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlT2Zmc2V0KS0+bV9jb3VudGVyOwogICAgICAgICAgICAg
dW5zaWduZWQgc3BlY2lhbEZhc3RDYXNlQ291bnQgPSBzcGVjaWFsRmFzdENhc2VQcm9maWxlRm9y
Qnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVPZmZzZXQpLT5tX2NvdW50ZXI7Ci0gICAgICAgICAgICBy
ZXR1cm4gKHNsb3dDYXNlQ291bnQgLSBzcGVjaWFsRmFzdENhc2VDb3VudCkgPj0gSGV1cmlzdGlj
czo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CisgICAgICAgICAgICB1bnNpZ25lZCB2
YWx1ZSA9IHNsb3dDYXNlQ291bnQgLSBzcGVjaWFsRmFzdENhc2VDb3VudDsKKyAgICAgICAgICAg
IHJldHVybiB2YWx1ZSA+PSBIZXVyaXN0aWNzOjpsaWtlbHlUb1Rha2VTbG93Q2FzZU1pbmltdW1D
b3VudCAmJiBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSAvIG1fZXhlY3V0aW9uRW50cnlDb3Vu
dCA+PSBIZXVyaXN0aWNzOjpsaWtlbHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZDsKICAgICAgICAg
fQogICAgICAgICAKICAgICAgICAgYm9vbCBsaWtlbHlUb1Rha2VBbnlTbG93Q2FzZShpbnQgYnl0
ZWNvZGVPZmZzZXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHVuc2lnbmVkIHNsb3dDYXNlQ291
bnQgPSByYXJlQ2FzZVByb2ZpbGVGb3JCeXRlY29kZU9mZnNldChieXRlY29kZU9mZnNldCktPm1f
Y291bnRlcjsKICAgICAgICAgICAgIHVuc2lnbmVkIHNwZWNpYWxGYXN0Q2FzZUNvdW50ID0gc3Bl
Y2lhbEZhc3RDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlT2Zmc2V0KS0+bV9j
b3VudGVyOwotICAgICAgICAgICAgcmV0dXJuIChzbG93Q2FzZUNvdW50ICsgc3BlY2lhbEZhc3RD
YXNlQ291bnQpID49IEhldXJpc3RpY3M6Omxpa2VseVRvVGFrZVNsb3dDYXNlVGhyZXNob2xkOwor
ICAgICAgICAgICAgdW5zaWduZWQgdmFsdWUgPSBzbG93Q2FzZUNvdW50ICsgc3BlY2lhbEZhc3RD
YXNlQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPj0gSGV1cmlzdGljczo6bGlrZWx5
VG9UYWtlU2xvd0Nhc2VNaW5pbXVtQ291bnQgJiYgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkg
LyBtX2V4ZWN1dGlvbkVudHJ5Q291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nh
c2VUaHJlc2hvbGQ7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIHZvaWQgcmVzZXRSYXJl
Q2FzZVByb2ZpbGVzKCk7CisgICAgICAgIHVuc2lnbmVkIGV4ZWN1dGlvbkVudHJ5Q291bnQoKSBj
b25zdCB7IHJldHVybiBtX2V4ZWN1dGlvbkVudHJ5Q291bnQ7IH0KICNlbmRpZgogCiAgICAgICAg
IHVuc2lnbmVkIGdsb2JhbFJlc29sdmVJbmZvQ291bnQoKSBjb25zdApAQCAtMTIxMyw2ICsxMjE3
LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIFNlZ21lbnRlZFZlY3RvcjxWYWx1ZVByb2Zp
bGUsIDg+IG1fdmFsdWVQcm9maWxlczsKICAgICAgICAgU2VnbWVudGVkVmVjdG9yPFJhcmVDYXNl
UHJvZmlsZSwgOD4gbV9yYXJlQ2FzZVByb2ZpbGVzOwogICAgICAgICBTZWdtZW50ZWRWZWN0b3I8
UmFyZUNhc2VQcm9maWxlLCA4PiBtX3NwZWNpYWxGYXN0Q2FzZVByb2ZpbGVzOworICAgICAgICB1
bnNpZ25lZCBtX2V4ZWN1dGlvbkVudHJ5Q291bnQ7CiAjZW5kaWYKIAogICAgICAgICBWZWN0b3I8
dW5zaWduZWQ+IG1fanVtcFRhcmdldHM7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0J5dGVDb2RlUGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAkocmV2aXNpb24gMTAyNDY4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTY3LDcgKzY3LDcgQEAgcHVibGljOgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNv
ZGVCbG9jay0+bV9udW1WYXJzOyArK2kpCiAgICAgICAgICAgICBtX3ByZXNlcnZlZFZhcnMuc2V0
KGkpOwogICAgIH0KLQorICAgIAogICAgIC8vIFBhcnNlIGEgZnVsbCBDb2RlQmxvY2sgb2YgYnl0
ZWNvZGUuCiAgICAgYm9vbCBwYXJzZSgpOwogICAgIApAQCAtNjQ2LDEwICs2NDYsMTcgQEAgcHJp
dmF0ZToKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgICAgIGNhc2UgQXJp
dGhNdWw6Ci0gICAgICAgICAgICBpZiAobV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2Nr
LT5saWtlbHlUb1Rha2VEZWVwZXN0U2xvd0Nhc2UobV9jdXJyZW50SW5kZXgpKQorICAgICAgICAg
ICAgaWYgKG1faW5saW5lU3RhY2tUb3AtPm1fcHJvZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlRGVl
cGVzdFNsb3dDYXNlKG1fY3VycmVudEluZGV4KSkgeworI2lmIERGR19FTkFCTEUoREVCVUdfVkVS
Qk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoIk1ha2luZyBBcml0aE11bCBAJXUgdGFrZSBk
ZWVwZXN0IHNsb3cgY2FzZS5cbiIsIG5vZGVJbmRleCk7CisjZW5kaWYKICAgICAgICAgICAgICAg
ICBtX2dyYXBoW25vZGVJbmRleF0ubWVyZ2VBcml0aE5vZGVGbGFncyhOb2RlTWF5T3ZlcmZsb3cg
fCBOb2RlTWF5TmVnWmVybyk7Ci0gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB9IGVsc2Ug
eworI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYo
Ik1ha2luZyBBcml0aE11bCBAJXUgdGFrZSBmYXN0ZXIgc2xvdyBjYXNlLlxuIiwgbm9kZUluZGV4
KTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS5tZXJnZUFyaXRo
Tm9kZUZsYWdzKE5vZGVNYXlOZWdaZXJvKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJy
ZWFrOwogICAgICAgICAgICAgCiAgICAgICAgIGRlZmF1bHQ6CkBAIC02NzMsNiArNjgwLDEwIEBA
IHByaXZhdGU6CiAgICAgICAgIGlmICghbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2Nr
LT5saWtlbHlUb1Rha2VTcGVjaWFsRmFzdENhc2UobV9jdXJyZW50SW5kZXgpKQogICAgICAgICAg
ICAgcmV0dXJuIG5vZGVJbmRleDsKICAgICAgICAgCisjaWYgREZHX0VOQUJMRShERUJVR19WRVJC
T1NFKQorICAgICAgICBwcmludGYoIk1ha2luZyAlcyBAJXUgc2FmZSBhdCBiYyMldSBiZWNhdXNl
IHNwZWNpYWwgZmFzdC1jYXNlIGNvdW50ZXIgaXMgYXQgJXVcbiIsIEdyYXBoOjpvcE5hbWUobV9n
cmFwaFtub2RlSW5kZXhdLm9wKSwgbm9kZUluZGV4LCBtX2N1cnJlbnRJbmRleCwgbV9pbmxpbmVT
dGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5zcGVjaWFsRmFzdENhc2VQcm9maWxlRm9yQnl0ZWNv
ZGVPZmZzZXQobV9jdXJyZW50SW5kZXgpLT5tX2NvdW50ZXIpOworI2VuZGlmCisgICAgICAgIAog
ICAgICAgICBtX2dyYXBoW25vZGVJbmRleF0ubWVyZ2VBcml0aE5vZGVGbGFncyhOb2RlTWF5T3Zl
cmZsb3cgfCBOb2RlTWF5TmVnWmVybyk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gbm9kZUlu
ZGV4OwpAQCAtODc0LDcgKzg4NSw3IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwo
SW50ZXJwcmUKICAgICBlbnVtIHsgQ29uc3RhbnRGdW5jdGlvbiwgTGlua2VkRnVuY3Rpb24sIFVu
a25vd25GdW5jdGlvbiB9IGNhbGxUeXBlOwogICAgICAgICAgICAgCiAjaWYgREZHX0VOQUJMRShE
RUJVR19WRVJCT1NFKQotICAgIHByaW50ZigiU2xvdyBjYXNlIGNvdW50IGZvciBjYWxsIGF0IEAl
bHUgYmMjJXU6ICV1LlxuIiwgbV9ncmFwaC5zaXplKCksIG1fY3VycmVudEluZGV4LCBtX2lubGlu
ZVN0YWNrVG9wLT5tX3Byb2ZpbGVkQmxvY2stPnJhcmVDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zm
c2V0KG1fY3VycmVudEluZGV4KS0+bV9jb3VudGVyKTsKKyAgICBwcmludGYoIlNsb3cgY2FzZSBj
b3VudCBmb3IgY2FsbCBhdCBAJWx1IGJjIyV1OiAldS8ldS5cbiIsIG1fZ3JhcGguc2l6ZSgpLCBt
X2N1cnJlbnRJbmRleCwgbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5yYXJlQ2Fz
ZVByb2ZpbGVGb3JCeXRlY29kZU9mZnNldChtX2N1cnJlbnRJbmRleCktPm1fY291bnRlciwgbV9p
bmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5leGVjdXRpb25FbnRyeUNvdW50KCkpOwog
I2VuZGlmCiAgICAgICAgICAgICAKICAgICBpZiAobV9ncmFwaC5pc0Z1bmN0aW9uQ29uc3RhbnQo
bV9jb2RlQmxvY2ssIGNhbGxUYXJnZXQpKQpAQCAtMTI0Niw2ICsxMjU3LDEwIEBAIGJvb2wgQnl0
ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKIHsKICAgICBib29sIHNob3VsZENvbnRp
bnVlUGFyc2luZyA9IHRydWU7CiAgICAgCisgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyID0g
bV9nbG9iYWxEYXRhLT5pbnRlcnByZXRlcjsKKyAgICBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb25z
QmVnaW4gPSBtX2lubGluZVN0YWNrVG9wLT5tX2NvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVn
aW4oKTsKKyAgICB1bnNpZ25lZCBibG9ja0JlZ2luID0gbV9jdXJyZW50SW5kZXg7CisgICAgCiAg
ICAgLy8gSWYgd2UgYXJlIHRoZSBmaXJzdCBiYXNpYyBibG9jaywgaW50cm9kdWNlIG1hcmtlcnMg
Zm9yIGFyZ3VtZW50cy4gVGhpcyBhbGxvd3MKICAgICAvLyB1cyB0byB0cmFjayBpZiBhIHVzZSBv
ZiBhbiBhcmd1bWVudCBtYXkgdXNlIHRoZSBhY3R1YWwgYXJndW1lbnQgcGFzc2VkLCBhcwogICAg
IC8vIG9wcG9zZWQgdG8gdXNpbmcgYSB2YWx1ZSB3ZSBzZXQgZXhwbGljaXRseS4KQEAgLTEyNTks
OSArMTI3NCw2IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAg
ICAgICAgfQogICAgIH0KIAotICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IG1fZ2xvYmFs
RGF0YS0+aW50ZXJwcmV0ZXI7Ci0gICAgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uc0JlZ2luID0g
bV9pbmxpbmVTdGFja1RvcC0+bV9jb2RlQmxvY2stPmluc3RydWN0aW9ucygpLmJlZ2luKCk7Ci0g
ICAgdW5zaWduZWQgYmxvY2tCZWdpbiA9IG1fY3VycmVudEluZGV4OwogICAgIHdoaWxlICh0cnVl
KSB7CiAgICAgICAgIC8vIERvbid0IGV4dGVuZCBvdmVyIGp1bXAgZGVzdGluYXRpb25zLgogICAg
ICAgICBpZiAobV9jdXJyZW50SW5kZXggPT0gbGltaXQpIHsKQEAgLTE2OTEsNiArMTcwMywxMCBA
QCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICBJ
ZGVudGlmaWVyIGlkZW50aWZpZXIgPSBtX2NvZGVCbG9jay0+aWRlbnRpZmllcihpZGVudGlmaWVy
TnVtYmVyKTsKICAgICAgICAgICAgIFN0cnVjdHVyZVN0dWJJbmZvJiBzdHViSW5mbyA9IG1faW5s
aW5lU3RhY2tUb3AtPm1fcHJvZmlsZWRCbG9jay0+Z2V0U3R1YkluZm8obV9jdXJyZW50SW5kZXgp
OwogICAgICAgICAgICAgCisjaWYgREZHX0VOQUJMRShERUJVR19WRVJCT1NFKQorICAgICAgICAg
ICAgcHJpbnRmKCJTbG93IGNhc2UgY291bnQgZm9yIEdldEJ5SWQgQCVsdSBiYyMldTogJXVcbiIs
IG1fZ3JhcGguc2l6ZSgpLCBtX2N1cnJlbnRJbmRleCwgbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9m
aWxlZEJsb2NrLT5yYXJlQ2FzZVByb2ZpbGVGb3JCeXRlY29kZU9mZnNldChtX2N1cnJlbnRJbmRl
eCktPm1fY291bnRlcik7CisjZW5kaWYKKyAgICAgICAgICAgIAogICAgICAgICAgICAgc2l6ZV90
IG9mZnNldCA9IG5vdEZvdW5kOwogICAgICAgICAgICAgU3RydWN0dXJlU2V0IHN0cnVjdHVyZVNl
dDsKICAgICAgICAgICAgIGlmIChzdHViSW5mby5zZWVuICYmICFtX2lubGluZVN0YWNrVG9wLT5t
X3Byb2ZpbGVkQmxvY2stPmxpa2VseVRvVGFrZVNsb3dDYXNlKG1fY3VycmVudEluZGV4KSkgewpA
QCAtMTc4MSw2ICsxNzk3LDEwIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5z
aWduZWQKICAgICAgICAgICAgIAogICAgICAgICAgICAgYm9vbCBhbHJlYWR5R2VuZXJhdGVkID0g
ZmFsc2U7CiAgICAgICAgICAgICAKKyNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCisgICAg
ICAgICAgICBwcmludGYoIlNsb3cgY2FzZSBjb3VudCBmb3IgUHV0QnlJZCBAJWx1IGJjIyV1OiAl
dVxuIiwgbV9ncmFwaC5zaXplKCksIG1fY3VycmVudEluZGV4LCBtX2lubGluZVN0YWNrVG9wLT5t
X3Byb2ZpbGVkQmxvY2stPnJhcmVDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KG1fY3VycmVu
dEluZGV4KS0+bV9jb3VudGVyKTsKKyNlbmRpZiAgICAgICAgICAgIAorCiAgICAgICAgICAgICBp
ZiAoc3R1YkluZm8uc2VlbiAmJiAhbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5s
aWtlbHlUb1Rha2VTbG93Q2FzZShtX2N1cnJlbnRJbmRleCkpIHsKICAgICAgICAgICAgICAgICBz
d2l0Y2ggKHN0dWJJbmZvLmFjY2Vzc1R5cGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIGFjY2Vz
c19wdXRfYnlfaWRfcmVwbGFjZTogewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdEcml2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
RHJpdmVyLmNwcAkocmV2aXNpb24gMTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdEcml2ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3ICs0NCw3IEBAIGlubGluZSBi
b29sIGNvbXBpbGUoQ29tcGlsZU1vZGUgY29tcGlsZU0KICAgICBBU1NFUlQoY29kZUJsb2NrLT5h
bHRlcm5hdGl2ZSgpLT5nZXRKSVRUeXBlKCkgPT0gSklUQ29kZTo6QmFzZWxpbmVKSVQpOwogCiAj
aWYgREZHX0VOQUJMRShERUJVR19WRVJCT1NFKQotICAgIGZwcmludGYoc3RkZXJyLCAiREZHIGNv
bXBpbGluZyBjb2RlIGJsb2NrICVwLCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zID0gJXUuXG4iLCBj
b2RlQmxvY2ssIGNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25Db3VudCgpKTsKKyAgICBmcHJpbnRmKHN0
ZGVyciwgIkRGRyBjb21waWxpbmcgY29kZSBibG9jayAlcCglcCksIG51bWJlciBvZiBpbnN0cnVj
dGlvbnMgPSAldS5cbiIsIGNvZGVCbG9jaywgY29kZUJsb2NrLT5hbHRlcm5hdGl2ZSgpLCBjb2Rl
QmxvY2stPmluc3RydWN0aW9uQ291bnQoKSk7CiAjZW5kaWYKICAgICAKICAgICBKU0dsb2JhbERh
dGEqIGdsb2JhbERhdGEgPSAmZXhlYy0+Z2xvYmFsRGF0YSgpOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2ppdC9KSVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9qaXQvSklULmNwcAkocmV2aXNpb24gMTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2ppdC9KSVQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01ODEsNiArNTgxLDExIEBAIEpJVENvZGUg
SklUOjpwcml2YXRlQ29tcGlsZShDb2RlUHRyKiBmdW4KICAgICB9CiAKICAgICBMYWJlbCBmdW5j
dGlvbkJvZHkgPSBsYWJlbCgpOworICAgIAorI2lmIEVOQUJMRShWQUxVRV9QUk9GSUxFUikKKyAg
ICBpZiAobV9jYW5CZU9wdGltaXplZCkKKyAgICAgICAgYWRkMzIoSW1tMzIoMSksIEFic29sdXRl
QWRkcmVzcygmbV9jb2RlQmxvY2stPm1fZXhlY3V0aW9uRW50cnlDb3VudCkpOworI2VuZGlmCiAK
ICAgICBwcml2YXRlQ29tcGlsZU1haW5QYXNzKCk7CiAgICAgcHJpdmF0ZUNvbXBpbGVMaW5rUGFz
cygpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGljcy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGljcy5j
cHAJKHJldmlzaW9uIDEwMjQ2OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hl
dXJpc3RpY3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Miw4ICs2MiwxMCBAQCBpbnQzMl90IGV4
ZWN1dGlvbkNvdW50ZXJJbmNyZW1lbnRGb3JSZXR1CiAKIHVuc2lnbmVkIGRlc2lyZWRTcGVjdWxh
dGl2ZVN1Y2Nlc3NGYWlsUmF0aW87CiAKLXVuc2lnbmVkIGxpa2VseVRvVGFrZVNsb3dDYXNlVGhy
ZXNob2xkOwotdW5zaWduZWQgY291bGRUYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7Citkb3VibGUgbGlr
ZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7Citkb3VibGUgY291bGRUYWtlU2xvd0Nhc2VUaHJl
c2hvbGQ7Cit1bnNpZ25lZCBsaWtlbHlUb1Rha2VTbG93Q2FzZU1pbmltdW1Db3VudDsKK3Vuc2ln
bmVkIGNvdWxkVGFrZVNsb3dDYXNlTWluaW11bUNvdW50OwogCiB1bnNpZ25lZCBsYXJnZUZhaWxD
b3VudFRocmVzaG9sZEJhc2U7CiB1bnNpZ25lZCBsYXJnZUZhaWxDb3VudFRocmVzaG9sZEJhc2VG
b3JMb29wOwpAQCAtMTQxLDggKzE0MywxMCBAQCB2b2lkIGluaXRpYWxpemVIZXVyaXN0aWNzKCkK
IAogICAgIFNFVChkZXNpcmVkU3BlY3VsYXRpdmVTdWNjZXNzRmFpbFJhdGlvLCA2KTsKICAgICAK
LSAgICBTRVQobGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQsIDEwMCk7Ci0gICAgU0VUKGNv
dWxkVGFrZVNsb3dDYXNlVGhyZXNob2xkLCAgICAxMCk7IC8vIFNob3VsZG4ndCBiZSB6ZXJvIGJl
Y2F1c2Ugc29tZSBvcHMgd2lsbCBzcHVyaW91c2x5IHRha2Ugc2xvdyBjYXNlLCBmb3IgZXhhbXBs
ZSBmb3IgbGlua2luZyBvciBjYWNoaW5nLgorICAgIFNFVChsaWtlbHlUb1Rha2VTbG93Q2FzZVRo
cmVzaG9sZCwgICAgMC4xNSk7CisgICAgU0VUKGNvdWxkVGFrZVNsb3dDYXNlVGhyZXNob2xkLCAg
ICAgICAwLjA1KTsgLy8gU2hvdWxkbid0IGJlIHplcm8gYmVjYXVzZSBzb21lIG9wcyB3aWxsIHNw
dXJpb3VzbHkgdGFrZSBzbG93IGNhc2UsIGZvciBleGFtcGxlIGZvciBsaW5raW5nIG9yIGNhY2hp
bmcuCisgICAgU0VUKGxpa2VseVRvVGFrZVNsb3dDYXNlTWluaW11bUNvdW50LCAxMDApOworICAg
IFNFVChjb3VsZFRha2VTbG93Q2FzZU1pbmltdW1Db3VudCwgICAgMTApOwogCiAgICAgU0VUKGxh
cmdlRmFpbENvdW50VGhyZXNob2xkQmFzZSwgICAgICAgIDIwKTsKICAgICBTRVQobGFyZ2VGYWls
Q291bnRUaHJlc2hvbGRCYXNlRm9yTG9vcCwgMSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9IZXVyaXN0aWNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvSGV1cmlzdGljcy5oCShyZXZpc2lvbiAxMDI0NjgpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9IZXVyaXN0aWNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDgg
KzQ4LDEwIEBAIGV4dGVybiBpbnQzMl90IGV4ZWN1dGlvbkNvdW50ZXJJbmNyZW1lbnQKIAogZXh0
ZXJuIHVuc2lnbmVkIGRlc2lyZWRTcGVjdWxhdGl2ZVN1Y2Nlc3NGYWlsUmF0aW87CiAKLWV4dGVy
biB1bnNpZ25lZCBsaWtlbHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZDsKLWV4dGVybiB1bnNpZ25l
ZCBjb3VsZFRha2VTbG93Q2FzZVRocmVzaG9sZDsKK2V4dGVybiBkb3VibGUgbGlrZWx5VG9UYWtl
U2xvd0Nhc2VUaHJlc2hvbGQ7CitleHRlcm4gZG91YmxlIGNvdWxkVGFrZVNsb3dDYXNlVGhyZXNo
b2xkOworZXh0ZXJuIHVuc2lnbmVkIGxpa2VseVRvVGFrZVNsb3dDYXNlTWluaW11bUNvdW50Owor
ZXh0ZXJuIHVuc2lnbmVkIGNvdWxkVGFrZVNsb3dDYXNlTWluaW11bUNvdW50OwogCiBleHRlcm4g
dW5zaWduZWQgbGFyZ2VGYWlsQ291bnRUaHJlc2hvbGRCYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxh
cmdlRmFpbENvdW50VGhyZXNob2xkQmFzZUZvckxvb3A7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118627</attachid>
            <date>2011-12-09 13:48:32 -0800</date>
            <delta_ts>2011-12-09 16:10:29 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>proportionalrare_patch_2.diff</filename>
            <type>text/plain</type>
            <size>14947</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAyNDcwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM2IEBA
CisyMDExLTEyLTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHJ3MgaW50ZXJwcmV0YXRpb24gb2YgcmFyZSBjYXNlIHByb2ZpbGVzIHNob3VsZCBiZSBmcmVx
dWVuY3ktYmFzZWQgbm90IGNvdW50LWJhc2VkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD03NDE3MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorICAgICAgICAKKyAgICAgICAgREZHIG9wdGltaXplcyBmb3IgcmFyZSBjYXNlcyBv
bmx5IHdoZW4gdGhlIHJhcmUgY2FzZSBjb3VudGVyIGlzIGFib3ZlIHNvbWUgdGhyZXNob2xkCisg
ICAgICAgIGFuZCBpdCBhbHNvIGNvbnN0aXR1dGVzIGEgbGFyZ2UgZW5vdWdoIGZyYWN0aW9uIG9m
IHRvdGFsIGZ1bmN0aW9uIGV4ZWN1dGlvbnMuIEFsc28KKyAgICAgICAgYWRkZWQgc29tZSBtaW5v
ciBkZWJ1ZyBsb2dpYy4KKworICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAg
ICAgIChKU0M6OkNvZGVCbG9jazo6Q29kZUJsb2NrKToKKyAgICAgICAgKiBieXRlY29kZS9Db2Rl
QmxvY2suaDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpsaWtlbHlUb1Rha2VTbG93Q2FzZSk6
CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6Y291bGRUYWtlU2xvd0Nhc2UpOgorICAgICAgICAo
SlNDOjpDb2RlQmxvY2s6Omxpa2VseVRvVGFrZVNwZWNpYWxGYXN0Q2FzZSk6CisgICAgICAgIChK
U0M6OkNvZGVCbG9jazo6bGlrZWx5VG9UYWtlRGVlcGVzdFNsb3dDYXNlKToKKyAgICAgICAgKEpT
Qzo6Q29kZUJsb2NrOjpsaWtlbHlUb1Rha2VBbnlTbG93Q2FzZSk6CisgICAgICAgIChKU0M6OkNv
ZGVCbG9jazo6ZXhlY3V0aW9uRW50cnlDb3VudCk6CisgICAgICAgICogZGZnL0RGR0J5dGVDb2Rl
UGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6bWFrZVNhZmUp
OgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjptYWtlRGl2U2FmZSk6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAgKiBkZmcvREZHRHJp
dmVyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpjb21waWxlKToKKyAgICAgICAgKiBqaXQvSklU
LmNwcDoKKyAgICAgICAgKEpTQzo6SklUOjpwcml2YXRlQ29tcGlsZSk6CisgICAgICAgICogcnVu
dGltZS9IZXVyaXN0aWNzLmNwcDoKKyAgICAgICAgKEpTQzo6SGV1cmlzdGljczo6aW5pdGlhbGl6
ZUhldXJpc3RpY3MpOgorICAgICAgICAqIHJ1bnRpbWUvSGV1cmlzdGljcy5oOgorCiAyMDExLTEy
LTA5ICBBZHJpZW5uZSBXYWxrZXIgIDxlbm5lQGdvb2dsZS5jb20+CiAKICAgICAgICAgRml4IEhh
c2hNYXA8Li4uLCBPd25QdHI8Li4uPiA+OjphZGQgY29tcGlsYXRpb24gZXJyb3JzCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkocmV2aXNpb24g
MTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTE0MzMsNiArMTQzMyw5IEBAIENvZGVCbG9jazo6Q29kZUJsb2Nr
KENvcHlQYXJzZWRCbG9ja1RhZywKICNpZiBFTkFCTEUoSklUKQogICAgICwgbV9nbG9iYWxSZXNv
bHZlSW5mb3Mob3RoZXIubV9nbG9iYWxSZXNvbHZlSW5mb3MpCiAjZW5kaWYKKyNpZiBFTkFCTEUo
VkFMVUVfUFJPRklMRVIpCisgICAgLCBtX2V4ZWN1dGlvbkVudHJ5Q291bnQoMCkKKyNlbmRpZgog
ICAgICwgbV9qdW1wVGFyZ2V0cyhvdGhlci5tX2p1bXBUYXJnZXRzKQogICAgICwgbV9sb29wVGFy
Z2V0cyhvdGhlci5tX2xvb3BUYXJnZXRzKQogICAgICwgbV9pZGVudGlmaWVycyhvdGhlci5tX2lk
ZW50aWZpZXJzKQpAQCAtMTQ4MSw2ICsxNDg0LDkgQEAgQ29kZUJsb2NrOjpDb2RlQmxvY2soU2Ny
aXB0RXhlY3V0YWJsZSogbwogICAgICwgbV9jb2RlVHlwZShjb2RlVHlwZSkKICAgICAsIG1fc291
cmNlKHNvdXJjZVByb3ZpZGVyKQogICAgICwgbV9zb3VyY2VPZmZzZXQoc291cmNlT2Zmc2V0KQor
I2lmIEVOQUJMRShWQUxVRV9QUk9GSUxFUikKKyAgICAsIG1fZXhlY3V0aW9uRW50cnlDb3VudCgw
KQorI2VuZGlmCiAgICAgLCBtX3N5bWJvbFRhYmxlKHN5bVRhYikKICAgICAsIG1fYWx0ZXJuYXRp
dmUoYWx0ZXJuYXRpdmUpCiAgICAgLCBtX3NwZWN1bGF0aXZlU3VjY2Vzc0NvdW50ZXIoMCkKQEAg
LTIyMzUsMTYgKzIyNDEsNiBAQCBib29sIENvZGVCbG9jazo6c2hvdWxkT3B0aW1pemVOb3coKQog
fQogI2VuZGlmCiAKLSNpZiBFTkFCTEUoVkFMVUVfUFJPRklMRVIpCi12b2lkIENvZGVCbG9jazo6
cmVzZXRSYXJlQ2FzZVByb2ZpbGVzKCkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bnVtYmVyT2ZSYXJlQ2FzZVByb2ZpbGVzKCk7ICsraSkKLSAgICAgICAgcmFyZUNhc2VQcm9maWxl
KGkpLT5tX2NvdW50ZXIgPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1iZXJP
ZlNwZWNpYWxGYXN0Q2FzZVByb2ZpbGVzKCk7ICsraSkKLSAgICAgICAgc3BlY2lhbEZhc3RDYXNl
UHJvZmlsZShpKS0+bV9jb3VudGVyID0gMDsKLX0KLSNlbmRpZgotCiAjaWYgRU5BQkxFKFZFUkJP
U0VfVkFMVUVfUFJPRklMRSkKIHZvaWQgQ29kZUJsb2NrOjpkdW1wVmFsdWVQcm9maWxlcygpCiB7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5oCShyZXZp
c2lvbiAxMDI0NjgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2Nr
LmgJKHdvcmtpbmcgY29weSkKQEAgLTY3NiwxMiArNjc2LDE0IEBAIG5hbWVzcGFjZSBKU0Mgewog
ICAgICAgICAKICAgICAgICAgYm9vbCBsaWtlbHlUb1Rha2VTbG93Q2FzZShpbnQgYnl0ZWNvZGVP
ZmZzZXQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByYXJlQ2FzZVByb2ZpbGVGb3JC
eXRlY29kZU9mZnNldChieXRlY29kZU9mZnNldCktPm1fY291bnRlciA+PSBIZXVyaXN0aWNzOjps
aWtlbHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZDsKKyAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVl
ID0gcmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVPZmZzZXQpLT5tX2Nv
dW50ZXI7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9U
YWtlU2xvd0Nhc2VNaW5pbXVtQ291bnQgJiYgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkgLyBt
X2V4ZWN1dGlvbkVudHJ5Q291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VU
aHJlc2hvbGQ7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGJvb2wgY291bGRUYWtlU2xv
d0Nhc2UoaW50IGJ5dGVjb2RlT2Zmc2V0KQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4g
cmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVPZmZzZXQpLT5tX2NvdW50
ZXIgPj0gSGV1cmlzdGljczo6Y291bGRUYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CisgICAgICAgICAg
ICB1bnNpZ25lZCB2YWx1ZSA9IHJhcmVDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KGJ5dGVj
b2RlT2Zmc2V0KS0+bV9jb3VudGVyOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID49IEhldXJp
c3RpY3M6OmNvdWxkVGFrZVNsb3dDYXNlTWluaW11bUNvdW50ICYmIHN0YXRpY19jYXN0PGRvdWJs
ZT4odmFsdWUpIC8gbV9leGVjdXRpb25FbnRyeUNvdW50ID49IEhldXJpc3RpY3M6OmNvdWxkVGFr
ZVNsb3dDYXNlVGhyZXNob2xkOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBSYXJlQ2Fz
ZVByb2ZpbGUqIGFkZFNwZWNpYWxGYXN0Q2FzZVByb2ZpbGUoaW50IGJ5dGVjb2RlT2Zmc2V0KQpA
QCAtNjk5LDI0ICs3MDEsMjYgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIGJvb2wgbGlrZWx5
VG9UYWtlU3BlY2lhbEZhc3RDYXNlKGludCBieXRlY29kZU9mZnNldCkKICAgICAgICAgewogICAg
ICAgICAgICAgdW5zaWduZWQgc3BlY2lhbEZhc3RDYXNlQ291bnQgPSBzcGVjaWFsRmFzdENhc2VQ
cm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVPZmZzZXQpLT5tX2NvdW50ZXI7Ci0gICAg
ICAgICAgICByZXR1cm4gc3BlY2lhbEZhc3RDYXNlQ291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5
VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CisgICAgICAgICAgICByZXR1cm4gc3BlY2lhbEZhc3RD
YXNlQ291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VNaW5pbXVtQ291bnQg
JiYgc3RhdGljX2Nhc3Q8ZG91YmxlPihzcGVjaWFsRmFzdENhc2VDb3VudCkgLyBtX2V4ZWN1dGlv
bkVudHJ5Q291bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7
CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGJvb2wgbGlrZWx5VG9UYWtlRGVlcGVzdFNs
b3dDYXNlKGludCBieXRlY29kZU9mZnNldCkKICAgICAgICAgewogICAgICAgICAgICAgdW5zaWdu
ZWQgc2xvd0Nhc2VDb3VudCA9IHJhcmVDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KGJ5dGVj
b2RlT2Zmc2V0KS0+bV9jb3VudGVyOwogICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lhbEZhc3RD
YXNlQ291bnQgPSBzcGVjaWFsRmFzdENhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNv
ZGVPZmZzZXQpLT5tX2NvdW50ZXI7Ci0gICAgICAgICAgICByZXR1cm4gKHNsb3dDYXNlQ291bnQg
LSBzcGVjaWFsRmFzdENhc2VDb3VudCkgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nh
c2VUaHJlc2hvbGQ7CisgICAgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA9IHNsb3dDYXNlQ291bnQg
LSBzcGVjaWFsRmFzdENhc2VDb3VudDsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBIZXVy
aXN0aWNzOjpsaWtlbHlUb1Rha2VTbG93Q2FzZU1pbmltdW1Db3VudCAmJiBzdGF0aWNfY2FzdDxk
b3VibGU+KHZhbHVlKSAvIG1fZXhlY3V0aW9uRW50cnlDb3VudCA+PSBIZXVyaXN0aWNzOjpsaWtl
bHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZDsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAg
Ym9vbCBsaWtlbHlUb1Rha2VBbnlTbG93Q2FzZShpbnQgYnl0ZWNvZGVPZmZzZXQpCiAgICAgICAg
IHsKICAgICAgICAgICAgIHVuc2lnbmVkIHNsb3dDYXNlQ291bnQgPSByYXJlQ2FzZVByb2ZpbGVG
b3JCeXRlY29kZU9mZnNldChieXRlY29kZU9mZnNldCktPm1fY291bnRlcjsKICAgICAgICAgICAg
IHVuc2lnbmVkIHNwZWNpYWxGYXN0Q2FzZUNvdW50ID0gc3BlY2lhbEZhc3RDYXNlUHJvZmlsZUZv
ckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlT2Zmc2V0KS0+bV9jb3VudGVyOwotICAgICAgICAgICAg
cmV0dXJuIChzbG93Q2FzZUNvdW50ICsgc3BlY2lhbEZhc3RDYXNlQ291bnQpID49IEhldXJpc3Rp
Y3M6Omxpa2VseVRvVGFrZVNsb3dDYXNlVGhyZXNob2xkOworICAgICAgICAgICAgdW5zaWduZWQg
dmFsdWUgPSBzbG93Q2FzZUNvdW50ICsgc3BlY2lhbEZhc3RDYXNlQ291bnQ7CisgICAgICAgICAg
ICByZXR1cm4gdmFsdWUgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VNaW5pbXVt
Q291bnQgJiYgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkgLyBtX2V4ZWN1dGlvbkVudHJ5Q291
bnQgPj0gSGV1cmlzdGljczo6bGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7CiAgICAgICAg
IH0KICAgICAgICAgCi0gICAgICAgIHZvaWQgcmVzZXRSYXJlQ2FzZVByb2ZpbGVzKCk7CisgICAg
ICAgIHVuc2lnbmVkIGV4ZWN1dGlvbkVudHJ5Q291bnQoKSBjb25zdCB7IHJldHVybiBtX2V4ZWN1
dGlvbkVudHJ5Q291bnQ7IH0KICNlbmRpZgogCiAgICAgICAgIHVuc2lnbmVkIGdsb2JhbFJlc29s
dmVJbmZvQ291bnQoKSBjb25zdApAQCAtMTIxMyw2ICsxMjE3LDcgQEAgbmFtZXNwYWNlIEpTQyB7
CiAgICAgICAgIFNlZ21lbnRlZFZlY3RvcjxWYWx1ZVByb2ZpbGUsIDg+IG1fdmFsdWVQcm9maWxl
czsKICAgICAgICAgU2VnbWVudGVkVmVjdG9yPFJhcmVDYXNlUHJvZmlsZSwgOD4gbV9yYXJlQ2Fz
ZVByb2ZpbGVzOwogICAgICAgICBTZWdtZW50ZWRWZWN0b3I8UmFyZUNhc2VQcm9maWxlLCA4PiBt
X3NwZWNpYWxGYXN0Q2FzZVByb2ZpbGVzOworICAgICAgICB1bnNpZ25lZCBtX2V4ZWN1dGlvbkVu
dHJ5Q291bnQ7CiAjZW5kaWYKIAogICAgICAgICBWZWN0b3I8dW5zaWduZWQ+IG1fanVtcFRhcmdl
dHM7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFy
c2VyLmNwcAkocmV2aXNpb24gMTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdCeXRlQ29kZVBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY3LDcgKzY3LDcgQEAgcHVi
bGljOgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvZGVCbG9jay0+bV9udW1WYXJzOyAr
K2kpCiAgICAgICAgICAgICBtX3ByZXNlcnZlZFZhcnMuc2V0KGkpOwogICAgIH0KLQorICAgIAog
ICAgIC8vIFBhcnNlIGEgZnVsbCBDb2RlQmxvY2sgb2YgYnl0ZWNvZGUuCiAgICAgYm9vbCBwYXJz
ZSgpOwogICAgIApAQCAtNjQ2LDEwICs2NDYsMTcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIGJy
ZWFrOwogICAgICAgICAgICAgCiAgICAgICAgIGNhc2UgQXJpdGhNdWw6Ci0gICAgICAgICAgICBp
ZiAobV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VEZWVwZXN0
U2xvd0Nhc2UobV9jdXJyZW50SW5kZXgpKQorICAgICAgICAgICAgaWYgKG1faW5saW5lU3RhY2tU
b3AtPm1fcHJvZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlRGVlcGVzdFNsb3dDYXNlKG1fY3VycmVu
dEluZGV4KSkgeworI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9TRSkKKyAgICAgICAgICAgICAg
ICBwcmludGYoIk1ha2luZyBBcml0aE11bCBAJXUgdGFrZSBkZWVwZXN0IHNsb3cgY2FzZS5cbiIs
IG5vZGVJbmRleCk7CisjZW5kaWYKICAgICAgICAgICAgICAgICBtX2dyYXBoW25vZGVJbmRleF0u
bWVyZ2VBcml0aE5vZGVGbGFncyhOb2RlTWF5T3ZlcmZsb3cgfCBOb2RlTWF5TmVnWmVybyk7Ci0g
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB9IGVsc2UgeworI2lmIERGR19FTkFCTEUoREVC
VUdfVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoIk1ha2luZyBBcml0aE11bCBAJXUg
dGFrZSBmYXN0ZXIgc2xvdyBjYXNlLlxuIiwgbm9kZUluZGV4KTsKKyNlbmRpZgogICAgICAgICAg
ICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS5tZXJnZUFyaXRoTm9kZUZsYWdzKE5vZGVNYXlOZWda
ZXJvKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAg
ICAgICAgIGRlZmF1bHQ6CkBAIC02NzMsNiArNjgwLDEwIEBAIHByaXZhdGU6CiAgICAgICAgIGlm
ICghbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VTcGVjaWFs
RmFzdENhc2UobV9jdXJyZW50SW5kZXgpKQogICAgICAgICAgICAgcmV0dXJuIG5vZGVJbmRleDsK
ICAgICAgICAgCisjaWYgREZHX0VOQUJMRShERUJVR19WRVJCT1NFKQorICAgICAgICBwcmludGYo
Ik1ha2luZyAlcyBAJXUgc2FmZSBhdCBiYyMldSBiZWNhdXNlIHNwZWNpYWwgZmFzdC1jYXNlIGNv
dW50ZXIgaXMgYXQgJXVcbiIsIEdyYXBoOjpvcE5hbWUobV9ncmFwaFtub2RlSW5kZXhdLm9wKSwg
bm9kZUluZGV4LCBtX2N1cnJlbnRJbmRleCwgbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJs
b2NrLT5zcGVjaWFsRmFzdENhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQobV9jdXJyZW50SW5k
ZXgpLT5tX2NvdW50ZXIpOworI2VuZGlmCisgICAgICAgIAogICAgICAgICBtX2dyYXBoW25vZGVJ
bmRleF0ubWVyZ2VBcml0aE5vZGVGbGFncyhOb2RlTWF5T3ZlcmZsb3cgfCBOb2RlTWF5TmVnWmVy
byk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gbm9kZUluZGV4OwpAQCAtODc0LDcgKzg4NSw3
IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwoSW50ZXJwcmUKICAgICBlbnVtIHsg
Q29uc3RhbnRGdW5jdGlvbiwgTGlua2VkRnVuY3Rpb24sIFVua25vd25GdW5jdGlvbiB9IGNhbGxU
eXBlOwogICAgICAgICAgICAgCiAjaWYgREZHX0VOQUJMRShERUJVR19WRVJCT1NFKQotICAgIHBy
aW50ZigiU2xvdyBjYXNlIGNvdW50IGZvciBjYWxsIGF0IEAlbHUgYmMjJXU6ICV1LlxuIiwgbV9n
cmFwaC5zaXplKCksIG1fY3VycmVudEluZGV4LCBtX2lubGluZVN0YWNrVG9wLT5tX3Byb2ZpbGVk
QmxvY2stPnJhcmVDYXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KG1fY3VycmVudEluZGV4KS0+
bV9jb3VudGVyKTsKKyAgICBwcmludGYoIlNsb3cgY2FzZSBjb3VudCBmb3IgY2FsbCBhdCBAJWx1
IGJjIyV1OiAldS8ldS5cbiIsIG1fZ3JhcGguc2l6ZSgpLCBtX2N1cnJlbnRJbmRleCwgbV9pbmxp
bmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5yYXJlQ2FzZVByb2ZpbGVGb3JCeXRlY29kZU9m
ZnNldChtX2N1cnJlbnRJbmRleCktPm1fY291bnRlciwgbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9m
aWxlZEJsb2NrLT5leGVjdXRpb25FbnRyeUNvdW50KCkpOwogI2VuZGlmCiAgICAgICAgICAgICAK
ICAgICBpZiAobV9ncmFwaC5pc0Z1bmN0aW9uQ29uc3RhbnQobV9jb2RlQmxvY2ssIGNhbGxUYXJn
ZXQpKQpAQCAtMTI0Niw2ICsxMjU3LDEwIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxv
Y2sodW5zaWduZWQKIHsKICAgICBib29sIHNob3VsZENvbnRpbnVlUGFyc2luZyA9IHRydWU7CiAg
ICAgCisgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyID0gbV9nbG9iYWxEYXRhLT5pbnRlcnBy
ZXRlcjsKKyAgICBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb25zQmVnaW4gPSBtX2lubGluZVN0YWNr
VG9wLT5tX2NvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKTsKKyAgICB1bnNpZ25lZCBi
bG9ja0JlZ2luID0gbV9jdXJyZW50SW5kZXg7CisgICAgCiAgICAgLy8gSWYgd2UgYXJlIHRoZSBm
aXJzdCBiYXNpYyBibG9jaywgaW50cm9kdWNlIG1hcmtlcnMgZm9yIGFyZ3VtZW50cy4gVGhpcyBh
bGxvd3MKICAgICAvLyB1cyB0byB0cmFjayBpZiBhIHVzZSBvZiBhbiBhcmd1bWVudCBtYXkgdXNl
IHRoZSBhY3R1YWwgYXJndW1lbnQgcGFzc2VkLCBhcwogICAgIC8vIG9wcG9zZWQgdG8gdXNpbmcg
YSB2YWx1ZSB3ZSBzZXQgZXhwbGljaXRseS4KQEAgLTEyNTksOSArMTI3NCw2IEBAIGJvb2wgQnl0
ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgfQogICAgIH0KIAotICAg
IEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IG1fZ2xvYmFsRGF0YS0+aW50ZXJwcmV0ZXI7Ci0g
ICAgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uc0JlZ2luID0gbV9pbmxpbmVTdGFja1RvcC0+bV9j
b2RlQmxvY2stPmluc3RydWN0aW9ucygpLmJlZ2luKCk7Ci0gICAgdW5zaWduZWQgYmxvY2tCZWdp
biA9IG1fY3VycmVudEluZGV4OwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIC8vIERvbid0
IGV4dGVuZCBvdmVyIGp1bXAgZGVzdGluYXRpb25zLgogICAgICAgICBpZiAobV9jdXJyZW50SW5k
ZXggPT0gbGltaXQpIHsKQEAgLTE2OTEsNiArMTcwMywxMCBAQCBib29sIEJ5dGVDb2RlUGFyc2Vy
OjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIg
PSBtX2NvZGVCbG9jay0+aWRlbnRpZmllcihpZGVudGlmaWVyTnVtYmVyKTsKICAgICAgICAgICAg
IFN0cnVjdHVyZVN0dWJJbmZvJiBzdHViSW5mbyA9IG1faW5saW5lU3RhY2tUb3AtPm1fcHJvZmls
ZWRCbG9jay0+Z2V0U3R1YkluZm8obV9jdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgCisjaWYg
REZHX0VOQUJMRShERUJVR19WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRmKCJTbG93IGNhc2Ug
Y291bnQgZm9yIEdldEJ5SWQgQCVsdSBiYyMldTogJXVcbiIsIG1fZ3JhcGguc2l6ZSgpLCBtX2N1
cnJlbnRJbmRleCwgbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5yYXJlQ2FzZVBy
b2ZpbGVGb3JCeXRlY29kZU9mZnNldChtX2N1cnJlbnRJbmRleCktPm1fY291bnRlcik7CisjZW5k
aWYKKyAgICAgICAgICAgIAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IG5vdEZvdW5kOwog
ICAgICAgICAgICAgU3RydWN0dXJlU2V0IHN0cnVjdHVyZVNldDsKICAgICAgICAgICAgIGlmIChz
dHViSW5mby5zZWVuICYmICFtX2lubGluZVN0YWNrVG9wLT5tX3Byb2ZpbGVkQmxvY2stPmxpa2Vs
eVRvVGFrZVNsb3dDYXNlKG1fY3VycmVudEluZGV4KSkgewpAQCAtMTc4MSw2ICsxNzk3LDEwIEBA
IGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIAog
ICAgICAgICAgICAgYm9vbCBhbHJlYWR5R2VuZXJhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAK
KyNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCisgICAgICAgICAgICBwcmludGYoIlNsb3cg
Y2FzZSBjb3VudCBmb3IgUHV0QnlJZCBAJWx1IGJjIyV1OiAldVxuIiwgbV9ncmFwaC5zaXplKCks
IG1fY3VycmVudEluZGV4LCBtX2lubGluZVN0YWNrVG9wLT5tX3Byb2ZpbGVkQmxvY2stPnJhcmVD
YXNlUHJvZmlsZUZvckJ5dGVjb2RlT2Zmc2V0KG1fY3VycmVudEluZGV4KS0+bV9jb3VudGVyKTsK
KyNlbmRpZiAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoc3R1YkluZm8uc2VlbiAmJiAh
bV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VTbG93Q2FzZSht
X2N1cnJlbnRJbmRleCkpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0dWJJbmZvLmFjY2Vz
c1R5cGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIGFjY2Vzc19wdXRfYnlfaWRfcmVwbGFjZTog
ewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdEcml2ZXIuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHRHJpdmVyLmNwcAkocmV2aXNpb24g
MTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdEcml2ZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00NCw3ICs0NCw3IEBAIGlubGluZSBib29sIGNvbXBpbGUoQ29tcGlsZU1v
ZGUgY29tcGlsZU0KICAgICBBU1NFUlQoY29kZUJsb2NrLT5hbHRlcm5hdGl2ZSgpLT5nZXRKSVRU
eXBlKCkgPT0gSklUQ29kZTo6QmFzZWxpbmVKSVQpOwogCiAjaWYgREZHX0VOQUJMRShERUJVR19W
RVJCT1NFKQotICAgIGZwcmludGYoc3RkZXJyLCAiREZHIGNvbXBpbGluZyBjb2RlIGJsb2NrICVw
LCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zID0gJXUuXG4iLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+
aW5zdHJ1Y3Rpb25Db3VudCgpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRGRyBjb21waWxpbmcg
Y29kZSBibG9jayAlcCglcCksIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgPSAldS5cbiIsIGNvZGVC
bG9jaywgY29kZUJsb2NrLT5hbHRlcm5hdGl2ZSgpLCBjb2RlQmxvY2stPmluc3RydWN0aW9uQ291
bnQoKSk7CiAjZW5kaWYKICAgICAKICAgICBKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEgPSAmZXhl
Yy0+Z2xvYmFsRGF0YSgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAkocmV2aXNp
b24gMTAyNDY4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01ODEsNiArNTgxLDExIEBAIEpJVENvZGUgSklUOjpwcml2YXRlQ29tcGlsZShD
b2RlUHRyKiBmdW4KICAgICB9CiAKICAgICBMYWJlbCBmdW5jdGlvbkJvZHkgPSBsYWJlbCgpOwor
ICAgIAorI2lmIEVOQUJMRShWQUxVRV9QUk9GSUxFUikKKyAgICBpZiAobV9jYW5CZU9wdGltaXpl
ZCkKKyAgICAgICAgYWRkMzIoSW1tMzIoMSksIEFic29sdXRlQWRkcmVzcygmbV9jb2RlQmxvY2st
Pm1fZXhlY3V0aW9uRW50cnlDb3VudCkpOworI2VuZGlmCiAKICAgICBwcml2YXRlQ29tcGlsZU1h
aW5QYXNzKCk7CiAgICAgcHJpdmF0ZUNvbXBpbGVMaW5rUGFzcygpOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGljcy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGljcy5jcHAJKHJldmlzaW9uIDEwMjQ2OCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC02Miw4ICs2MiwxMCBAQCBpbnQzMl90IGV4ZWN1dGlvbkNvdW50ZXJJbmNyZW1l
bnRGb3JSZXR1CiAKIHVuc2lnbmVkIGRlc2lyZWRTcGVjdWxhdGl2ZVN1Y2Nlc3NGYWlsUmF0aW87
CiAKLXVuc2lnbmVkIGxpa2VseVRvVGFrZVNsb3dDYXNlVGhyZXNob2xkOwotdW5zaWduZWQgY291
bGRUYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7Citkb3VibGUgbGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJl
c2hvbGQ7Citkb3VibGUgY291bGRUYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7Cit1bnNpZ25lZCBsaWtl
bHlUb1Rha2VTbG93Q2FzZU1pbmltdW1Db3VudDsKK3Vuc2lnbmVkIGNvdWxkVGFrZVNsb3dDYXNl
TWluaW11bUNvdW50OwogCiB1bnNpZ25lZCBsYXJnZUZhaWxDb3VudFRocmVzaG9sZEJhc2U7CiB1
bnNpZ25lZCBsYXJnZUZhaWxDb3VudFRocmVzaG9sZEJhc2VGb3JMb29wOwpAQCAtMTQxLDggKzE0
MywxMCBAQCB2b2lkIGluaXRpYWxpemVIZXVyaXN0aWNzKCkKIAogICAgIFNFVChkZXNpcmVkU3Bl
Y3VsYXRpdmVTdWNjZXNzRmFpbFJhdGlvLCA2KTsKICAgICAKLSAgICBTRVQobGlrZWx5VG9UYWtl
U2xvd0Nhc2VUaHJlc2hvbGQsIDEwMCk7Ci0gICAgU0VUKGNvdWxkVGFrZVNsb3dDYXNlVGhyZXNo
b2xkLCAgICAxMCk7IC8vIFNob3VsZG4ndCBiZSB6ZXJvIGJlY2F1c2Ugc29tZSBvcHMgd2lsbCBz
cHVyaW91c2x5IHRha2Ugc2xvdyBjYXNlLCBmb3IgZXhhbXBsZSBmb3IgbGlua2luZyBvciBjYWNo
aW5nLgorICAgIFNFVChsaWtlbHlUb1Rha2VTbG93Q2FzZVRocmVzaG9sZCwgICAgMC4xNSk7Cisg
ICAgU0VUKGNvdWxkVGFrZVNsb3dDYXNlVGhyZXNob2xkLCAgICAgICAwLjA1KTsgLy8gU2hvdWxk
bid0IGJlIHplcm8gYmVjYXVzZSBzb21lIG9wcyB3aWxsIHNwdXJpb3VzbHkgdGFrZSBzbG93IGNh
c2UsIGZvciBleGFtcGxlIGZvciBsaW5raW5nIG9yIGNhY2hpbmcuCisgICAgU0VUKGxpa2VseVRv
VGFrZVNsb3dDYXNlTWluaW11bUNvdW50LCAxMDApOworICAgIFNFVChjb3VsZFRha2VTbG93Q2Fz
ZU1pbmltdW1Db3VudCwgICAgMTApOwogCiAgICAgU0VUKGxhcmdlRmFpbENvdW50VGhyZXNob2xk
QmFzZSwgICAgICAgIDIwKTsKICAgICBTRVQobGFyZ2VGYWlsQ291bnRUaHJlc2hvbGRCYXNlRm9y
TG9vcCwgMSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9IZXVyaXN0aWNz
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGlj
cy5oCShyZXZpc2lvbiAxMDI0NjgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9I
ZXVyaXN0aWNzLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDggKzQ4LDEwIEBAIGV4dGVybiBpbnQz
Ml90IGV4ZWN1dGlvbkNvdW50ZXJJbmNyZW1lbnQKIAogZXh0ZXJuIHVuc2lnbmVkIGRlc2lyZWRT
cGVjdWxhdGl2ZVN1Y2Nlc3NGYWlsUmF0aW87CiAKLWV4dGVybiB1bnNpZ25lZCBsaWtlbHlUb1Rh
a2VTbG93Q2FzZVRocmVzaG9sZDsKLWV4dGVybiB1bnNpZ25lZCBjb3VsZFRha2VTbG93Q2FzZVRo
cmVzaG9sZDsKK2V4dGVybiBkb3VibGUgbGlrZWx5VG9UYWtlU2xvd0Nhc2VUaHJlc2hvbGQ7Citl
eHRlcm4gZG91YmxlIGNvdWxkVGFrZVNsb3dDYXNlVGhyZXNob2xkOworZXh0ZXJuIHVuc2lnbmVk
IGxpa2VseVRvVGFrZVNsb3dDYXNlTWluaW11bUNvdW50OworZXh0ZXJuIHVuc2lnbmVkIGNvdWxk
VGFrZVNsb3dDYXNlTWluaW11bUNvdW50OwogCiBleHRlcm4gdW5zaWduZWQgbGFyZ2VGYWlsQ291
bnRUaHJlc2hvbGRCYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxhcmdlRmFpbENvdW50VGhyZXNob2xk
QmFzZUZvckxvb3A7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>