<?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>21272</bug_id>
          
          <creation_ts>2008-10-01 03:22:37 -0700</creation_ts>
          <short_desc>Switching between custom allocators (TCmalloc, JEmalloc) in linux-qt</short_desc>
          <delta_ts>2010-03-19 00:47:46 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Zoltan Horvath">zoltan</reporter>
          <assigned_to name="QtWebKit Unassigned">webkit-qt-unassigned</assigned_to>
          <cc>gyuyoung</cc>
    
    <cc>ismail</cc>
    
    <cc>joybro201</cc>
    
    <cc>mrowe</cc>
    
    <cc>nayankk</cc>
    
    <cc>skyul</cc>
    
    <cc>vestbo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>93531</commentid>
    <comment_count>0</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:22:37 -0700</bug_when>
    <thetext>We modified build system of WebKit under linux-qt to use TCmalloc if “--tcmalloc” parameter is given to build-webkit script. Even more, we integrated JEmalloc into WebKit as well which is used if &quot;--jemalloc&quot; parameter is given to build-webkit script. (In Mozilla the default allocator is JEmalloc.) 
If we do not give any of these parameters to the build these libraries are not used.

There are three patches:
 (enable_tcmalloc.patch) enables TCmalloc in WebKit (without JEmalloc)
 (enable_jemalloc.patch JEmalloc.h.patch JEmalloc.c.patch rb.h.patch) adds JEmalloc to WebKit (without enabling TCmalloc)
 (enable_jetcmalloc.patch JEmalloc.h.patch JEmalloc.c.patch rb.h.patch) enables TCmalloc and adds JEmalloc at the same time (in this case the user can switch between the allocators in compile time)

Since under linux-qt global operator new and delete do not invoke allocators of TC/JEmalloc, therefore only fastMalloc invokes them. On the other hand, the experimental patches of bug #20422 (https://bugs.webkit.org/show_bug.cgi?id=20422) gives a solution where new and delete also invoke custom allocators (TC/JEmalloc).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93532</commentid>
    <comment_count>1</comment_count>
      <attachid>23974</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:23:45 -0700</bug_when>
    <thetext>Created attachment 23974
Enable TCmalloc under linux-qt (enable_tcmalloc.patch)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93534</commentid>
    <comment_count>2</comment_count>
      <attachid>23975</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:26:28 -0700</bug_when>
    <thetext>Created attachment 23975
Enable JEmalloc under linux-qt (enable_jemalloc.patch)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93535</commentid>
    <comment_count>3</comment_count>
      <attachid>23976</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:27:16 -0700</bug_when>
    <thetext>Created attachment 23976
JEmalloc.h (JEmalloc.h.patch)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93536</commentid>
    <comment_count>4</comment_count>
      <attachid>23977</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:27:50 -0700</bug_when>
    <thetext>Created attachment 23977
JEmalloc.c (JEmalloc.c.patch)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93537</commentid>
    <comment_count>5</comment_count>
      <attachid>23978</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:28:33 -0700</bug_when>
    <thetext>Created attachment 23978
rb.h (red-black tree for JEmalloc)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93538</commentid>
    <comment_count>6</comment_count>
      <attachid>23979</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 03:29:18 -0700</bug_when>
    <thetext>Created attachment 23979
Enable TC/JEmalloc under linux-qt (enable_jetcmalloc.patch)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93546</commentid>
    <comment_count>7</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-01 06:12:45 -0700</bug_when>
    <thetext>*** Bug 21273 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93607</commentid>
    <comment_count>8</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-10-01 14:32:06 -0700</bug_when>
    <thetext>If you&apos;re going to submit a patch, please do it as a single patch rather than attaching each file independently.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93609</commentid>
    <comment_count>9</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-10-01 14:34:57 -0700</bug_when>
    <thetext>What is the purpose of adding jemalloc to WebKit?  What benefits does it bring?

We should not be adding an additional memory allocator to the WebKit source tree.  We can evaluate whether jemalloc would perform better than our custom TCMalloc, and if it does we can consider replacing TCMalloc with it.  If it doesn&apos;t, I see no reason to add it to our tree, and many reasons not to.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93610</commentid>
    <comment_count>10</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-10-01 14:53:32 -0700</bug_when>
    <thetext>Three of the patches look like they do conflicting things. Clearing review flags, since it&apos;s not clear that they&apos;re ready for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93692</commentid>
    <comment_count>11</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-02 01:15:34 -0700</bug_when>
    <thetext>The patches do not conflict but the comment was not clear enough.

If you want to use TCmalloc without JEmalloc then use the enable_tcmalloc.patch patch file only and the others are unnecessary in this case (do not use them).

If you want to use JEmalloc without TCmalloc then use enable_jemalloc.patch, JEmalloc.h.patch, JEmalloc.c.patch, rb.h.patch patch files and the others are unnecessary in this case (do not use them).

If you want to use JEmalloc and TCmalloc together use the enable_jetcmalloc.patch, JEmalloc.h.patch, JEmalloc.c.patch, rb.h.patch patch files only and the are unnecessary in this case (do not use them).

Since the TCmalloc and JEmalloc patches conflict, therefore we created them separately (the first two cases) and we created a third one which contains both of them.

I think the possibility of changing between different memory allocators would be a useful feature (even in embedded systems).
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93699</commentid>
    <comment_count>12</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-10-02 02:28:05 -0700</bug_when>
    <thetext>You flagged all of the patches for review but, as you say, three of them are mutually exclusive. Which are you proposing that we review?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93700</commentid>
    <comment_count>13</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-10-02 02:48:42 -0700</bug_when>
    <thetext>Further, what is it that you&apos;re proposing with these patches? That we drop TCMalloc in favour of  jemalloc? That we add code for a second memory allocator, along side our existing TCMalloc? It would be great if you could clarify this. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93884</commentid>
    <comment_count>14</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2008-10-03 04:21:23 -0700</bug_when>
    <thetext>You don&amp;#8217;t need to review these patches because we have been improving them and we will send exactly one as soon as we achieve better results with the custom allocators.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127128</commentid>
    <comment_count>15</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2009-06-20 04:20:19 -0700</bug_when>
    <thetext>I can think of one reason why jemalloc is a good alternative to tcmalloc. 

jemalloc is more portable. While tcmalloc can&apos;t be used on Windows CE, jemalloc is ported to Windows CE by Mozilla. Fennec uses jemalloc and it defeats the 32MB virtual memory space limitation of Windows CE.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>160434</commentid>
    <comment_count>16</comment_count>
    <who name="Ismail Donmez">ismail</who>
    <bug_when>2009-11-04 06:57:50 -0800</bug_when>
    <thetext>Any news about this patch? This is truly needed for WinCE ports.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>160525</commentid>
    <comment_count>17</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2009-11-04 11:20:31 -0800</bug_when>
    <thetext>Is the switching needed or the JEmalloc implementation is needed?

I&apos;m working on the custom allocation framework now what is needed to the switching allocators for the whole WebKit. If you want to test JavaScriptCore with other allocators it is possible already.

If you have further questions, please ask. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188948</commentid>
    <comment_count>18</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-02-09 03:25:08 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; Is the switching needed or the JEmalloc implementation is needed?
&gt; 
&gt; I&apos;m working on the custom allocation framework now what is needed to the
&gt; switching allocators for the whole WebKit. If you want to test JavaScriptCore
&gt; with other allocators it is possible already.
&gt; 
&gt; If you have further questions, please ask. :)

What&apos;s the current position of WebKit on switching the memory allocator? As described in your blog article &quot;War of allocators in JavaScriptCore&quot;, adding jemalloc makes no sense for Linux-qt build. However, in Windows CE, jemalloc gives almost 2x speedup in page loading time over the system malloc because the system malloc is simply too slow.  

Is it okay to use jemalloc at least for Windows CE? If the answer is yes, I will file a bug for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188965</commentid>
    <comment_count>19</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-02-09 04:47:26 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; What&apos;s the current position of WebKit on switching the memory allocator? As
&gt; described in your blog article &quot;War of allocators in JavaScriptCore&quot;, adding
&gt; jemalloc makes no sense for Linux-qt build. However, in Windows CE, jemalloc
&gt; gives almost 2x speedup in page loading time over the system malloc because the
&gt; system malloc is simply too slow.  
&gt; 
&gt; Is it okay to use jemalloc at least for Windows CE? If the answer is yes, I
&gt; will file a bug for this.

Custom allocation framework is ready (only few (&lt;5) classes aren&apos;t inherited from FastAllocBase), so you can safely use custom allocators - trough FastMalloc - without overriding global operator new/delete.
Now, I&apos;m benchmarking JEmalloc on multi-threaded benchmarks,  tomorrow I&apos;ll write a post about the results. 

First, I think we should make TCmalloc&apos;s implementation WinCE compatible, and test that. Adding and maintaining an extra allocator - because of one platform - is not a good idea.

What are the depedencies of enabling TCmalloc on WinCe? TCmalloc uses pthreads... This might be a problem, isn&apos;t it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189063</commentid>
    <comment_count>20</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-02-09 10:19:13 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; Custom allocation framework is ready (only few (&lt;5) classes aren&apos;t inherited
&gt; from FastAllocBase), so you can safely use custom allocators - trough
&gt; FastMalloc - without overriding global operator new/delete.
&gt; Now, I&apos;m benchmarking JEmalloc on multi-threaded benchmarks,  tomorrow I&apos;ll
&gt; write a post about the results. 
&gt; 
&gt; First, I think we should make TCmalloc&apos;s implementation WinCE compatible, and
&gt; test that. Adding and maintaining an extra allocator - because of one platform
&gt; - is not a good idea.
&gt; 
&gt; What are the depedencies of enabling TCmalloc on WinCe? TCmalloc uses
&gt; pthreads... This might be a problem, isn&apos;t it?

I agree with you. TCmalloc needs to be ported to WinCE before we consider adding an extra allocator.

Implementing threading and spin lock for WinCE ARM is one thing, but the big obstacle is the WinCE&apos;s virtual memory space limitation. WinCE is unique as it allows only 32MB virtual memory space to each process. Windows CE 6.0 Embedded removed the limitation though.

Check out the memory map of Windows Mobile 6.1 (based on Windows CE 5.0)

http://bolingconsulting.com/blog/?p=4

Fortunately, VirtualAlloc(size &gt; 2MB) allocates the memory outside the 32MB process virtual memory space. It allocates memory in Large Memory Area(LBA). TCmalloc must be modified to address this issue.

Mozilla&apos;s Fennec uses jemalloc to overcome this virtual memory space issue as jemalloc is ported to WinCE to circumvent the limitation.

My colleague is currently working on this issue. He will be able to submit a patch soon or later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189066</commentid>
    <comment_count>21</comment_count>
    <who name="Ismail Donmez">ismail</who>
    <bug_when>2010-02-09 10:29:55 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; Mozilla&apos;s Fennec uses jemalloc to overcome this virtual memory space issue as
&gt; jemalloc is ported to WinCE to circumvent the limitation.
&gt; 
&gt; My colleague is currently working on this issue. He will be able to submit a
&gt; patch soon or later.

Using jemalloc is fine but once you have mismatched allocators i.e stuff allocated with jemalloc and freed by CRT&apos;s free/delete you are gonna end up crashing.

It will be tough road imho.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193269</commentid>
    <comment_count>22</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-02-24 01:30:28 -0800</bug_when>
    <thetext>In the past few weeks, I wrote some blog posts about results of custom allocators:
http://webkit.sed.hu/taxonomy/term/3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200620</commentid>
    <comment_count>23</comment_count>
      <attachid>50881</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-03-17 02:14:43 -0700</bug_when>
    <thetext>Created attachment 50881
Switching between system allocator and TCmalloc in build-webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200622</commentid>
    <comment_count>24</comment_count>
      <attachid>50882</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-03-17 02:17:26 -0700</bug_when>
    <thetext>Created attachment 50882
Switching between system allocator and TCmalloc in build-webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201725</commentid>
    <comment_count>25</comment_count>
      <attachid>50882</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2010-03-18 23:30:31 -0700</bug_when>
    <thetext>Comment on attachment 50882
Switching between system allocator and TCmalloc in build-webkit

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201769</commentid>
    <comment_count>26</comment_count>
      <attachid>50882</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-03-19 00:47:34 -0700</bug_when>
    <thetext>Comment on attachment 50882
Switching between system allocator and TCmalloc in build-webkit

Clearing flags on attachment: 50882

Committed r56227: &lt;http://trac.webkit.org/changeset/56227&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201770</commentid>
    <comment_count>27</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2010-03-19 00:47:46 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23974</attachid>
            <date>2008-10-01 03:23:45 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>Enable TCmalloc under linux-qt (enable_tcmalloc.patch)</desc>
            <filename>enable_tcmalloc.patch</filename>
            <type>text/plain</type>
            <size>4207</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9qc2MucHJvCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2tqcy9qc2MucHJvCShyZXZpc2lvbiAzNzA0OCkKKysrIEphdmFTY3JpcHRDb3JlL2tq
cy9qc2MucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0xNCw4ICsxNCwxMSBAQAogQ09ORklHICs9IGJ1
aWxkaW5nLWxpYnMKIAogQ09ORklHKHJlbGVhc2UpIHsKLSAgICBERUZJTkVTICs9IE5ERUJVRyBV
U0VfU1lTVEVNX01BTExPQworICAgIERFRklORVMgKz0gTkRFQlVHCiB9CishQ09ORklHKHRjbWFs
bG9jKSB7CisgICAgREVGSU5FUyArPSBVU0VfU1lTVEVNX01BTExPQworfQogCiBpbmNsdWRlKCQk
UFdELy4uLy4uL1dlYktpdC5wcmkpCiAKSW5kZXg6IEdOVW1ha2VmaWxlLmFtCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEdOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiAzNzA0OCkKKysrIEdOVW1ha2VmaWxlLmFtCSh3
b3JraW5nIGNvcHkpCkBAIC0yNTUsMTAgKzI1NSwxMCBAQAogCS1EQlVJTERJTkdfR1RLX189MSBc
CiAJLURXVEZfQ0hBTkdFUwogCi1pZiAhRU5BQkxFX0ZBU1RfTUFMTE9DCi1nbG9iYWxfY3BwZmxh
Z3MgKz0gXAotCS1EVVNFX1NZU1RFTV9NQUxMT0MKLWVuZGlmCisjaWYgIUVOQUJMRV9GQVNUX01B
TExPQworI2dsb2JhbF9jcHBmbGFncyArPSBcCisjCS1EVVNFX1NZU1RFTV9NQUxMT0MKKyNlbmRp
ZgogCiBpZiBUQVJHRVRfWDExCiBnbG9iYWxfY3BwZmxhZ3MgKz0gLURYUF9VTklYCkluZGV4OiBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdGRpcnMucG0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRkaXJzLnBtCShyZXZpc2lvbiAzNzA0OCkKKysrIFdlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0ZGlycy5wbQkod29ya2luZyBjb3B5KQpAQCAtODc0LDE0ICs4NzQsMzAg
QEAKICAgICByZXR1cm4gJHJlc3VsdDsKIH0KIAotc3ViIGJ1aWxkUU1ha2VRdFByb2plY3QoJCQp
CitzdWIgZ2V0TWVtb3J5TWFuYWdlKCQpIHsKKworICAgIG15ICgkbWVtb3J5TWFuYWdlKSA9IEBf
OworCisgICAgaWYgKCRtZW1vcnlNYW5hZ2UgZXEgInRjbWFsbG9jIikgeworICAgICAgICByZXR1
cm4gIkNPTkZJRys9Ii4kbWVtb3J5TWFuYWdlOworICAgIH0KKworICAgIHJldHVybiAiIjsKK30K
Kworc3ViIGJ1aWxkUU1ha2VRdFByb2plY3QoJCQkKQogewotICAgIG15ICgkcHJvamVjdCwgJGNs
ZWFuKSA9IEBfOworICAgIG15ICgkcHJvamVjdCwgJGNsZWFuLCAkbWVtb3J5TWFuYWdlKSA9IEBf
OwogCiAgICAgbXkgQGJ1aWxkQXJncyA9ICgiQ09ORklHKz1xdC1wb3J0Iik7Ci0gICAgcmV0dXJu
IGJ1aWxkUU1ha2VQcm9qZWN0KCRjbGVhbiwgQGJ1aWxkQXJncyk7Ci19CiAKKyAgICBpZiAoJG1l
bW9yeU1hbmFnZSBuZSAiIikgeworICAgICAgICBwdXNoIEBidWlsZEFyZ3MsZ2V0TWVtb3J5TWFu
YWdlKCRtZW1vcnlNYW5hZ2UpOworICAgIH0KKworICAgICByZXR1cm4gYnVpbGRRTWFrZVByb2pl
Y3QoJGNsZWFuLCBAYnVpbGRBcmdzKTsKKyB9CisKIHN1YiBidWlsZEd0a1Byb2plY3QoJCRAKQog
ewogICAgIG15ICgkcHJvamVjdCwgJGNsZWFuLCBAYnVpbGRBcmdzKSA9IEBfOwpJbmRleDogV2Vi
S2l0VG9vbHMvU2NyaXB0cy9idWlsZC13ZWJraXQKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMv
U2NyaXB0cy9idWlsZC13ZWJraXQJKHJldmlzaW9uIDM3MDQ4KQorKysgV2ViS2l0VG9vbHMvU2Ny
aXB0cy9idWlsZC13ZWJraXQJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDkgQEAKIG15ICRi
dWlsZFVuaXZlcnNhbCA9IDA7CiBteSAkYnVpbGRTaXh0eUZvdXJCaXQgPSAwOwogCitteSAkdGNt
YWxsb2MgPSAwOworbXkgJG1lbW9yeU1hbmFnZSA9ICIiOworCiBteSAkcHJvZ3JhbU5hbWUgPSBi
YXNlbmFtZSgkMCk7CiBteSAkdXNhZ2UgPSA8PEVPRjsKIFVzYWdlOiAkcHJvZ3JhbU5hbWUgW29w
dGlvbnNdIFtvcHRpb25zIHRvIHBhc3MgdG8gYnVpbGQgc3lzdGVtXQpAQCAtODUsNiArODgsNyBA
QAogICAtLVtuby1deHNsdCAgICAgICAgICAgICAgICAgICBUb2dnbGUgWFNMVCBzdXBwb3J0IChk
ZWZhdWx0OiAkeHNsdFN1cHBvcnQpCiAgIC0tW25vLV12aWRlbyAgICAgICAgICAgICAgICAgIFRv
Z2dsZSBWaWRlbyBzdXBwb3J0IChkZWZhdWx0OiAkdmlkZW9TdXBwb3J0KQogICAtLVtuby1dY292
ZXJhZ2UgICAgICAgICAgICAgICBUb2dnbGUgY29kZSBjb3ZlcmFnZSBzdXBwb3J0IChkZWZhdWx0
OiAkY292ZXJhZ2VTdXBwb3J0KQorICAtLXRjbWFsbG9jICAgICAgICAgICAgICAgICAgICBFbmFi
bGUgVENtYWxsb2MgYmVoaW5kIFF0IHBvcnQKIEVPRgogCiBHZXRPcHRpb25zKCdkYXRhYmFzZSEn
ID0+IFwkZGF0YWJhc2VTdXBwb3J0LApAQCAtMTA2LDEzICsxMTAsMTggQEAKICAgICAgICAgICAg
J2hlbHAnID0+IFwkc2hvd0hlbHAsCiAgICAgICAgICAgICd1bml2ZXJzYWwnID0+IFwkYnVpbGRV
bml2ZXJzYWwsCiAgICAgICAgICAgICc2NC1iaXQnID0+IFwkYnVpbGRTaXh0eUZvdXJCaXQsCi0g
ICAgICAgICAgICdjbGVhbicgPT4gXCRjbGVhbik7CisgICAgICAgICAgICdjbGVhbicgPT4gXCRj
bGVhbiwKKyAgICAgICAgICAgJ3RjbWFsbG9jJyA9PiBcJHRjbWFsbG9jKTsKIAogaWYgKCRzaG93
SGVscCkgewogICAgcHJpbnQgU1RERVJSICR1c2FnZTsKICAgIGV4aXQgMTsKIH0KIAoraWYoJHRj
bWFsbG9jKSB7CisgICAgJG1lbW9yeU1hbmFnZT0idGNtYWxsb2MiOworfQorCiAkc3ZnRXhwZXJp
bWVudGFsU3VwcG9ydCA9IDAgdW5sZXNzICRzdmdTdXBwb3J0OwogJHN2Z0FuaW1hdGlvblN1cHBv
cnQgPSAwIHVubGVzcyAkc3ZnU3VwcG9ydDsKICRzdmdGaWx0ZXJzU3VwcG9ydCA9IDAgdW5sZXNz
ICRzdmdTdXBwb3J0OwpAQCAtMzAwLDcgKzMwOSw3IEBACiAgICAgICAgICAgICBjaGRpciAiLi4i
IG9yIGRpZTsKICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9
IGJ1aWxkUU1ha2VRdFByb2plY3QoJGRpciwgJGNsZWFuKTsKKyAgICAgICAgJHJlc3VsdCA9IGJ1
aWxkUU1ha2VRdFByb2plY3QoJGRpciwgJGNsZWFuLCAkbWVtb3J5TWFuYWdlKTsKICAgICB9IGVs
c2lmIChpc09TWCgpKSB7CiAgICAgICAgICRyZXN1bHQgPSBzeXN0ZW0gInhjb2RlYnVpbGQiLCAi
LXByb2plY3QiLCAiJGRpci54Y29kZXByb2oiLCBAb3B0aW9ucywgJG92ZXJyaWRlRmVhdHVyZURl
ZmluZXNTdHJpbmcsIEBjb3ZlcmFnZVN1cHBvcnRPcHRpb24sIEBBUkdWOwogICAgIH0gZWxzaWYg
KGlzQ3lnd2luKCkpIHsKSW5kZXg6IFdlYktpdC5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0LnBy
aQkocmV2aXNpb24gMzcwNDgpCisrKyBXZWJLaXQucHJpCSh3b3JraW5nIGNvcHkpCkBAIC0xNSw3
ICsxNSw2IEBACiAgICAgREVQRU5EUEFUSCArPSAkJFBXRC9XZWJLaXQvcXQvQXBpCiB9CiAKLURF
RklORVMgKz0gVVNFX1NZU1RFTV9NQUxMT0MKIENPTkZJRyhyZWxlYXNlKSB7CiAgICAgREVGSU5F
UyArPSBOREVCVUcKIH0KQEAgLTIzLDYgKzIyLDE0IEBACiBCQVNFX0RJUiA9ICQkUFdECiBJTkNM
VURFUEFUSCArPSAkJFBXRC9XZWJLaXQvcXQvQXBpCiAKK0NPTkZJRyh0Y21hbGxvYykgeworUU1B
S0VfQ1hYRkxBUyArPSAtbHRjbWFsbG9jCitRTUFLRV9DRkxBR1MgKz0gLWx0Y21hbGxvYworUU1B
S0VfTEZMQUdTICs9IC1sdGNtYWxsb2MKK30gZWxzZSB7CitERUZJTkVTICs9IFVTRV9TWVNURU1f
TUFMTE9DCit9CisKICMKICMgRm9yIGJ1aWxkcyBpbnNpZGUgUXQgd2UgaW50ZXJwcmV0IHRoZSBv
dXRwdXQgcnVsZSBhbmQgdGhlIGlucHV0IG9mIGVhY2ggZXh0cmEgY29tcGlsZXIgbWFudWFsbHkK
ICMgYW5kIGFkZCB0aGUgcmVzdWx0aW5nIHNvdXJjZXMgdG8gdGhlIFNPVVJDRVMgdmFyaWFibGUs
IGJlY2F1c2UgdGhlIGJ1aWxkIGluc2lkZSBRdCBjb250YWlucyBhbHJlYWR5Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23975</attachid>
            <date>2008-10-01 03:26:28 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>Enable JEmalloc under linux-qt (enable_jemalloc.patch)</desc>
            <filename>enable_jemalloc.patch</filename>
            <type>text/plain</type>
            <size>4903</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9GYXN0TWFsbG9jLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS93dGYvRmFzdE1hbGxvYy5jcHAJKHJldmlzaW9uIDM3MDQ4KQorKysgSmF2
YVNjcmlwdENvcmUvd3RmL0Zhc3RNYWxsb2MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCw2ICs5
NCwxMiBAQAogI2RlZmluZSBGT1JDRV9TWVNURU1fTUFMTE9DIDEKICNlbmRpZgogCisjaWYgIWRl
ZmluZWQoVVNFX0pFX01BTExPQykKKyNkZWZpbmUgRk9SQ0VfSkVfTUFMTE9DIDAKKyNlbHNlCisj
ZGVmaW5lIEZPUkNFX0pFX01BTExPQyAxCisjZW5kaWYKKwogI2RlZmluZSBUQ01BTExPQ19UUkFD
S19ERUNPTU1JVEVEX1NQQU5TIChIQVZFKFZJUlRVQUxBTExPQykpCiAKICNpZm5kZWYgTkRFQlVH
CkBAIC0xNjksOSArMTc1LDI0IEBACiAKIH0gLy8gbmFtZXNwYWNlIFdURgogCi0jaWYgRk9SQ0Vf
U1lTVEVNX01BTExPQworI2lmIEZPUkNFX1NZU1RFTV9NQUxMT0MgfHwgRk9SQ0VfSkVfTUFMTE9D
CiAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAhRk9SQ0VfSkVfTUFMTE9DCisgICAgI2luY2x1
ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsK
KyNlbmRpZgorCisjaW5jbHVkZSAiSkVtYWxsb2MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9
CisjZW5kaWYKKworI2VuZGlmCisKICNpZiAhUExBVEZPUk0oV0lOX09TKQogICAgICNpbmNsdWRl
IDxwdGhyZWFkLmg+CiAjZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
LnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHJl
dmlzaW9uIDM3MDQ4KQorKysgSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNDYsNiArMTQ2LDEwIEBACiAgICAgd3RmL1RocmVhZGluZ1F0LmNwcCBc
CiAgICAgd3RmL3F0L01haW5UaHJlYWRRdC5jcHAKIAorQ09ORklHKGplbWFsbG9jKSB7CisgICAg
U09VUkNFUyArPSB3dGYvSkVtYWxsb2MuYworfQorCiAjIEdFTkVSQVRPUiAxLUE6IExVVCBjcmVh
dG9yCiBsdXQub3V0cHV0ID0gJCRHRU5FUkFURURfU09VUkNFU19ESVIvJHtRTUFLRV9GSUxFX0JB
U0V9Lmx1dC5oCiBsdXQuY29tbWFuZHMgPSBwZXJsICQkUFdEL2tqcy9jcmVhdGVfaGFzaF90YWJs
ZSAke1FNQUtFX0ZJTEVfTkFNRX0gLWkgPiAke1FNQUtFX0ZJTEVfT1VUfQpJbmRleDogR05VbWFr
ZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDM3MDQ4KQor
KysgR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTI1NSwxMCArMjU1LDEwIEBACiAJ
LURCVUlMRElOR19HVEtfXz0xIFwKIAktRFdURl9DSEFOR0VTCiAKLWlmICFFTkFCTEVfRkFTVF9N
QUxMT0MKLWdsb2JhbF9jcHBmbGFncyArPSBcCi0JLURVU0VfU1lTVEVNX01BTExPQwotZW5kaWYK
KyNpZiAhRU5BQkxFX0ZBU1RfTUFMTE9DCisjZ2xvYmFsX2NwcGZsYWdzICs9IFwKKyMJLURVU0Vf
U1lTVEVNX01BTExPQworI2VuZGlmCiAKIGlmIFRBUkdFVF9YMTEKIGdsb2JhbF9jcHBmbGFncyAr
PSAtRFhQX1VOSVgKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0ZGlycy5wbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdGRpcnMucG0JKHJldmlzaW9uIDM3
MDQ4KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRkaXJzLnBtCSh3b3JraW5nIGNvcHkp
CkBAIC04NzQsMTQgKzg3NCwzMCBAQAogICAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgYnVp
bGRRTWFrZVF0UHJvamVjdCgkJCkKK3N1YiBnZXRNZW1vcnlNYW5hZ2UoJCkgeworCisgICAgbXkg
KCRtZW1vcnlNYW5hZ2UpID0gQF87CisKKyAgICBpZiAoJG1lbW9yeU1hbmFnZSBlcSAiamVtYWxs
b2MiKSB7CisgICAgICAgIHJldHVybiAiQ09ORklHKz0iLiRtZW1vcnlNYW5hZ2U7CisgICAgfQor
CisgICAgcmV0dXJuICIiOworfQorCitzdWIgYnVpbGRRTWFrZVF0UHJvamVjdCgkJCQpCiB7Ci0g
ICAgbXkgKCRwcm9qZWN0LCAkY2xlYW4pID0gQF87CisgICAgbXkgKCRwcm9qZWN0LCAkY2xlYW4s
ICRtZW1vcnlNYW5hZ2UpID0gQF87CiAKICAgICBteSBAYnVpbGRBcmdzID0gKCJDT05GSUcrPXF0
LXBvcnQiKTsKLSAgICByZXR1cm4gYnVpbGRRTWFrZVByb2plY3QoJGNsZWFuLCBAYnVpbGRBcmdz
KTsKLX0KIAorICAgIGlmICgkbWVtb3J5TWFuYWdlIG5lICIiKSB7CisgICAgICAgIHB1c2ggQGJ1
aWxkQXJncyxnZXRNZW1vcnlNYW5hZ2UoJG1lbW9yeU1hbmFnZSk7CisgICAgfQorCisgICAgIHJl
dHVybiBidWlsZFFNYWtlUHJvamVjdCgkY2xlYW4sIEBidWlsZEFyZ3MpOworIH0KKwogc3ViIGJ1
aWxkR3RrUHJvamVjdCgkJEApCiB7CiAgICAgbXkgKCRwcm9qZWN0LCAkY2xlYW4sIEBidWlsZEFy
Z3MpID0gQF87CkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdAkocmV2aXNpb24gMzcwNDgp
CisrKyBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdAkod29ya2luZyBjb3B5KQpAQCAt
NjAsNiArNjAsOSBAQAogbXkgJGJ1aWxkVW5pdmVyc2FsID0gMDsKIG15ICRidWlsZFNpeHR5Rm91
ckJpdCA9IDA7CiAKK215ICRqZW1hbGxvYyA9IDA7CitteSAkbWVtb3J5TWFuYWdlID0gIiI7CisK
IG15ICRwcm9ncmFtTmFtZSA9IGJhc2VuYW1lKCQwKTsKIG15ICR1c2FnZSA9IDw8RU9GOwogVXNh
Z2U6ICRwcm9ncmFtTmFtZSBbb3B0aW9uc10gW29wdGlvbnMgdG8gcGFzcyB0byBidWlsZCBzeXN0
ZW1dCkBAIC04NSw2ICs4OCw3IEBACiAgIC0tW25vLV14c2x0ICAgICAgICAgICAgICAgICAgIFRv
Z2dsZSBYU0xUIHN1cHBvcnQgKGRlZmF1bHQ6ICR4c2x0U3VwcG9ydCkKICAgLS1bbm8tXXZpZGVv
ICAgICAgICAgICAgICAgICAgVG9nZ2xlIFZpZGVvIHN1cHBvcnQgKGRlZmF1bHQ6ICR2aWRlb1N1
cHBvcnQpCiAgIC0tW25vLV1jb3ZlcmFnZSAgICAgICAgICAgICAgIFRvZ2dsZSBjb2RlIGNvdmVy
YWdlIHN1cHBvcnQgKGRlZmF1bHQ6ICRjb3ZlcmFnZVN1cHBvcnQpCisgIC0tamVtYWxsb2MgICAg
ICAgICAgICAgICAgICAgIEVuYWJsZSBKRW1hbGxvYyBiZWhpbmQgUXQgcG9ydAogRU9GCiAKIEdl
dE9wdGlvbnMoJ2RhdGFiYXNlIScgPT4gXCRkYXRhYmFzZVN1cHBvcnQsCkBAIC0xMDYsMTMgKzEx
MCwxOCBAQAogICAgICAgICAgICAnaGVscCcgPT4gXCRzaG93SGVscCwKICAgICAgICAgICAgJ3Vu
aXZlcnNhbCcgPT4gXCRidWlsZFVuaXZlcnNhbCwKICAgICAgICAgICAgJzY0LWJpdCcgPT4gXCRi
dWlsZFNpeHR5Rm91ckJpdCwKLSAgICAgICAgICAgJ2NsZWFuJyA9PiBcJGNsZWFuKTsKKyAgICAg
ICAgICAgJ2NsZWFuJyA9PiBcJGNsZWFuLAorICAgICAgICAgICAnamVtYWxsb2MnID0+IFwkamVt
YWxsb2MpOwogCiBpZiAoJHNob3dIZWxwKSB7CiAgICBwcmludCBTVERFUlIgJHVzYWdlOwogICAg
ZXhpdCAxOwogfQogCitpZigkamVtYWxsb2MpIHsKKyAgICAkbWVtb3J5TWFuYWdlPSJqZW1hbGxv
YyI7Cit9CisKICRzdmdFeHBlcmltZW50YWxTdXBwb3J0ID0gMCB1bmxlc3MgJHN2Z1N1cHBvcnQ7
CiAkc3ZnQW5pbWF0aW9uU3VwcG9ydCA9IDAgdW5sZXNzICRzdmdTdXBwb3J0OwogJHN2Z0ZpbHRl
cnNTdXBwb3J0ID0gMCB1bmxlc3MgJHN2Z1N1cHBvcnQ7CkBAIC0zMDAsNyArMzA5LDcgQEAKICAg
ICAgICAgICAgIGNoZGlyICIuLiIgb3IgZGllOwogICAgICAgICAgICAgbmV4dDsKICAgICAgICAg
fQotICAgICAgICAkcmVzdWx0ID0gYnVpbGRRTWFrZVF0UHJvamVjdCgkZGlyLCAkY2xlYW4pOwor
ICAgICAgICAkcmVzdWx0ID0gYnVpbGRRTWFrZVF0UHJvamVjdCgkZGlyLCAkY2xlYW4sICRtZW1v
cnlNYW5hZ2UpOwogICAgIH0gZWxzaWYgKGlzT1NYKCkpIHsKICAgICAgICAgJHJlc3VsdCA9IHN5
c3RlbSAieGNvZGVidWlsZCIsICItcHJvamVjdCIsICIkZGlyLnhjb2RlcHJvaiIsIEBvcHRpb25z
LCAkb3ZlcnJpZGVGZWF0dXJlRGVmaW5lc1N0cmluZywgQGNvdmVyYWdlU3VwcG9ydE9wdGlvbiwg
QEFSR1Y7CiAgICAgfSBlbHNpZiAoaXNDeWd3aW4oKSkgewpJbmRleDogV2ViS2l0LnByaQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQucHJpCShyZXZpc2lvbiAzNzA0OCkKKysrIFdlYktpdC5wcmkJKHdv
cmtpbmcgY29weSkKQEAgLTIzLDYgKzIzLDEwIEBACiBCQVNFX0RJUiA9ICQkUFdECiBJTkNMVURF
UEFUSCArPSAkJFBXRC9XZWJLaXQvcXQvQXBpCiAKK0NPTkZJRyhqZW1hbGxvYykgeworREVGSU5F
UyArPSBVU0VfSkVfTUFMTE9DCit9CisKICMKICMgRm9yIGJ1aWxkcyBpbnNpZGUgUXQgd2UgaW50
ZXJwcmV0IHRoZSBvdXRwdXQgcnVsZSBhbmQgdGhlIGlucHV0IG9mIGVhY2ggZXh0cmEgY29tcGls
ZXIgbWFudWFsbHkKICMgYW5kIGFkZCB0aGUgcmVzdWx0aW5nIHNvdXJjZXMgdG8gdGhlIFNPVVJD
RVMgdmFyaWFibGUsIGJlY2F1c2UgdGhlIGJ1aWxkIGluc2lkZSBRdCBjb250YWlucyBhbHJlYWR5
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23976</attachid>
            <date>2008-10-01 03:27:16 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>JEmalloc.h (JEmalloc.h.patch)</desc>
            <filename>JEmalloc.h.patch</filename>
            <type>text/plain</type>
            <size>1974</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9KRW1hbGxvYy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9KRW1hbGxvYy5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUv
d3RmL0pFbWFsbG9jLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDAgQEAKKy8qLQorICogQ29w
eXJpZ2h0IChDKSAyMDA2LTIwMDggSmFzb24gRXZhbnMgPGphc29uZUBGcmVlQlNELm9yZz4uCisg
KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZShzKSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcworICogICAgdGhlIGZpcnN0
IGxpbmVzIG9mIHRoaXMgZmlsZSB1bm1vZGlmaWVkIG90aGVyIHRoYW4gdGhlIHBvc3NpYmxlCisg
KiAgICBhZGRpdGlvbiBvZiBvbmUgb3IgbW9yZSBjb3B5cmlnaHQgbm90aWNlcy4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UocyksIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSKFMp
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIo
UykgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBKRW1hbGxv
Yy5oCisjaWZuZGVmIEpFbWFsbG9jX2gKKyNkZWZpbmUgSkVtYWxsb2NfaAorCit2b2lkICogbWFs
bG9jKHNpemVfdCBzaXplKTsKK3ZvaWQgKiBjYWxsb2Moc2l6ZV90IG51bSwgc2l6ZV90IHNpemUp
Owordm9pZCAqIHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGZyZWUodm9p
ZCAqcHRyKTsKKworI2VuZGlmIC8qIEpFbWFsbG9jX2ggKi8K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23977</attachid>
            <date>2008-10-01 03:27:50 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>JEmalloc.c (JEmalloc.c.patch)</desc>
            <filename>JEmalloc.c.patch</filename>
            <type>text/plain</type>
            <size>149715</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9KRW1hbGxvYy5jCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9KRW1hbGxvYy5jCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUv
d3RmL0pFbWFsbG9jLmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTY3NSBAQAorLyotCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBKYXNvbiBFdmFucyA8amFzb25lQEZyZWVCU0Qub3JnPi4K
KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlKHMpLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFzCisgKiAgICB0aGUgZmly
c3QgbGluZXMgb2YgdGhpcyBmaWxlIHVubW9kaWZpZWQgb3RoZXIgdGhhbiB0aGUgcG9zc2libGUK
KyAqICAgIGFkZGl0aW9uIG9mIG9uZSBvciBtb3JlIGNvcHlyaWdodCBub3RpY2VzLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZShzKSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVIo
UykgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERF
UihTKSBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioKKyAqCisgKiBUaGlzIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25l
ZCB0byBwcm92aWRlIHNjYWxhYmxlIHBlcmZvcm1hbmNlCisgKiBmb3IgbXVsdGktdGhyZWFkZWQg
cHJvZ3JhbXMgb24gbXVsdGktcHJvY2Vzc29yIHN5c3RlbXMuICBUaGUgZm9sbG93aW5nCisgKiBm
ZWF0dXJlcyBhcmUgaW5jbHVkZWQgZm9yIHRoaXMgcHVycG9zZToKKyAqCisgKiAgICsgTXVsdGlw
bGUgYXJlbmFzIGFyZSB1c2VkIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBDUFVzLCB3aGljaCByZWR1
Y2VzIGxvY2sKKyAqICAgICBjb250ZW50aW9uIGFuZCBjYWNoZSBzbG9zaGluZy4KKyAqCisgKiAg
ICsgVGhyZWFkLXNwZWNpZmljIGNhY2hpbmcgaXMgdXNlZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUg
dGhyZWFkcywgd2hpY2gKKyAqICAgICByZWR1Y2VzIHRoZSBhbW91bnQgb2YgbG9ja2luZy4KKyAq
CisgKiAgICsgQ2FjaGUgbGluZSBzaGFyaW5nIGJldHdlZW4gYXJlbmFzIGlzIGF2b2lkZWQgZm9y
IGludGVybmFsIGRhdGEKKyAqICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqICAgKyBNZW1vcnkgaXMg
bWFuYWdlZCBpbiBjaHVua3MgYW5kIHJ1bnMgKGNodW5rcyBjYW4gYmUgc3BsaXQgaW50byBydW5z
KSwKKyAqICAgICByYXRoZXIgdGhhbiBhcyBpbmRpdmlkdWFsIHBhZ2VzLiAgVGhpcyBwcm92aWRl
cyBhIGNvbnN0YW50LXRpbWUKKyAqICAgICBtZWNoYW5pc20gZm9yIGFzc29jaWF0aW5nIGFsbG9j
YXRpb25zIHdpdGggcGFydGljdWxhciBhcmVuYXMuCisgKgorICogQWxsb2NhdGlvbiByZXF1ZXN0
cyBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBzaXplIGNsYXNzLCBhbmQgbm8gcmVjb3Jk
CisgKiBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBzaXplIGlzIG1haW50YWluZWQuICBBbGxvY2F0
aW9ucyBhcmUgYnJva2VuIGludG8KKyAqIGNhdGVnb3JpZXMgYWNjb3JkaW5nIHRvIHNpemUgY2xh
c3MuICBBc3N1bWluZyBydW50aW1lIGRlZmF1bHRzLCA0IGtCIHBhZ2VzCisgKiBhbmQgYSAxNiBi
eXRlIHF1YW50dW0gb24gYSAzMi1iaXQgc3lzdGVtLCB0aGUgc2l6ZSBjbGFzc2VzIGluIGVhY2gg
Y2F0ZWdvcnkKKyAqIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqICAgfD09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PXwKKyAqICAgfCBDYXRlZ29yeSB8IFN1YmNhdGVnb3J5ICAg
ICAgfCAgICBTaXplIHwKKyAqICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PXwKKyAqICAgfCBTbWFsbCAgICB8IFRpbnkgICAgICAgICAgICAgfCAgICAgICAyIHwKKyAq
ICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICA0IHwKKyAqICAgfCAgICAg
ICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICA4IHwKKyAqICAgfCAgICAgICAgICB8LS0t
LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLXwKKyAqICAgfCAgICAgICAgICB8IFF1YW50dW0tc3Bh
Y2VkICAgfCAgICAgIDE2IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAg
ICAgIDMyIHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgIDQ4IHwK
KyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgLi4uIHwKKyAqICAgfCAg
ICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgIDk2IHwKKyAqICAgfCAgICAgICAgICB8
ICAgICAgICAgICAgICAgICAgfCAgICAgMTEyIHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAg
ICAgICAgICAgfCAgICAgMTI4IHwKKyAqICAgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0t
Ky0tLS0tLS0tLXwKKyAqICAgfCAgICAgICAgICB8IENhY2hlbGluZS1zcGFjZWQgfCAgICAgMTky
IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgMjU2IHwKKyAqICAg
fCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgMzIwIHwKKyAqICAgfCAgICAgICAg
ICB8ICAgICAgICAgICAgICAgICAgfCAgICAgMzg0IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAg
ICAgICAgICAgICAgfCAgICAgNDQ4IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAg
ICAgfCAgICAgNTEyIHwKKyAqICAgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t
LS0tLXwKKyAqICAgfCAgICAgICAgICB8IFN1Yi1wYWdlICAgICAgICAgfCAgICAgNzYwIHwKKyAq
ICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAxMDI0IHwKKyAqICAgfCAgICAg
ICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAxMjgwIHwKKyAqICAgfCAgICAgICAgICB8ICAg
ICAgICAgICAgICAgICAgfCAgICAgLi4uIHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAg
ICAgICAgfCAgICAzMzI4IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAg
ICAzNTg0IHwKKyAqICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAzODQwIHwK
KyAqICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKKyAqICAgfCBM
YXJnZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0IGtCIHwKKyAqICAgfCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfCAgICA4IGtCIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfCAgIDEyIGtCIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fCAgICAgLi4uIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDEyIGtC
IHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE2IGtCIHwKKyAqICAg
fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDIwIGtCIHwKKyAqICAgfD09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKKyAqICAgfCBIdWdlICAgICAgICAgICAg
ICAgICAgICAgICAgfCAgICAxIE1CIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfCAgICAyIE1CIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAz
IE1CIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLi4uIHwKKyAq
ICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKKyAqCisgKiBBIGRp
ZmZlcmVudCBtZWNoYW5pc20gaXMgdXNlZCBmb3IgZWFjaCBjYXRlZ29yeToKKyAqCisgKiAgIFNt
YWxsIDogRWFjaCBzaXplIGNsYXNzIGlzIHNlZ3JlZ2F0ZWQgaW50byBpdHMgb3duIHNldCBvZiBy
dW5zLiAgRWFjaCBydW4KKyAqICAgICAgICAgICBtYWludGFpbnMgYSBiaXRtYXAgb2Ygd2hpY2gg
cmVnaW9ucyBhcmUgZnJlZS9hbGxvY2F0ZWQuCisgKgorICogICBMYXJnZSA6IEVhY2ggYWxsb2Nh
dGlvbiBpcyBiYWNrZWQgYnkgYSBkZWRpY2F0ZWQgcnVuLiAgTWV0YWRhdGEgYXJlIHN0b3JlZAor
ICogICAgICAgICAgIGluIHRoZSBhc3NvY2lhdGVkIGFyZW5hIGNodW5rIGhlYWRlciBtYXBzLgor
ICoKKyAqICAgSHVnZSA6IEVhY2ggYWxsb2NhdGlvbiBpcyBiYWNrZWQgYnkgYSBkZWRpY2F0ZWQg
Y29udGlndW91cyBzZXQgb2YgY2h1bmtzLgorICogICAgICAgICAgTWV0YWRhdGEgYXJlIHN0b3Jl
ZCBpbiBhIHNlcGFyYXRlIHJlZC1ibGFjayB0cmVlLgorICoKKyAqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqCisgKi8KKworLyoKKyAqIFNldCB0byBmYWxzZSBpZiBzaW5nbGUtdGhyZWFkZWQuICBFdmVu
IGJldHRlciwgcmlwIG91dCBhbGwgb2YgdGhlIGNvZGUgdGhhdAorICogZG9lc24ndCBnZXQgdXNl
ZCBpZiBfX2lzdGhyZWFkZWQgaXMgZmFsc2UsIHNvIHRoYXQgbGlicHRocmVhZCBpc24ndAorICog
bmVjZXNzYXJ5LgorICovCisgCisjZGVmaW5lIF9faXN0aHJlYWRlZCB0cnVlCisKKyNpZm5kZWYg
X19pc3RocmVhZGVkCisjICBkZWZpbmUgX19pc3RocmVhZGVkIHRydWUKKyNlbmRpZgorCisjZGVm
aW5lIE1BTExPQ19PUFRJT05TIFAKKworLyoKKyAqIE1BTExPQ19QUk9EVUNUSU9OIGRpc2FibGVz
IGFzc2VydGlvbnMgYW5kIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLiAgSXQgYWxzbworICogZGVmYXVs
dHMgdGhlIEEgYW5kIEogcnVudGltZSBvcHRpb25zIHRvIG9mZi4gIFRoZXNlIHNldHRpbmdzIGFy
ZSBhcHByb3ByaWF0ZQorICogZm9yIHByb2R1Y3Rpb24gc3lzdGVtcy4KKyAqLworLyogI2RlZmlu
ZQlNQUxMT0NfUFJPRFVDVElPTiAqLworCisjaWZuZGVmIE1BTExPQ19QUk9EVUNUSU9OCisgICAv
KgorICAgICogTUFMTE9DX0RFQlVHIGVuYWJsZXMgYXNzZXJ0aW9ucyBhbmQgb3RoZXIgc2FuaXR5
IGNoZWNrcywgYW5kIGRpc2FibGVzCisgICAgKiBpbmxpbmUgZnVuY3Rpb25zLgorICAgICovCisj
ICBkZWZpbmUgTUFMTE9DX0RFQlVHCisKKyAgIC8qIE1BTExPQ19TVEFUUyBlbmFibGVzIHN0YXRp
c3RpY3MgY2FsY3VsYXRpb24uICovCisjICBkZWZpbmUgTUFMTE9DX1NUQVRTCisjZW5kaWYKKwor
LyoKKyAqIE1BTExPQ19USU5ZIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGlueSBvYmplY3RzLCB3aGlj
aCBhcmUgc21hbGxlciB0aGFuIG9uZQorICogcXVhbnR1bS4KKyAqLworI2RlZmluZQlNQUxMT0Nf
VElOWQorCisvKgorICogTUFMTE9DX01BRyBlbmFibGVzIGEgbWFnYXppbmUtYmFzZWQgdGhyZWFk
LXNwZWNpZmljIGNhY2hpbmcgbGF5ZXIgZm9yIHNtYWxsCisgKiBvYmplY3RzLiAgVGhpcyBtYWtl
cyBpdCBwb3NzaWJsZSB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIG9iamVjdHMgd2l0aG91dCBhbnkK
KyAqIGxvY2tpbmcgd2hlbiB0aGUgY2FjaGUgaXMgaW4gdGhlIHN0ZWFkeSBzdGF0ZS4KKyAqCisg
KiBJZiBNQUxMT0NfTUFHIGlzIGVuYWJsZWQsIG1ha2Ugc3VyZSB0aGF0IF9tYWxsb2NfdGhyZWFk
X2NsZWFudXAoKSBpcyBjYWxsZWQKKyAqIGJ5IGVhY2ggdGhyZWFkIGp1c3QgYmVmb3JlIGl0IGV4
aXRzLgorICovCisvKiAjZGVmaW5lCU1BTExPQ19NQUcgKi8KKworLyoKKyAqIE1BTExPQ19CQUxB
TkNFIGVuYWJsZXMgbW9uaXRvcmluZyBvZiBhcmVuYSBsb2NrIGNvbnRlbnRpb24gYW5kIGR5bmFt
aWNhbGx5CisgKiByZS1iYWxhbmNlcyBhcmVuYSBsb2FkIGlmIGV4cG9uZW50aWFsbHkgYXZlcmFn
ZWQgY29udGVudGlvbiBleGNlZWRzIGEKKyAqIGNlcnRhaW4gdGhyZXNob2xkLgorICovCisjZGVm
aW5lCU1BTExPQ19CQUxBTkNFCisKKy8qCisgKiBNQUxMT0NfRFNTIGVuYWJsZXMgdXNlIG9mIHNi
cmsoMikgdG8gYWxsb2NhdGUgY2h1bmtzIGZyb20gdGhlIGRhdGEgc3RvcmFnZQorICogc2VnbWVu
dCAoRFNTKS4gIEluIGFuIGlkZWFsIHdvcmxkLCB0aGlzIGZ1bmN0aW9uYWxpdHkgd291bGQgYmUg
Y29tcGxldGVseQorICogdW5uZWNlc3NhcnksIGJ1dCB3ZSBhcmUgYnVyZGVuZWQgYnkgaGlzdG9y
eSBhbmQgdGhlIGxhY2sgb2YgcmVzb3VyY2UgbGltaXRzCisgKiBmb3IgYW5vbnltb3VzIG1hcHBl
ZCBtZW1vcnkuCisgKi8KKy8qICNkZWZpbmUJTUFMTE9DX0RTUyAqLworCisjZGVmaW5lCV9HTlVf
U09VUkNFIC8qIEZvciBtcmVtYXAoMikuICovCisjZGVmaW5lCWlzc2V0dWdpZCgpIDAKKyNkZWZp
bmUJX19ERUNPTlNUKHR5cGUsIHZhcikJKCh0eXBlKSh1aW50cHRyX3QpKGNvbnN0IHZvaWQgKiko
dmFyKSkKKworLyogX19GQlNESUQoIiRGcmVlQlNEOiBoZWFkL2xpYi9saWJjL3N0ZGxpYi9tYWxs
b2MuYyAxODIyMjUgMjAwOC0wOC0yNyAwMjowMDo1M1ogamFzb25lICQiKTsgKi8KKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFt
Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNs
dWRlIDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8ZXJy
bm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZm5kZWYgU0laRV9UX01BWAorIyAgZGVmaW5l
IFNJWkVfVF9NQVgJU0laRV9NQVgKKyNlbmRpZgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNs
dWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4K
KyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxp
Yi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRl
IDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKwor
I2luY2x1ZGUgInJiLmgiCisKKyNpZmRlZiBNQUxMT0NfREVCVUcKKyAgIC8qIERpc2FibGUgaW5s
aW5pbmcgdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLiAqLworIyAgZGVmaW5lIGlubGluZQorI2Vu
ZGlmCisKKy8qIFNpemUgb2Ygc3RhY2stYWxsb2NhdGVkIGJ1ZmZlciBwYXNzZWQgdG8gc3RyZXJy
b3JfcigpLiAqLworI2RlZmluZQlTVFJFUlJPUl9CVUYJCTY0CisKKy8qCisgKiBUaGUgY29uc3Rf
c2l6ZTJiaW4gdGFibGUgaXMgc2l6ZWQgYWNjb3JkaW5nIHRvIFBBR0VTSVpFXzJQT1csIGJ1dCBm
b3IKKyAqIGNvcnJlY3RuZXNzIHJlYXNvbnMsIHdlIG5ldmVyIGFzc3VtZSB0aGF0CisgKiAocGFn
ZXNpemUgPT0gKDFVIDw8ICogUEFHRVNJWkVfMlBPVykpLgorICoKKyAqIE1pbmltdW0gYWxpZ25t
ZW50IG9mIGFsbG9jYXRpb25zIGlzIDJeUVVBTlRVTV8yUE9XIGJ5dGVzLgorICovCisjaWZkZWYg
X19pMzg2X18KKyMgIGRlZmluZSBQQUdFU0laRV8yUE9XCQkxMgorIyAgZGVmaW5lIFFVQU5UVU1f
MlBPVwkJNAorIyAgZGVmaW5lIFNJWkVPRl9QVFJfMlBPVwkyCisjICBkZWZpbmUgQ1BVX1NQSU5X
QUlUCQlfX2FzbV9fIHZvbGF0aWxlKCJwYXVzZSIpCisjZW5kaWYKKyNpZmRlZiBfX2lhNjRfXwor
IyAgZGVmaW5lIFBBR0VTSVpFXzJQT1cJCTEyCisjICBkZWZpbmUgUVVBTlRVTV8yUE9XCQk0Cisj
ICBkZWZpbmUgU0laRU9GX1BUUl8yUE9XCTMKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworIyAg
ZGVmaW5lIFBBR0VTSVpFXzJQT1cJCTEzCisjICBkZWZpbmUgUVVBTlRVTV8yUE9XCQk0CisjICBk
ZWZpbmUgU0laRU9GX1BUUl8yUE9XCTMKKyMgIGRlZmluZSBOT19UTFMKKyNlbmRpZgorI2lmZGVm
IF9fc3BhcmM2NF9fCisjICBkZWZpbmUgUEFHRVNJWkVfMlBPVwkJMTMKKyMgIGRlZmluZSBRVUFO
VFVNXzJQT1cJCTQKKyMgIGRlZmluZSBTSVpFT0ZfUFRSXzJQT1cJMworIyAgZGVmaW5lIE5PX1RM
UworI2VuZGlmCisjaWZkZWYgX19hbWQ2NF9fCisjICBkZWZpbmUgUEFHRVNJWkVfMlBPVwkJMTIK
KyMgIGRlZmluZSBRVUFOVFVNXzJQT1cJCTQKKyMgIGRlZmluZSBTSVpFT0ZfUFRSXzJQT1cJMwor
IyAgZGVmaW5lIENQVV9TUElOV0FJVAkJX19hc21fXyB2b2xhdGlsZSgicGF1c2UiKQorI2VuZGlm
CisjaWZkZWYgX19hcm1fXworIyAgZGVmaW5lIFBBR0VTSVpFXzJQT1cJCTEyCisjICBkZWZpbmUg
UVVBTlRVTV8yUE9XCQkzCisjICBkZWZpbmUgU0laRU9GX1BUUl8yUE9XCTIKKyMgIGRlZmluZSBO
T19UTFMKKyNlbmRpZgorI2lmZGVmIF9fbWlwc19fCisjICBkZWZpbmUgUEFHRVNJWkVfMlBPVwkJ
MTIKKyMgIGRlZmluZSBRVUFOVFVNXzJQT1cJCTMKKyMgIGRlZmluZSBTSVpFT0ZfUFRSXzJQT1cJ
MgorIyAgZGVmaW5lIE5PX1RMUworI2VuZGlmCisjaWZkZWYgX19wb3dlcnBjX18KKyMgIGRlZmlu
ZSBQQUdFU0laRV8yUE9XCQkxMgorIyAgZGVmaW5lIFFVQU5UVU1fMlBPVwkJNAorIyAgZGVmaW5l
IFNJWkVPRl9QVFJfMlBPVwkyCisjZW5kaWYKKworI2RlZmluZQlRVUFOVFVNCQkJKChzaXplX3Qp
KDFVIDw8IFFVQU5UVU1fMlBPVykpCisjZGVmaW5lCVFVQU5UVU1fTUFTSwkJKFFVQU5UVU0gLSAx
KQorCisjZGVmaW5lCVNJWkVPRl9QVFIJCSgxVSA8PCBTSVpFT0ZfUFRSXzJQT1cpCisKKy8qIHNp
emVvZihpbnQpID09ICgxVSA8PCBTSVpFT0ZfSU5UXzJQT1cpLiAqLworI2lmbmRlZiBTSVpFT0Zf
SU5UXzJQT1cKKyMgIGRlZmluZSBTSVpFT0ZfSU5UXzJQT1cJMgorI2VuZGlmCisKKy8qIFdlIGNh
bid0IHVzZSBUTFMgaW4gbm9uLVBJQyBwcm9ncmFtcywgc2luY2UgVExTIHJlbGllcyBvbiBsb2Fk
ZXIgbWFnaWMuICovCisjaWYgKCFkZWZpbmVkKFBJQykgJiYgIWRlZmluZWQoTk9fVExTKSkKKyMg
IGRlZmluZSBOT19UTFMKKyNlbmRpZgorCisjaWZkZWYgTk9fVExTCisgICAvKiBNQUxMT0NfTUFH
IHJlcXVpcmVzIFRMUy4gKi8KKyMgIGlmZGVmIE1BTExPQ19NQUcKKyMgICAgdW5kZWYgTUFMTE9D
X01BRworIyAgZW5kaWYKKyAgIC8qIE1BTExPQ19CQUxBTkNFIHJlcXVpcmVzIFRMUy4gKi8KKyMg
IGlmZGVmIE1BTExPQ19CQUxBTkNFCisjICAgIHVuZGVmIE1BTExPQ19CQUxBTkNFCisjICBlbmRp
ZgorI2VuZGlmCisKKy8qCisgKiBTaXplIGFuZCBhbGlnbm1lbnQgb2YgbWVtb3J5IGNodW5rcyB0
aGF0IGFyZSBhbGxvY2F0ZWQgYnkgdGhlIE9TJ3MgdmlydHVhbAorICogbWVtb3J5IHN5c3RlbS4K
KyAqLworI2RlZmluZQlDSFVOS18yUE9XX0RFRkFVTFQJMjAKKworLyogTWF4aW11bSBudW1iZXIg
b2YgZGlydHkgcGFnZXMgcGVyIGFyZW5hLiAqLworI2RlZmluZQlESVJUWV9NQVhfREVGQVVMVAko
MVUgPDwgOSkKKworLyoKKyAqIE1heGltdW0gc2l6ZSBvZiBMMSBjYWNoZSBsaW5lLiAgVGhpcyBp
cyB1c2VkIHRvIGF2b2lkIGNhY2hlIGxpbmUgYWxpYXNpbmcuCisgKiBJbiBhZGRpdGlvbiwgdGhp
cyBjb250cm9scyB0aGUgc3BhY2luZyBvZiBjYWNoZWxpbmUtc3BhY2VkIHNpemUgY2xhc3Nlcy4K
KyAqLworI2RlZmluZQlDQUNIRUxJTkVfMlBPVwkJNgorI2RlZmluZQlDQUNIRUxJTkUJCSgoc2l6
ZV90KSgxVSA8PCBDQUNIRUxJTkVfMlBPVykpCisjZGVmaW5lCUNBQ0hFTElORV9NQVNLCQkoQ0FD
SEVMSU5FIC0gMSkKKworLyoKKyAqIFN1YnBhZ2VzIGFyZSBhbiBhcnRpZmljaWFsbHkgZGVzaWdu
YXRlZCBwYXJ0aXRpb25pbmcgb2YgcGFnZXMuICBUaGVpciBvbmx5CisgKiBwdXJwb3NlIGlzIHRv
IHN1cHBvcnQgc3VicGFnZS1zcGFjZWQgc2l6ZSBjbGFzc2VzLgorICoKKyAqIFRoZXJlIG11c3Qg
YmUgYXQgbGVhc3QgNCBzdWJwYWdlcyBwZXIgcGFnZSwgZHVlIHRvIHRoZSB3YXkgc2l6ZSBjbGFz
c2VzIGFyZQorICogaGFuZGxlZC4KKyAqLworI2RlZmluZQlTVUJQQUdFXzJQT1cJCTgKKyNkZWZp
bmUJU1VCUEFHRQkJCSgoc2l6ZV90KSgxVSA8PCBTVUJQQUdFXzJQT1cpKQorI2RlZmluZQlTVUJQ
QUdFX01BU0sJCShTVUJQQUdFIC0gMSkKKworI2lmZGVmIE1BTExPQ19USU5ZCisgICAvKiBTbWFs
bGVzdCBzaXplIGNsYXNzIHRvIHN1cHBvcnQuICovCisjICBkZWZpbmUgVElOWV9NSU5fMlBPVwkJ
MQorI2VuZGlmCisKKy8qCisgKiBNYXhpbXVtIHNpemUgY2xhc3MgdGhhdCBpcyBhIG11bHRpcGxl
IG9mIHRoZSBxdWFudHVtLCBidXQgbm90IChuZWNlc3NhcmlseSkKKyAqIGEgcG93ZXIgb2YgMi4g
IEFib3ZlIHRoaXMgc2l6ZSwgYWxsb2NhdGlvbnMgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJl
c3QKKyAqIHBvd2VyIG9mIDIuCisgKi8KKyNkZWZpbmUJUVNQQUNFX01BWF8yUE9XX0RFRkFVTFQJ
NworCisvKgorICogTWF4aW11bSBzaXplIGNsYXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUg
Y2FjaGVsaW5lLCBidXQgbm90IChuZWNlc3NhcmlseSkKKyAqIGEgcG93ZXIgb2YgMi4gIEFib3Zl
IHRoaXMgc2l6ZSwgYWxsb2NhdGlvbnMgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QKKyAq
IHBvd2VyIG9mIDIuCisgKi8KKyNkZWZpbmUJQ1NQQUNFX01BWF8yUE9XX0RFRkFVTFQJOQorCisv
KgorICogUlVOX01BWF9PVlJIRCBpbmRpY2F0ZXMgbWF4aW11bSBkZXNpcmVkIHJ1biBoZWFkZXIg
b3ZlcmhlYWQuICBSdW5zIGFyZSBzaXplZAorICogYXMgc21hbGwgYXMgcG9zc2libGUgc3VjaCB0
aGF0IHRoaXMgc2V0dGluZyBpcyBzdGlsbCBob25vcmVkLCB3aXRob3V0CisgKiB2aW9sYXRpbmcg
b3RoZXIgY29uc3RyYWludHMuICBUaGUgZ29hbCBpcyB0byBtYWtlIHJ1bnMgYXMgc21hbGwgYXMg
cG9zc2libGUKKyAqIHdpdGhvdXQgZXhjZWVkaW5nIGEgcGVyIHJ1biBleHRlcm5hbCBmcmFnbWVu
dGF0aW9uIHRocmVzaG9sZC4KKyAqCisgKiBXZSB1c2UgYmluYXJ5IGZpeGVkIHBvaW50IG1hdGgg
Zm9yIG92ZXJoZWFkIGNvbXB1dGF0aW9ucywgd2hlcmUgdGhlIGJpbmFyeQorICogcG9pbnQgaXMg
aW1wbGljaXRseSBSVU5fQkZQIGJpdHMgdG8gdGhlIGxlZnQuCisgKgorICogTm90ZSB0aGF0IGl0
IGlzIHBvc3NpYmxlIHRvIHNldCBSVU5fTUFYX09WUkhEIGxvdyBlbm91Z2ggdGhhdCBpdCBjYW5u
b3QgYmUKKyAqIGhvbm9yZWQgZm9yIHNvbWUvYWxsIG9iamVjdCBzaXplcywgc2luY2UgdGhlcmUg
aXMgb25lIGJpdCBvZiBoZWFkZXIgb3ZlcmhlYWQKKyAqIHBlciBvYmplY3QgKHBsdXMgYSBjb25z
dGFudCkuICBUaGlzIGNvbnN0cmFpbnQgaXMgcmVsYXhlZCAoaWdub3JlZCkgZm9yIHJ1bnMKKyAq
IHRoYXQgYXJlIHNvIHNtYWxsIHRoYXQgdGhlIHBlci1yZWdpb24gb3ZlcmhlYWQgaXMgZ3JlYXRl
ciB0aGFuOgorICoKKyAqICAgKFJVTl9NQVhfT1ZSSEQgLyAocmVnX3NpemUgPDwgKDMrUlVOX0JG
UCkpCisgKi8KKyNkZWZpbmUJUlVOX0JGUAkJCTEyCisvKiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwvICAgSW1wbGljaXQgYmluYXJ5IGZpeGVkIHBvaW50LiAqLworI2RlZmlu
ZQlSVU5fTUFYX09WUkhECQkweDAwMDAwMDNkVQorI2RlZmluZQlSVU5fTUFYX09WUkhEX1JFTEFY
CTB4MDAwMDE4MDBVCisKKy8qIFB1dCBhIGNhcCBvbiBzbWFsbCBvYmplY3QgcnVuIHNpemUuICBU
aGlzIG92ZXJyaWRlcyBSVU5fTUFYX09WUkhELiAqLworI2RlZmluZQlSVU5fTUFYX1NNQUxMCSgx
MiAqIHBhZ2VzaXplKQorCisvKgorICogSHlwZXItdGhyZWFkZWQgQ1BVcyBtYXkgbmVlZCBhIHNw
ZWNpYWwgaW5zdHJ1Y3Rpb24gaW5zaWRlIHNwaW4gbG9vcHMgaW4KKyAqIG9yZGVyIHRvIHlpZWxk
IHRvIGFub3RoZXIgdmlydHVhbCBDUFUuICBJZiBubyBzdWNoIGluc3RydWN0aW9uIGlzIGRlZmlu
ZWQKKyAqIGFib3ZlLCBtYWtlIENQVV9TUElOV0FJVCBhIG5vLW9wLgorICovCisjaWZuZGVmIENQ
VV9TUElOV0FJVAorIyAgZGVmaW5lIENQVV9TUElOV0FJVAorI2VuZGlmCisKKy8qCisgKiBBZGFw
dGl2ZSBzcGlubmluZyBtdXN0IGV2ZW50dWFsbHkgc3dpdGNoIHRvIGJsb2NraW5nLCBpbiBvcmRl
ciB0byBhdm9pZCB0aGUKKyAqIHBvdGVudGlhbCBmb3IgcHJpb3JpdHkgaW52ZXJzaW9uIGRlYWRs
b2NrLiAgQmFja2luZyBvZmYgcGFzdCBhIGNlcnRhaW4gcG9pbnQKKyAqIGNhbiBhY3R1YWxseSB3
YXN0ZSB0aW1lLgorICovCisjZGVmaW5lCVNQSU5fTElNSVRfMlBPVwkJMTEKKworLyoKKyAqIENv
bnZlcnNpb24gZnJvbSBzcGlubmluZyB0byBibG9ja2luZyBpcyBleHBlbnNpdmU7IHdlIHVzZSAo
MVUgPDwKKyAqIEJMT0NLX0NPU1RfMlBPVykgdG8gZXN0aW1hdGUgaG93IG1hbnkgbW9yZSB0aW1l
cyBjb3N0bHkgYmxvY2tpbmcgaXMgdGhhbgorICogd29yc3QtY2FzZSBzcGlubmluZy4KKyAqLwor
I2RlZmluZQlCTE9DS19DT1NUXzJQT1cJCTQKKworI2lmZGVmIE1BTExPQ19NQUcKKyAgIC8qCisg
ICAgKiBEZWZhdWx0IG1hZ2F6aW5lIHNpemUsIGluIGJ5dGVzLiAgbWF4X3JvdW5kcyBpcyBjYWxj
dWxhdGVkIHRvIG1ha2UKKyAgICAqIG9wdGltYWwgdXNlIG9mIHRoZSBzcGFjZSwgbGVhdmluZyBq
dXN0IGVub3VnaCByb29tIGZvciB0aGUgbWFnYXppbmUKKyAgICAqIGhlYWRlci4KKyAgICAqLwor
IyAgZGVmaW5lIE1BR19TSVpFXzJQT1dfREVGQVVMVAk5CisjZW5kaWYKKworI2lmZGVmIE1BTExP
Q19CQUxBTkNFCisgICAvKgorICAgICogV2UgdXNlIGFuIGV4cG9uZW50aWFsIG1vdmluZyBhdmVy
YWdlIHRvIHRyYWNrIHJlY2VudCBsb2NrIGNvbnRlbnRpb24sCisgICAgKiB3aGVyZSB0aGUgc2l6
ZSBvZiB0aGUgaGlzdG9yeSB3aW5kb3cgaXMgTiwgYW5kIGFscGhhPTIvKE4rMSkuCisgICAgKgor
ICAgICogRHVlIHRvIGludGVnZXIgbWF0aCByb3VuZGluZywgdmVyeSBzbWFsbCB2YWx1ZXMgaGVy
ZSBjYW4gY2F1c2UKKyAgICAqIHN1YnN0YW50aWFsIGRlZ3JhZGF0aW9uIGluIGFjY3VyYWN5LCB0
aHVzIG1ha2luZyB0aGUgbW92aW5nIGF2ZXJhZ2UgZGVjYXkKKyAgICAqIGZhc3RlciB0aGFuIGl0
IHdvdWxkIHdpdGggcHJlY2lzZSBjYWxjdWxhdGlvbi4KKyAgICAqLworIyAgZGVmaW5lIEJBTEFO
Q0VfQUxQSEFfSU5WXzJQT1cJOQorCisgICAvKgorICAgICogVGhyZXNob2xkIHZhbHVlIGZvciB0
aGUgZXhwb25lbnRpYWwgbW92aW5nIGNvbnRlbnRpb24gYXZlcmFnZSBhdCB3aGljaCB0bworICAg
ICogcmUtYXNzaWduIGEgdGhyZWFkLgorICAgICovCisjICBkZWZpbmUgQkFMQU5DRV9USFJFU0hP
TERfREVGQVVMVAkoMVUgPDwgKFNQSU5fTElNSVRfMlBPVy00KSkKKyNlbmRpZgorCisvKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqLworCit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBtYWxsb2NfbXV0ZXhf
dDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IG1hbGxvY19zcGlubG9ja190OworCisvKiBTZXQg
dG8gdHJ1ZSBvbmNlIHRoZSBhbGxvY2F0b3IgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovCitzdGF0
aWMgYm9vbCBtYWxsb2NfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworLyogVXNlZCB0byBhdm9pZCBp
bml0aWFsaXphdGlvbiByYWNlcy4gKi8KK3N0YXRpYyBtYWxsb2NfbXV0ZXhfdCBpbml0X2xvY2sg
PSBQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QOworCisvKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqLworLyoKKyAqIFN0YXRpc3RpY3MgZGF0YSBzdHJ1Y3R1cmVzLgorICovCisKKyNp
ZmRlZiBNQUxMT0NfU1RBVFMKKwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2Jpbl9zdGF0c19zIG1h
bGxvY19iaW5fc3RhdHNfdDsKK3N0cnVjdCBtYWxsb2NfYmluX3N0YXRzX3MgeworCS8qCisJICog
TnVtYmVyIG9mIGFsbG9jYXRpb24gcmVxdWVzdHMgdGhhdCBjb3JyZXNwb25kZWQgdG8gdGhlIHNp
emUgb2YgdGhpcworCSAqIGJpbi4KKwkgKi8KKwl1aW50NjRfdAlucmVxdWVzdHM7CisKKyNpZmRl
ZiBNQUxMT0NfTUFHCisJLyogTnVtYmVyIG9mIG1hZ2F6aW5lIHJlbG9hZHMgZnJvbSB0aGlzIGJp
bi4gKi8KKwl1aW50NjRfdAlubWFnczsKKyNlbmRpZgorCisJLyogVG90YWwgbnVtYmVyIG9mIHJ1
bnMgY3JlYXRlZCBmb3IgdGhpcyBiaW4ncyBzaXplIGNsYXNzLiAqLworCXVpbnQ2NF90CW5ydW5z
OworCisJLyoKKwkgKiBUb3RhbCBudW1iZXIgb2YgcnVucyByZXVzZWQgYnkgZXh0cmFjdGluZyB0
aGVtIGZyb20gdGhlIHJ1bnMgdHJlZSBmb3IKKwkgKiB0aGlzIGJpbidzIHNpemUgY2xhc3MuCisJ
ICovCisJdWludDY0X3QJcmVydW5zOworCisJLyogSGlnaC13YXRlciBtYXJrIGZvciB0aGlzIGJp
bi4gKi8KKwl1bnNpZ25lZCBsb25nCWhpZ2hydW5zOworCisJLyogQ3VycmVudCBudW1iZXIgb2Yg
cnVucyBpbiB0aGlzIGJpbi4gKi8KKwl1bnNpZ25lZCBsb25nCWN1cnJ1bnM7Cit9OworCit0eXBl
ZGVmIHN0cnVjdCBhcmVuYV9zdGF0c19zIGFyZW5hX3N0YXRzX3Q7CitzdHJ1Y3QgYXJlbmFfc3Rh
dHNfcyB7CisJLyogTnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBtYXBwZWQuICovCisJc2l6ZV90
CQltYXBwZWQ7CisKKwkvKgorCSAqIFRvdGFsIG51bWJlciBvZiBwdXJnZSBzd2VlcHMsIHRvdGFs
IG51bWJlciBvZiBtYWR2aXNlIGNhbGxzIG1hZGUsCisJICogYW5kIHRvdGFsIHBhZ2VzIHB1cmdl
ZCBpbiBvcmRlciB0byBrZWVwIGRpcnR5IHVudXNlZCBtZW1vcnkgdW5kZXIKKwkgKiBjb250cm9s
LgorCSAqLworCXVpbnQ2NF90CW5wdXJnZTsKKwl1aW50NjRfdAlubWFkdmlzZTsKKwl1aW50NjRf
dAlwdXJnZWQ7CisKKwkvKiBQZXItc2l6ZS1jYXRlZ29yeSBzdGF0aXN0aWNzLiAqLworCXNpemVf
dAkJYWxsb2NhdGVkX3NtYWxsOworCXVpbnQ2NF90CW5tYWxsb2Nfc21hbGw7CisJdWludDY0X3QJ
bmRhbGxvY19zbWFsbDsKKworCXNpemVfdAkJYWxsb2NhdGVkX2xhcmdlOworCXVpbnQ2NF90CW5t
YWxsb2NfbGFyZ2U7CisJdWludDY0X3QJbmRhbGxvY19sYXJnZTsKKworI2lmZGVmIE1BTExPQ19C
QUxBTkNFCisJLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgYXJlbmEgcmVhc3NpZ25lZCBhIHRocmVh
ZCBkdWUgdG8gY29udGVudGlvbi4gKi8KKwl1aW50NjRfdAluYmFsYW5jZTsKKyNlbmRpZgorfTsK
KwordHlwZWRlZiBzdHJ1Y3QgY2h1bmtfc3RhdHNfcyBjaHVua19zdGF0c190Oworc3RydWN0IGNo
dW5rX3N0YXRzX3MgeworCS8qIE51bWJlciBvZiBjaHVua3MgdGhhdCB3ZXJlIGFsbG9jYXRlZC4g
Ki8KKwl1aW50NjRfdAluY2h1bmtzOworCisJLyogSGlnaC13YXRlciBtYXJrIGZvciBudW1iZXIg
b2YgY2h1bmtzIGFsbG9jYXRlZC4gKi8KKwl1bnNpZ25lZCBsb25nCWhpZ2hjaHVua3M7CisKKwkv
KgorCSAqIEN1cnJlbnQgbnVtYmVyIG9mIGNodW5rcyBhbGxvY2F0ZWQuICBUaGlzIHZhbHVlIGlz
bid0IG1haW50YWluZWQgZm9yCisJICogYW55IG90aGVyIHB1cnBvc2UsIHNvIGtlZXAgdHJhY2sg
b2YgaXQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZXQKKwkgKiBoaWdoY2h1bmtzLgorCSAqLwor
CXVuc2lnbmVkIGxvbmcJY3VyY2h1bmtzOworfTsKKworI2VuZGlmIC8qICNpZmRlZiBNQUxMT0Nf
U1RBVFMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBFeHRlbnQgZGF0YSBz
dHJ1Y3R1cmVzLgorICovCisKKy8qIFRyZWUgb2YgZXh0ZW50cy4gKi8KK3R5cGVkZWYgc3RydWN0
IGV4dGVudF9ub2RlX3MgZXh0ZW50X25vZGVfdDsKK3N0cnVjdCBleHRlbnRfbm9kZV9zIHsKKyNp
ZmRlZiBNQUxMT0NfRFNTCisJLyogTGlua2FnZSBmb3IgdGhlIHNpemUvYWRkcmVzcy1vcmRlcmVk
IHRyZWUuICovCisJcmJfbm9kZShleHRlbnRfbm9kZV90KSBsaW5rX3N6YWQ7CisjZW5kaWYKKwor
CS8qIExpbmthZ2UgZm9yIHRoZSBhZGRyZXNzLW9yZGVyZWQgdHJlZS4gKi8KKwlyYl9ub2RlKGV4
dGVudF9ub2RlX3QpIGxpbmtfYWQ7CisKKwkvKiBQb2ludGVyIHRvIHRoZSBleHRlbnQgdGhhdCB0
aGlzIHRyZWUgbm9kZSBpcyByZXNwb25zaWJsZSBmb3IuICovCisJdm9pZAkqYWRkcjsKKworCS8q
IFRvdGFsIHJlZ2lvbiBzaXplLiAqLworCXNpemVfdAlzaXplOworfTsKK3R5cGVkZWYgcmJfdHJl
ZShleHRlbnRfbm9kZV90KSBleHRlbnRfdHJlZV90OworCisvKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LworLyoKKyAqIEFyZW5hIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBh
cmVuYV9zIGFyZW5hX3Q7Cit0eXBlZGVmIHN0cnVjdCBhcmVuYV9iaW5fcyBhcmVuYV9iaW5fdDsK
KworLyogRWFjaCBlbGVtZW50IG9mIHRoZSBjaHVuayBtYXAgY29ycmVzcG9uZHMgdG8gb25lIHBh
Z2Ugd2l0aGluIHRoZSBjaHVuay4gKi8KK3R5cGVkZWYgc3RydWN0IGFyZW5hX2NodW5rX21hcF9z
IGFyZW5hX2NodW5rX21hcF90Oworc3RydWN0IGFyZW5hX2NodW5rX21hcF9zIHsKKwkvKgorCSAq
IExpbmthZ2UgZm9yIHJ1biB0cmVlcy4gIFRoZXJlIGFyZSB0d28gZGlzam9pbnQgdXNlczoKKwkg
KgorCSAqIDEpIGFyZW5hX3QncyBydW5zX2F2YWlsIHRyZWUuCisJICogMikgYXJlbmFfcnVuX3Qg
Y29uY2VwdHVhbGx5IHVzZXMgdGhpcyBsaW5rYWdlIGZvciBpbi11c2Ugbm9uLWZ1bGwKKwkgKiAg
ICBydW5zLCByYXRoZXIgdGhhbiBkaXJlY3RseSBlbWJlZGRpbmcgbGlua2FnZS4KKwkgKi8KKwly
Yl9ub2RlKGFyZW5hX2NodW5rX21hcF90KQlsaW5rOworCisJLyoKKwkgKiBSdW4gYWRkcmVzcyAo
b3Igc2l6ZSkgYW5kIHZhcmlvdXMgZmxhZ3MgYXJlIHN0b3JlZCB0b2dldGhlci4gIFRoZSBiaXQK
KwkgKiBsYXlvdXQgbG9va3MgbGlrZSAoYXNzdW1pbmcgMzItYml0IHN5c3RlbSk6CisJICoKKwkg
KiAgID8/Pz8/Pz8/ID8/Pz8/Pz8/ID8/Pz8tLS0tIC0tLWtkemxhCisJICoKKwkgKiA/IDogVW5h
bGxvY2F0ZWQ6IFJ1biBhZGRyZXNzIGZvciBmaXJzdC9sYXN0IHBhZ2VzLCB1bnNldCBmb3IgaW50
ZXJuYWwKKwkgKiAgICAgICAgICAgICAgICAgIHBhZ2VzLgorCSAqICAgICBTbWFsbDogUnVuIGFk
ZHJlc3MuCisJICogICAgIExhcmdlOiBSdW4gc2l6ZSBmb3IgZmlyc3QgcGFnZSwgdW5zZXQgZm9y
IHRyYWlsaW5nIHBhZ2VzLgorCSAqIC0gOiBVbnVzZWQuCisJICogayA6IGtleT8KKwkgKiBkIDog
ZGlydHk/CisJICogeiA6IHplcm9lZD8KKwkgKiBsIDogbGFyZ2U/CisJICogYSA6IGFsbG9jYXRl
ZD8KKwkgKgorCSAqIEZvbGxvd2luZyBhcmUgZXhhbXBsZSBiaXQgcGF0dGVybnMgZm9yIHRoZSB0
aHJlZSB0eXBlcyBvZiBydW5zLgorCSAqCisJICogciA6IHJ1biBhZGRyZXNzCisJICogcyA6IHJ1
biBzaXplCisJICogeCA6IGRvbid0IGNhcmUKKwkgKiAtIDogMAorCSAqIFtkemxhXSA6IGJpdCBz
ZXQKKwkgKgorCSAqICAgVW5hbGxvY2F0ZWQ6CisJICogICAgIHNzc3Nzc3NzIHNzc3Nzc3NzIHNz
c3MtLS0tIC0tLS0tLS0tCisJICogICAgIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHgtLS0tIC0tLS1k
LS0tCisJICogICAgIHNzc3Nzc3NzIHNzc3Nzc3NzIHNzc3MtLS0tIC0tLS0tei0tCisJICoKKwkg
KiAgIFNtYWxsOgorCSAqICAgICBycnJycnJyciBycnJycnJyciBycnJyLS0tLSAtLS0tLS0tYQor
CSAqICAgICBycnJycnJyciBycnJycnJyciBycnJyLS0tLSAtLS0tLS0tYQorCSAqICAgICBycnJy
cnJyciBycnJycnJyciBycnJyLS0tLSAtLS0tLS0tYQorCSAqCisJICogICBMYXJnZToKKwkgKiAg
ICAgc3Nzc3Nzc3Mgc3Nzc3Nzc3Mgc3Nzcy0tLS0gLS0tLS0tbGEKKwkgKiAgICAgLS0tLS0tLS0g
LS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tbGEKKwkgKiAgICAgLS0tLS0tLS0gLS0tLS0tLS0gLS0t
LS0tLS0gLS0tLS0tbGEKKwkgKi8KKwlzaXplX3QJCQkJYml0czsKKyNkZWZpbmUJQ0hVTktfTUFQ
X0tFWQkJKChzaXplX3QpMHgxMFUpCisjZGVmaW5lCUNIVU5LX01BUF9ESVJUWQkJKChzaXplX3Qp
MHgwOFUpCisjZGVmaW5lCUNIVU5LX01BUF9aRVJPRUQJKChzaXplX3QpMHgwNFUpCisjZGVmaW5l
CUNIVU5LX01BUF9MQVJHRQkJKChzaXplX3QpMHgwMlUpCisjZGVmaW5lCUNIVU5LX01BUF9BTExP
Q0FURUQJKChzaXplX3QpMHgwMVUpCit9OwordHlwZWRlZiByYl90cmVlKGFyZW5hX2NodW5rX21h
cF90KSBhcmVuYV9hdmFpbF90cmVlX3Q7Cit0eXBlZGVmIHJiX3RyZWUoYXJlbmFfY2h1bmtfbWFw
X3QpIGFyZW5hX3J1bl90cmVlX3Q7CisKKy8qIEFyZW5hIGNodW5rIGhlYWRlci4gKi8KK3R5cGVk
ZWYgc3RydWN0IGFyZW5hX2NodW5rX3MgYXJlbmFfY2h1bmtfdDsKK3N0cnVjdCBhcmVuYV9jaHVu
a19zIHsKKwkvKiBBcmVuYSB0aGF0IG93bnMgdGhlIGNodW5rLiAqLworCWFyZW5hX3QJCSphcmVu
YTsKKworCS8qIExpbmthZ2UgZm9yIHRoZSBhcmVuYSdzIGNodW5rc19kaXJ0eSB0cmVlLiAqLwor
CXJiX25vZGUoYXJlbmFfY2h1bmtfdCkgbGlua19kaXJ0eTsKKworCS8qIE51bWJlciBvZiBkaXJ0
eSBwYWdlcy4gKi8KKwlzaXplX3QJCW5kaXJ0eTsKKworCS8qIE1hcCBvZiBwYWdlcyB3aXRoaW4g
Y2h1bmsgdGhhdCBrZWVwcyB0cmFjayBvZiBmcmVlL2xhcmdlL3NtYWxsLiAqLworCWFyZW5hX2No
dW5rX21hcF90IG1hcFsxXTsgLyogRHluYW1pY2FsbHkgc2l6ZWQuICovCit9OwordHlwZWRlZiBy
Yl90cmVlKGFyZW5hX2NodW5rX3QpIGFyZW5hX2NodW5rX3RyZWVfdDsKKwordHlwZWRlZiBzdHJ1
Y3QgYXJlbmFfcnVuX3MgYXJlbmFfcnVuX3Q7CitzdHJ1Y3QgYXJlbmFfcnVuX3MgeworI2lmZGVm
IE1BTExPQ19ERUJVRworCXVpbnQzMl90CW1hZ2ljOworIyAgZGVmaW5lIEFSRU5BX1JVTl9NQUdJ
QyAweDM4NGFkZjkzCisjZW5kaWYKKworCS8qIEJpbiB0aGlzIHJ1biBpcyBhc3NvY2lhdGVkIHdp
dGguICovCisJYXJlbmFfYmluX3QJKmJpbjsKKworCS8qIEluZGV4IG9mIGZpcnN0IGVsZW1lbnQg
dGhhdCBtaWdodCBoYXZlIGEgZnJlZSByZWdpb24uICovCisJdW5zaWduZWQJcmVnc19taW5lbG07
CisKKwkvKiBOdW1iZXIgb2YgZnJlZSByZWdpb25zIGluIHJ1bi4gKi8KKwl1bnNpZ25lZAluZnJl
ZTsKKworCS8qIEJpdG1hc2sgb2YgaW4tdXNlIHJlZ2lvbnMgKDA6IGluIHVzZSwgMTogZnJlZSku
ICovCisJdW5zaWduZWQJcmVnc19tYXNrWzFdOyAvKiBEeW5hbWljYWxseSBzaXplZC4gKi8KK307
CisKK3N0cnVjdCBhcmVuYV9iaW5fcyB7CisJLyoKKwkgKiBDdXJyZW50IHJ1biBiZWluZyB1c2Vk
IHRvIHNlcnZpY2UgYWxsb2NhdGlvbnMgb2YgdGhpcyBiaW4ncyBzaXplCisJICogY2xhc3MuCisJ
ICovCisJYXJlbmFfcnVuX3QJKnJ1bmN1cjsKKworCS8qCisJICogVHJlZSBvZiBub24tZnVsbCBy
dW5zLiAgVGhpcyB0cmVlIGlzIHVzZWQgd2hlbiBsb29raW5nIGZvciBhbgorCSAqIGV4aXN0aW5n
IHJ1biB3aGVuIHJ1bmN1ciBpcyBubyBsb25nZXIgdXNhYmxlLiAgV2UgY2hvb3NlIHRoZQorCSAq
IG5vbi1mdWxsIHJ1biB0aGF0IGlzIGxvd2VzdCBpbiBtZW1vcnk7IHRoaXMgcG9saWN5IHRlbmRz
IHRvIGtlZXAKKwkgKiBvYmplY3RzIHBhY2tlZCB3ZWxsLCBhbmQgaXQgY2FuIGFsc28gaGVscCBy
ZWR1Y2UgdGhlIG51bWJlciBvZgorCSAqIGFsbW9zdC1lbXB0eSBjaHVua3MuCisJICovCisJYXJl
bmFfcnVuX3RyZWVfdCBydW5zOworCisJLyogU2l6ZSBvZiByZWdpb25zIGluIGEgcnVuIGZvciB0
aGlzIGJpbidzIHNpemUgY2xhc3MuICovCisJc2l6ZV90CQlyZWdfc2l6ZTsKKworCS8qIFRvdGFs
IHNpemUgb2YgYSBydW4gZm9yIHRoaXMgYmluJ3Mgc2l6ZSBjbGFzcy4gKi8KKwlzaXplX3QJCXJ1
bl9zaXplOworCisJLyogVG90YWwgbnVtYmVyIG9mIHJlZ2lvbnMgaW4gYSBydW4gZm9yIHRoaXMg
YmluJ3Mgc2l6ZSBjbGFzcy4gKi8KKwl1aW50MzJfdAlucmVnczsKKworCS8qIE51bWJlciBvZiBl
bGVtZW50cyBpbiBhIHJ1bidzIHJlZ3NfbWFzayBmb3IgdGhpcyBiaW4ncyBzaXplIGNsYXNzLiAq
LworCXVpbnQzMl90CXJlZ3NfbWFza19uZWxtczsKKworCS8qIE9mZnNldCBvZiBmaXJzdCByZWdp
b24gaW4gYSBydW4gZm9yIHRoaXMgYmluJ3Mgc2l6ZSBjbGFzcy4gKi8KKwl1aW50MzJfdAlyZWcw
X29mZnNldDsKKworI2lmZGVmIE1BTExPQ19TVEFUUworCS8qIEJpbiBzdGF0aXN0aWNzLiAqLwor
CW1hbGxvY19iaW5fc3RhdHNfdCBzdGF0czsKKyNlbmRpZgorfTsKKworc3RydWN0IGFyZW5hX3Mg
eworI2lmZGVmIE1BTExPQ19ERUJVRworCXVpbnQzMl90CQltYWdpYzsKKyMgIGRlZmluZSBBUkVO
QV9NQUdJQyAweDk0N2QzZDI0CisjZW5kaWYKKworCS8qIEFsbCBvcGVyYXRpb25zIG9uIHRoaXMg
YXJlbmEgcmVxdWlyZSB0aGF0IGxvY2sgYmUgbG9ja2VkLiAqLworCXB0aHJlYWRfbXV0ZXhfdAkJ
bG9jazsKKworI2lmZGVmIE1BTExPQ19TVEFUUworCWFyZW5hX3N0YXRzX3QJCXN0YXRzOworI2Vu
ZGlmCisKKwkvKiBUcmVlIG9mIGRpcnR5LXBhZ2UtY29udGFpbmluZyBjaHVua3MgdGhpcyBhcmVu
YSBtYW5hZ2VzLiAqLworCWFyZW5hX2NodW5rX3RyZWVfdAljaHVua3NfZGlydHk7CisKKwkvKgor
CSAqIEluIG9yZGVyIHRvIGF2b2lkIHJhcGlkIGNodW5rIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9u
IHdoZW4gYW4gYXJlbmEKKwkgKiBvc2NpbGxhdGVzIHJpZ2h0IG9uIHRoZSBjdXNwIG9mIG5lZWRp
bmcgYSBuZXcgY2h1bmssIGNhY2hlIHRoZSBtb3N0CisJICogcmVjZW50bHkgZnJlZWQgY2h1bmsu
ICBUaGUgc3BhcmUgaXMgbGVmdCBpbiB0aGUgYXJlbmEncyBjaHVuayB0cmVlcworCSAqIHVudGls
IGl0IGlzIGRlbGV0ZWQuCisJICoKKwkgKiBUaGVyZSBpcyBvbmUgc3BhcmUgY2h1bmsgcGVyIGFy
ZW5hLCByYXRoZXIgdGhhbiBvbmUgc3BhcmUgdG90YWwsIGluCisJICogb3JkZXIgdG8gYXZvaWQg
aW50ZXJhY3Rpb25zIGJldHdlZW4gbXVsdGlwbGUgdGhyZWFkcyB0aGF0IGNvdWxkIG1ha2UKKwkg
KiBhIHNpbmdsZSBzcGFyZSBpbmFkZXF1YXRlLgorCSAqLworCWFyZW5hX2NodW5rX3QJCSpzcGFy
ZTsKKworCS8qCisJICogQ3VycmVudCBjb3VudCBvZiBwYWdlcyB3aXRoaW4gdW51c2VkIHJ1bnMg
dGhhdCBhcmUgcG90ZW50aWFsbHkKKwkgKiBkaXJ0eSwgYW5kIGZvciB3aGljaCBtYWR2aXNlKC4u
LiBNQURWX0RPTlRORUVEKSBoYXMgbm90IGJlZW4gY2FsbGVkLgorCSAqIEJ5IHRyYWNraW5nIHRo
aXMsIHdlIGNhbiBpbnN0aXR1dGUgYSBsaW1pdCBvbiBob3cgbXVjaCBkaXJ0eSB1bnVzZWQKKwkg
KiBtZW1vcnkgaXMgbWFwcGVkIGZvciBlYWNoIGFyZW5hLgorCSAqLworCXNpemVfdAkJCW5kaXJ0
eTsKKworCS8qCisJICogU2l6ZS9hZGRyZXNzLW9yZGVyZWQgdHJlZSBvZiB0aGlzIGFyZW5hJ3Mg
YXZhaWxhYmxlIHJ1bnMuICBUaGlzIHRyZWUKKwkgKiBpcyB1c2VkIGZvciBmaXJzdC1iZXN0LWZp
dCBydW4gYWxsb2NhdGlvbi4KKwkgKi8KKwlhcmVuYV9hdmFpbF90cmVlX3QJcnVuc19hdmFpbDsK
KworI2lmZGVmIE1BTExPQ19CQUxBTkNFCisJLyoKKwkgKiBUaGUgYXJlbmEgbG9hZCBiYWxhbmNp
bmcgbWFjaGluZXJ5IG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgaG93IG11Y2gKKwkgKiBsb2NrIGNv
bnRlbnRpb24gdGhlcmUgaXMuICBUaGlzIHZhbHVlIGlzIGV4cG9uZW50aWFsbHkgYXZlcmFnZWQu
CisJICovCisJdWludDMyX3QJCWNvbnRlbnRpb247CisjZW5kaWYKKworCS8qCisJICogYmlucyBp
cyB1c2VkIHRvIHN0b3JlIHJpbmdzIG9mIGZyZWUgcmVnaW9ucyBvZiB0aGUgZm9sbG93aW5nIHNp
emVzLAorCSAqIGFzc3VtaW5nIGEgMTYtYnl0ZSBxdWFudHVtLCA0a0IgcGFnZXNpemUsIGFuZCBk
ZWZhdWx0IE1BTExPQ19PUFRJT05TLgorCSAqCisJICogICBiaW5zW2ldIHwgc2l6ZSB8CisJICog
ICAtLS0tLS0tLSstLS0tLS0rCisJICogICAgICAgIDAgIHwgICAgMiB8CisJICogICAgICAgIDEg
IHwgICAgNCB8CisJICogICAgICAgIDIgIHwgICAgOCB8CisJICogICAtLS0tLS0tLSstLS0tLS0r
CisJICogICAgICAgIDMgIHwgICAxNiB8CisJICogICAgICAgIDQgIHwgICAzMiB8CisJICogICAg
ICAgIDUgIHwgICA0OCB8CisJICogICAgICAgIDYgIHwgICA2NCB8CisJICogICAgICAgICAgIDog
ICAgICA6CisJICogICAgICAgICAgIDogICAgICA6CisJICogICAgICAgMzMgIHwgIDQ5NiB8CisJ
ICogICAgICAgMzQgIHwgIDUxMiB8CisJICogICAtLS0tLS0tLSstLS0tLS0rCisJICogICAgICAg
MzUgIHwgMTAyNCB8CisJICogICAgICAgMzYgIHwgMjA0OCB8CisJICogICAtLS0tLS0tLSstLS0t
LS0rCisJICovCisJYXJlbmFfYmluX3QJCWJpbnNbMV07IC8qIER5bmFtaWNhbGx5IHNpemVkLiAq
LworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNYWdhemluZSBkYXRhIHN0
cnVjdHVyZXMuCisgKi8KKworI2lmZGVmIE1BTExPQ19NQUcKK3R5cGVkZWYgc3RydWN0IG1hZ19z
IG1hZ190Oworc3RydWN0IG1hZ19zIHsKKwlzaXplX3QJCWJpbmluZDsgLyogSW5kZXggb2YgYXNz
b2NpYXRlZCBiaW4uICovCisJc2l6ZV90CQlucm91bmRzOworCXZvaWQJCSpyb3VuZHNbMV07IC8q
IER5bmFtaWNhbGx5IHNpemVkLiAqLworfTsKKworLyoKKyAqIE1hZ2F6aW5lcyBhcmUgbGF6aWx5
IGFsbG9jYXRlZCwgYnV0IG9uY2UgY3JlYXRlZCwgdGhleSByZW1haW4gdW50aWwgdGhlCisgKiBh
c3NvY2lhdGVkIG1hZ19yYWNrIGlzIGRlc3Ryb3llZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmlu
X21hZ3NfcyBiaW5fbWFnc190Oworc3RydWN0IGJpbl9tYWdzX3MgeworCW1hZ190CSpjdXJtYWc7
CisJbWFnX3QJKnNwYXJlbWFnOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWFnX3JhY2tfcyBtYWdf
cmFja190Oworc3RydWN0IG1hZ19yYWNrX3MgeworCWJpbl9tYWdzX3QJYmluX21hZ3NbMV07IC8q
IER5bmFtaWNhbGx5IHNpemVkLiAqLworfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqLworLyoKKyAqIERhdGEuCisgKi8KKworLyogTnVtYmVyIG9mIENQVXMuICovCitzdGF0aWMg
dW5zaWduZWQJCW5jcHVzOworCisvKiBWTSBwYWdlIHNpemUuICovCitzdGF0aWMgc2l6ZV90CQlw
YWdlc2l6ZTsKK3N0YXRpYyBzaXplX3QJCXBhZ2VzaXplX21hc2s7CitzdGF0aWMgc2l6ZV90CQlw
YWdlc2l6ZV8ycG93OworCisvKiBWYXJpb3VzIGJpbi1yZWxhdGVkIHNldHRpbmdzLiAqLworI2lm
ZGVmIE1BTExPQ19USU5ZCQkvKiBOdW1iZXIgb2YgKDJebiktc3BhY2VkIHRpbnkgYmlucy4gKi8K
KyMgIGRlZmluZQkJbnRiaW5zCSgodW5zaWduZWQpKFFVQU5UVU1fMlBPVyAtIFRJTllfTUlOXzJQ
T1cpKQorI2Vsc2UKKyMgIGRlZmluZQkJbnRiaW5zCTAKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVk
CQlucWJpbnM7IC8qIE51bWJlciBvZiBxdWFudHVtLXNwYWNlZCBiaW5zLiAqLworc3RhdGljIHVu
c2lnbmVkCQluY2JpbnM7IC8qIE51bWJlciBvZiBjYWNoZWxpbmUtc3BhY2VkIGJpbnMuICovCitz
dGF0aWMgdW5zaWduZWQJCW5zYmluczsgLyogTnVtYmVyIG9mIHN1YnBhZ2Utc3BhY2VkIGJpbnMu
ICovCitzdGF0aWMgdW5zaWduZWQJCW5iaW5zOworI2lmZGVmIE1BTExPQ19USU5ZCisjICBkZWZp
bmUJCXRzcGFjZV9tYXgJKChzaXplX3QpKFFVQU5UVU0gPj4gMSkpCisjZW5kaWYKKyNkZWZpbmUJ
CQlxc3BhY2VfbWluCVFVQU5UVU0KK3N0YXRpYyBzaXplX3QJCXFzcGFjZV9tYXg7CitzdGF0aWMg
c2l6ZV90CQljc3BhY2VfbWluOworc3RhdGljIHNpemVfdAkJY3NwYWNlX21heDsKK3N0YXRpYyBz
aXplX3QJCXNzcGFjZV9taW47CitzdGF0aWMgc2l6ZV90CQlzc3BhY2VfbWF4OworI2RlZmluZQkJ
CWJpbl9tYXhjbGFzcwlzc3BhY2VfbWF4CisKK3N0YXRpYyB1aW50OF90IGNvbnN0CSpzaXplMmJp
bjsKKy8qCisgKiBjb25zdF9zaXplMmJpbiBpcyBhIHN0YXRpYyBjb25zdGFudCBsb29rdXAgdGFi
bGUgdGhhdCBpbiB0aGUgY29tbW9uIGNhc2UgY2FuCisgKiBiZSB1c2VkIGFzLWlzIGZvciBzaXpl
MmJpbi4gIEZvciBkeW5hbWljYWxseSBsaW5rZWQgcHJvZ3JhbXMsIHRoaXMgYXZvaWRzCisgKiBh
IHBhZ2Ugb2YgbWVtb3J5IG92ZXJoZWFkIHBlciBwcm9jZXNzLgorICovCisjZGVmaW5lCVMyQl8x
KGkpCWksCisjZGVmaW5lCVMyQl8yKGkpCVMyQl8xKGkpIFMyQl8xKGkpCisjZGVmaW5lCVMyQl80
KGkpCVMyQl8yKGkpIFMyQl8yKGkpCisjZGVmaW5lCVMyQl84KGkpCVMyQl80KGkpIFMyQl80KGkp
CisjZGVmaW5lCVMyQl8xNihpKQlTMkJfOChpKSBTMkJfOChpKQorI2RlZmluZQlTMkJfMzIoaSkJ
UzJCXzE2KGkpIFMyQl8xNihpKQorI2RlZmluZQlTMkJfNjQoaSkJUzJCXzMyKGkpIFMyQl8zMihp
KQorI2RlZmluZQlTMkJfMTI4KGkpCVMyQl82NChpKSBTMkJfNjQoaSkKKyNkZWZpbmUJUzJCXzI1
NihpKQlTMkJfMTI4KGkpIFMyQl8xMjgoaSkKK3N0YXRpYyBjb25zdCB1aW50OF90CWNvbnN0X3Np
emUyYmluWygxVSA8PCBQQUdFU0laRV8yUE9XKSAtIDI1NV0gPSB7CisJUzJCXzEoMHhmZlUpCQkv
KiAgICAwICovCisjaWYgKFFVQU5UVU1fMlBPVyA9PSA0KQorLyogNjQtYml0IHN5c3RlbSAqKioq
KioqKioqKioqKioqKioqKioqKiovCisjICBpZmRlZiBNQUxMT0NfVElOWQorCVMyQl8yKDApCQkv
KiAgICAyICovCisJUzJCXzIoMSkJCS8qICAgIDQgKi8KKwlTMkJfNCgyKQkJLyogICAgOCAqLwor
CVMyQl84KDMpCQkvKiAgIDE2ICovCisjICAgIGRlZmluZSBTMkJfUU1JTiAzCisjICBlbHNlCisJ
UzJCXzE2KDApCQkvKiAgIDE2ICovCisjICAgIGRlZmluZSBTMkJfUU1JTiAwCisjICBlbmRpZgor
CVMyQl8xNihTMkJfUU1JTiArIDEpCS8qICAgMzIgKi8KKwlTMkJfMTYoUzJCX1FNSU4gKyAyKQkv
KiAgIDQ4ICovCisJUzJCXzE2KFMyQl9RTUlOICsgMykJLyogICA2NCAqLworCVMyQl8xNihTMkJf
UU1JTiArIDQpCS8qICAgODAgKi8KKwlTMkJfMTYoUzJCX1FNSU4gKyA1KQkvKiAgIDk2ICovCisJ
UzJCXzE2KFMyQl9RTUlOICsgNikJLyogIDExMiAqLworCVMyQl8xNihTMkJfUU1JTiArIDcpCS8q
ICAxMjggKi8KKyMgIGRlZmluZSBTMkJfQ01JTiAoUzJCX1FNSU4gKyA4KQorI2Vsc2UKKy8qIDMy
LWJpdCBzeXN0ZW0gKioqKioqKioqKioqKioqKioqKioqKioqLworIyAgaWZkZWYgTUFMTE9DX1RJ
TlkKKwlTMkJfMigwKQkJLyogICAgMiAqLworCVMyQl8yKDEpCQkvKiAgICA0ICovCisJUzJCXzQo
MikJCS8qICAgIDggKi8KKyMgICAgZGVmaW5lIFMyQl9RTUlOIDIKKyMgIGVsc2UKKwlTMkJfOCgw
KQkJLyogICAgOCAqLworIyAgICBkZWZpbmUgUzJCX1FNSU4gMAorIyAgZW5kaWYKKwlTMkJfOChT
MkJfUU1JTiArIDEpCS8qICAgMTYgKi8KKwlTMkJfOChTMkJfUU1JTiArIDIpCS8qICAgMjQgKi8K
KwlTMkJfOChTMkJfUU1JTiArIDMpCS8qICAgMzIgKi8KKwlTMkJfOChTMkJfUU1JTiArIDQpCS8q
ICAgNDAgKi8KKwlTMkJfOChTMkJfUU1JTiArIDUpCS8qICAgNDggKi8KKwlTMkJfOChTMkJfUU1J
TiArIDYpCS8qICAgNTYgKi8KKwlTMkJfOChTMkJfUU1JTiArIDcpCS8qICAgNjQgKi8KKwlTMkJf
OChTMkJfUU1JTiArIDgpCS8qICAgNzIgKi8KKwlTMkJfOChTMkJfUU1JTiArIDkpCS8qICAgODAg
Ki8KKwlTMkJfOChTMkJfUU1JTiArIDEwKQkvKiAgIDg4ICovCisJUzJCXzgoUzJCX1FNSU4gKyAx
MSkJLyogICA5NiAqLworCVMyQl84KFMyQl9RTUlOICsgMTIpCS8qICAxMDQgKi8KKwlTMkJfOChT
MkJfUU1JTiArIDEzKQkvKiAgMTEyICovCisJUzJCXzgoUzJCX1FNSU4gKyAxNCkJLyogIDEyMCAq
LworCVMyQl84KFMyQl9RTUlOICsgMTUpCS8qICAxMjggKi8KKyMgIGRlZmluZSBTMkJfQ01JTiAo
UzJCX1FNSU4gKyAxNikKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKiovCisJUzJCXzY0KFMyQl9DTUlOICsgMCkJLyogIDE5MiAqLworCVMyQl82NChTMkJf
Q01JTiArIDEpCS8qICAyNTYgKi8KKwlTMkJfNjQoUzJCX0NNSU4gKyAyKQkvKiAgMzIwICovCisJ
UzJCXzY0KFMyQl9DTUlOICsgMykJLyogIDM4NCAqLworCVMyQl82NChTMkJfQ01JTiArIDQpCS8q
ICA0NDggKi8KKwlTMkJfNjQoUzJCX0NNSU4gKyA1KQkvKiAgNTEyICovCisjICBkZWZpbmUgUzJC
X1NNSU4gKFMyQl9DTUlOICsgNikKKwlTMkJfMjU2KFMyQl9TTUlOICsgMCkJLyogIDc2OCAqLwor
CVMyQl8yNTYoUzJCX1NNSU4gKyAxKQkvKiAxMDI0ICovCisJUzJCXzI1NihTMkJfU01JTiArIDIp
CS8qIDEyODAgKi8KKwlTMkJfMjU2KFMyQl9TTUlOICsgMykJLyogMTUzNiAqLworCVMyQl8yNTYo
UzJCX1NNSU4gKyA0KQkvKiAxNzkyICovCisJUzJCXzI1NihTMkJfU01JTiArIDUpCS8qIDIwNDgg
Ki8KKwlTMkJfMjU2KFMyQl9TTUlOICsgNikJLyogMjMwNCAqLworCVMyQl8yNTYoUzJCX1NNSU4g
KyA3KQkvKiAyNTYwICovCisJUzJCXzI1NihTMkJfU01JTiArIDgpCS8qIDI4MTYgKi8KKwlTMkJf
MjU2KFMyQl9TTUlOICsgOSkJLyogMzA3MiAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAxMCkJLyog
MzMyOCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAxMSkJLyogMzU4NCAqLworCVMyQl8yNTYoUzJC
X1NNSU4gKyAxMikJLyogMzg0MCAqLworI2lmIChQQUdFU0laRV8yUE9XID09IDEzKQorCVMyQl8y
NTYoUzJCX1NNSU4gKyAxMykJLyogNDA5NiAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAxNCkJLyog
NDM1MiAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAxNSkJLyogNDYwOCAqLworCVMyQl8yNTYoUzJC
X1NNSU4gKyAxNikJLyogNDg2NCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAxNykJLyogNTEyMCAq
LworCVMyQl8yNTYoUzJCX1NNSU4gKyAxOCkJLyogNTM3NiAqLworCVMyQl8yNTYoUzJCX1NNSU4g
KyAxOSkJLyogNTYzMiAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyMCkJLyogNTg4OCAqLworCVMy
Ql8yNTYoUzJCX1NNSU4gKyAyMSkJLyogNjE0NCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyMikJ
LyogNjQwMCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyMykJLyogNjY1NiAqLworCVMyQl8yNTYo
UzJCX1NNSU4gKyAyNCkJLyogNjkxMiAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyNSkJLyogNzE2
OCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyNikJLyogNzQyNCAqLworCVMyQl8yNTYoUzJCX1NN
SU4gKyAyNykJLyogNzY4MCAqLworCVMyQl8yNTYoUzJCX1NNSU4gKyAyOCkJLyogNzkzNiAqLwor
I2VuZGlmCit9OworI3VuZGVmIFMyQl8xCisjdW5kZWYgUzJCXzIKKyN1bmRlZiBTMkJfNAorI3Vu
ZGVmIFMyQl84CisjdW5kZWYgUzJCXzE2CisjdW5kZWYgUzJCXzMyCisjdW5kZWYgUzJCXzY0Cisj
dW5kZWYgUzJCXzEyOAorI3VuZGVmIFMyQl8yNTYKKyN1bmRlZiBTMkJfUU1JTgorI3VuZGVmIFMy
Ql9DTUlOCisjdW5kZWYgUzJCX1NNSU4KKworI2lmZGVmIE1BTExPQ19NQUcKK3N0YXRpYyBzaXpl
X3QJCW1heF9yb3VuZHM7CisjZW5kaWYKKworLyogVmFyaW91cyBjaHVuay1yZWxhdGVkIHNldHRp
bmdzLiAqLworc3RhdGljIHNpemVfdAkJY2h1bmtzaXplOworc3RhdGljIHNpemVfdAkJY2h1bmtz
aXplX21hc2s7IC8qIChjaHVua3NpemUgLSAxKS4gKi8KK3N0YXRpYyBzaXplX3QJCWNodW5rX25w
YWdlczsKK3N0YXRpYyBzaXplX3QJCWFyZW5hX2NodW5rX2hlYWRlcl9ucGFnZXM7CitzdGF0aWMg
c2l6ZV90CQlhcmVuYV9tYXhjbGFzczsgLyogTWF4IHNpemUgY2xhc3MgZm9yIGFyZW5hcy4gKi8K
KworLyoqKioqKioqLworLyoKKyAqIENodW5rcy4KKyAqLworCisvKiBQcm90ZWN0cyBjaHVuay1y
ZWxhdGVkIGRhdGEgc3RydWN0dXJlcy4gKi8KK3N0YXRpYyBtYWxsb2NfbXV0ZXhfdAlodWdlX210
eDsKKworLyogVHJlZSBvZiBjaHVua3MgdGhhdCBhcmUgc3RhbmQtYWxvbmUgaHVnZSBhbGxvY2F0
aW9ucy4gKi8KK3N0YXRpYyBleHRlbnRfdHJlZV90CWh1Z2U7CisKKyNpZmRlZiBNQUxMT0NfRFNT
CisvKgorICogUHJvdGVjdHMgc2JyaygpIGNhbGxzLiAgVGhpcyBhdm9pZHMgbWFsbG9jIHJhY2Vz
IGFtb25nIHRocmVhZHMsIHRob3VnaCBpdAorICogZG9lcyBub3QgcHJvdGVjdCBhZ2FpbnN0IHJh
Y2VzIHdpdGggdGhyZWFkcyB0aGF0IGNhbGwgc2JyaygpIGRpcmVjdGx5LgorICovCitzdGF0aWMg
bWFsbG9jX211dGV4X3QJZHNzX210eDsKKy8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgRFNTLiAqLwor
c3RhdGljIHZvaWQJCSpkc3NfYmFzZTsKKy8qIEN1cnJlbnQgZW5kIG9mIHRoZSBEU1MsIG9yICgo
dm9pZCAqKS0xKSBpZiB0aGUgRFNTIGlzIGV4aGF1c3RlZC4gKi8KK3N0YXRpYyB2b2lkCQkqZHNz
X3ByZXY7CisvKiBDdXJyZW50IHVwcGVyIGxpbWl0IG9uIERTUyBhZGRyZXNzZXMuICovCitzdGF0
aWMgdm9pZAkJKmRzc19tYXg7CisKKy8qCisgKiBUcmVlcyBvZiBjaHVua3MgdGhhdCB3ZXJlIHBy
ZXZpb3VzbHkgYWxsb2NhdGVkICh0cmVlcyBkaWZmZXIgb25seSBpbiBub2RlCisgKiBvcmRlcmlu
ZykuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGFsbG9jYXRpbmcgY2h1bmtzLCBpbiBhbiBhdHRlbXB0
IHRvIHJlLXVzZQorICogYWRkcmVzcyBzcGFjZS4gIERlcGVuZGluZyBvbiBmdW5jdGlvbiwgZGlm
ZmVyZW50IHRyZWUgb3JkZXJpbmdzIGFyZSBuZWVkZWQsCisgKiB3aGljaCBpcyB3aHkgdGhlcmUg
YXJlIHR3byB0cmVlcyB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzLgorICovCitzdGF0aWMgZXh0ZW50
X3RyZWVfdAlkc3NfY2h1bmtzX3N6YWQ7CitzdGF0aWMgZXh0ZW50X3RyZWVfdAlkc3NfY2h1bmtz
X2FkOworI2VuZGlmCisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKy8qIEh1Z2UgYWxsb2NhdGlvbiBz
dGF0aXN0aWNzLiAqLworc3RhdGljIHVpbnQ2NF90CQlodWdlX25tYWxsb2M7CitzdGF0aWMgdWlu
dDY0X3QJCWh1Z2VfbmRhbGxvYzsKK3N0YXRpYyBzaXplX3QJCWh1Z2VfYWxsb2NhdGVkOworI2Vu
ZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGJhc2UgKGludGVy
bmFsIGFsbG9jYXRpb24pLgorICovCisKKy8qCisgKiBDdXJyZW50IHBhZ2VzIHRoYXQgYXJlIGJl
aW5nIHVzZWQgZm9yIGludGVybmFsIG1lbW9yeSBhbGxvY2F0aW9ucy4gIFRoZXNlCisgKiBwYWdl
cyBhcmUgY2FydmVkIHVwIGluIGNhY2hlbGluZS1zaXplIHF1YW50YSwgc28gdGhhdCB0aGVyZSBp
cyBubyBjaGFuY2Ugb2YKKyAqIGZhbHNlIGNhY2hlIGxpbmUgc2hhcmluZy4KKyAqLworc3RhdGlj
IHZvaWQJCSpiYXNlX3BhZ2VzOworc3RhdGljIHZvaWQJCSpiYXNlX25leHRfYWRkcjsKK3N0YXRp
YyB2b2lkCQkqYmFzZV9wYXN0X2FkZHI7IC8qIEFkZHIgaW1tZWRpYXRlbHkgcGFzdCBiYXNlX3Bh
Z2VzLiAqLworc3RhdGljIGV4dGVudF9ub2RlX3QJKmJhc2Vfbm9kZXM7CitzdGF0aWMgbWFsbG9j
X211dGV4X3QJYmFzZV9tdHg7CisjaWZkZWYgTUFMTE9DX1NUQVRTCitzdGF0aWMgc2l6ZV90CQli
YXNlX21hcHBlZDsKKyNlbmRpZgorCisvKioqKioqKiovCisvKgorICogQXJlbmFzLgorICovCisK
Ky8qCisgKiBBcmVuYXMgdGhhdCBhcmUgdXNlZCB0byBzZXJ2aWNlIGV4dGVybmFsIHJlcXVlc3Rz
LiAgTm90IGFsbCBlbGVtZW50cyBvZiB0aGUKKyAqIGFyZW5hcyBhcnJheSBhcmUgbmVjZXNzYXJp
bHkgdXNlZDsgYXJlbmFzIGFyZSBjcmVhdGVkIGxhemlseSBhcyBuZWVkZWQuCisgKi8KK3N0YXRp
YyBhcmVuYV90CQkqKmFyZW5hczsKK3N0YXRpYyB1bnNpZ25lZAkJbmFyZW5hczsKKyNpZm5kZWYg
Tk9fVExTCisjICBpZmRlZiBNQUxMT0NfQkFMQU5DRQorc3RhdGljIHVuc2lnbmVkCQluYXJlbmFz
XzJwb3c7CisjICBlbHNlCitzdGF0aWMgdW5zaWduZWQJCW5leHRfYXJlbmE7CisjICBlbmRpZgor
I2VuZGlmCitzdGF0aWMgcHRocmVhZF9tdXRleF90CWFyZW5hc19sb2NrOyAvKiBQcm90ZWN0cyBh
cmVuYXMgaW5pdGlhbGl6YXRpb24uICovCisKKyNpZm5kZWYgTk9fVExTCisvKgorICogTWFwIG9m
IHB0aHJlYWRfc2VsZigpIC0tPiBhcmVuYXNbPz8/XSwgdXNlZCBmb3Igc2VsZWN0aW5nIGFuIGFy
ZW5hIHRvIHVzZQorICogZm9yIGFsbG9jYXRpb25zLgorICovCitzdGF0aWMgX190aHJlYWQgYXJl
bmFfdAkqYXJlbmFzX21hcDsKKyNlbmRpZgorCisjaWZkZWYgTUFMTE9DX01BRworLyoKKyAqIE1h
cCBvZiB0aHJlYWQtc3BlY2lmaWMgbWFnYXppbmUgcmFja3MsIHVzZWQgZm9yIHRocmVhZC1zcGVj
aWZpYyBvYmplY3QKKyAqIGNhY2hpbmcuCisgKi8KK3N0YXRpYyBfX3RocmVhZCBtYWdfcmFja190
CSptYWdfcmFjazsKKyNlbmRpZgorCisjaWZkZWYgTUFMTE9DX1NUQVRTCisvKiBDaHVuayBzdGF0
aXN0aWNzLiAqLworc3RhdGljIGNodW5rX3N0YXRzX3QJc3RhdHNfY2h1bmtzOworI2VuZGlmCisK
Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ1bnRpbWUgY29uZmln
dXJhdGlvbiBvcHRpb25zLgorICovCitjb25zdCBjaGFyCSpfbWFsbG9jX29wdGlvbnM7CisKKyNp
Zm5kZWYgTUFMTE9DX1BST0RVQ1RJT04KK3N0YXRpYyBib29sCW9wdF9hYm9ydCA9IHRydWU7Citz
dGF0aWMgYm9vbAlvcHRfanVuayA9IHRydWU7CisjZWxzZQorc3RhdGljIGJvb2wJb3B0X2Fib3J0
ID0gZmFsc2U7CitzdGF0aWMgYm9vbAlvcHRfanVuayA9IGZhbHNlOworI2VuZGlmCisjaWZkZWYg
TUFMTE9DX0RTUworc3RhdGljIGJvb2wJb3B0X2RzcyA9IHRydWU7CitzdGF0aWMgYm9vbAlvcHRf
bW1hcCA9IHRydWU7CisjZW5kaWYKKyNpZmRlZiBNQUxMT0NfTUFHCitzdGF0aWMgYm9vbAlvcHRf
bWFnID0gdHJ1ZTsKK3N0YXRpYyBzaXplX3QJb3B0X21hZ19zaXplXzJwb3cgPSBNQUdfU0laRV8y
UE9XX0RFRkFVTFQ7CisjZW5kaWYKK3N0YXRpYyBzaXplX3QJb3B0X2RpcnR5X21heCA9IERJUlRZ
X01BWF9ERUZBVUxUOworI2lmZGVmIE1BTExPQ19CQUxBTkNFCitzdGF0aWMgdWludDY0X3QJb3B0
X2JhbGFuY2VfdGhyZXNob2xkID0gQkFMQU5DRV9USFJFU0hPTERfREVGQVVMVDsKKyNlbmRpZgor
c3RhdGljIGJvb2wJb3B0X3ByaW50X3N0YXRzID0gdHJ1ZTsKK3N0YXRpYyBzaXplX3QJb3B0X3Fz
cGFjZV9tYXhfMnBvdyA9IFFTUEFDRV9NQVhfMlBPV19ERUZBVUxUOworc3RhdGljIHNpemVfdAlv
cHRfY3NwYWNlX21heF8ycG93ID0gQ1NQQUNFX01BWF8yUE9XX0RFRkFVTFQ7CitzdGF0aWMgc2l6
ZV90CW9wdF9jaHVua18ycG93ID0gQ0hVTktfMlBPV19ERUZBVUxUOworc3RhdGljIGJvb2wJb3B0
X3V0cmFjZSA9IGZhbHNlOworc3RhdGljIGJvb2wJb3B0X3N5c3YgPSBmYWxzZTsKK3N0YXRpYyBi
b29sCW9wdF94bWFsbG9jID0gZmFsc2U7CitzdGF0aWMgYm9vbAlvcHRfemVybyA9IGZhbHNlOwor
c3RhdGljIGludAlvcHRfbmFyZW5hc19sc2hpZnQgPSAwOworCit0eXBlZGVmIHN0cnVjdCB7CisJ
dm9pZAkqcDsKKwlzaXplX3QJczsKKwl2b2lkCSpyOworfSBtYWxsb2NfdXRyYWNlX3Q7CisKKyNp
ZmRlZiBNQUxMT0NfU1RBVFMKKyNkZWZpbmUJVVRSQUNFKGEsIGIsIGMpCQkJCQkJCVwKKwlpZiAo
b3B0X3V0cmFjZSkgewkJCQkJCVwKKwkJbWFsbG9jX3V0cmFjZV90IHV0OwkJCQkJXAorCQl1dC5w
ID0gKGEpOwkJCQkJCVwKKwkJdXQucyA9IChiKTsJCQkJCQlcCisJCXV0LnIgPSAoYyk7CQkJCQkJ
XAorCQl1dHJhY2UoJnV0LCBzaXplb2YodXQpKTsJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lCVVU
UkFDRShhLCBiLCBjKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICog
QmVnaW4gZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igbm9uLWlubGluZSBzdGF0aWMgZnVuY3Rpb25z
LgorICovCisKK3N0YXRpYyBib29sCW1hbGxvY19tdXRleF9pbml0KG1hbGxvY19tdXRleF90ICpt
dXRleCk7CitzdGF0aWMgYm9vbAltYWxsb2Nfc3Bpbl9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbG9j
ayk7CitzdGF0aWMgdm9pZAl3cnRtZXNzYWdlKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpw
MiwgY29uc3QgY2hhciAqcDMsCisJCWNvbnN0IGNoYXIgKnA0KTsKKyNpZmRlZiBNQUxMT0NfU1RB
VFMKK3N0YXRpYyB2b2lkCW1hbGxvY19wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwor
I2VuZGlmCitzdGF0aWMgY2hhcgkqdW1heDJzKHVpbnRtYXhfdCB4LCBjaGFyICpzKTsKKyNpZmRl
ZiBNQUxMT0NfRFNTCitzdGF0aWMgYm9vbAliYXNlX3BhZ2VzX2FsbG9jX2RzcyhzaXplX3QgbWlu
c2l6ZSk7CisjZW5kaWYKK3N0YXRpYyBib29sCWJhc2VfcGFnZXNfYWxsb2NfbW1hcChzaXplX3Qg
bWluc2l6ZSk7CitzdGF0aWMgYm9vbAliYXNlX3BhZ2VzX2FsbG9jKHNpemVfdCBtaW5zaXplKTsK
K3N0YXRpYyB2b2lkCSpiYXNlX2FsbG9jKHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkCSpiYXNl
X2NhbGxvYyhzaXplX3QgbnVtYmVyLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgZXh0ZW50X25vZGVf
dCAqYmFzZV9ub2RlX2FsbG9jKHZvaWQpOworc3RhdGljIHZvaWQJYmFzZV9ub2RlX2RlYWxsb2Mo
ZXh0ZW50X25vZGVfdCAqbm9kZSk7CisjaWZkZWYgTUFMTE9DX1NUQVRTCitzdGF0aWMgdm9pZAlz
dGF0c19wcmludChhcmVuYV90ICphcmVuYSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCSpwYWdlc19t
YXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpOworc3RhdGljIHZvaWQJcGFnZXNfdW5tYXAodm9p
ZCAqYWRkciwgc2l6ZV90IHNpemUpOworI2lmZGVmIE1BTExPQ19EU1MKK3N0YXRpYyB2b2lkCSpj
aHVua19hbGxvY19kc3Moc2l6ZV90IHNpemUpOworc3RhdGljIHZvaWQJKmNodW5rX3JlY3ljbGVf
ZHNzKHNpemVfdCBzaXplLCBib29sIHplcm8pOworI2VuZGlmCitzdGF0aWMgdm9pZAkqY2h1bmtf
YWxsb2NfbW1hcChzaXplX3Qgc2l6ZSk7CitzdGF0aWMgdm9pZAkqY2h1bmtfYWxsb2Moc2l6ZV90
IHNpemUsIGJvb2wgemVybyk7CisjaWZkZWYgTUFMTE9DX0RTUworc3RhdGljIGV4dGVudF9ub2Rl
X3QgKmNodW5rX2RlYWxsb2NfZHNzX3JlY29yZCh2b2lkICpjaHVuaywgc2l6ZV90IHNpemUpOwor
c3RhdGljIGJvb2wJY2h1bmtfZGVhbGxvY19kc3Modm9pZCAqY2h1bmssIHNpemVfdCBzaXplKTsK
KyNlbmRpZgorc3RhdGljIHZvaWQJY2h1bmtfZGVhbGxvY19tbWFwKHZvaWQgKmNodW5rLCBzaXpl
X3Qgc2l6ZSk7CitzdGF0aWMgdm9pZAljaHVua19kZWFsbG9jKHZvaWQgKmNodW5rLCBzaXplX3Qg
c2l6ZSk7CisjaWZuZGVmIE5PX1RMUworc3RhdGljIGFyZW5hX3QJKmNob29zZV9hcmVuYV9oYXJk
KHZvaWQpOworI2VuZGlmCitzdGF0aWMgdm9pZAlhcmVuYV9ydW5fc3BsaXQoYXJlbmFfdCAqYXJl
bmEsIGFyZW5hX3J1bl90ICpydW4sIHNpemVfdCBzaXplLAorICAgIGJvb2wgbGFyZ2UsIGJvb2wg
emVybyk7CitzdGF0aWMgYXJlbmFfY2h1bmtfdCAqYXJlbmFfY2h1bmtfYWxsb2MoYXJlbmFfdCAq
YXJlbmEpOworc3RhdGljIHZvaWQJYXJlbmFfY2h1bmtfZGVhbGxvYyhhcmVuYV90ICphcmVuYSwg
YXJlbmFfY2h1bmtfdCAqY2h1bmspOworc3RhdGljIGFyZW5hX3J1bl90ICphcmVuYV9ydW5fYWxs
b2MoYXJlbmFfdCAqYXJlbmEsIHNpemVfdCBzaXplLCBib29sIGxhcmdlLAorICAgIGJvb2wgemVy
byk7CitzdGF0aWMgdm9pZAlhcmVuYV9wdXJnZShhcmVuYV90ICphcmVuYSk7CitzdGF0aWMgdm9p
ZAlhcmVuYV9ydW5fZGFsbG9jKGFyZW5hX3QgKmFyZW5hLCBhcmVuYV9ydW5fdCAqcnVuLCBib29s
IGRpcnR5KTsKK3N0YXRpYyB2b2lkCWFyZW5hX3J1bl90cmltX2hlYWQoYXJlbmFfdCAqYXJlbmEs
IGFyZW5hX2NodW5rX3QgKmNodW5rLAorICAgIGFyZW5hX3J1bl90ICpydW4sIHNpemVfdCBvbGRz
aXplLCBzaXplX3QgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZAlhcmVuYV9ydW5fdHJpbV90YWlsKGFy
ZW5hX3QgKmFyZW5hLCBhcmVuYV9jaHVua190ICpjaHVuaywKKyAgICBhcmVuYV9ydW5fdCAqcnVu
LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IG5ld3NpemUsIGJvb2wgZGlydHkpOworc3RhdGljIGFy
ZW5hX3J1bl90ICphcmVuYV9iaW5fbm9uZnVsbF9ydW5fZ2V0KGFyZW5hX3QgKmFyZW5hLCBhcmVu
YV9iaW5fdCAqYmluKTsKK3N0YXRpYyB2b2lkCSphcmVuYV9iaW5fbWFsbG9jX2hhcmQoYXJlbmFf
dCAqYXJlbmEsIGFyZW5hX2Jpbl90ICpiaW4pOworc3RhdGljIHNpemVfdAlhcmVuYV9iaW5fcnVu
X3NpemVfY2FsYyhhcmVuYV9iaW5fdCAqYmluLCBzaXplX3QgbWluX3J1bl9zaXplKTsKKyNpZmRl
ZiBNQUxMT0NfQkFMQU5DRQorc3RhdGljIHZvaWQJYXJlbmFfbG9ja19iYWxhbmNlX2hhcmQoYXJl
bmFfdCAqYXJlbmEpOworI2VuZGlmCisjaWZkZWYgTUFMTE9DX01BRworc3RhdGljIHZvaWQJbWFn
X2xvYWQobWFnX3QgKm1hZyk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCSphcmVuYV9tYWxsb2NfbGFy
Z2UoYXJlbmFfdCAqYXJlbmEsIHNpemVfdCBzaXplLCBib29sIHplcm8pOworc3RhdGljIHZvaWQJ
KmFyZW5hX3BhbGxvYyhhcmVuYV90ICphcmVuYSwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNp
emUsCisgICAgc2l6ZV90IGFsbG9jX3NpemUpOworc3RhdGljIHNpemVfdAlhcmVuYV9zYWxsb2Mo
Y29uc3Qgdm9pZCAqcHRyKTsKKyNpZmRlZiBNQUxMT0NfTUFHCitzdGF0aWMgdm9pZAltYWdfdW5s
b2FkKG1hZ190ICptYWcpOworI2VuZGlmCitzdGF0aWMgdm9pZAlhcmVuYV9kYWxsb2NfbGFyZ2Uo
YXJlbmFfdCAqYXJlbmEsIGFyZW5hX2NodW5rX3QgKmNodW5rLAorICAgIHZvaWQgKnB0cik7Citz
dGF0aWMgdm9pZAlhcmVuYV9yYWxsb2NfbGFyZ2Vfc2hyaW5rKGFyZW5hX3QgKmFyZW5hLCBhcmVu
YV9jaHVua190ICpjaHVuaywKKyAgICB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgb2xk
c2l6ZSk7CitzdGF0aWMgYm9vbAlhcmVuYV9yYWxsb2NfbGFyZ2VfZ3JvdyhhcmVuYV90ICphcmVu
YSwgYXJlbmFfY2h1bmtfdCAqY2h1bmssCisgICAgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6
ZV90IG9sZHNpemUpOworc3RhdGljIGJvb2wJYXJlbmFfcmFsbG9jX2xhcmdlKHZvaWQgKnB0ciwg
c2l6ZV90IHNpemUsIHNpemVfdCBvbGRzaXplKTsKK3N0YXRpYyB2b2lkCSphcmVuYV9yYWxsb2Mo
dm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG9sZHNpemUpOworc3RhdGljIGJvb2wJYXJl
bmFfbmV3KGFyZW5hX3QgKmFyZW5hKTsKK3N0YXRpYyBhcmVuYV90CSphcmVuYXNfZXh0ZW5kKHVu
c2lnbmVkIGluZCk7CisjaWZkZWYgTUFMTE9DX01BRworc3RhdGljIG1hZ190CSptYWdfY3JlYXRl
KGFyZW5hX3QgKmFyZW5hLCBzaXplX3QgYmluaW5kKTsKK3N0YXRpYyB2b2lkCW1hZ19kZXN0cm95
KG1hZ190ICptYWcpOworc3RhdGljIG1hZ19yYWNrX3QgKm1hZ19yYWNrX2NyZWF0ZShhcmVuYV90
ICphcmVuYSk7CitzdGF0aWMgdm9pZAltYWdfcmFja19kZXN0cm95KG1hZ19yYWNrX3QgKnJhY2sp
OworI2VuZGlmCitzdGF0aWMgdm9pZAkqaHVnZV9tYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgemVy
byk7CitzdGF0aWMgdm9pZAkqaHVnZV9wYWxsb2Moc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNp
emUpOworc3RhdGljIHZvaWQJKmh1Z2VfcmFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNp
emVfdCBvbGRzaXplKTsKK3N0YXRpYyB2b2lkCWh1Z2VfZGFsbG9jKHZvaWQgKnB0cik7CitzdGF0
aWMgdm9pZAltYWxsb2NfcHJpbnRfc3RhdHModm9pZCk7CisjaWZkZWYgTUFMTE9DX0RFQlVHCitz
dGF0aWMgdm9pZAlzaXplMmJpbl92YWxpZGF0ZSh2b2lkKTsKKyNlbmRpZgorc3RhdGljIGJvb2wJ
c2l6ZTJiaW5faW5pdCh2b2lkKTsKK3N0YXRpYyBib29sCXNpemUyYmluX2luaXRfaGFyZCh2b2lk
KTsKK3N0YXRpYyB1bnNpZ25lZAltYWxsb2NfbmNwdXModm9pZCk7CitzdGF0aWMgYm9vbAltYWxs
b2NfaW5pdF9oYXJkKHZvaWQpOwordm9pZAkJX21hbGxvY19wcmVmb3JrKHZvaWQpOwordm9pZAkJ
X21hbGxvY19wb3N0Zm9yayh2b2lkKTsKKworLyoKKyAqIEVuZCBmdW5jdGlvbiBwcm90b3R5cGVz
LgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAord3J0bWVzc2Fn
ZShjb25zdCBjaGFyICpwMSwgY29uc3QgY2hhciAqcDIsIGNvbnN0IGNoYXIgKnAzLCBjb25zdCBj
aGFyICpwNCkKK3sKKworCXdyaXRlKFNUREVSUl9GSUxFTk8sIHAxLCBzdHJsZW4ocDEpKTsKKwl3
cml0ZShTVERFUlJfRklMRU5PLCBwMiwgc3RybGVuKHAyKSk7CisJd3JpdGUoU1RERVJSX0ZJTEVO
TywgcDMsIHN0cmxlbihwMykpOworCXdyaXRlKFNUREVSUl9GSUxFTk8sIHA0LCBzdHJsZW4ocDQp
KTsKK30KKworI2RlZmluZQlfbWFsbG9jX21lc3NhZ2UgbWFsbG9jX21lc3NhZ2UKK3ZvaWQJKCpf
bWFsbG9jX21lc3NhZ2UpKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMiwgY29uc3QgY2hh
ciAqcDMsCisJICAgIGNvbnN0IGNoYXIgKnA0KSA9IHdydG1lc3NhZ2U7CisKKy8qCisgKiBXZSBk
b24ndCB3YW50IHRvIGRlcGVuZCBvbiB2c25wcmludGYoKSBmb3IgcHJvZHVjdGlvbiBidWlsZHMs
IHNpbmNlIHRoYXQgY2FuCisgKiBjYXVzZSB1bm5lY2Vzc2FyeSBibG9hdCBmb3Igc3RhdGljIGJp
bmFyaWVzLiAgdW1heDJzKCkgcHJvdmlkZXMgbWluaW1hbAorICogaW50ZWdlciBwcmludGluZyBm
dW5jdGlvbmFsaXR5LCBzbyB0aGF0IG1hbGxvY19wcmludGYoKSB1c2UgY2FuIGJlIGxpbWl0ZWQg
dG8KKyAqIE1BTExPQ19TVEFUUyBjb2RlLgorICovCisjZGVmaW5lCVVNQVgyU19CVUZTSVpFCTIx
CitzdGF0aWMgY2hhciAqCit1bWF4MnModWludG1heF90IHgsIGNoYXIgKnMpCit7CisJdW5zaWdu
ZWQgaTsKKworCWkgPSBVTUFYMlNfQlVGU0laRSAtIDE7CisJc1tpXSA9ICdcMCc7CisJZG8gewor
CQlpLS07CisJCXNbaV0gPSAiMDEyMzQ1Njc4OSJbeCAlIDEwXTsKKwkJeCAvPSAxMDsKKwl9IHdo
aWxlICh4ID4gMCk7CisKKwlyZXR1cm4gKCZzW2ldKTsKK30KKworLyoKKyAqIERlZmluZSBhIGN1
c3RvbSBhc3NlcnQoKSBpbiBvcmRlciB0byByZWR1Y2UgdGhlIGNoYW5jZXMgb2YgZGVhZGxvY2sg
ZHVyaW5nCisgKiBhc3NlcnRpb24gZmFpbHVyZS4KKyAqLworI2lmZGVmIE1BTExPQ19ERUJVRwor
IyAgZGVmaW5lIGFzc2VydChlKSBkbyB7CQkJCQkJXAorCWlmICghKGUpKSB7CQkJCQkJCVwKKwkJ
Y2hhciBsaW5lX2J1ZltVTUFYMlNfQlVGU0laRV07CQkJCVwKKwkJX21hbGxvY19tZXNzYWdlKF9f
RklMRV9fLCAiOiIsIHVtYXgycyhfX0xJTkVfXywJCVwKKwkJICAgIGxpbmVfYnVmKSwgIjogRmFp
bGVkIGFzc2VydGlvbjogIik7CQkJXAorCQlfbWFsbG9jX21lc3NhZ2UoIlwiIiwgI2UsICJcIlxu
IiwgIiIpOwkJCVwKKwkJYWJvcnQoKTsJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkK
KyNlbHNlCisjZGVmaW5lIGFzc2VydChlKQorI2VuZGlmCisKKyNpZmRlZiBNQUxMT0NfU1RBVFMK
K3N0YXRpYyBpbnQKK3V0cmFjZShjb25zdCB2b2lkICphZGRyLCBzaXplX3QgbGVuKQoreworCW1h
bGxvY191dHJhY2VfdCAqdXQgPSAobWFsbG9jX3V0cmFjZV90ICopYWRkcjsKKworCWFzc2VydChs
ZW4gPT0gc2l6ZW9mKG1hbGxvY191dHJhY2VfdCkpOworCisJaWYgKHV0LT5wID09IE5VTEwgJiYg
dXQtPnMgPT0gMCAmJiB1dC0+ciA9PSBOVUxMKQorCQltYWxsb2NfcHJpbnRmKCIlZCB4IFVTRVIg
bWFsbG9jX2luaXQoKVxuIiwgZ2V0cGlkKCkpOworCWVsc2UgaWYgKHV0LT5wID09IE5VTEwgJiYg
dXQtPnIgIT0gTlVMTCkgeworCQltYWxsb2NfcHJpbnRmKCIlZCB4IFVTRVIgJXAgPSBtYWxsb2Mo
JXp1KVxuIiwgZ2V0cGlkKCksIHV0LT5yLAorCQkgICAgdXQtPnMpOworCX0gZWxzZSBpZiAodXQt
PnAgIT0gTlVMTCAmJiB1dC0+ciAhPSBOVUxMKSB7CisJCW1hbGxvY19wcmludGYoIiVkIHggVVNF
UiAlcCA9IHJlYWxsb2MoJXAsICV6dSlcbiIsIGdldHBpZCgpLAorCQkgICAgdXQtPnIsIHV0LT5w
LCB1dC0+cyk7CisJfSBlbHNlCisJCW1hbGxvY19wcmludGYoIiVkIHggVVNFUiBmcmVlKCVwKVxu
IiwgZ2V0cGlkKCksIHV0LT5wKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworc3RhdGlj
IGlubGluZSBjb25zdCBjaGFyICoKK19nZXRwcm9nbmFtZSh2b2lkKQoreworCisJcmV0dXJuICgi
PGplbWFsbG9jPiIpOworfQorCisjaWZkZWYgTUFMTE9DX1NUQVRTCisvKgorICogUHJpbnQgdG8g
c3RkZXJyIGluIHN1Y2ggYSB3YXkgYXMgdG8gKGhvcGVmdWxseSkgYXZvaWQgbWVtb3J5IGFsbG9j
YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCittYWxsb2NfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1h
dCwgLi4uKQoreworCWNoYXIgYnVmWzQwOTZdOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChh
cCwgZm9ybWF0KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhcCk7CisJ
dmFfZW5kKGFwKTsKKwlfbWFsbG9jX21lc3NhZ2UoYnVmLCAiIiwgIiIsICIiKTsKK30KKyNlbmRp
ZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEJlZ2luIG11dGV4LgorICovCisK
K3N0YXRpYyBib29sCittYWxsb2NfbXV0ZXhfaW5pdChtYWxsb2NfbXV0ZXhfdCAqbXV0ZXgpCit7
CisJcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworCisJaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX2lu
aXQoJmF0dHIpICE9IDApCisJCXJldHVybiAodHJ1ZSk7CisJcHRocmVhZF9tdXRleGF0dHJfc2V0
dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCk7CisJaWYgKHB0aHJlYWRfbXV0
ZXhfaW5pdChtdXRleCwgJmF0dHIpICE9IDApIHsKKwkJcHRocmVhZF9tdXRleGF0dHJfZGVzdHJv
eSgmYXR0cik7CisJCXJldHVybiAodHJ1ZSk7CisJfQorCXB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ry
b3koJmF0dHIpOworCisJcmV0dXJuIChmYWxzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAor
bWFsbG9jX211dGV4X2xvY2sobWFsbG9jX211dGV4X3QgKm11dGV4KQoreworCisJaWYgKF9faXN0
aHJlYWRlZCkKKwkJcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKK30KKworc3RhdGljIGlubGlu
ZSB2b2lkCittYWxsb2NfbXV0ZXhfdW5sb2NrKG1hbGxvY19tdXRleF90ICptdXRleCkKK3sKKwor
CWlmIChfX2lzdGhyZWFkZWQpCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKK30KKwor
LyoKKyAqIEVuZCBtdXRleC4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBC
ZWdpbiBzcGluIGxvY2suICBTcGluIGxvY2tzIGhlcmUgYXJlIGFjdHVhbGx5IGFkYXB0aXZlIG11
dGV4ZXMgdGhhdCBibG9jaworICogYWZ0ZXIgYSBwZXJpb2Qgb2Ygc3Bpbm5pbmcsIGJlY2F1c2Ug
dW5ib3VuZGVkIHNwaW5uaW5nIHdvdWxkIGFsbG93IGZvcgorICogcHJpb3JpdHkgaW52ZXJzaW9u
LgorICovCisKK3N0YXRpYyBib29sCittYWxsb2Nfc3Bpbl9pbml0KHB0aHJlYWRfbXV0ZXhfdCAq
bG9jaykKK3sKKworCWlmIChwdGhyZWFkX211dGV4X2luaXQobG9jaywgTlVMTCkgIT0gMCkKKwkJ
cmV0dXJuICh0cnVlKTsKKworCXJldHVybiAoZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHVu
c2lnbmVkCittYWxsb2Nfc3Bpbl9sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbG9jaykKK3sKKwl1bnNp
Z25lZCByZXQgPSAwOworCisJaWYgKF9faXN0aHJlYWRlZCkgeworCQlpZiAocHRocmVhZF9tdXRl
eF90cnlsb2NrKGxvY2spICE9IDApIHsKKwkJCXVuc2lnbmVkIGk7CisJCQl2b2xhdGlsZSB1bnNp
Z25lZCBqOworCisJCQkvKiBFeHBvbmVudGlhbGx5IGJhY2sgb2ZmLiAqLworCQkJZm9yIChpID0g
MTsgaSA8PSBTUElOX0xJTUlUXzJQT1c7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCAoMVUg
PDwgaSk7IGorKykgeworCQkJCQlyZXQrKzsKKwkJCQkJQ1BVX1NQSU5XQUlUOworCQkJCX0KKwor
CQkJCWlmIChwdGhyZWFkX211dGV4X3RyeWxvY2sobG9jaykgPT0gMCkKKwkJCQkJcmV0dXJuIChy
ZXQpOworCQkJfQorCisJCQkvKgorCQkJICogU3Bpbm5pbmcgZmFpbGVkLiAgQmxvY2sgdW50aWwg
dGhlIGxvY2sgYmVjb21lcworCQkJICogYXZhaWxhYmxlLCBpbiBvcmRlciB0byBhdm9pZCBpbmRl
ZmluaXRlIHByaW9yaXR5CisJCQkgKiBpbnZlcnNpb24uCisJCQkgKi8KKwkJCXB0aHJlYWRfbXV0
ZXhfbG9jayhsb2NrKTsKKwkJCWFzc2VydCgocmV0IDw8IEJMT0NLX0NPU1RfMlBPVykgIT0gMCk7
CisJCQlyZXR1cm4gKHJldCA8PCBCTE9DS19DT1NUXzJQT1cpOworCQl9CisJfQorCisJcmV0dXJu
IChyZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK21hbGxvY19zcGluX3VubG9jayhwdGhy
ZWFkX211dGV4X3QgKmxvY2spCit7CisKKwlpZiAoX19pc3RocmVhZGVkKQorCQlwdGhyZWFkX211
dGV4X3VubG9jayhsb2NrKTsKK30KKworLyoKKyAqIEVuZCBzcGluIGxvY2suCisgKi8KKy8qKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKiovCisvKgorICogQmVnaW4gVXRpbGl0eSBmdW5jdGlvbnMvbWFjcm9z
LgorICovCisKKy8qIFJldHVybiB0aGUgY2h1bmsgYWRkcmVzcyBmb3IgYWxsb2NhdGlvbiBhZGRy
ZXNzIGEuICovCisjZGVmaW5lCUNIVU5LX0FERFIyQkFTRShhKQkJCQkJCVwKKwkoKHZvaWQgKiko
KHVpbnRwdHJfdCkoYSkgJiB+Y2h1bmtzaXplX21hc2spKQorCisvKiBSZXR1cm4gdGhlIGNodW5r
IG9mZnNldCBvZiBhZGRyZXNzIGEuICovCisjZGVmaW5lCUNIVU5LX0FERFIyT0ZGU0VUKGEpCQkJ
CQkJXAorCSgoc2l6ZV90KSgodWludHB0cl90KShhKSAmIGNodW5rc2l6ZV9tYXNrKSkKKworLyog
UmV0dXJuIHRoZSBzbWFsbGVzdCBjaHVuayBtdWx0aXBsZSB0aGF0IGlzID49IHMuICovCisjZGVm
aW5lCUNIVU5LX0NFSUxJTkcocykJCQkJCQlcCisJKCgocykgKyBjaHVua3NpemVfbWFzaykgJiB+
Y2h1bmtzaXplX21hc2spCisKKy8qIFJldHVybiB0aGUgc21hbGxlc3QgcXVhbnR1bSBtdWx0aXBs
ZSB0aGF0IGlzID49IGEuICovCisjZGVmaW5lCVFVQU5UVU1fQ0VJTElORyhhKQkJCQkJCVwKKwko
KChhKSArIFFVQU5UVU1fTUFTSykgJiB+UVVBTlRVTV9NQVNLKQorCisvKiBSZXR1cm4gdGhlIHNt
YWxsZXN0IGNhY2hlbGluZSBtdWx0aXBsZSB0aGF0IGlzID49IHMuICovCisjZGVmaW5lCUNBQ0hF
TElORV9DRUlMSU5HKHMpCQkJCQkJXAorCSgoKHMpICsgQ0FDSEVMSU5FX01BU0spICYgfkNBQ0hF
TElORV9NQVNLKQorCisvKiBSZXR1cm4gdGhlIHNtYWxsZXN0IHN1YnBhZ2UgbXVsdGlwbGUgdGhh
dCBpcyA+PSBzLiAqLworI2RlZmluZQlTVUJQQUdFX0NFSUxJTkcocykJCQkJCQlcCisJKCgocykg
KyBTVUJQQUdFX01BU0spICYgflNVQlBBR0VfTUFTSykKKworLyogUmV0dXJuIHRoZSBzbWFsbGVz
dCBwYWdlc2l6ZSBtdWx0aXBsZSB0aGF0IGlzID49IHMuICovCisjZGVmaW5lCVBBR0VfQ0VJTElO
RyhzKQkJCQkJCQlcCisJKCgocykgKyBwYWdlc2l6ZV9tYXNrKSAmIH5wYWdlc2l6ZV9tYXNrKQor
CisjaWZkZWYgTUFMTE9DX1RJTlkKKy8qIENvbXB1dGUgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIDIg
dGhhdCBpcyA+PSB4LiAqLworc3RhdGljIGlubGluZSBzaXplX3QKK3BvdzJfY2VpbChzaXplX3Qg
eCkKK3sKKworCXgtLTsKKwl4IHw9IHggPj4gMTsKKwl4IHw9IHggPj4gMjsKKwl4IHw9IHggPj4g
NDsKKwl4IHw9IHggPj4gODsKKwl4IHw9IHggPj4gMTY7CisjaWYgKFNJWkVPRl9QVFIgPT0gOCkK
Kwl4IHw9IHggPj4gMzI7CisjZW5kaWYKKwl4Kys7CisJcmV0dXJuICh4KTsKK30KKyNlbmRpZgor
CisjaWZkZWYgTUFMTE9DX0JBTEFOQ0UKKy8qCisgKiBVc2UgYSBzaW1wbGUgbGluZWFyIGNvbmdy
dWVudGlhbCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3I6CisgKgorICogICBwcm4oeSkg
PSAoYSp4ICsgYykgJSBtCisgKgorICogd2hlcmUgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgZW5z
dXJlIG1heGltYWwgcGVyaW9kOgorICoKKyAqICAgYSA9PSBPZGQgbnVtYmVyIChyZWxhdGl2ZWx5
IHByaW1lIHRvIDJebiksIGFuZCAoYS0xKSBpcyBhIG11bHRpcGxlIG9mIDQuCisgKiAgIGMgPT0g
T2RkIG51bWJlciAocmVsYXRpdmVseSBwcmltZSB0byAyXm4pLgorICogICBtID09IDJeMzIKKyAq
CisgKiBTZWUgS251dGgncyBUQU9DUCAzcmQgRWQuLCBWb2wuIDIsIHBnLiAxNyBmb3IgZGV0YWls
cyBvbiB0aGVzZSBjb25zdHJhaW50cy4KKyAqCisgKiBUaGlzIGNob2ljZSBvZiBtIGhhcyB0aGUg
ZGlzYWR2YW50YWdlIHRoYXQgdGhlIHF1YWxpdHkgb2YgdGhlIGJpdHMgaXMKKyAqIHByb3BvcnRp
b25hbCB0byBiaXQgcG9zaXRpb24uICBGb3IgZXhhbXBsZS4gdGhlIGxvd2VzdCBiaXQgaGFzIGEg
Y3ljbGUgb2YgMiwKKyAqIHRoZSBuZXh0IGhhcyBhIGN5Y2xlIG9mIDQsIGV0Yy4gIEZvciB0aGlz
IHJlYXNvbiwgd2UgcHJlZmVyIHRvIHVzZSB0aGUgdXBwZXIKKyAqIGJpdHMuCisgKi8KKyMgIGRl
ZmluZSBQUk5fREVGSU5FKHN1ZmZpeCwgdmFyLCBhLCBjKQkJCQkJXAorc3RhdGljIGlubGluZSB2
b2lkCQkJCQkJCVwKK3Nwcm5fIyNzdWZmaXgodWludDMyX3Qgc2VlZCkJCQkJCQlcCit7CQkJCQkJ
CQkJXAorCXZhciA9IHNlZWQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0
aWMgaW5saW5lIHVpbnQzMl90CQkJCQkJCVwKK3Bybl8jI3N1ZmZpeCh1aW50MzJfdCBsZ19yYW5n
ZSkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXVpbnQzMl90IHJldCwgeDsJCQkJCQlcCisJCQkJCQkJ
CQlcCisJYXNzZXJ0KGxnX3JhbmdlID4gMCk7CQkJCQkJXAorCWFzc2VydChsZ19yYW5nZSA8PSAz
Mik7CQkJCQkJXAorCQkJCQkJCQkJXAorCXggPSAodmFyICogKGEpKSArIChjKTsJCQkJCQlcCisJ
dmFyID0geDsJCQkJCQkJXAorCXJldCA9IHggPj4gKDMyIC0gbGdfcmFuZ2UpOwkJCQkJXAorCQkJ
CQkJCQkJXAorCXJldHVybiAocmV0KTsJCQkJCQkJXAorfQorIyAgZGVmaW5lIFNQUk4oc3VmZml4
LCBzZWVkKQlzcHJuXyMjc3VmZml4KHNlZWQpCisjICBkZWZpbmUgUFJOKHN1ZmZpeCwgbGdfcmFu
Z2UpCXBybl8jI3N1ZmZpeChsZ19yYW5nZSkKKyNlbmRpZgorCisjaWZkZWYgTUFMTE9DX0JBTEFO
Q0UKKy8qIERlZmluZSB0aGUgUFJORyB1c2VkIGZvciBhcmVuYSBhc3NpZ25tZW50LiAqLworc3Rh
dGljIF9fdGhyZWFkIHVpbnQzMl90IGJhbGFuY2VfeDsKK1BSTl9ERUZJTkUoYmFsYW5jZSwgYmFs
YW5jZV94LCAxMjk3LCAxMzAxKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisK
KyNpZmRlZiBNQUxMT0NfRFNTCitzdGF0aWMgYm9vbAorYmFzZV9wYWdlc19hbGxvY19kc3Moc2l6
ZV90IG1pbnNpemUpCit7CisKKwkvKgorCSAqIERvIHNwZWNpYWwgRFNTIGFsbG9jYXRpb24gaGVy
ZSwgc2luY2UgYmFzZSBhbGxvY2F0aW9ucyBkb24ndCBuZWVkIHRvCisJICogYmUgY2h1bmstYWxp
Z25lZC4KKwkgKi8KKwltYWxsb2NfbXV0ZXhfbG9jaygmZHNzX210eCk7CisJaWYgKGRzc19wcmV2
ICE9ICh2b2lkICopLTEpIHsKKwkJaW50cHRyX3QgaW5jcjsKKwkJc2l6ZV90IGNzaXplID0gQ0hV
TktfQ0VJTElORyhtaW5zaXplKTsKKworCQlkbyB7CisJCQkvKiBHZXQgdGhlIGN1cnJlbnQgZW5k
IG9mIHRoZSBEU1MuICovCisJCQlkc3NfbWF4ID0gc2JyaygwKTsKKworCQkJLyoKKwkJCSAqIENh
bGN1bGF0ZSBob3cgbXVjaCBwYWRkaW5nIGlzIG5lY2Vzc2FyeSB0bworCQkJICogY2h1bmstYWxp
Z24gdGhlIGVuZCBvZiB0aGUgRFNTLiAgRG9uJ3Qgd29ycnkgYWJvdXQKKwkJCSAqIGRzc19tYXgg
bm90IGJlaW5nIGNodW5rLWFsaWduZWQgdGhvdWdoLgorCQkJICovCisJCQlpbmNyID0gKGludHB0
cl90KWNodW5rc2l6ZQorCQkJICAgIC0gKGludHB0cl90KUNIVU5LX0FERFIyT0ZGU0VUKGRzc19t
YXgpOworCQkJYXNzZXJ0KGluY3IgPj0gMCk7CisJCQlpZiAoKHNpemVfdClpbmNyIDwgbWluc2l6
ZSkKKwkJCQlpbmNyICs9IGNzaXplOworCisJCQlkc3NfcHJldiA9IHNicmsoaW5jcik7CisJCQlp
ZiAoZHNzX3ByZXYgPT0gZHNzX21heCkgeworCQkJCS8qIFN1Y2Nlc3MuICovCisJCQkJZHNzX21h
eCA9ICh2b2lkICopKChpbnRwdHJfdClkc3NfcHJldiArIGluY3IpOworCQkJCWJhc2VfcGFnZXMg
PSBkc3NfcHJldjsKKwkJCQliYXNlX25leHRfYWRkciA9IGJhc2VfcGFnZXM7CisJCQkJYmFzZV9w
YXN0X2FkZHIgPSBkc3NfbWF4OworI2lmZGVmIE1BTExPQ19TVEFUUworCQkJCWJhc2VfbWFwcGVk
ICs9IGluY3I7CisjZW5kaWYKKwkJCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZkc3NfbXR4KTsKKwkJ
CQlyZXR1cm4gKGZhbHNlKTsKKwkJCX0KKwkJfSB3aGlsZSAoZHNzX3ByZXYgIT0gKHZvaWQgKikt
MSk7CisJfQorCW1hbGxvY19tdXRleF91bmxvY2soJmRzc19tdHgpOworCisJcmV0dXJuICh0cnVl
KTsKK30KKyNlbmRpZgorCitzdGF0aWMgYm9vbAorYmFzZV9wYWdlc19hbGxvY19tbWFwKHNpemVf
dCBtaW5zaXplKQoreworCXNpemVfdCBjc2l6ZTsKKworCWFzc2VydChtaW5zaXplICE9IDApOwor
CWNzaXplID0gUEFHRV9DRUlMSU5HKG1pbnNpemUpOworCWJhc2VfcGFnZXMgPSBwYWdlc19tYXAo
TlVMTCwgY3NpemUpOworCWlmIChiYXNlX3BhZ2VzID09IE5VTEwpCisJCXJldHVybiAodHJ1ZSk7
CisJYmFzZV9uZXh0X2FkZHIgPSBiYXNlX3BhZ2VzOworCWJhc2VfcGFzdF9hZGRyID0gKHZvaWQg
KikoKHVpbnRwdHJfdCliYXNlX3BhZ2VzICsgY3NpemUpOworI2lmZGVmIE1BTExPQ19TVEFUUwor
CWJhc2VfbWFwcGVkICs9IGNzaXplOworI2VuZGlmCisKKwlyZXR1cm4gKGZhbHNlKTsKK30KKwor
c3RhdGljIGJvb2wKK2Jhc2VfcGFnZXNfYWxsb2Moc2l6ZV90IG1pbnNpemUpCit7CisKKyNpZmRl
ZiBNQUxMT0NfRFNTCisJaWYgKG9wdF9kc3MpIHsKKwkJaWYgKGJhc2VfcGFnZXNfYWxsb2NfZHNz
KG1pbnNpemUpID09IGZhbHNlKQorCQkJcmV0dXJuIChmYWxzZSk7CisJfQorCisJaWYgKG9wdF9t
bWFwICYmIG1pbnNpemUgIT0gMCkKKyNlbmRpZgorCXsKKwkJaWYgKGJhc2VfcGFnZXNfYWxsb2Nf
bW1hcChtaW5zaXplKSA9PSBmYWxzZSkKKwkJCXJldHVybiAoZmFsc2UpOworCX0KKworCXJldHVy
biAodHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2Jhc2VfYWxsb2Moc2l6ZV90IHNpemUpCit7
CisJdm9pZCAqcmV0OworCXNpemVfdCBjc2l6ZTsKKworCS8qIFJvdW5kIHNpemUgdXAgdG8gbmVh
cmVzdCBtdWx0aXBsZSBvZiB0aGUgY2FjaGVsaW5lIHNpemUuICovCisJY3NpemUgPSBDQUNIRUxJ
TkVfQ0VJTElORyhzaXplKTsKKworCW1hbGxvY19tdXRleF9sb2NrKCZiYXNlX210eCk7CisJLyog
TWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGZvciB0aGUgYWxsb2NhdGlvbi4gKi8KKwlp
ZiAoKHVpbnRwdHJfdCliYXNlX25leHRfYWRkciArIGNzaXplID4gKHVpbnRwdHJfdCliYXNlX3Bh
c3RfYWRkcikgeworCQlpZiAoYmFzZV9wYWdlc19hbGxvYyhjc2l6ZSkpIHsKKwkJCW1hbGxvY19t
dXRleF91bmxvY2soJmJhc2VfbXR4KTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwl9CisJLyog
QWxsb2NhdGUuICovCisJcmV0ID0gYmFzZV9uZXh0X2FkZHI7CisJYmFzZV9uZXh0X2FkZHIgPSAo
dm9pZCAqKSgodWludHB0cl90KWJhc2VfbmV4dF9hZGRyICsgY3NpemUpOworCW1hbGxvY19tdXRl
eF91bmxvY2soJmJhc2VfbXR4KTsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHZvaWQg
KgorYmFzZV9jYWxsb2Moc2l6ZV90IG51bWJlciwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0
OworCisJcmV0ID0gYmFzZV9hbGxvYyhudW1iZXIgKiBzaXplKTsKKwltZW1zZXQocmV0LCAwLCBu
dW1iZXIgKiBzaXplKTsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGV4dGVudF9ub2Rl
X3QgKgorYmFzZV9ub2RlX2FsbG9jKHZvaWQpCit7CisJZXh0ZW50X25vZGVfdCAqcmV0OworCisJ
bWFsbG9jX211dGV4X2xvY2soJmJhc2VfbXR4KTsKKwlpZiAoYmFzZV9ub2RlcyAhPSBOVUxMKSB7
CisJCXJldCA9IGJhc2Vfbm9kZXM7CisJCWJhc2Vfbm9kZXMgPSAqKGV4dGVudF9ub2RlX3QgKiop
cmV0OworCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZiYXNlX210eCk7CisJfSBlbHNlIHsKKwkJbWFs
bG9jX211dGV4X3VubG9jaygmYmFzZV9tdHgpOworCQlyZXQgPSAoZXh0ZW50X25vZGVfdCAqKWJh
c2VfYWxsb2Moc2l6ZW9mKGV4dGVudF9ub2RlX3QpKTsKKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9
CisKK3N0YXRpYyB2b2lkCitiYXNlX25vZGVfZGVhbGxvYyhleHRlbnRfbm9kZV90ICpub2RlKQor
eworCisJbWFsbG9jX211dGV4X2xvY2soJmJhc2VfbXR4KTsKKwkqKGV4dGVudF9ub2RlX3QgKiop
bm9kZSA9IGJhc2Vfbm9kZXM7CisJYmFzZV9ub2RlcyA9IG5vZGU7CisJbWFsbG9jX211dGV4X3Vu
bG9jaygmYmFzZV9tdHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYg
TUFMTE9DX1NUQVRTCitzdGF0aWMgdm9pZAorc3RhdHNfcHJpbnQoYXJlbmFfdCAqYXJlbmEpCit7
CisJdW5zaWduZWQgaSwgZ2FwX3N0YXJ0OworCisJbWFsbG9jX3ByaW50ZigiZGlydHk6ICV6dSBw
YWdlJXMgZGlydHksICVsbHUgc3dlZXAlcywiCisJICAgICIgJWxsdSBtYWR2aXNlJXMsICVsbHUg
cGFnZSVzIHB1cmdlZFxuIiwKKwkgICAgYXJlbmEtPm5kaXJ0eSwgYXJlbmEtPm5kaXJ0eSA9PSAx
ID8gIiIgOiAicyIsCisJICAgIGFyZW5hLT5zdGF0cy5ucHVyZ2UsIGFyZW5hLT5zdGF0cy5ucHVy
Z2UgPT0gMSA/ICIiIDogInMiLAorCSAgICBhcmVuYS0+c3RhdHMubm1hZHZpc2UsIGFyZW5hLT5z
dGF0cy5ubWFkdmlzZSA9PSAxID8gIiIgOiAicyIsCisJICAgIGFyZW5hLT5zdGF0cy5wdXJnZWQs
IGFyZW5hLT5zdGF0cy5wdXJnZWQgPT0gMSA/ICIiIDogInMiKTsKKworCW1hbGxvY19wcmludGYo
IiAgICAgICAgICAgIGFsbG9jYXRlZCAgICAgIG5tYWxsb2MgICAgICBuZGFsbG9jXG4iKTsKKwlt
YWxsb2NfcHJpbnRmKCJzbWFsbDogICAlMTJ6dSAlMTJsbHUgJTEybGx1XG4iLAorCSAgICBhcmVu
YS0+c3RhdHMuYWxsb2NhdGVkX3NtYWxsLCBhcmVuYS0+c3RhdHMubm1hbGxvY19zbWFsbCwKKwkg
ICAgYXJlbmEtPnN0YXRzLm5kYWxsb2Nfc21hbGwpOworCW1hbGxvY19wcmludGYoImxhcmdlOiAg
ICUxMnp1ICUxMmxsdSAlMTJsbHVcbiIsCisJICAgIGFyZW5hLT5zdGF0cy5hbGxvY2F0ZWRfbGFy
Z2UsIGFyZW5hLT5zdGF0cy5ubWFsbG9jX2xhcmdlLAorCSAgICBhcmVuYS0+c3RhdHMubmRhbGxv
Y19sYXJnZSk7CisJbWFsbG9jX3ByaW50ZigidG90YWw6ICAgJTEyenUgJTEybGx1ICUxMmxsdVxu
IiwKKwkgICAgYXJlbmEtPnN0YXRzLmFsbG9jYXRlZF9zbWFsbCArIGFyZW5hLT5zdGF0cy5hbGxv
Y2F0ZWRfbGFyZ2UsCisJICAgIGFyZW5hLT5zdGF0cy5ubWFsbG9jX3NtYWxsICsgYXJlbmEtPnN0
YXRzLm5tYWxsb2NfbGFyZ2UsCisJICAgIGFyZW5hLT5zdGF0cy5uZGFsbG9jX3NtYWxsICsgYXJl
bmEtPnN0YXRzLm5kYWxsb2NfbGFyZ2UpOworCW1hbGxvY19wcmludGYoIm1hcHBlZDogICUxMnp1
XG4iLCBhcmVuYS0+c3RhdHMubWFwcGVkKTsKKworI2lmZGVmIE1BTExPQ19NQUcKKwlpZiAoX19p
c3RocmVhZGVkICYmIG9wdF9tYWcpIHsKKwkJbWFsbG9jX3ByaW50ZigiYmluczogICAgIGJpbiAg
IHNpemUgcmVncyBwZ3MgICAgICBtYWdzICAgIgorCQkgICAgIm5ld3J1bnMgICAgcmVydW5zIG1h
eHJ1bnMgY3VycnVuc1xuIik7CisJfSBlbHNlIHsKKyNlbmRpZgorCQltYWxsb2NfcHJpbnRmKCJi
aW5zOiAgICAgYmluICAgc2l6ZSByZWdzIHBncyAgcmVxdWVzdHMgICAiCisJCSAgICAibmV3cnVu
cyAgICByZXJ1bnMgbWF4cnVucyBjdXJydW5zXG4iKTsKKyNpZmRlZiBNQUxMT0NfTUFHCisJfQor
I2VuZGlmCisJZm9yIChpID0gMCwgZ2FwX3N0YXJ0ID0gVUlOVF9NQVg7IGkgPCBuYmluczsgaSsr
KSB7CisJCWlmIChhcmVuYS0+Ymluc1tpXS5zdGF0cy5ucnVucyA9PSAwKSB7CisJCQlpZiAoZ2Fw
X3N0YXJ0ID09IFVJTlRfTUFYKQorCQkJCWdhcF9zdGFydCA9IGk7CisJCX0gZWxzZSB7CisJCQlp
ZiAoZ2FwX3N0YXJ0ICE9IFVJTlRfTUFYKSB7CisJCQkJaWYgKGkgPiBnYXBfc3RhcnQgKyAxKSB7
CisJCQkJCS8qIEdhcCBvZiBtb3JlIHRoYW4gb25lIHNpemUgY2xhc3MuICovCisJCQkJCW1hbGxv
Y19wcmludGYoIlsldS4uJXVdXG4iLAorCQkJCQkgICAgZ2FwX3N0YXJ0LCBpIC0gMSk7CisJCQkJ
fSBlbHNlIHsKKwkJCQkJLyogR2FwIG9mIG9uZSBzaXplIGNsYXNzLiAqLworCQkJCQltYWxsb2Nf
cHJpbnRmKCJbJXVdXG4iLCBnYXBfc3RhcnQpOworCQkJCX0KKwkJCQlnYXBfc3RhcnQgPSBVSU5U
X01BWDsKKwkJCX0KKwkJCW1hbGxvY19wcmludGYoCisJCQkgICAgIiUxM3UgJTFzICU0dSAlNHUg
JTN1ICU5bGx1ICU5bGx1IgorCQkJICAgICIgJTlsbHUgJTdsdSAlN2x1XG4iLAorCQkJICAgIGks
CisJCQkgICAgaSA8IG50YmlucyA/ICJUIiA6IGkgPCBudGJpbnMgKyBucWJpbnMgPyAiUSIgOgor
CQkJICAgIGkgPCBudGJpbnMgKyBucWJpbnMgKyBuY2JpbnMgPyAiQyIgOiAiUyIsCisJCQkgICAg
YXJlbmEtPmJpbnNbaV0ucmVnX3NpemUsCisJCQkgICAgYXJlbmEtPmJpbnNbaV0ubnJlZ3MsCisJ
CQkgICAgYXJlbmEtPmJpbnNbaV0ucnVuX3NpemUgPj4gcGFnZXNpemVfMnBvdywKKyNpZmRlZiBN
QUxMT0NfTUFHCisJCQkgICAgKF9faXN0aHJlYWRlZCAmJiBvcHRfbWFnKSA/CisJCQkgICAgYXJl
bmEtPmJpbnNbaV0uc3RhdHMubm1hZ3MgOgorI2VuZGlmCisJCQkgICAgYXJlbmEtPmJpbnNbaV0u
c3RhdHMubnJlcXVlc3RzLAorCQkJICAgIGFyZW5hLT5iaW5zW2ldLnN0YXRzLm5ydW5zLAorCQkJ
ICAgIGFyZW5hLT5iaW5zW2ldLnN0YXRzLnJlcnVucywKKwkJCSAgICBhcmVuYS0+Ymluc1tpXS5z
dGF0cy5oaWdocnVucywKKwkJCSAgICBhcmVuYS0+Ymluc1tpXS5zdGF0cy5jdXJydW5zKTsKKwkJ
fQorCX0KKwlpZiAoZ2FwX3N0YXJ0ICE9IFVJTlRfTUFYKSB7CisJCWlmIChpID4gZ2FwX3N0YXJ0
ICsgMSkgeworCQkJLyogR2FwIG9mIG1vcmUgdGhhbiBvbmUgc2l6ZSBjbGFzcy4gKi8KKwkJCW1h
bGxvY19wcmludGYoIlsldS4uJXVdXG4iLCBnYXBfc3RhcnQsIGkgLSAxKTsKKwkJfSBlbHNlIHsK
KwkJCS8qIEdhcCBvZiBvbmUgc2l6ZSBjbGFzcy4gKi8KKwkJCW1hbGxvY19wcmludGYoIlsldV1c
biIsIGdhcF9zdGFydCk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIEVuZCBVdGlsaXR5
IGZ1bmN0aW9ucy9tYWNyb3MuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICog
QmVnaW4gZXh0ZW50IHRyZWUgY29kZS4KKyAqLworCisjaWZkZWYgTUFMTE9DX0RTUworc3RhdGlj
IGlubGluZSBpbnQKK2V4dGVudF9zemFkX2NvbXAoZXh0ZW50X25vZGVfdCAqYSwgZXh0ZW50X25v
ZGVfdCAqYikKK3sKKwlpbnQgcmV0OworCXNpemVfdCBhX3NpemUgPSBhLT5zaXplOworCXNpemVf
dCBiX3NpemUgPSBiLT5zaXplOworCisJcmV0ID0gKGFfc2l6ZSA+IGJfc2l6ZSkgLSAoYV9zaXpl
IDwgYl9zaXplKTsKKwlpZiAocmV0ID09IDApIHsKKwkJdWludHB0cl90IGFfYWRkciA9ICh1aW50
cHRyX3QpYS0+YWRkcjsKKwkJdWludHB0cl90IGJfYWRkciA9ICh1aW50cHRyX3QpYi0+YWRkcjsK
KworCQlyZXQgPSAoYV9hZGRyID4gYl9hZGRyKSAtIChhX2FkZHIgPCBiX2FkZHIpOworCX0KKwor
CXJldHVybiAocmV0KTsKK30KKworLyogV3JhcCByZWQtYmxhY2sgdHJlZSBtYWNyb3MgaW4gZnVu
Y3Rpb25zLiAqLworcmJfd3JhcChzdGF0aWMsIGV4dGVudF90cmVlX3N6YWRfLCBleHRlbnRfdHJl
ZV90LCBleHRlbnRfbm9kZV90LAorICAgIGxpbmtfc3phZCwgZXh0ZW50X3N6YWRfY29tcCkKKyNl
bmRpZgorCitzdGF0aWMgaW5saW5lIGludAorZXh0ZW50X2FkX2NvbXAoZXh0ZW50X25vZGVfdCAq
YSwgZXh0ZW50X25vZGVfdCAqYikKK3sKKwl1aW50cHRyX3QgYV9hZGRyID0gKHVpbnRwdHJfdClh
LT5hZGRyOworCXVpbnRwdHJfdCBiX2FkZHIgPSAodWludHB0cl90KWItPmFkZHI7CisKKwlyZXR1
cm4gKChhX2FkZHIgPiBiX2FkZHIpIC0gKGFfYWRkciA8IGJfYWRkcikpOworfQorCisvKiBXcmFw
IHJlZC1ibGFjayB0cmVlIG1hY3JvcyBpbiBmdW5jdGlvbnMuICovCityYl93cmFwKHN0YXRpYywg
ZXh0ZW50X3RyZWVfYWRfLCBleHRlbnRfdHJlZV90LCBleHRlbnRfbm9kZV90LCBsaW5rX2FkLAor
ICAgIGV4dGVudF9hZF9jb21wKQorCisvKgorICogRW5kIGV4dGVudCB0cmVlIGNvZGUuCisgKi8K
Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQmVnaW4gY2h1bmsgbWFuYWdlbWVudCBm
dW5jdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQgKgorcGFnZXNfbWFwKHZvaWQgKmFkZHIsIHNp
emVfdCBzaXplKQoreworCXZvaWQgKnJldDsKKworCS8qCisJICogV2UgZG9uJ3QgdXNlIE1BUF9G
SVhFRCBoZXJlLCBiZWNhdXNlIGl0IGNhbiBjYXVzZSB0aGUgKnJlcGxhY2VtZW50KgorCSAqIG9m
IGV4aXN0aW5nIG1hcHBpbmdzLCBhbmQgd2Ugb25seSB3YW50IHRvIGNyZWF0ZSBuZXcgbWFwcGlu
Z3MuCisJICovCisJcmV0ID0gbW1hcChhZGRyLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRF
LCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAorCSAgICAtMSwgMCk7CisJYXNzZXJ0KHJldCAhPSBO
VUxMKTsKKworCWlmIChyZXQgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0ID0gTlVMTDsKKwllbHNlIGlm
IChhZGRyICE9IE5VTEwgJiYgcmV0ICE9IGFkZHIpIHsKKwkJLyoKKwkJICogV2Ugc3VjY2VlZGVk
IGluIG1hcHBpbmcgbWVtb3J5LCBidXQgbm90IGluIHRoZSByaWdodCBwbGFjZS4KKwkJICovCisJ
CWlmIChtdW5tYXAocmV0LCBzaXplKSA9PSAtMSkgeworCQkJY2hhciBidWZbU1RSRVJST1JfQlVG
XTsKKworCQkJc3RyZXJyb3JfcihlcnJubywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQlfbWFsbG9j
X21lc3NhZ2UoX2dldHByb2duYW1lKCksCisJCQkgICAgIjogKG1hbGxvYykgRXJyb3IgaW4gbXVu
bWFwKCk6ICIsIGJ1ZiwgIlxuIik7CisJCQlpZiAob3B0X2Fib3J0KQorCQkJCWFib3J0KCk7CisJ
CX0KKwkJcmV0ID0gTlVMTDsKKwl9CisKKwlhc3NlcnQocmV0ID09IE5VTEwgfHwgKGFkZHIgPT0g
TlVMTCAmJiByZXQgIT0gYWRkcikKKwkgICAgfHwgKGFkZHIgIT0gTlVMTCAmJiByZXQgPT0gYWRk
cikpOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHZvaWQKK3BhZ2VzX3VubWFwKHZvaWQg
KmFkZHIsIHNpemVfdCBzaXplKQoreworCisJaWYgKG11bm1hcChhZGRyLCBzaXplKSA9PSAtMSkg
eworCQljaGFyIGJ1ZltTVFJFUlJPUl9CVUZdOworCisJCXN0cmVycm9yX3IoZXJybm8sIGJ1Ziwg
c2l6ZW9mKGJ1ZikpOworCQlfbWFsbG9jX21lc3NhZ2UoX2dldHByb2duYW1lKCksCisJCSAgICAi
OiAobWFsbG9jKSBFcnJvciBpbiBtdW5tYXAoKTogIiwgYnVmLCAiXG4iKTsKKwkJaWYgKG9wdF9h
Ym9ydCkKKwkJCWFib3J0KCk7CisJfQorfQorCisjaWZkZWYgTUFMTE9DX0RTUworc3RhdGljIHZv
aWQgKgorY2h1bmtfYWxsb2NfZHNzKHNpemVfdCBzaXplKQoreworCisJLyoKKwkgKiBzYnJrKCkg
dXNlcyBhIHNpZ25lZCBpbmNyZW1lbnQgYXJndW1lbnQsIHNvIHRha2UgY2FyZSBub3QgdG8KKwkg
KiBpbnRlcnByZXQgYSBodWdlIGFsbG9jYXRpb24gcmVxdWVzdCBhcyBhIG5lZ2F0aXZlIGluY3Jl
bWVudC4KKwkgKi8KKwlpZiAoKGludHB0cl90KXNpemUgPCAwKQorCQlyZXR1cm4gKE5VTEwpOwor
CisJbWFsbG9jX211dGV4X2xvY2soJmRzc19tdHgpOworCWlmIChkc3NfcHJldiAhPSAodm9pZCAq
KS0xKSB7CisJCWludHB0cl90IGluY3I7CisKKwkJLyoKKwkJICogVGhlIGxvb3AgaXMgbmVjZXNz
YXJ5IHRvIHJlY292ZXIgZnJvbSByYWNlcyB3aXRoIG90aGVyCisJCSAqIHRocmVhZHMgdGhhdCBh
cmUgdXNpbmcgdGhlIERTUyBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4KKwkJICogbWFsbG9jLgor
CQkgKi8KKwkJZG8geworCQkJdm9pZCAqcmV0OworCisJCQkvKiBHZXQgdGhlIGN1cnJlbnQgZW5k
IG9mIHRoZSBEU1MuICovCisJCQlkc3NfbWF4ID0gc2JyaygwKTsKKworCQkJLyoKKwkJCSAqIENh
bGN1bGF0ZSBob3cgbXVjaCBwYWRkaW5nIGlzIG5lY2Vzc2FyeSB0bworCQkJICogY2h1bmstYWxp
Z24gdGhlIGVuZCBvZiB0aGUgRFNTLgorCQkJICovCisJCQlpbmNyID0gKGludHB0cl90KXNpemUK
KwkJCSAgICAtIChpbnRwdHJfdClDSFVOS19BRERSMk9GRlNFVChkc3NfbWF4KTsKKwkJCWlmIChp
bmNyID09IChpbnRwdHJfdClzaXplKQorCQkJCXJldCA9IGRzc19tYXg7CisJCQllbHNlIHsKKwkJ
CQlyZXQgPSAodm9pZCAqKSgoaW50cHRyX3QpZHNzX21heCArIGluY3IpOworCQkJCWluY3IgKz0g
c2l6ZTsKKwkJCX0KKworCQkJZHNzX3ByZXYgPSBzYnJrKGluY3IpOworCQkJaWYgKGRzc19wcmV2
ID09IGRzc19tYXgpIHsKKwkJCQkvKiBTdWNjZXNzLiAqLworCQkJCWRzc19tYXggPSAodm9pZCAq
KSgoaW50cHRyX3QpZHNzX3ByZXYgKyBpbmNyKTsKKwkJCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZk
c3NfbXR4KTsKKwkJCQlyZXR1cm4gKHJldCk7CisJCQl9CisJCX0gd2hpbGUgKGRzc19wcmV2ICE9
ICh2b2lkICopLTEpOworCX0KKwltYWxsb2NfbXV0ZXhfdW5sb2NrKCZkc3NfbXR4KTsKKworCXJl
dHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2NodW5rX3JlY3ljbGVfZHNzKHNpemVf
dCBzaXplLCBib29sIHplcm8pCit7CisJZXh0ZW50X25vZGVfdCAqbm9kZSwga2V5OworCisJa2V5
LmFkZHIgPSBOVUxMOworCWtleS5zaXplID0gc2l6ZTsKKwltYWxsb2NfbXV0ZXhfbG9jaygmZHNz
X210eCk7CisJbm9kZSA9IGV4dGVudF90cmVlX3N6YWRfbnNlYXJjaCgmZHNzX2NodW5rc19zemFk
LCAma2V5KTsKKwlpZiAobm9kZSAhPSBOVUxMKSB7CisJCXZvaWQgKnJldCA9IG5vZGUtPmFkZHI7
CisKKwkJLyogUmVtb3ZlIG5vZGUgZnJvbSB0aGUgdHJlZS4gKi8KKwkJZXh0ZW50X3RyZWVfc3ph
ZF9yZW1vdmUoJmRzc19jaHVua3Nfc3phZCwgbm9kZSk7CisJCWlmIChub2RlLT5zaXplID09IHNp
emUpIHsKKwkJCWV4dGVudF90cmVlX2FkX3JlbW92ZSgmZHNzX2NodW5rc19hZCwgbm9kZSk7CisJ
CQliYXNlX25vZGVfZGVhbGxvYyhub2RlKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJbnNl
cnQgdGhlIHJlbWFpbmRlciBvZiBub2RlJ3MgYWRkcmVzcyByYW5nZSBhcyBhCisJCQkgKiBzbWFs
bGVyIGNodW5rLiAgSXRzIHBvc2l0aW9uIHdpdGhpbiBkc3NfY2h1bmtzX2FkCisJCQkgKiBkb2Vz
IG5vdCBjaGFuZ2UuCisJCQkgKi8KKwkJCWFzc2VydChub2RlLT5zaXplID4gc2l6ZSk7CisJCQlu
b2RlLT5hZGRyID0gKHZvaWQgKikoKHVpbnRwdHJfdClub2RlLT5hZGRyICsgc2l6ZSk7CisJCQlu
b2RlLT5zaXplIC09IHNpemU7CisJCQlleHRlbnRfdHJlZV9zemFkX2luc2VydCgmZHNzX2NodW5r
c19zemFkLCBub2RlKTsKKwkJfQorCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZkc3NfbXR4KTsKKwor
CQlpZiAoemVybykKKwkJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQlyZXR1cm4gKHJldCk7CisJ
fQorCW1hbGxvY19tdXRleF91bmxvY2soJmRzc19tdHgpOworCisJcmV0dXJuIChOVUxMKTsKK30K
KyNlbmRpZgorCitzdGF0aWMgdm9pZCAqCitjaHVua19hbGxvY19tbWFwKHNpemVfdCBzaXplKQor
eworCXZvaWQgKnJldDsKKwlzaXplX3Qgb2Zmc2V0OworCisJLyoKKwkgKiBJZGVhbGx5LCB0aGVy
ZSB3b3VsZCBiZSBhIHdheSB0byBzcGVjaWZ5IGFsaWdubWVudCB0byBtbWFwKCkgKGxpa2UKKwkg
KiBOZXRCU0QgaGFzKSwgYnV0IGluIHRoZSBhYnNlbmNlIG9mIHN1Y2ggYSBmZWF0dXJlLCB3ZSBo
YXZlIHRvIHdvcmsKKwkgKiBoYXJkIHRvIGVmZmljaWVudGx5IGNyZWF0ZSBhbGlnbmVkIG1hcHBp
bmdzLiAgVGhlIHJlbGlhYmxlLCBidXQKKwkgKiBleHBlbnNpdmUgbWV0aG9kIGlzIHRvIGNyZWF0
ZSBhIG1hcHBpbmcgdGhhdCBpcyBvdmVyLXNpemVkLCB0aGVuCisJICogdHJpbSB0aGUgZXhjZXNz
LiAgSG93ZXZlciwgdGhhdCBhbHdheXMgcmVzdWx0cyBpbiBhdCBsZWFzdCBvbmUgY2FsbAorCSAq
IHRvIHBhZ2VzX3VubWFwKCkuCisJICoKKwkgKiBBIG1vcmUgb3B0aW1pc3RpYyBhcHByb2FjaCBp
cyB0byB0cnkgbWFwcGluZyBwcmVjaXNlbHkgdGhlIHJpZ2h0CisJICogYW1vdW50LCB0aGVuIHRy
eSB0byBhcHBlbmQgYW5vdGhlciBtYXBwaW5nIGlmIGFsaWdubWVudCBpcyBvZmYuICBJbgorCSAq
IHByYWN0aWNlLCB0aGlzIHdvcmtzIG91dCB3ZWxsIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9u
IGlzIG5vdAorCSAqIGludGVybGVhdmluZyBtYXBwaW5ncyB2aWEgZGlyZWN0IG1tYXAoKSBjYWxs
cy4gIElmIHdlIGRvIHJ1biBpbnRvIGEKKwkgKiBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgYW4g
aW50ZXJsZWF2ZWQgbWFwcGluZyBhbmQgd2UgYXJlIHVuYWJsZSB0bworCSAqIGV4dGVuZCBhbiB1
bmFsaWduZWQgbWFwcGluZywgb3VyIGJlc3Qgb3B0aW9uIGlzIHRvIG1vbWVudGFyaWx5CisJICog
cmV2ZXJ0IHRvIHRoZSByZWxpYWJsZS1idXQtZXhwZW5zaXZlIG1ldGhvZC4gIFRoaXMgd2lsbCB0
ZW5kIHRvCisJICogbGVhdmUgYSBnYXAgaW4gdGhlIG1lbW9yeSBtYXAgdGhhdCBpcyB0b28gc21h
bGwgdG8gY2F1c2UgbGF0ZXIKKwkgKiBwcm9ibGVtcyBmb3IgdGhlIG9wdGltaXN0aWMgbWV0aG9k
LgorCSAqLworCisJcmV0ID0gcGFnZXNfbWFwKE5VTEwsIHNpemUpOworCWlmIChyZXQgPT0gTlVM
TCkKKwkJcmV0dXJuIChOVUxMKTsKKworCW9mZnNldCA9IENIVU5LX0FERFIyT0ZGU0VUKHJldCk7
CisJaWYgKG9mZnNldCAhPSAwKSB7CisJCS8qIFRyeSB0byBleHRlbmQgY2h1bmsgYm91bmRhcnku
ICovCisJCWlmIChwYWdlc19tYXAoKHZvaWQgKikoKHVpbnRwdHJfdClyZXQgKyBzaXplKSwKKwkJ
ICAgIGNodW5rc2l6ZSAtIG9mZnNldCkgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIEV4dGVuc2lv
biBmYWlsZWQuICBDbGVhbiB1cCwgdGhlbiByZXZlcnQgdG8gdGhlCisJCQkgKiByZWxpYWJsZS1i
dXQtZXhwZW5zaXZlIG1ldGhvZC4KKwkJCSAqLworCQkJcGFnZXNfdW5tYXAocmV0LCBzaXplKTsK
KworCQkJLyogQmV3YXJlIHNpemVfdCB3cmFwLWFyb3VuZC4gKi8KKwkJCWlmIChzaXplICsgY2h1
bmtzaXplIDw9IHNpemUpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCXJldCA9IHBhZ2VzX21hcChO
VUxMLCBzaXplICsgY2h1bmtzaXplKTsKKwkJCWlmIChyZXQgPT0gTlVMTCkKKwkJCQlyZXR1cm4g
KE5VTEwpOworCisJCQkvKiBDbGVhbiB1cCB1bm5lZWRlZCBsZWFkaW5nL3RyYWlsaW5nIHNwYWNl
LiAqLworCQkJb2Zmc2V0ID0gQ0hVTktfQUREUjJPRkZTRVQocmV0KTsKKwkJCWlmIChvZmZzZXQg
IT0gMCkgeworCQkJCS8qIExlYWRpbmcgc3BhY2UuICovCisJCQkJcGFnZXNfdW5tYXAocmV0LCBj
aHVua3NpemUgLSBvZmZzZXQpOworCisJCQkJcmV0ID0gKHZvaWQgKikoKHVpbnRwdHJfdClyZXQg
KworCQkJCSAgICAoY2h1bmtzaXplIC0gb2Zmc2V0KSk7CisKKwkJCQkvKiBUcmFpbGluZyBzcGFj
ZS4gKi8KKwkJCQlwYWdlc191bm1hcCgodm9pZCAqKSgodWludHB0cl90KXJldCArIHNpemUpLAor
CQkJCSAgICBvZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUcmFpbGluZyBzcGFjZSBvbmx5
LiAqLworCQkJCXBhZ2VzX3VubWFwKCh2b2lkICopKCh1aW50cHRyX3QpcmV0ICsgc2l6ZSksCisJ
CQkJICAgIGNodW5rc2l6ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDbGVhbiB1cCB1bm5l
ZWRlZCBsZWFkaW5nIHNwYWNlLiAqLworCQkJcGFnZXNfdW5tYXAocmV0LCBjaHVua3NpemUgLSBv
ZmZzZXQpOworCQkJcmV0ID0gKHZvaWQgKikoKHVpbnRwdHJfdClyZXQgKyAoY2h1bmtzaXplIC0g
b2Zmc2V0KSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkICoK
K2NodW5rX2FsbG9jKHNpemVfdCBzaXplLCBib29sIHplcm8pCit7CisJdm9pZCAqcmV0OworCisJ
YXNzZXJ0KHNpemUgIT0gMCk7CisJYXNzZXJ0KChzaXplICYgY2h1bmtzaXplX21hc2spID09IDAp
OworCisjaWZkZWYgTUFMTE9DX0RTUworCWlmIChvcHRfZHNzKSB7CisJCXJldCA9IGNodW5rX3Jl
Y3ljbGVfZHNzKHNpemUsIHplcm8pOworCQlpZiAocmV0ICE9IE5VTEwpIHsKKwkJCWdvdG8gUkVU
VVJOOworCQl9CisKKwkJcmV0ID0gY2h1bmtfYWxsb2NfZHNzKHNpemUpOworCQlpZiAocmV0ICE9
IE5VTEwpCisJCQlnb3RvIFJFVFVSTjsKKwl9CisKKwlpZiAob3B0X21tYXApCisjZW5kaWYKKwl7
CisJCXJldCA9IGNodW5rX2FsbG9jX21tYXAoc2l6ZSk7CisJCWlmIChyZXQgIT0gTlVMTCkKKwkJ
CWdvdG8gUkVUVVJOOworCX0KKworCS8qIEFsbCBzdHJhdGVnaWVzIGZvciBhbGxvY2F0aW9uIGZh
aWxlZC4gKi8KKwlyZXQgPSBOVUxMOworUkVUVVJOOgorI2lmZGVmIE1BTExPQ19TVEFUUworCWlm
IChyZXQgIT0gTlVMTCkgeworCQlzdGF0c19jaHVua3MubmNodW5rcyArPSAoc2l6ZSAvIGNodW5r
c2l6ZSk7CisJCXN0YXRzX2NodW5rcy5jdXJjaHVua3MgKz0gKHNpemUgLyBjaHVua3NpemUpOwor
CX0KKwlpZiAoc3RhdHNfY2h1bmtzLmN1cmNodW5rcyA+IHN0YXRzX2NodW5rcy5oaWdoY2h1bmtz
KQorCQlzdGF0c19jaHVua3MuaGlnaGNodW5rcyA9IHN0YXRzX2NodW5rcy5jdXJjaHVua3M7Cisj
ZW5kaWYKKworCWFzc2VydChDSFVOS19BRERSMkJBU0UocmV0KSA9PSByZXQpOworCXJldHVybiAo
cmV0KTsKK30KKworI2lmZGVmIE1BTExPQ19EU1MKK3N0YXRpYyBleHRlbnRfbm9kZV90ICoKK2No
dW5rX2RlYWxsb2NfZHNzX3JlY29yZCh2b2lkICpjaHVuaywgc2l6ZV90IHNpemUpCit7CisJZXh0
ZW50X25vZGVfdCAqbm9kZSwgKnByZXYsIGtleTsKKworCWtleS5hZGRyID0gKHZvaWQgKikoKHVp
bnRwdHJfdCljaHVuayArIHNpemUpOworCW5vZGUgPSBleHRlbnRfdHJlZV9hZF9uc2VhcmNoKCZk
c3NfY2h1bmtzX2FkLCAma2V5KTsKKwkvKiBUcnkgdG8gY29hbGVzY2UgZm9yd2FyZC4gKi8KKwlp
ZiAobm9kZSAhPSBOVUxMICYmIG5vZGUtPmFkZHIgPT0ga2V5LmFkZHIpIHsKKwkJLyoKKwkJICog
Q29hbGVzY2UgY2h1bmsgd2l0aCB0aGUgZm9sbG93aW5nIGFkZHJlc3MgcmFuZ2UuICBUaGlzIGRv
ZXMKKwkJICogbm90IGNoYW5nZSB0aGUgcG9zaXRpb24gd2l0aGluIGRzc19jaHVua3NfYWQsIHNv
IG9ubHkKKwkJICogcmVtb3ZlL2luc2VydCBmcm9tL2ludG8gZHNzX2NodW5rc19zemFkLgorCQkg
Ki8KKwkJZXh0ZW50X3RyZWVfc3phZF9yZW1vdmUoJmRzc19jaHVua3Nfc3phZCwgbm9kZSk7CisJ
CW5vZGUtPmFkZHIgPSBjaHVuazsKKwkJbm9kZS0+c2l6ZSArPSBzaXplOworCQlleHRlbnRfdHJl
ZV9zemFkX2luc2VydCgmZHNzX2NodW5rc19zemFkLCBub2RlKTsKKwl9IGVsc2UgeworCQkvKgor
CQkgKiBDb2FsZXNjaW5nIGZvcndhcmQgZmFpbGVkLCBzbyBpbnNlcnQgYSBuZXcgbm9kZS4gIERy
b3AKKwkJICogZHNzX210eCBkdXJpbmcgbm9kZSBhbGxvY2F0aW9uLCBzaW5jZSBpdCBpcyBwb3Nz
aWJsZSB0aGF0IGEKKwkJICogbmV3IGJhc2UgY2h1bmsgd2lsbCBiZSBhbGxvY2F0ZWQuCisJCSAq
LworCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZkc3NfbXR4KTsKKwkJbm9kZSA9IGJhc2Vfbm9kZV9h
bGxvYygpOworCQltYWxsb2NfbXV0ZXhfbG9jaygmZHNzX210eCk7CisJCWlmIChub2RlID09IE5V
TEwpCisJCQlyZXR1cm4gKE5VTEwpOworCQlub2RlLT5hZGRyID0gY2h1bms7CisJCW5vZGUtPnNp
emUgPSBzaXplOworCQlleHRlbnRfdHJlZV9hZF9pbnNlcnQoJmRzc19jaHVua3NfYWQsIG5vZGUp
OworCQlleHRlbnRfdHJlZV9zemFkX2luc2VydCgmZHNzX2NodW5rc19zemFkLCBub2RlKTsKKwl9
CisKKwkvKiBUcnkgdG8gY29hbGVzY2UgYmFja3dhcmQuICovCisJcHJldiA9IGV4dGVudF90cmVl
X2FkX3ByZXYoJmRzc19jaHVua3NfYWQsIG5vZGUpOworCWlmIChwcmV2ICE9IE5VTEwgJiYgKHZv
aWQgKikoKHVpbnRwdHJfdClwcmV2LT5hZGRyICsgcHJldi0+c2l6ZSkgPT0KKwkgICAgY2h1bmsp
IHsKKwkJLyoKKwkJICogQ29hbGVzY2UgY2h1bmsgd2l0aCB0aGUgcHJldmlvdXMgYWRkcmVzcyBy
YW5nZS4gIFRoaXMgZG9lcworCQkgKiBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbiB3aXRoaW4gZHNz
X2NodW5rc19hZCwgc28gb25seQorCQkgKiByZW1vdmUvaW5zZXJ0IG5vZGUgZnJvbS9pbnRvIGRz
c19jaHVua3Nfc3phZC4KKwkJICovCisJCWV4dGVudF90cmVlX3N6YWRfcmVtb3ZlKCZkc3NfY2h1
bmtzX3N6YWQsIHByZXYpOworCQlleHRlbnRfdHJlZV9hZF9yZW1vdmUoJmRzc19jaHVua3NfYWQs
IHByZXYpOworCisJCWV4dGVudF90cmVlX3N6YWRfcmVtb3ZlKCZkc3NfY2h1bmtzX3N6YWQsIG5v
ZGUpOworCQlub2RlLT5hZGRyID0gcHJldi0+YWRkcjsKKwkJbm9kZS0+c2l6ZSArPSBwcmV2LT5z
aXplOworCQlleHRlbnRfdHJlZV9zemFkX2luc2VydCgmZHNzX2NodW5rc19zemFkLCBub2RlKTsK
KworCQliYXNlX25vZGVfZGVhbGxvYyhwcmV2KTsKKwl9CisKKwlyZXR1cm4gKG5vZGUpOworfQor
CitzdGF0aWMgYm9vbAorY2h1bmtfZGVhbGxvY19kc3Modm9pZCAqY2h1bmssIHNpemVfdCBzaXpl
KQoreworCisJbWFsbG9jX211dGV4X2xvY2soJmRzc19tdHgpOworCWlmICgodWludHB0cl90KWNo
dW5rID49ICh1aW50cHRyX3QpZHNzX2Jhc2UKKwkgICAgJiYgKHVpbnRwdHJfdCljaHVuayA8ICh1
aW50cHRyX3QpZHNzX21heCkgeworCQlleHRlbnRfbm9kZV90ICpub2RlOworCisJCS8qIFRyeSB0
byBjb2FsZXNjZSB3aXRoIG90aGVyIHVudXNlZCBjaHVua3MuICovCisJCW5vZGUgPSBjaHVua19k
ZWFsbG9jX2Rzc19yZWNvcmQoY2h1bmssIHNpemUpOworCQlpZiAobm9kZSAhPSBOVUxMKSB7CisJ
CQljaHVuayA9IG5vZGUtPmFkZHI7CisJCQlzaXplID0gbm9kZS0+c2l6ZTsKKwkJfQorCisJCS8q
IEdldCB0aGUgY3VycmVudCBlbmQgb2YgdGhlIERTUy4gKi8KKwkJZHNzX21heCA9IHNicmsoMCk7
CisKKwkJLyoKKwkJICogVHJ5IHRvIHNocmluayB0aGUgRFNTIGlmIHRoaXMgY2h1bmsgaXMgYXQg
dGhlIGVuZCBvZiB0aGUKKwkJICogRFNTLiAgVGhlIHNicmsoKSBjYWxsIGhlcmUgaXMgc3ViamVj
dCB0byBhIHJhY2UgY29uZGl0aW9uCisJCSAqIHdpdGggdGhyZWFkcyB0aGF0IHVzZSBicmsoMikg
b3Igc2JyaygyKSBkaXJlY3RseSwgYnV0IHRoZQorCQkgKiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0
byBsZWFrIG1lbW9yeSBmb3IgdGhlIHNha2Ugb2YgcG9vcmx5CisJCSAqIGRlc2lnbmVkIG11bHRp
LXRocmVhZGVkIHByb2dyYW1zLgorCQkgKi8KKwkJaWYgKCh2b2lkICopKCh1aW50cHRyX3QpY2h1
bmsgKyBzaXplKSA9PSBkc3NfbWF4CisJCSAgICAmJiAoZHNzX3ByZXYgPSBzYnJrKC0oaW50cHRy
X3Qpc2l6ZSkpID09IGRzc19tYXgpIHsKKwkJCS8qIFN1Y2Nlc3MuICovCisJCQlkc3NfbWF4ID0g
KHZvaWQgKikoKGludHB0cl90KWRzc19wcmV2IC0gKGludHB0cl90KXNpemUpOworCisJCQlpZiAo
bm9kZSAhPSBOVUxMKSB7CisJCQkJZXh0ZW50X3RyZWVfc3phZF9yZW1vdmUoJmRzc19jaHVua3Nf
c3phZCwgbm9kZSk7CisJCQkJZXh0ZW50X3RyZWVfYWRfcmVtb3ZlKCZkc3NfY2h1bmtzX2FkLCBu
b2RlKTsKKwkJCQliYXNlX25vZGVfZGVhbGxvYyhub2RlKTsKKwkJCX0KKwkJCW1hbGxvY19tdXRl
eF91bmxvY2soJmRzc19tdHgpOworCQl9IGVsc2UgeworCQkJbWFsbG9jX211dGV4X3VubG9jaygm
ZHNzX210eCk7CisJCQltYWR2aXNlKGNodW5rLCBzaXplLCBNQURWX0RPTlRORUVEKTsKKwkJfQor
CisJCXJldHVybiAoZmFsc2UpOworCX0KKwltYWxsb2NfbXV0ZXhfdW5sb2NrKCZkc3NfbXR4KTsK
KworCXJldHVybiAodHJ1ZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2NodW5rX2RlYWxs
b2NfbW1hcCh2b2lkICpjaHVuaywgc2l6ZV90IHNpemUpCit7CisKKwlwYWdlc191bm1hcChjaHVu
aywgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaHVua19kZWFsbG9jKHZvaWQgKmNodW5rLCBz
aXplX3Qgc2l6ZSkKK3sKKworCWFzc2VydChjaHVuayAhPSBOVUxMKTsKKwlhc3NlcnQoQ0hVTktf
QUREUjJCQVNFKGNodW5rKSA9PSBjaHVuayk7CisJYXNzZXJ0KHNpemUgIT0gMCk7CisJYXNzZXJ0
KChzaXplICYgY2h1bmtzaXplX21hc2spID09IDApOworCisjaWZkZWYgTUFMTE9DX1NUQVRTCisJ
c3RhdHNfY2h1bmtzLmN1cmNodW5rcyAtPSAoc2l6ZSAvIGNodW5rc2l6ZSk7CisjZW5kaWYKKwor
I2lmZGVmIE1BTExPQ19EU1MKKwlpZiAob3B0X2RzcykgeworCQlpZiAoY2h1bmtfZGVhbGxvY19k
c3MoY2h1bmssIHNpemUpID09IGZhbHNlKQorCQkJcmV0dXJuOworCX0KKworCWlmIChvcHRfbW1h
cCkKKyNlbmRpZgorCQljaHVua19kZWFsbG9jX21tYXAoY2h1bmssIHNpemUpOworfQorCisvKgor
ICogRW5kIGNodW5rIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgorICovCisvKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqLworLyoKKyAqIEJlZ2luIGFyZW5hLgorICovCisKKy8qCisgKiBDaG9vc2UgYW4gYXJl
bmEgYmFzZWQgb24gYSBwZXItdGhyZWFkIHZhbHVlIChmYXN0LXBhdGggY29kZSwgY2FsbHMgc2xv
dy1wYXRoCisgKiBjb2RlIGlmIG5lY2Vzc2FyeSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgYXJlbmFf
dCAqCitjaG9vc2VfYXJlbmEodm9pZCkKK3sKKwlhcmVuYV90ICpyZXQ7CisKKwkvKgorCSAqIFdl
IGNhbiBvbmx5IHVzZSBUTFMgaWYgdGhpcyBpcyBhIFBJQyBsaWJyYXJ5LCBzaW5jZSBmb3IgdGhl
IHN0YXRpYworCSAqIGxpYnJhcnkgdmVyc2lvbiwgbGliYydzIG1hbGxvYyBpcyB1c2VkIGJ5IFRM
UyBhbGxvY2F0aW9uLCB3aGljaAorCSAqIGludHJvZHVjZXMgYSBib290c3RyYXBwaW5nIGlzc3Vl
LgorCSAqLworI2lmbmRlZiBOT19UTFMKKwlpZiAoX19pc3RocmVhZGVkID09IGZhbHNlKSB7CisJ
ICAgIC8qIEF2b2lkIHRoZSBvdmVyaGVhZCBvZiBUTFMgZm9yIHNpbmdsZS10aHJlYWRlZCBvcGVy
YXRpb24uICovCisJICAgIHJldHVybiAoYXJlbmFzWzBdKTsKKwl9CisKKwlyZXQgPSBhcmVuYXNf
bWFwOworCWlmIChyZXQgPT0gTlVMTCkgeworCQlyZXQgPSBjaG9vc2VfYXJlbmFfaGFyZCgpOwor
CQlhc3NlcnQocmV0ICE9IE5VTEwpOworCX0KKyNlbHNlCisJaWYgKF9faXN0aHJlYWRlZCAmJiBu
YXJlbmFzID4gMSkgeworCQl1bnNpZ25lZCBsb25nIGluZDsKKworCQkvKgorCQkgKiBIYXNoIHB0
aHJlYWRfc2VsZigpIHRvIG9uZSBvZiB0aGUgYXJlbmFzLiAgVGhlcmUgaXMgYSBwcmltZQorCQkg
KiBudW1iZXIgb2YgYXJlbmFzLCBzbyB0aGlzIGhhcyBhIHJlYXNvbmFibGUgY2hhbmNlIG9mCisJ
CSAqIHdvcmtpbmcuICBFdmVuIHNvLCB0aGUgaGFzaGluZyBjYW4gYmUgZWFzaWx5IHRod2FydGVk
IGJ5CisJCSAqIGluY29udmVuaWVudCBwdGhyZWFkX3NlbGYoKSB2YWx1ZXMuICBXaXRob3V0IHNw
ZWNpZmljCisJCSAqIGtub3dsZWRnZSBvZiBob3cgcHRocmVhZF9zZWxmKCkgY2FsY3VsYXRlcyB2
YWx1ZXMsIHdlIGNhbid0CisJCSAqIGVhc2lseSBkbyBtdWNoIGJldHRlciB0aGFuIHRoaXMuCisJ
CSAqLworCQlpbmQgPSAodW5zaWduZWQgbG9uZykgcHRocmVhZF9zZWxmKCkgJSBuYXJlbmFzOwor
CisJCS8qCisJCSAqIE9wdGltaXN0aWFsbHkgYXNzdW1lIHRoYXQgYXJlbmFzW2luZF0gaGFzIGJl
ZW4gaW5pdGlhbGl6ZWQuCisJCSAqIEF0IHdvcnN0LCB3ZSBmaW5kIG91dCB0aGF0IHNvbWUgb3Ro
ZXIgdGhyZWFkIGhhcyBhbHJlYWR5CisJCSAqIGRvbmUgc28sIGFmdGVyIGFjcXVpcmluZyB0aGUg
bG9jayBpbiBwcmVwYXJhdGlvbi4gIE5vdGUgdGhhdAorCQkgKiB0aGlzIGxhenkgbG9ja2luZyBh
bHNvIGhhcyB0aGUgZWZmZWN0IG9mIGxhemlseSBmb3JjaW5nCisJCSAqIGNhY2hlIGNvaGVyZW5j
eTsgd2l0aG91dCB0aGUgbG9jayBhY3F1aXNpdGlvbiwgdGhlcmUncyBubworCQkgKiBndWFyYW50
ZWUgdGhhdCBtb2RpZmljYXRpb24gb2YgYXJlbmFzW2luZF0gYnkgYW5vdGhlciB0aHJlYWQKKwkJ
ICogd291bGQgYmUgc2VlbiBvbiB0aGlzIENQVSBmb3IgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0
aW1lLgorCQkgKgorCQkgKiBJbiBnZW5lcmFsLCB0aGlzIGFwcHJvYWNoIHRvIG1vZGlmeWluZyBh
IHN5bmNocm9uaXplZCB2YWx1ZQorCQkgKiBpc24ndCBhIGdvb2QgaWRlYSwgYnV0IGluIHRoaXMg
Y2FzZSB3ZSBvbmx5IGV2ZXIgbW9kaWZ5IHRoZQorCQkgKiB2YWx1ZSBvbmNlLCBzbyB0aGluZ3Mg
d29yayBvdXQgd2VsbC4KKwkJICovCisJCXJldCA9IGFyZW5hc1tpbmRdOworCQlpZiAocmV0ID09
IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBBdm9pZCByYWNlcyB3aXRoIGFub3RoZXIgdGhyZWFkIHRo
YXQgbWF5IGhhdmUgYWxyZWFkeQorCQkJICogaW5pdGlhbGl6ZWQgYXJlbmFzW2luZF0uCisJCQkg
Ki8KKwkJCW1hbGxvY19zcGluX2xvY2soJmFyZW5hc19sb2NrKTsKKwkJCWlmIChhcmVuYXNbaW5k
XSA9PSBOVUxMKQorCQkJCXJldCA9IGFyZW5hc19leHRlbmQoKHVuc2lnbmVkKWluZCk7CisJCQll
bHNlCisJCQkJcmV0ID0gYXJlbmFzW2luZF07CisJCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5h
c19sb2NrKTsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSBhcmVuYXNbMF07CisjZW5kaWYKKworCWFz
c2VydChyZXQgIT0gTlVMTCk7CisJcmV0dXJuIChyZXQpOworfQorCisjaWZuZGVmIE5PX1RMUwor
LyoKKyAqIENob29zZSBhbiBhcmVuYSBiYXNlZCBvbiBhIHBlci10aHJlYWQgdmFsdWUgKHNsb3ct
cGF0aCBjb2RlIG9ubHksIGNhbGxlZAorICogb25seSBieSBjaG9vc2VfYXJlbmEoKSkuCisgKi8K
K3N0YXRpYyBhcmVuYV90ICoKK2Nob29zZV9hcmVuYV9oYXJkKHZvaWQpCit7CisJYXJlbmFfdCAq
cmV0OworCisJYXNzZXJ0KF9faXN0aHJlYWRlZCk7CisKKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQor
CS8qIFNlZWQgdGhlIFBSTkcgdXNlZCBmb3IgYXJlbmEgbG9hZCBiYWxhbmNpbmcuICovCisJU1BS
TihiYWxhbmNlLCAodWludDMyX3QpKHVpbnRwdHJfdCkocHRocmVhZF9zZWxmKCkpKTsKKyNlbmRp
ZgorCisJaWYgKG5hcmVuYXMgPiAxKSB7CisjaWZkZWYgTUFMTE9DX0JBTEFOQ0UKKwkJdW5zaWdu
ZWQgaW5kOworCisJCWluZCA9IFBSTihiYWxhbmNlLCBuYXJlbmFzXzJwb3cpOworCQlpZiAoKHJl
dCA9IGFyZW5hc1tpbmRdKSA9PSBOVUxMKSB7CisJCQltYWxsb2Nfc3Bpbl9sb2NrKCZhcmVuYXNf
bG9jayk7CisJCQlpZiAoKHJldCA9IGFyZW5hc1tpbmRdKSA9PSBOVUxMKQorCQkJCXJldCA9IGFy
ZW5hc19leHRlbmQoaW5kKTsKKwkJCW1hbGxvY19zcGluX3VubG9jaygmYXJlbmFzX2xvY2spOwor
CQl9CisjZWxzZQorCQltYWxsb2Nfc3Bpbl9sb2NrKCZhcmVuYXNfbG9jayk7CisJCWlmICgocmV0
ID0gYXJlbmFzW25leHRfYXJlbmFdKSA9PSBOVUxMKQorCQkJcmV0ID0gYXJlbmFzX2V4dGVuZChu
ZXh0X2FyZW5hKTsKKwkJbmV4dF9hcmVuYSA9IChuZXh0X2FyZW5hICsgMSkgJSBuYXJlbmFzOwor
CQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hc19sb2NrKTsKKyNlbmRpZgorCX0gZWxzZQorCQly
ZXQgPSBhcmVuYXNbMF07CisKKwlhcmVuYXNfbWFwID0gcmV0OworCisJcmV0dXJuIChyZXQpOwor
fQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CithcmVuYV9jaHVua19jb21wKGFyZW5hX2No
dW5rX3QgKmEsIGFyZW5hX2NodW5rX3QgKmIpCit7CisJdWludHB0cl90IGFfY2h1bmsgPSAodWlu
dHB0cl90KWE7CisJdWludHB0cl90IGJfY2h1bmsgPSAodWludHB0cl90KWI7CisKKwlhc3NlcnQo
YSAhPSBOVUxMKTsKKwlhc3NlcnQoYiAhPSBOVUxMKTsKKworCXJldHVybiAoKGFfY2h1bmsgPiBi
X2NodW5rKSAtIChhX2NodW5rIDwgYl9jaHVuaykpOworfQorCisvKiBXcmFwIHJlZC1ibGFjayB0
cmVlIG1hY3JvcyBpbiBmdW5jdGlvbnMuICovCityYl93cmFwKHN0YXRpYywgYXJlbmFfY2h1bmtf
dHJlZV9kaXJ0eV8sIGFyZW5hX2NodW5rX3RyZWVfdCwKKyAgICBhcmVuYV9jaHVua190LCBsaW5r
X2RpcnR5LCBhcmVuYV9jaHVua19jb21wKQorCitzdGF0aWMgaW5saW5lIGludAorYXJlbmFfcnVu
X2NvbXAoYXJlbmFfY2h1bmtfbWFwX3QgKmEsIGFyZW5hX2NodW5rX21hcF90ICpiKQoreworCXVp
bnRwdHJfdCBhX21hcGVsbSA9ICh1aW50cHRyX3QpYTsKKwl1aW50cHRyX3QgYl9tYXBlbG0gPSAo
dWludHB0cl90KWI7CisKKwlhc3NlcnQoYSAhPSBOVUxMKTsKKwlhc3NlcnQoYiAhPSBOVUxMKTsK
KworCXJldHVybiAoKGFfbWFwZWxtID4gYl9tYXBlbG0pIC0gKGFfbWFwZWxtIDwgYl9tYXBlbG0p
KTsKK30KKworLyogV3JhcCByZWQtYmxhY2sgdHJlZSBtYWNyb3MgaW4gZnVuY3Rpb25zLiAqLwor
cmJfd3JhcChzdGF0aWMsIGFyZW5hX3J1bl90cmVlXywgYXJlbmFfcnVuX3RyZWVfdCwgYXJlbmFf
Y2h1bmtfbWFwX3QsCisgICAgbGluaywgYXJlbmFfcnVuX2NvbXApCisKK3N0YXRpYyBpbmxpbmUg
aW50CithcmVuYV9hdmFpbF9jb21wKGFyZW5hX2NodW5rX21hcF90ICphLCBhcmVuYV9jaHVua19t
YXBfdCAqYikKK3sKKwlpbnQgcmV0OworCXNpemVfdCBhX3NpemUgPSBhLT5iaXRzICYgfnBhZ2Vz
aXplX21hc2s7CisJc2l6ZV90IGJfc2l6ZSA9IGItPmJpdHMgJiB+cGFnZXNpemVfbWFzazsKKwor
CXJldCA9IChhX3NpemUgPiBiX3NpemUpIC0gKGFfc2l6ZSA8IGJfc2l6ZSk7CisJaWYgKHJldCA9
PSAwKSB7CisJCXVpbnRwdHJfdCBhX21hcGVsbSwgYl9tYXBlbG07CisKKwkJaWYgKChhLT5iaXRz
ICYgQ0hVTktfTUFQX0tFWSkgPT0gMCkKKwkJCWFfbWFwZWxtID0gKHVpbnRwdHJfdClhOworCQll
bHNlIHsKKwkJCS8qCisJCQkgKiBUcmVhdCBrZXlzIGFzIHRob3VnaCB0aGV5IGFyZSBsb3dlciB0
aGFuIGFueXRoaW5nCisJCQkgKiBlbHNlLgorCQkJICovCisJCQlhX21hcGVsbSA9IDA7CisJCX0K
KwkJYl9tYXBlbG0gPSAodWludHB0cl90KWI7CisKKwkJcmV0ID0gKGFfbWFwZWxtID4gYl9tYXBl
bG0pIC0gKGFfbWFwZWxtIDwgYl9tYXBlbG0pOworCX0KKworCXJldHVybiAocmV0KTsKK30KKwor
LyogV3JhcCByZWQtYmxhY2sgdHJlZSBtYWNyb3MgaW4gZnVuY3Rpb25zLiAqLworcmJfd3JhcChz
dGF0aWMsIGFyZW5hX2F2YWlsX3RyZWVfLCBhcmVuYV9hdmFpbF90cmVlX3QsCisgICAgYXJlbmFf
Y2h1bmtfbWFwX3QsIGxpbmssIGFyZW5hX2F2YWlsX2NvbXApCisKK3N0YXRpYyBpbmxpbmUgdm9p
ZCAqCithcmVuYV9ydW5fcmVnX2FsbG9jKGFyZW5hX3J1bl90ICpydW4sIGFyZW5hX2Jpbl90ICpi
aW4pCit7CisJdm9pZCAqcmV0OworCXVuc2lnbmVkIGksIG1hc2ssIGJpdCwgcmVnaW5kOworCisJ
YXNzZXJ0KHJ1bi0+bWFnaWMgPT0gQVJFTkFfUlVOX01BR0lDKTsKKwlhc3NlcnQocnVuLT5yZWdz
X21pbmVsbSA8IGJpbi0+cmVnc19tYXNrX25lbG1zKTsKKworCS8qCisJICogTW92ZSB0aGUgZmly
c3QgY2hlY2sgb3V0c2lkZSB0aGUgbG9vcCwgc28gdGhhdCBydW4tPnJlZ3NfbWluZWxtIGNhbgor
CSAqIGJlIHVwZGF0ZWQgdW5jb25kaXRpb25hbGx5LCB3aXRob3V0IHRoZSBwb3NzaWJpbGl0eSBv
ZiB1cGRhdGluZyBpdAorCSAqIG11bHRpcGxlIHRpbWVzLgorCSAqLworCWkgPSBydW4tPnJlZ3Nf
bWluZWxtOworCW1hc2sgPSBydW4tPnJlZ3NfbWFza1tpXTsKKwlpZiAobWFzayAhPSAwKSB7CisJ
CS8qIFVzYWJsZSBhbGxvY2F0aW9uIGZvdW5kLiAqLworCQliaXQgPSBmZnMoKGludCltYXNrKSAt
IDE7CisKKwkJcmVnaW5kID0gKChpIDw8IChTSVpFT0ZfSU5UXzJQT1cgKyAzKSkgKyBiaXQpOwor
CQlhc3NlcnQocmVnaW5kIDwgYmluLT5ucmVncyk7CisJCXJldCA9ICh2b2lkICopKCgodWludHB0
cl90KXJ1bikgKyBiaW4tPnJlZzBfb2Zmc2V0CisJCSAgICArIChiaW4tPnJlZ19zaXplICogcmVn
aW5kKSk7CisKKwkJLyogQ2xlYXIgYml0LiAqLworCQltYXNrIF49ICgxVSA8PCBiaXQpOworCQly
dW4tPnJlZ3NfbWFza1tpXSA9IG1hc2s7CisKKwkJcmV0dXJuIChyZXQpOworCX0KKworCWZvciAo
aSsrOyBpIDwgYmluLT5yZWdzX21hc2tfbmVsbXM7IGkrKykgeworCQltYXNrID0gcnVuLT5yZWdz
X21hc2tbaV07CisJCWlmIChtYXNrICE9IDApIHsKKwkJCS8qIFVzYWJsZSBhbGxvY2F0aW9uIGZv
dW5kLiAqLworCQkJYml0ID0gZmZzKChpbnQpbWFzaykgLSAxOworCisJCQlyZWdpbmQgPSAoKGkg
PDwgKFNJWkVPRl9JTlRfMlBPVyArIDMpKSArIGJpdCk7CisJCQlhc3NlcnQocmVnaW5kIDwgYmlu
LT5ucmVncyk7CisJCQlyZXQgPSAodm9pZCAqKSgoKHVpbnRwdHJfdClydW4pICsgYmluLT5yZWcw
X29mZnNldAorCQkJICAgICsgKGJpbi0+cmVnX3NpemUgKiByZWdpbmQpKTsKKworCQkJLyogQ2xl
YXIgYml0LiAqLworCQkJbWFzayBePSAoMVUgPDwgYml0KTsKKwkJCXJ1bi0+cmVnc19tYXNrW2ld
ID0gbWFzazsKKworCQkJLyoKKwkJCSAqIE1ha2UgYSBub3RlIHRoYXQgbm90aGluZyBiZWZvcmUg
dGhpcyBlbGVtZW50CisJCQkgKiBjb250YWlucyBhIGZyZWUgcmVnaW9uLgorCQkJICovCisJCQly
dW4tPnJlZ3NfbWluZWxtID0gaTsgLyogTG93IHBheW9mZjogKyAobWFzayA9PSAwKTsgKi8KKwor
CQkJcmV0dXJuIChyZXQpOworCQl9CisJfQorCS8qIE5vdCByZWFjaGVkLiAqLworCWFzc2VydCgw
KTsKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FyZW5hX3J1bl9y
ZWdfZGFsbG9jKGFyZW5hX3J1bl90ICpydW4sIGFyZW5hX2Jpbl90ICpiaW4sIHZvaWQgKnB0ciwg
c2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgZGlmZiwgcmVnaW5kLCBlbG0sIGJpdDsKKworCWFz
c2VydChydW4tPm1hZ2ljID09IEFSRU5BX1JVTl9NQUdJQyk7CisKKwkvKgorCSAqIEF2b2lkIGRv
aW5nIGRpdmlzaW9uIHdpdGggYSB2YXJpYWJsZSBkaXZpc29yIGlmIHBvc3NpYmxlLiAgVXNpbmcK
KwkgKiBhY3R1YWwgZGl2aXNpb24gaGVyZSBjYW4gcmVkdWNlIGFsbG9jYXRvciB0aHJvdWdocHV0
IGJ5IG92ZXIgMjAlIQorCSAqLworCWRpZmYgPSAodW5zaWduZWQpKCh1aW50cHRyX3QpcHRyIC0g
KHVpbnRwdHJfdClydW4gLSBiaW4tPnJlZzBfb2Zmc2V0KTsKKwlpZiAoKHNpemUgJiAoc2l6ZSAt
IDEpKSA9PSAwKSB7CisJCS8qCisJCSAqIGxvZzJfdGFibGUgYWxsb3dzIGZhc3QgZGl2aXNpb24g
b2YgYSBwb3dlciBvZiB0d28gaW4gdGhlCisJCSAqIFsxLi4xMjhdIHJhbmdlLgorCQkgKgorCQkg
KiAoeCAvIGRpdmlzb3IpIGJlY29tZXMgKHggPj4gbG9nMl90YWJsZVtkaXZpc29yIC0gMV0pLgor
CQkgKi8KKwkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbG9nMl90YWJsZVtdID0geworCQkg
ICAgMCwgMSwgMCwgMiwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwKKwkJICAg
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDUsCisJCSAgICAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkgICAgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwKKwkJICAgIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCSAgICAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkgICAgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJICAgIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDcKKwkJfTsKKworCQlpZiAoc2l6ZSA8
PSAxMjgpCisJCQlyZWdpbmQgPSAoZGlmZiA+PiBsb2cyX3RhYmxlW3NpemUgLSAxXSk7CisJCWVs
c2UgaWYgKHNpemUgPD0gMzI3NjgpCisJCQlyZWdpbmQgPSBkaWZmID4+ICg4ICsgbG9nMl90YWJs
ZVsoc2l6ZSA+PiA4KSAtIDFdKTsKKwkJZWxzZQorCQkJcmVnaW5kID0gZGlmZiAvIHNpemU7CisJ
fSBlbHNlIGlmIChzaXplIDwgcXNwYWNlX21heCkgeworCQkvKgorCQkgKiBUbyBkaXZpZGUgYnkg
YSBudW1iZXIgRCB0aGF0IGlzIG5vdCBhIHBvd2VyIG9mIHR3byB3ZQorCQkgKiBtdWx0aXBseSBi
eSAoMl4yMSAvIEQpIGFuZCB0aGVuIHJpZ2h0IHNoaWZ0IGJ5IDIxIHBvc2l0aW9ucy4KKwkJICoK
KwkJICogICBYIC8gRAorCQkgKgorCQkgKiBiZWNvbWVzCisJCSAqCisJCSAqICAgKFggKiBxc2l6
ZV9pbnZzWyhEID4+IFFVQU5UVU1fMlBPVykgLSAzXSkKKwkJICogICAgICAgPj4gU0laRV9JTlZf
U0hJRlQKKwkJICoKKwkJICogV2UgY2FuIG9taXQgdGhlIGZpcnN0IHRocmVlIGVsZW1lbnRzLCBi
ZWNhdXNlIHdlIG5ldmVyCisJCSAqIGRpdmlkZSBieSAwLCBhbmQgUVVBTlRVTSBhbmQgMipRVUFO
VFVNIGFyZSBib3RoIHBvd2VycyBvZgorCQkgKiB0d28sIHdoaWNoIGFyZSBoYW5kbGVkIGFib3Zl
LgorCQkgKi8KKyNkZWZpbmUJU0laRV9JTlZfU0hJRlQgMjEKKyNkZWZpbmUJUVNJWkVfSU5WKHMp
ICgoKDFVIDw8IFNJWkVfSU5WX1NISUZUKSAvIChzIDw8IFFVQU5UVU1fMlBPVykpICsgMSkKKwkJ
c3RhdGljIGNvbnN0IHVuc2lnbmVkIHFzaXplX2ludnNbXSA9IHsKKwkJICAgIFFTSVpFX0lOVigz
KSwKKwkJICAgIFFTSVpFX0lOVig0KSwgUVNJWkVfSU5WKDUpLCBRU0laRV9JTlYoNiksIFFTSVpF
X0lOVig3KQorI2lmIChRVUFOVFVNXzJQT1cgPCA0KQorCQkgICAgLAorCQkgICAgUVNJWkVfSU5W
KDgpLCBRU0laRV9JTlYoOSksIFFTSVpFX0lOVigxMCksIFFTSVpFX0lOVigxMSksCisJCSAgICBR
U0laRV9JTlYoMTIpLFFTSVpFX0lOVigxMyksIFFTSVpFX0lOVigxNCksIFFTSVpFX0lOVigxNSkK
KyNlbmRpZgorCQl9OworCQlhc3NlcnQoUVVBTlRVTSAqICgoKHNpemVvZihxc2l6ZV9pbnZzKSkg
LyBzaXplb2YodW5zaWduZWQpKSArIDMpCisJCSAgICA+PSAoMVUgPDwgUVNQQUNFX01BWF8yUE9X
X0RFRkFVTFQpKTsKKworCQlpZiAoc2l6ZSA8PSAoKChzaXplb2YocXNpemVfaW52cykgLyBzaXpl
b2YodW5zaWduZWQpKSArIDIpIDw8CisJCSAgICBRVUFOVFVNXzJQT1cpKSB7CisJCQlyZWdpbmQg
PSBxc2l6ZV9pbnZzWyhzaXplID4+IFFVQU5UVU1fMlBPVykgLSAzXSAqIGRpZmY7CisJCQlyZWdp
bmQgPj49IFNJWkVfSU5WX1NISUZUOworCQl9IGVsc2UKKwkJCXJlZ2luZCA9IGRpZmYgLyBzaXpl
OworI3VuZGVmIFFTSVpFX0lOVgorCX0gZWxzZSBpZiAoc2l6ZSA8IGNzcGFjZV9tYXgpIHsKKyNk
ZWZpbmUJQ1NJWkVfSU5WKHMpICgoKDFVIDw8IFNJWkVfSU5WX1NISUZUKSAvIChzIDw8IENBQ0hF
TElORV8yUE9XKSkgKyAxKQorCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY3NpemVfaW52c1tdID0g
eworCQkgICAgQ1NJWkVfSU5WKDMpLAorCQkgICAgQ1NJWkVfSU5WKDQpLCBDU0laRV9JTlYoNSks
IENTSVpFX0lOVig2KSwgQ1NJWkVfSU5WKDcpCisJCX07CisJCWFzc2VydChDQUNIRUxJTkUgKiAo
KChzaXplb2YoY3NpemVfaW52cykpIC8gc2l6ZW9mKHVuc2lnbmVkKSkgKworCQkgICAgMykgPj0g
KDFVIDw8IENTUEFDRV9NQVhfMlBPV19ERUZBVUxUKSk7CisKKwkJaWYgKHNpemUgPD0gKCgoc2l6
ZW9mKGNzaXplX2ludnMpIC8gc2l6ZW9mKHVuc2lnbmVkKSkgKyAyKSA8PAorCQkgICAgQ0FDSEVM
SU5FXzJQT1cpKSB7CisJCQlyZWdpbmQgPSBjc2l6ZV9pbnZzWyhzaXplID4+IENBQ0hFTElORV8y
UE9XKSAtIDNdICoKKwkJCSAgICBkaWZmOworCQkJcmVnaW5kID4+PSBTSVpFX0lOVl9TSElGVDsK
KwkJfSBlbHNlCisJCQlyZWdpbmQgPSBkaWZmIC8gc2l6ZTsKKyN1bmRlZiBDU0laRV9JTlYKKwl9
IGVsc2UgeworI2RlZmluZQlTU0laRV9JTlYocykgKCgoMVUgPDwgU0laRV9JTlZfU0hJRlQpIC8g
KHMgPDwgU1VCUEFHRV8yUE9XKSkgKyAxKQorCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgc3NpemVf
aW52c1tdID0geworCQkgICAgU1NJWkVfSU5WKDMpLAorCQkgICAgU1NJWkVfSU5WKDQpLCBTU0la
RV9JTlYoNSksIFNTSVpFX0lOVig2KSwgU1NJWkVfSU5WKDcpLAorCQkgICAgU1NJWkVfSU5WKDgp
LCBTU0laRV9JTlYoOSksIFNTSVpFX0lOVigxMCksIFNTSVpFX0lOVigxMSksCisJCSAgICBTU0la
RV9JTlYoMTIpLCBTU0laRV9JTlYoMTMpLCBTU0laRV9JTlYoMTQpLCBTU0laRV9JTlYoMTUpCisj
aWYgKFBBR0VTSVpFXzJQT1cgPT0gMTMpCisJCSAgICAsCisJCSAgICBTU0laRV9JTlYoMTYpLCBT
U0laRV9JTlYoMTcpLCBTU0laRV9JTlYoMTgpLCBTU0laRV9JTlYoMTkpLAorCQkgICAgU1NJWkVf
SU5WKDIwKSwgU1NJWkVfSU5WKDIxKSwgU1NJWkVfSU5WKDIyKSwgU1NJWkVfSU5WKDIzKSwKKwkJ
ICAgIFNTSVpFX0lOVigyNCksIFNTSVpFX0lOVigyNSksIFNTSVpFX0lOVigyNiksIFNTSVpFX0lO
VigyNyksCisJCSAgICBTU0laRV9JTlYoMjgpLCBTU0laRV9JTlYoMjkpLCBTU0laRV9JTlYoMjkp
LCBTU0laRV9JTlYoMzApCisjZW5kaWYKKwkJfTsKKwkJYXNzZXJ0KFNVQlBBR0UgKiAoKChzaXpl
b2Yoc3NpemVfaW52cykpIC8gc2l6ZW9mKHVuc2lnbmVkKSkgKyAzKQorCQkgICAgPj0gKDFVIDw8
IFBBR0VTSVpFXzJQT1cpKTsKKworCQlpZiAoc2l6ZSA8ICgoKHNpemVvZihzc2l6ZV9pbnZzKSAv
IHNpemVvZih1bnNpZ25lZCkpICsgMikgPDwKKwkJICAgIFNVQlBBR0VfMlBPVykpIHsKKwkJCXJl
Z2luZCA9IHNzaXplX2ludnNbKHNpemUgPj4gU1VCUEFHRV8yUE9XKSAtIDNdICogZGlmZjsKKwkJ
CXJlZ2luZCA+Pj0gU0laRV9JTlZfU0hJRlQ7CisJCX0gZWxzZQorCQkJcmVnaW5kID0gZGlmZiAv
IHNpemU7CisjdW5kZWYgU1NJWkVfSU5WCisJfQorI3VuZGVmIFNJWkVfSU5WX1NISUZUCisJYXNz
ZXJ0KGRpZmYgPT0gcmVnaW5kICogc2l6ZSk7CisJYXNzZXJ0KHJlZ2luZCA8IGJpbi0+bnJlZ3Mp
OworCisJZWxtID0gcmVnaW5kID4+IChTSVpFT0ZfSU5UXzJQT1cgKyAzKTsKKwlpZiAoZWxtIDwg
cnVuLT5yZWdzX21pbmVsbSkKKwkJcnVuLT5yZWdzX21pbmVsbSA9IGVsbTsKKwliaXQgPSByZWdp
bmQgLSAoZWxtIDw8IChTSVpFT0ZfSU5UXzJQT1cgKyAzKSk7CisJYXNzZXJ0KChydW4tPnJlZ3Nf
bWFza1tlbG1dICYgKDFVIDw8IGJpdCkpID09IDApOworCXJ1bi0+cmVnc19tYXNrW2VsbV0gfD0g
KDFVIDw8IGJpdCk7Cit9CisKK3N0YXRpYyB2b2lkCithcmVuYV9ydW5fc3BsaXQoYXJlbmFfdCAq
YXJlbmEsIGFyZW5hX3J1bl90ICpydW4sIHNpemVfdCBzaXplLCBib29sIGxhcmdlLAorICAgIGJv
b2wgemVybykKK3sKKwlhcmVuYV9jaHVua190ICpjaHVuazsKKwlzaXplX3Qgb2xkX25kaXJ0eSwg
cnVuX2luZCwgdG90YWxfcGFnZXMsIG5lZWRfcGFnZXMsIHJlbV9wYWdlcywgaTsKKworCWNodW5r
ID0gKGFyZW5hX2NodW5rX3QgKilDSFVOS19BRERSMkJBU0UocnVuKTsKKwlvbGRfbmRpcnR5ID0g
Y2h1bmstPm5kaXJ0eTsKKwlydW5faW5kID0gKHVuc2lnbmVkKSgoKHVpbnRwdHJfdClydW4gLSAo
dWludHB0cl90KWNodW5rKQorCSAgICA+PiBwYWdlc2l6ZV8ycG93KTsKKwl0b3RhbF9wYWdlcyA9
IChjaHVuay0+bWFwW3J1bl9pbmRdLmJpdHMgJiB+cGFnZXNpemVfbWFzaykgPj4KKwkgICAgcGFn
ZXNpemVfMnBvdzsKKwluZWVkX3BhZ2VzID0gKHNpemUgPj4gcGFnZXNpemVfMnBvdyk7CisJYXNz
ZXJ0KG5lZWRfcGFnZXMgPiAwKTsKKwlhc3NlcnQobmVlZF9wYWdlcyA8PSB0b3RhbF9wYWdlcyk7
CisJcmVtX3BhZ2VzID0gdG90YWxfcGFnZXMgLSBuZWVkX3BhZ2VzOworCisJYXJlbmFfYXZhaWxf
dHJlZV9yZW1vdmUoJmFyZW5hLT5ydW5zX2F2YWlsLCAmY2h1bmstPm1hcFtydW5faW5kXSk7CisK
KwkvKiBLZWVwIHRyYWNrIG9mIHRyYWlsaW5nIHVudXNlZCBwYWdlcyBmb3IgbGF0ZXIgdXNlLiAq
LworCWlmIChyZW1fcGFnZXMgPiAwKSB7CisJCWNodW5rLT5tYXBbcnVuX2luZCtuZWVkX3BhZ2Vz
XS5iaXRzID0gKHJlbV9wYWdlcyA8PAorCQkgICAgcGFnZXNpemVfMnBvdykgfCAoY2h1bmstPm1h
cFtydW5faW5kK25lZWRfcGFnZXNdLmJpdHMgJgorCQkgICAgcGFnZXNpemVfbWFzayk7CisJCWNo
dW5rLT5tYXBbcnVuX2luZCt0b3RhbF9wYWdlcy0xXS5iaXRzID0gKHJlbV9wYWdlcyA8PAorCQkg
ICAgcGFnZXNpemVfMnBvdykgfCAoY2h1bmstPm1hcFtydW5faW5kK3RvdGFsX3BhZ2VzLTFdLmJp
dHMgJgorCQkgICAgcGFnZXNpemVfbWFzayk7CisJCWFyZW5hX2F2YWlsX3RyZWVfaW5zZXJ0KCZh
cmVuYS0+cnVuc19hdmFpbCwKKwkJICAgICZjaHVuay0+bWFwW3J1bl9pbmQrbmVlZF9wYWdlc10p
OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuZWVkX3BhZ2VzOyBpKyspIHsKKwkJLyogWmVybyBp
ZiBuZWNlc3NhcnkuICovCisJCWlmICh6ZXJvKSB7CisJCQlpZiAoKGNodW5rLT5tYXBbcnVuX2lu
ZCArIGldLmJpdHMgJiBDSFVOS19NQVBfWkVST0VEKQorCQkJICAgID09IDApIHsKKwkJCQltZW1z
ZXQoKHZvaWQgKikoKHVpbnRwdHJfdCljaHVuayArICgocnVuX2luZAorCQkJCSAgICArIGkpIDw8
IHBhZ2VzaXplXzJwb3cpKSwgMCwgcGFnZXNpemUpOworCQkJCS8qIENIVU5LX01BUF9aRVJPRUQg
aXMgY2xlYXJlZCBiZWxvdy4gKi8KKwkJCX0KKwkJfQorCisJCS8qIFVwZGF0ZSBkaXJ0eSBwYWdl
IGFjY291bnRpbmcuICovCisJCWlmIChjaHVuay0+bWFwW3J1bl9pbmQgKyBpXS5iaXRzICYgQ0hV
TktfTUFQX0RJUlRZKSB7CisJCQljaHVuay0+bmRpcnR5LS07CisJCQlhcmVuYS0+bmRpcnR5LS07
CisJCQkvKiBDSFVOS19NQVBfRElSVFkgaXMgY2xlYXJlZCBiZWxvdy4gKi8KKwkJfQorCisJCS8q
IEluaXRpYWxpemUgdGhlIGNodW5rIG1hcC4gKi8KKwkJaWYgKGxhcmdlKSB7CisJCQljaHVuay0+
bWFwW3J1bl9pbmQgKyBpXS5iaXRzID0gQ0hVTktfTUFQX0xBUkdFCisJCQkgICAgfCBDSFVOS19N
QVBfQUxMT0NBVEVEOworCQl9IGVsc2UgeworCQkJY2h1bmstPm1hcFtydW5faW5kICsgaV0uYml0
cyA9IChzaXplX3QpcnVuCisJCQkgICAgfCBDSFVOS19NQVBfQUxMT0NBVEVEOworCQl9CisJfQor
CisJLyoKKwkgKiBTZXQgdGhlIHJ1biBzaXplIG9ubHkgaW4gdGhlIGZpcnN0IGVsZW1lbnQgZm9y
IGxhcmdlIHJ1bnMuICBUaGlzIGlzCisJICogcHJpbWFyaWx5IGEgZGVidWdnaW5nIGFpZCwgc2lu
Y2UgdGhlIGxhY2sgb2Ygc2l6ZSBpbmZvIGZvciB0cmFpbGluZworCSAqIHBhZ2VzIG9ubHkgbWF0
dGVycyBpZiB0aGUgYXBwbGljYXRpb24gdHJpZXMgdG8gb3BlcmF0ZSBvbiBhbgorCSAqIGludGVy
aW9yIHBvaW50ZXIuCisJICovCisJaWYgKGxhcmdlKQorCQljaHVuay0+bWFwW3J1bl9pbmRdLmJp
dHMgfD0gc2l6ZTsKKworCWlmIChjaHVuay0+bmRpcnR5ID09IDAgJiYgb2xkX25kaXJ0eSA+IDAp
CisJCWFyZW5hX2NodW5rX3RyZWVfZGlydHlfcmVtb3ZlKCZhcmVuYS0+Y2h1bmtzX2RpcnR5LCBj
aHVuayk7Cit9CisKK3N0YXRpYyBhcmVuYV9jaHVua190ICoKK2FyZW5hX2NodW5rX2FsbG9jKGFy
ZW5hX3QgKmFyZW5hKQoreworCWFyZW5hX2NodW5rX3QgKmNodW5rOworCXNpemVfdCBpOworCisJ
aWYgKGFyZW5hLT5zcGFyZSAhPSBOVUxMKSB7CisJCWNodW5rID0gYXJlbmEtPnNwYXJlOworCQlh
cmVuYS0+c3BhcmUgPSBOVUxMOworCX0gZWxzZSB7CisJCWNodW5rID0gKGFyZW5hX2NodW5rX3Qg
KiljaHVua19hbGxvYyhjaHVua3NpemUsIHRydWUpOworCQlpZiAoY2h1bmsgPT0gTlVMTCkKKwkJ
CXJldHVybiAoTlVMTCk7CisjaWZkZWYgTUFMTE9DX1NUQVRTCisJCWFyZW5hLT5zdGF0cy5tYXBw
ZWQgKz0gY2h1bmtzaXplOworI2VuZGlmCisKKwkJY2h1bmstPmFyZW5hID0gYXJlbmE7CisKKwkJ
LyoKKwkJICogQ2xhaW0gdGhhdCBubyBwYWdlcyBhcmUgaW4gdXNlLCBzaW5jZSB0aGUgaGVhZGVy
IGlzIG1lcmVseQorCQkgKiBvdmVyaGVhZC4KKwkJICovCisJCWNodW5rLT5uZGlydHkgPSAwOwor
CisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIG1hcCB0byBjb250YWluIG9uZSBtYXhpbWFsIGZy
ZWUgdW50b3VjaGVkIHJ1bi4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBhcmVuYV9jaHVua19o
ZWFkZXJfbnBhZ2VzOyBpKyspCisJCQljaHVuay0+bWFwW2ldLmJpdHMgPSAwOworCQljaHVuay0+
bWFwW2ldLmJpdHMgPSBhcmVuYV9tYXhjbGFzcyB8IENIVU5LX01BUF9aRVJPRUQ7CisJCWZvciAo
aSsrOyBpIDwgY2h1bmtfbnBhZ2VzLTE7IGkrKykgeworCQkJY2h1bmstPm1hcFtpXS5iaXRzID0g
Q0hVTktfTUFQX1pFUk9FRDsKKwkJfQorCQljaHVuay0+bWFwW2NodW5rX25wYWdlcy0xXS5iaXRz
ID0gYXJlbmFfbWF4Y2xhc3MgfAorCQkgICAgQ0hVTktfTUFQX1pFUk9FRDsKKwl9CisKKwkvKiBJ
bnNlcnQgdGhlIHJ1biBpbnRvIHRoZSBydW5zX2F2YWlsIHRyZWUuICovCisJYXJlbmFfYXZhaWxf
dHJlZV9pbnNlcnQoJmFyZW5hLT5ydW5zX2F2YWlsLAorCSAgICAmY2h1bmstPm1hcFthcmVuYV9j
aHVua19oZWFkZXJfbnBhZ2VzXSk7CisKKwlyZXR1cm4gKGNodW5rKTsKK30KKworc3RhdGljIHZv
aWQKK2FyZW5hX2NodW5rX2RlYWxsb2MoYXJlbmFfdCAqYXJlbmEsIGFyZW5hX2NodW5rX3QgKmNo
dW5rKQoreworCisJaWYgKGFyZW5hLT5zcGFyZSAhPSBOVUxMKSB7CisJCWlmIChhcmVuYS0+c3Bh
cmUtPm5kaXJ0eSA+IDApIHsKKwkJCWFyZW5hX2NodW5rX3RyZWVfZGlydHlfcmVtb3ZlKAorCQkJ
ICAgICZjaHVuay0+YXJlbmEtPmNodW5rc19kaXJ0eSwgYXJlbmEtPnNwYXJlKTsKKwkJCWFyZW5h
LT5uZGlydHkgLT0gYXJlbmEtPnNwYXJlLT5uZGlydHk7CisJCX0KKwkJY2h1bmtfZGVhbGxvYygo
dm9pZCAqKWFyZW5hLT5zcGFyZSwgY2h1bmtzaXplKTsKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwkJ
YXJlbmEtPnN0YXRzLm1hcHBlZCAtPSBjaHVua3NpemU7CisjZW5kaWYKKwl9CisKKwkvKgorCSAq
IFJlbW92ZSBydW4gZnJvbSBydW5zX2F2YWlsLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBj
aHVuaworCSAqIHdpbGwgYmUgY2FjaGVkLCBzbyB0aGF0IHRoZSBhcmVuYSBkb2VzIG5vdCB1c2Ug
aXQuICBEaXJ0eSBwYWdlCisJICogZmx1c2hpbmcgb25seSB1c2VzIHRoZSBjaHVua3NfZGlydHkg
dHJlZSwgc28gbGVhdmluZyB0aGlzIGNodW5rIGluCisJICogdGhlIGNodW5rc18qIHRyZWVzIGlz
IHN1ZmZpY2llbnQgZm9yIHRoYXQgcHVycG9zZS4KKwkgKi8KKwlhcmVuYV9hdmFpbF90cmVlX3Jl
bW92ZSgmYXJlbmEtPnJ1bnNfYXZhaWwsCisJICAgICZjaHVuay0+bWFwW2FyZW5hX2NodW5rX2hl
YWRlcl9ucGFnZXNdKTsKKworCWFyZW5hLT5zcGFyZSA9IGNodW5rOworfQorCitzdGF0aWMgYXJl
bmFfcnVuX3QgKgorYXJlbmFfcnVuX2FsbG9jKGFyZW5hX3QgKmFyZW5hLCBzaXplX3Qgc2l6ZSwg
Ym9vbCBsYXJnZSwgYm9vbCB6ZXJvKQoreworCWFyZW5hX2NodW5rX3QgKmNodW5rOworCWFyZW5h
X3J1bl90ICpydW47CisJYXJlbmFfY2h1bmtfbWFwX3QgKm1hcGVsbSwga2V5OworCisJYXNzZXJ0
KHNpemUgPD0gYXJlbmFfbWF4Y2xhc3MpOworCWFzc2VydCgoc2l6ZSAmIHBhZ2VzaXplX21hc2sp
ID09IDApOworCisJLyogU2VhcmNoIHRoZSBhcmVuYSdzIGNodW5rcyBmb3IgdGhlIGxvd2VzdCBi
ZXN0IGZpdC4gKi8KKwlrZXkuYml0cyA9IHNpemUgfCBDSFVOS19NQVBfS0VZOworCW1hcGVsbSA9
IGFyZW5hX2F2YWlsX3RyZWVfbnNlYXJjaCgmYXJlbmEtPnJ1bnNfYXZhaWwsICZrZXkpOworCWlm
IChtYXBlbG0gIT0gTlVMTCkgeworCQlhcmVuYV9jaHVua190ICpydW5fY2h1bmsgPSBDSFVOS19B
RERSMkJBU0UobWFwZWxtKTsKKwkJc2l6ZV90IHBhZ2VpbmQgPSAoKHVpbnRwdHJfdCltYXBlbG0g
LSAodWludHB0cl90KXJ1bl9jaHVuay0+bWFwKQorCQkgICAgLyBzaXplb2YoYXJlbmFfY2h1bmtf
bWFwX3QpOworCisJCXJ1biA9IChhcmVuYV9ydW5fdCAqKSgodWludHB0cl90KXJ1bl9jaHVuayAr
IChwYWdlaW5kCisJCSAgICA8PCBwYWdlc2l6ZV8ycG93KSk7CisJCWFyZW5hX3J1bl9zcGxpdChh
cmVuYSwgcnVuLCBzaXplLCBsYXJnZSwgemVybyk7CisJCXJldHVybiAocnVuKTsKKwl9CisKKwkv
KgorCSAqIE5vIHVzYWJsZSBydW5zLiAgQ3JlYXRlIGEgbmV3IGNodW5rIGZyb20gd2hpY2ggdG8g
YWxsb2NhdGUgdGhlIHJ1bi4KKwkgKi8KKwljaHVuayA9IGFyZW5hX2NodW5rX2FsbG9jKGFyZW5h
KTsKKwlpZiAoY2h1bmsgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwlydW4gPSAoYXJlbmFf
cnVuX3QgKikoKHVpbnRwdHJfdCljaHVuayArIChhcmVuYV9jaHVua19oZWFkZXJfbnBhZ2VzIDw8
CisJICAgIHBhZ2VzaXplXzJwb3cpKTsKKwkvKiBVcGRhdGUgcGFnZSBtYXAuICovCisJYXJlbmFf
cnVuX3NwbGl0KGFyZW5hLCBydW4sIHNpemUsIGxhcmdlLCB6ZXJvKTsKKwlyZXR1cm4gKHJ1bik7
Cit9CisKK3N0YXRpYyB2b2lkCithcmVuYV9wdXJnZShhcmVuYV90ICphcmVuYSkKK3sKKwlhcmVu
YV9jaHVua190ICpjaHVuazsKKwlzaXplX3QgaSwgbnBhZ2VzOworI2lmZGVmIE1BTExPQ19ERUJV
RworCXNpemVfdCBuZGlydHkgPSAwOworCisJcmJfZm9yZWFjaF9iZWdpbihhcmVuYV9jaHVua190
LCBsaW5rX2RpcnR5LCAmYXJlbmEtPmNodW5rc19kaXJ0eSwKKwkgICAgY2h1bmspIHsKKwkJbmRp
cnR5ICs9IGNodW5rLT5uZGlydHk7CisJfSByYl9mb3JlYWNoX2VuZChhcmVuYV9jaHVua190LCBs
aW5rX2RpcnR5LCAmYXJlbmEtPmNodW5rc19kaXJ0eSwgY2h1bmspCisJYXNzZXJ0KG5kaXJ0eSA9
PSBhcmVuYS0+bmRpcnR5KTsKKyNlbmRpZgorCWFzc2VydChhcmVuYS0+bmRpcnR5ID4gb3B0X2Rp
cnR5X21heCk7CisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlhcmVuYS0+c3RhdHMubnB1cmdlKys7
CisjZW5kaWYKKworCS8qCisJICogSXRlcmF0ZSBkb3dud2FyZCB0aHJvdWdoIGNodW5rcyB1bnRp
bCBlbm91Z2ggZGlydHkgbWVtb3J5IGhhcyBiZWVuCisJICogcHVyZ2VkLiAgVGVybWluYXRlIGFz
IHNvb24gYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlCisJICogbnVtYmVyIG9m
IHN5c3RlbSBjYWxscywgZXZlbiBpZiBhIGNodW5rIGhhcyBvbmx5IGJlZW4gcGFydGlhbGx5CisJ
ICogcHVyZ2VkLgorCSAqLworCXdoaWxlIChhcmVuYS0+bmRpcnR5ID4gKG9wdF9kaXJ0eV9tYXgg
Pj4gMSkpIHsKKwkJY2h1bmsgPSBhcmVuYV9jaHVua190cmVlX2RpcnR5X2xhc3QoJmFyZW5hLT5j
aHVua3NfZGlydHkpOworCQlhc3NlcnQoY2h1bmsgIT0gTlVMTCk7CisKKwkJZm9yIChpID0gY2h1
bmtfbnBhZ2VzIC0gMTsgY2h1bmstPm5kaXJ0eSA+IDA7IGktLSkgeworCQkJYXNzZXJ0KGkgPj0g
YXJlbmFfY2h1bmtfaGVhZGVyX25wYWdlcyk7CisKKwkJCWlmIChjaHVuay0+bWFwW2ldLmJpdHMg
JiBDSFVOS19NQVBfRElSVFkpIHsKKwkJCQljaHVuay0+bWFwW2ldLmJpdHMgXj0gQ0hVTktfTUFQ
X0RJUlRZOworCQkJCS8qIEZpbmQgYWRqYWNlbnQgZGlydHkgcnVuKHMpLiAqLworCQkJCWZvciAo
bnBhZ2VzID0gMTsgaSA+IGFyZW5hX2NodW5rX2hlYWRlcl9ucGFnZXMKKwkJCQkgICAgJiYgKGNo
dW5rLT5tYXBbaSAtIDFdLmJpdHMgJgorCQkJCSAgICBDSFVOS19NQVBfRElSVFkpOyBucGFnZXMr
KykgeworCQkJCQlpLS07CisJCQkJCWNodW5rLT5tYXBbaV0uYml0cyBePSBDSFVOS19NQVBfRElS
VFk7CisJCQkJfQorCQkJCWNodW5rLT5uZGlydHkgLT0gbnBhZ2VzOworCQkJCWFyZW5hLT5uZGly
dHkgLT0gbnBhZ2VzOworCisJCQkJbWFkdmlzZSgodm9pZCAqKSgodWludHB0cl90KWNodW5rICsg
KGkgPDwKKwkJCQkgICAgcGFnZXNpemVfMnBvdykpLCAobnBhZ2VzIDw8IHBhZ2VzaXplXzJwb3cp
LAorCQkJCSAgICBNQURWX0RPTlRORUVEKTsKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwkJCQlhcmVu
YS0+c3RhdHMubm1hZHZpc2UrKzsKKwkJCQlhcmVuYS0+c3RhdHMucHVyZ2VkICs9IG5wYWdlczsK
KyNlbmRpZgorCQkJCWlmIChhcmVuYS0+bmRpcnR5IDw9IChvcHRfZGlydHlfbWF4ID4+IDEpKQor
CQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjaHVuay0+bmRpcnR5ID09IDApIHsKKwkJ
CWFyZW5hX2NodW5rX3RyZWVfZGlydHlfcmVtb3ZlKCZhcmVuYS0+Y2h1bmtzX2RpcnR5LAorCQkJ
ICAgIGNodW5rKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2FyZW5hX3J1bl9kYWxsb2Mo
YXJlbmFfdCAqYXJlbmEsIGFyZW5hX3J1bl90ICpydW4sIGJvb2wgZGlydHkpCit7CisJYXJlbmFf
Y2h1bmtfdCAqY2h1bms7CisJc2l6ZV90IHNpemUsIHJ1bl9pbmQsIHJ1bl9wYWdlczsKKworCWNo
dW5rID0gKGFyZW5hX2NodW5rX3QgKilDSFVOS19BRERSMkJBU0UocnVuKTsKKwlydW5faW5kID0g
KHNpemVfdCkoKCh1aW50cHRyX3QpcnVuIC0gKHVpbnRwdHJfdCljaHVuaykKKwkgICAgPj4gcGFn
ZXNpemVfMnBvdyk7CisJYXNzZXJ0KHJ1bl9pbmQgPj0gYXJlbmFfY2h1bmtfaGVhZGVyX25wYWdl
cyk7CisJYXNzZXJ0KHJ1bl9pbmQgPCBjaHVua19ucGFnZXMpOworCWlmICgoY2h1bmstPm1hcFty
dW5faW5kXS5iaXRzICYgQ0hVTktfTUFQX0xBUkdFKSAhPSAwKQorCQlzaXplID0gY2h1bmstPm1h
cFtydW5faW5kXS5iaXRzICYgfnBhZ2VzaXplX21hc2s7CisJZWxzZQorCQlzaXplID0gcnVuLT5i
aW4tPnJ1bl9zaXplOworCXJ1bl9wYWdlcyA9IChzaXplID4+IHBhZ2VzaXplXzJwb3cpOworCisJ
LyogTWFyayBwYWdlcyBhcyB1bmFsbG9jYXRlZCBpbiB0aGUgY2h1bmsgbWFwLiAqLworCWlmIChk
aXJ0eSkgeworCQlzaXplX3QgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcnVuX3BhZ2VzOyBpKysp
IHsKKwkJCWFzc2VydCgoY2h1bmstPm1hcFtydW5faW5kICsgaV0uYml0cyAmIENIVU5LX01BUF9E
SVJUWSkKKwkJCSAgICA9PSAwKTsKKwkJCWNodW5rLT5tYXBbcnVuX2luZCArIGldLmJpdHMgPSBD
SFVOS19NQVBfRElSVFk7CisJCX0KKworCQlpZiAoY2h1bmstPm5kaXJ0eSA9PSAwKSB7CisJCQlh
cmVuYV9jaHVua190cmVlX2RpcnR5X2luc2VydCgmYXJlbmEtPmNodW5rc19kaXJ0eSwKKwkJCSAg
ICBjaHVuayk7CisJCX0KKwkJY2h1bmstPm5kaXJ0eSArPSBydW5fcGFnZXM7CisJCWFyZW5hLT5u
ZGlydHkgKz0gcnVuX3BhZ2VzOworCX0gZWxzZSB7CisJCXNpemVfdCBpOworCisJCWZvciAoaSA9
IDA7IGkgPCBydW5fcGFnZXM7IGkrKykgeworCQkJY2h1bmstPm1hcFtydW5faW5kICsgaV0uYml0
cyAmPSB+KENIVU5LX01BUF9MQVJHRSB8CisJCQkgICAgQ0hVTktfTUFQX0FMTE9DQVRFRCk7CisJ
CX0KKwl9CisJY2h1bmstPm1hcFtydW5faW5kXS5iaXRzID0gc2l6ZSB8IChjaHVuay0+bWFwW3J1
bl9pbmRdLmJpdHMgJgorCSAgICBwYWdlc2l6ZV9tYXNrKTsKKwljaHVuay0+bWFwW3J1bl9pbmQr
cnVuX3BhZ2VzLTFdLmJpdHMgPSBzaXplIHwKKwkgICAgKGNodW5rLT5tYXBbcnVuX2luZCtydW5f
cGFnZXMtMV0uYml0cyAmIHBhZ2VzaXplX21hc2spOworCisJLyogVHJ5IHRvIGNvYWxlc2NlIGZv
cndhcmQuICovCisJaWYgKHJ1bl9pbmQgKyBydW5fcGFnZXMgPCBjaHVua19ucGFnZXMgJiYKKwkg
ICAgKGNodW5rLT5tYXBbcnVuX2luZCtydW5fcGFnZXNdLmJpdHMgJiBDSFVOS19NQVBfQUxMT0NB
VEVEKSA9PSAwKSB7CisJCXNpemVfdCBucnVuX3NpemUgPSBjaHVuay0+bWFwW3J1bl9pbmQrcnVu
X3BhZ2VzXS5iaXRzICYKKwkJICAgIH5wYWdlc2l6ZV9tYXNrOworCisJCS8qCisJCSAqIFJlbW92
ZSBzdWNjZXNzb3IgZnJvbSBydW5zX2F2YWlsOyB0aGUgY29hbGVzY2VkIHJ1biBpcworCQkgKiBp
bnNlcnRlZCBsYXRlci4KKwkJICovCisJCWFyZW5hX2F2YWlsX3RyZWVfcmVtb3ZlKCZhcmVuYS0+
cnVuc19hdmFpbCwKKwkJICAgICZjaHVuay0+bWFwW3J1bl9pbmQrcnVuX3BhZ2VzXSk7CisKKwkJ
c2l6ZSArPSBucnVuX3NpemU7CisJCXJ1bl9wYWdlcyA9IHNpemUgPj4gcGFnZXNpemVfMnBvdzsK
KworCQlhc3NlcnQoKGNodW5rLT5tYXBbcnVuX2luZCtydW5fcGFnZXMtMV0uYml0cyAmIH5wYWdl
c2l6ZV9tYXNrKQorCQkgICAgPT0gbnJ1bl9zaXplKTsKKwkJY2h1bmstPm1hcFtydW5faW5kXS5i
aXRzID0gc2l6ZSB8IChjaHVuay0+bWFwW3J1bl9pbmRdLmJpdHMgJgorCQkgICAgcGFnZXNpemVf
bWFzayk7CisJCWNodW5rLT5tYXBbcnVuX2luZCtydW5fcGFnZXMtMV0uYml0cyA9IHNpemUgfAor
CQkgICAgKGNodW5rLT5tYXBbcnVuX2luZCtydW5fcGFnZXMtMV0uYml0cyAmIHBhZ2VzaXplX21h
c2spOworCX0KKworCS8qIFRyeSB0byBjb2FsZXNjZSBiYWNrd2FyZC4gKi8KKwlpZiAocnVuX2lu
ZCA+IGFyZW5hX2NodW5rX2hlYWRlcl9ucGFnZXMgJiYgKGNodW5rLT5tYXBbcnVuX2luZC0xXS5i
aXRzICYKKwkgICAgQ0hVTktfTUFQX0FMTE9DQVRFRCkgPT0gMCkgeworCQlzaXplX3QgcHJ1bl9z
aXplID0gY2h1bmstPm1hcFtydW5faW5kLTFdLmJpdHMgJiB+cGFnZXNpemVfbWFzazsKKworCQly
dW5faW5kIC09IHBydW5fc2l6ZSA+PiBwYWdlc2l6ZV8ycG93OworCisJCS8qCisJCSAqIFJlbW92
ZSBwcmVkZWNlc3NvciBmcm9tIHJ1bnNfYXZhaWw7IHRoZSBjb2FsZXNjZWQgcnVuIGlzCisJCSAq
IGluc2VydGVkIGxhdGVyLgorCQkgKi8KKwkJYXJlbmFfYXZhaWxfdHJlZV9yZW1vdmUoJmFyZW5h
LT5ydW5zX2F2YWlsLAorCQkgICAgJmNodW5rLT5tYXBbcnVuX2luZF0pOworCisJCXNpemUgKz0g
cHJ1bl9zaXplOworCQlydW5fcGFnZXMgPSBzaXplID4+IHBhZ2VzaXplXzJwb3c7CisKKwkJYXNz
ZXJ0KChjaHVuay0+bWFwW3J1bl9pbmRdLmJpdHMgJiB+cGFnZXNpemVfbWFzaykgPT0KKwkJICAg
IHBydW5fc2l6ZSk7CisJCWNodW5rLT5tYXBbcnVuX2luZF0uYml0cyA9IHNpemUgfCAoY2h1bmst
Pm1hcFtydW5faW5kXS5iaXRzICYKKwkJICAgIHBhZ2VzaXplX21hc2spOworCQljaHVuay0+bWFw
W3J1bl9pbmQrcnVuX3BhZ2VzLTFdLmJpdHMgPSBzaXplIHwKKwkJICAgIChjaHVuay0+bWFwW3J1
bl9pbmQrcnVuX3BhZ2VzLTFdLmJpdHMgJiBwYWdlc2l6ZV9tYXNrKTsKKwl9CisKKwkvKiBJbnNl
cnQgaW50byBydW5zX2F2YWlsLCBub3cgdGhhdCBjb2FsZXNjaW5nIGlzIGNvbXBsZXRlLiAqLwor
CWFyZW5hX2F2YWlsX3RyZWVfaW5zZXJ0KCZhcmVuYS0+cnVuc19hdmFpbCwgJmNodW5rLT5tYXBb
cnVuX2luZF0pOworCisJLyogRGVhbGxvY2F0ZSBjaHVuayBpZiBpdCBpcyBub3cgY29tcGxldGVs
eSB1bnVzZWQuICovCisJaWYgKChjaHVuay0+bWFwW2FyZW5hX2NodW5rX2hlYWRlcl9ucGFnZXNd
LmJpdHMgJiAofnBhZ2VzaXplX21hc2sgfAorCSAgICBDSFVOS19NQVBfQUxMT0NBVEVEKSkgPT0g
YXJlbmFfbWF4Y2xhc3MpCisJCWFyZW5hX2NodW5rX2RlYWxsb2MoYXJlbmEsIGNodW5rKTsKKwor
CS8qIEVuZm9yY2Ugb3B0X2RpcnR5X21heC4gKi8KKwlpZiAoYXJlbmEtPm5kaXJ0eSA+IG9wdF9k
aXJ0eV9tYXgpCisJCWFyZW5hX3B1cmdlKGFyZW5hKTsKK30KKworc3RhdGljIHZvaWQKK2FyZW5h
X3J1bl90cmltX2hlYWQoYXJlbmFfdCAqYXJlbmEsIGFyZW5hX2NodW5rX3QgKmNodW5rLCBhcmVu
YV9ydW5fdCAqcnVuLAorICAgIHNpemVfdCBvbGRzaXplLCBzaXplX3QgbmV3c2l6ZSkKK3sKKwlz
aXplX3QgcGFnZWluZCA9ICgodWludHB0cl90KXJ1biAtICh1aW50cHRyX3QpY2h1bmspID4+IHBh
Z2VzaXplXzJwb3c7CisJc2l6ZV90IGhlYWRfbnBhZ2VzID0gKG9sZHNpemUgLSBuZXdzaXplKSA+
PiBwYWdlc2l6ZV8ycG93OworCisJYXNzZXJ0KG9sZHNpemUgPiBuZXdzaXplKTsKKworCS8qCisJ
ICogVXBkYXRlIHRoZSBjaHVuayBtYXAgc28gdGhhdCBhcmVuYV9ydW5fZGFsbG9jKCkgY2FuIHRy
ZWF0IHRoZQorCSAqIGxlYWRpbmcgcnVuIGFzIHNlcGFyYXRlbHkgYWxsb2NhdGVkLgorCSAqLwor
CWNodW5rLT5tYXBbcGFnZWluZF0uYml0cyA9IChvbGRzaXplIC0gbmV3c2l6ZSkgfCBDSFVOS19N
QVBfTEFSR0UgfAorCSAgICBDSFVOS19NQVBfQUxMT0NBVEVEOworCWNodW5rLT5tYXBbcGFnZWlu
ZCtoZWFkX25wYWdlc10uYml0cyA9IG5ld3NpemUgfCBDSFVOS19NQVBfTEFSR0UgfAorCSAgICBD
SFVOS19NQVBfQUxMT0NBVEVEOworCisJYXJlbmFfcnVuX2RhbGxvYyhhcmVuYSwgcnVuLCBmYWxz
ZSk7Cit9CisKK3N0YXRpYyB2b2lkCithcmVuYV9ydW5fdHJpbV90YWlsKGFyZW5hX3QgKmFyZW5h
LCBhcmVuYV9jaHVua190ICpjaHVuaywgYXJlbmFfcnVuX3QgKnJ1biwKKyAgICBzaXplX3Qgb2xk
c2l6ZSwgc2l6ZV90IG5ld3NpemUsIGJvb2wgZGlydHkpCit7CisJc2l6ZV90IHBhZ2VpbmQgPSAo
KHVpbnRwdHJfdClydW4gLSAodWludHB0cl90KWNodW5rKSA+PiBwYWdlc2l6ZV8ycG93OworCXNp
emVfdCBucGFnZXMgPSBuZXdzaXplID4+IHBhZ2VzaXplXzJwb3c7CisKKwlhc3NlcnQob2xkc2l6
ZSA+IG5ld3NpemUpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIGNodW5rIG1hcCBzbyB0aGF0IGFy
ZW5hX3J1bl9kYWxsb2MoKSBjYW4gdHJlYXQgdGhlCisJICogdHJhaWxpbmcgcnVuIGFzIHNlcGFy
YXRlbHkgYWxsb2NhdGVkLgorCSAqLworCWNodW5rLT5tYXBbcGFnZWluZF0uYml0cyA9IG5ld3Np
emUgfCBDSFVOS19NQVBfTEFSR0UgfAorCSAgICBDSFVOS19NQVBfQUxMT0NBVEVEOworCWNodW5r
LT5tYXBbcGFnZWluZCtucGFnZXNdLmJpdHMgPSAob2xkc2l6ZSAtIG5ld3NpemUpIHwgQ0hVTktf
TUFQX0xBUkdFCisJICAgIHwgQ0hVTktfTUFQX0FMTE9DQVRFRDsKKworCWFyZW5hX3J1bl9kYWxs
b2MoYXJlbmEsIChhcmVuYV9ydW5fdCAqKSgodWludHB0cl90KXJ1biArIG5ld3NpemUpLAorCSAg
ICBkaXJ0eSk7Cit9CisKK3N0YXRpYyBhcmVuYV9ydW5fdCAqCithcmVuYV9iaW5fbm9uZnVsbF9y
dW5fZ2V0KGFyZW5hX3QgKmFyZW5hLCBhcmVuYV9iaW5fdCAqYmluKQoreworCWFyZW5hX2NodW5r
X21hcF90ICptYXBlbG07CisJYXJlbmFfcnVuX3QgKnJ1bjsKKwl1bnNpZ25lZCBpLCByZW1haW5k
ZXI7CisKKwkvKiBMb29rIGZvciBhIHVzYWJsZSBydW4uICovCisJbWFwZWxtID0gYXJlbmFfcnVu
X3RyZWVfZmlyc3QoJmJpbi0+cnVucyk7CisJaWYgKG1hcGVsbSAhPSBOVUxMKSB7CisJCS8qIHJ1
biBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYXZhaWxhYmxlIHNwYWNlLiAqLworCQlhcmVuYV9ydW5f
dHJlZV9yZW1vdmUoJmJpbi0+cnVucywgbWFwZWxtKTsKKwkJcnVuID0gKGFyZW5hX3J1bl90ICop
KG1hcGVsbS0+Yml0cyAmIH5wYWdlc2l6ZV9tYXNrKTsKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwkJ
YmluLT5zdGF0cy5yZXJ1bnMrKzsKKyNlbmRpZgorCQlyZXR1cm4gKHJ1bik7CisJfQorCS8qIE5v
IGV4aXN0aW5nIHJ1bnMgaGF2ZSBhbnkgc3BhY2UgYXZhaWxhYmxlLiAqLworCisJLyogQWxsb2Nh
dGUgYSBuZXcgcnVuLiAqLworCXJ1biA9IGFyZW5hX3J1bl9hbGxvYyhhcmVuYSwgYmluLT5ydW5f
c2l6ZSwgZmFsc2UsIGZhbHNlKTsKKwlpZiAocnVuID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7
CisKKwkvKiBJbml0aWFsaXplIHJ1biBpbnRlcm5hbHMuICovCisJcnVuLT5iaW4gPSBiaW47CisK
Kwlmb3IgKGkgPSAwOyBpIDwgYmluLT5yZWdzX21hc2tfbmVsbXMgLSAxOyBpKyspCisJCXJ1bi0+
cmVnc19tYXNrW2ldID0gVUlOVF9NQVg7CisJcmVtYWluZGVyID0gYmluLT5ucmVncyAmICgoMVUg
PDwgKFNJWkVPRl9JTlRfMlBPVyArIDMpKSAtIDEpOworCWlmIChyZW1haW5kZXIgPT0gMCkKKwkJ
cnVuLT5yZWdzX21hc2tbaV0gPSBVSU5UX01BWDsKKwllbHNlIHsKKwkJLyogVGhlIGxhc3QgZWxl
bWVudCBoYXMgc3BhcmUgYml0cyB0aGF0IG5lZWQgdG8gYmUgdW5zZXQuICovCisJCXJ1bi0+cmVn
c19tYXNrW2ldID0gKFVJTlRfTUFYID4+ICgoMVUgPDwgKFNJWkVPRl9JTlRfMlBPVyArIDMpKQor
CQkgICAgLSByZW1haW5kZXIpKTsKKwl9CisKKwlydW4tPnJlZ3NfbWluZWxtID0gMDsKKworCXJ1
bi0+bmZyZWUgPSBiaW4tPm5yZWdzOworI2lmZGVmIE1BTExPQ19ERUJVRworCXJ1bi0+bWFnaWMg
PSBBUkVOQV9SVU5fTUFHSUM7CisjZW5kaWYKKworI2lmZGVmIE1BTExPQ19TVEFUUworCWJpbi0+
c3RhdHMubnJ1bnMrKzsKKwliaW4tPnN0YXRzLmN1cnJ1bnMrKzsKKwlpZiAoYmluLT5zdGF0cy5j
dXJydW5zID4gYmluLT5zdGF0cy5oaWdocnVucykKKwkJYmluLT5zdGF0cy5oaWdocnVucyA9IGJp
bi0+c3RhdHMuY3VycnVuczsKKyNlbmRpZgorCXJldHVybiAocnVuKTsKK30KKworLyogYmluLT5y
dW5jdXIgbXVzdCBoYXZlIHNwYWNlIGF2YWlsYWJsZSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBj
YWxsZWQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYXJlbmFfYmluX21hbGxvY19lYXN5KGFy
ZW5hX3QgKmFyZW5hLCBhcmVuYV9iaW5fdCAqYmluLCBhcmVuYV9ydW5fdCAqcnVuKQoreworCXZv
aWQgKnJldDsKKworCWFzc2VydChydW4tPm1hZ2ljID09IEFSRU5BX1JVTl9NQUdJQyk7CisJYXNz
ZXJ0KHJ1bi0+bmZyZWUgPiAwKTsKKworCXJldCA9IGFyZW5hX3J1bl9yZWdfYWxsb2MocnVuLCBi
aW4pOworCWFzc2VydChyZXQgIT0gTlVMTCk7CisJcnVuLT5uZnJlZS0tOworCisJcmV0dXJuIChy
ZXQpOworfQorCisvKiBSZS1maWxsIGJpbi0+cnVuY3VyLCB0aGVuIGNhbGwgYXJlbmFfYmluX21h
bGxvY19lYXN5KCkuICovCitzdGF0aWMgdm9pZCAqCithcmVuYV9iaW5fbWFsbG9jX2hhcmQoYXJl
bmFfdCAqYXJlbmEsIGFyZW5hX2Jpbl90ICpiaW4pCit7CisKKwliaW4tPnJ1bmN1ciA9IGFyZW5h
X2Jpbl9ub25mdWxsX3J1bl9nZXQoYXJlbmEsIGJpbik7CisJaWYgKGJpbi0+cnVuY3VyID09IE5V
TEwpCisJCXJldHVybiAoTlVMTCk7CisJYXNzZXJ0KGJpbi0+cnVuY3VyLT5tYWdpYyA9PSBBUkVO
QV9SVU5fTUFHSUMpOworCWFzc2VydChiaW4tPnJ1bmN1ci0+bmZyZWUgPiAwKTsKKworCXJldHVy
biAoYXJlbmFfYmluX21hbGxvY19lYXN5KGFyZW5hLCBiaW4sIGJpbi0+cnVuY3VyKSk7Cit9CisK
Ky8qCisgKiBDYWxjdWxhdGUgYmluLT5ydW5fc2l6ZSBzdWNoIHRoYXQgaXQgbWVldHMgdGhlIGZv
bGxvd2luZyBjb25zdHJhaW50czoKKyAqCisgKiAgICopIGJpbi0+cnVuX3NpemUgPj0gbWluX3J1
bl9zaXplCisgKiAgICopIGJpbi0+cnVuX3NpemUgPD0gYXJlbmFfbWF4Y2xhc3MKKyAqICAgKikg
YmluLT5ydW5fc2l6ZSA8PSBSVU5fTUFYX1NNQUxMCisgKiAgICopIHJ1biBoZWFkZXIgb3Zlcmhl
YWQgPD0gUlVOX01BWF9PVlJIRCAob3IgaGVhZGVyIG92ZXJoZWFkIHJlbGF4ZWQpLgorICoKKyAq
IGJpbi0+bnJlZ3MsIGJpbi0+cmVnc19tYXNrX25lbG1zLCBhbmQgYmluLT5yZWcwX29mZnNldCBh
cmUKKyAqIGFsc28gY2FsY3VsYXRlZCBoZXJlLCBzaW5jZSB0aGVzZSBzZXR0aW5ncyBhcmUgYWxs
IGludGVyZGVwZW5kZW50LgorICovCitzdGF0aWMgc2l6ZV90CithcmVuYV9iaW5fcnVuX3NpemVf
Y2FsYyhhcmVuYV9iaW5fdCAqYmluLCBzaXplX3QgbWluX3J1bl9zaXplKQoreworCXNpemVfdCB0
cnlfcnVuX3NpemUsIGdvb2RfcnVuX3NpemU7CisJdW5zaWduZWQgZ29vZF9ucmVncywgZ29vZF9t
YXNrX25lbG1zLCBnb29kX3JlZzBfb2Zmc2V0OworCXVuc2lnbmVkIHRyeV9ucmVncywgdHJ5X21h
c2tfbmVsbXMsIHRyeV9yZWcwX29mZnNldDsKKworCWFzc2VydChtaW5fcnVuX3NpemUgPj0gcGFn
ZXNpemUpOworCWFzc2VydChtaW5fcnVuX3NpemUgPD0gYXJlbmFfbWF4Y2xhc3MpOworCWFzc2Vy
dChtaW5fcnVuX3NpemUgPD0gUlVOX01BWF9TTUFMTCk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBr
bm93bi12YWxpZCBzZXR0aW5ncyBiZWZvcmUgZW50ZXJpbmcgdGhlIHJ1bl9zaXplCisJICogZXhw
YW5zaW9uIGxvb3AsIHNvIHRoYXQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGxvb3AgYWx3YXlzIGNv
cGllcworCSAqIHZhbGlkIHNldHRpbmdzLgorCSAqCisJICogVGhlIGRvLi53aGlsZSBsb29wIGl0
ZXJhdGl2ZWx5IHJlZHVjZXMgdGhlIG51bWJlciBvZiByZWdpb25zIHVudGlsCisJICogdGhlIHJ1
biBoZWFkZXIgYW5kIHRoZSByZWdpb25zIG5vIGxvbmdlciBvdmVybGFwLiAgQSBjbG9zZWQgZm9y
bXVsYQorCSAqIHdvdWxkIGJlIHF1aXRlIG1lc3N5LCBzaW5jZSB0aGVyZSBpcyBhbiBpbnRlcmRl
cGVuZGVuY3kgYmV0d2VlbiB0aGUKKwkgKiBoZWFkZXIncyBtYXNrIGxlbmd0aCBhbmQgdGhlIG51
bWJlciBvZiByZWdpb25zLgorCSAqLworCXRyeV9ydW5fc2l6ZSA9IG1pbl9ydW5fc2l6ZTsKKwl0
cnlfbnJlZ3MgPSAoKHRyeV9ydW5fc2l6ZSAtIHNpemVvZihhcmVuYV9ydW5fdCkpIC8gYmluLT5y
ZWdfc2l6ZSkKKwkgICAgKyAxOyAvKiBDb3VudGVyLWFjdCB0cnlfbnJlZ3MtLSBpbiBsb29wLiAq
LworCWRvIHsKKwkJdHJ5X25yZWdzLS07CisJCXRyeV9tYXNrX25lbG1zID0gKHRyeV9ucmVncyA+
PiAoU0laRU9GX0lOVF8yUE9XICsgMykpICsKKwkJICAgICgodHJ5X25yZWdzICYgKCgxVSA8PCAo
U0laRU9GX0lOVF8yUE9XICsgMykpIC0gMSkpID8gMSA6IDApOworCQl0cnlfcmVnMF9vZmZzZXQg
PSB0cnlfcnVuX3NpemUgLSAodHJ5X25yZWdzICogYmluLT5yZWdfc2l6ZSk7CisJfSB3aGlsZSAo
c2l6ZW9mKGFyZW5hX3J1bl90KSArIChzaXplb2YodW5zaWduZWQpICogKHRyeV9tYXNrX25lbG1z
IC0gMSkpCisJICAgID4gdHJ5X3JlZzBfb2Zmc2V0KTsKKworCS8qIHJ1bl9zaXplIGV4cGFuc2lv
biBsb29wLiAqLworCWRvIHsKKwkJLyoKKwkJICogQ29weSB2YWxpZCBzZXR0aW5ncyBiZWZvcmUg
dHJ5aW5nIG1vcmUgYWdncmVzc2l2ZSBzZXR0aW5ncy4KKwkJICovCisJCWdvb2RfcnVuX3NpemUg
PSB0cnlfcnVuX3NpemU7CisJCWdvb2RfbnJlZ3MgPSB0cnlfbnJlZ3M7CisJCWdvb2RfbWFza19u
ZWxtcyA9IHRyeV9tYXNrX25lbG1zOworCQlnb29kX3JlZzBfb2Zmc2V0ID0gdHJ5X3JlZzBfb2Zm
c2V0OworCisJCS8qIFRyeSBtb3JlIGFnZ3Jlc3NpdmUgc2V0dGluZ3MuICovCisJCXRyeV9ydW5f
c2l6ZSArPSBwYWdlc2l6ZTsKKwkJdHJ5X25yZWdzID0gKCh0cnlfcnVuX3NpemUgLSBzaXplb2Yo
YXJlbmFfcnVuX3QpKSAvCisJCSAgICBiaW4tPnJlZ19zaXplKSArIDE7IC8qIENvdW50ZXItYWN0
IHRyeV9ucmVncy0tIGluIGxvb3AuICovCisJCWRvIHsKKwkJCXRyeV9ucmVncy0tOworCQkJdHJ5
X21hc2tfbmVsbXMgPSAodHJ5X25yZWdzID4+IChTSVpFT0ZfSU5UXzJQT1cgKyAzKSkgKworCQkJ
ICAgICgodHJ5X25yZWdzICYgKCgxVSA8PCAoU0laRU9GX0lOVF8yUE9XICsgMykpIC0gMSkpID8K
KwkJCSAgICAxIDogMCk7CisJCQl0cnlfcmVnMF9vZmZzZXQgPSB0cnlfcnVuX3NpemUgLSAodHJ5
X25yZWdzICoKKwkJCSAgICBiaW4tPnJlZ19zaXplKTsKKwkJfSB3aGlsZSAoc2l6ZW9mKGFyZW5h
X3J1bl90KSArIChzaXplb2YodW5zaWduZWQpICoKKwkJICAgICh0cnlfbWFza19uZWxtcyAtIDEp
KSA+IHRyeV9yZWcwX29mZnNldCk7CisJfSB3aGlsZSAodHJ5X3J1bl9zaXplIDw9IGFyZW5hX21h
eGNsYXNzICYmIHRyeV9ydW5fc2l6ZSA8PSBSVU5fTUFYX1NNQUxMCisJICAgICYmIFJVTl9NQVhf
T1ZSSEQgKiAoYmluLT5yZWdfc2l6ZSA8PCAzKSA+IFJVTl9NQVhfT1ZSSERfUkVMQVgKKwkgICAg
JiYgKHRyeV9yZWcwX29mZnNldCA8PCBSVU5fQkZQKSA+IFJVTl9NQVhfT1ZSSEQgKiB0cnlfcnVu
X3NpemUpOworCisJYXNzZXJ0KHNpemVvZihhcmVuYV9ydW5fdCkgKyAoc2l6ZW9mKHVuc2lnbmVk
KSAqIChnb29kX21hc2tfbmVsbXMgLSAxKSkKKwkgICAgPD0gZ29vZF9yZWcwX29mZnNldCk7CisJ
YXNzZXJ0KChnb29kX21hc2tfbmVsbXMgPDwgKFNJWkVPRl9JTlRfMlBPVyArIDMpKSA+PSBnb29k
X25yZWdzKTsKKworCS8qIENvcHkgZmluYWwgc2V0dGluZ3MuICovCisJYmluLT5ydW5fc2l6ZSA9
IGdvb2RfcnVuX3NpemU7CisJYmluLT5ucmVncyA9IGdvb2RfbnJlZ3M7CisJYmluLT5yZWdzX21h
c2tfbmVsbXMgPSBnb29kX21hc2tfbmVsbXM7CisJYmluLT5yZWcwX29mZnNldCA9IGdvb2RfcmVn
MF9vZmZzZXQ7CisKKwlyZXR1cm4gKGdvb2RfcnVuX3NpemUpOworfQorCisjaWZkZWYgTUFMTE9D
X0JBTEFOQ0UKK3N0YXRpYyBpbmxpbmUgdm9pZAorYXJlbmFfbG9ja19iYWxhbmNlKGFyZW5hX3Qg
KmFyZW5hKQoreworCXVuc2lnbmVkIGNvbnRlbnRpb247CisKKwljb250ZW50aW9uID0gbWFsbG9j
X3NwaW5fbG9jaygmYXJlbmEtPmxvY2spOworCWlmIChuYXJlbmFzID4gMSkgeworCQkvKgorCQkg
KiBDYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsbHkgYXZlcmFnZWQgY29udGVudGlvbiBmb3IgdGhp
cworCQkgKiBhcmVuYS4gIER1ZSB0byBpbnRlZ2VyIG1hdGggYWx3YXlzIHJvdW5kaW5nIGRvd24s
IHRoaXMgdmFsdWUKKwkJICogZGVjYXlzIHNvbWV3aGF0IGZhc3RlciB0aGFuIG5vcm1hbC4KKwkJ
ICovCisJCWFyZW5hLT5jb250ZW50aW9uID0gKCgodWludDY0X3QpYXJlbmEtPmNvbnRlbnRpb24K
KwkJICAgICogKHVpbnQ2NF90KSgoMVUgPDwgQkFMQU5DRV9BTFBIQV9JTlZfMlBPVyktMSkpCisJ
CSAgICArICh1aW50NjRfdCljb250ZW50aW9uKSA+PiBCQUxBTkNFX0FMUEhBX0lOVl8yUE9XOwor
CQlpZiAoYXJlbmEtPmNvbnRlbnRpb24gPj0gb3B0X2JhbGFuY2VfdGhyZXNob2xkKQorCQkJYXJl
bmFfbG9ja19iYWxhbmNlX2hhcmQoYXJlbmEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FyZW5h
X2xvY2tfYmFsYW5jZV9oYXJkKGFyZW5hX3QgKmFyZW5hKQoreworCXVpbnQzMl90IGluZDsKKwor
CWFyZW5hLT5jb250ZW50aW9uID0gMDsKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlhcmVuYS0+c3Rh
dHMubmJhbGFuY2UrKzsKKyNlbmRpZgorCWluZCA9IFBSTihiYWxhbmNlLCBuYXJlbmFzXzJwb3cp
OworCWlmIChhcmVuYXNbaW5kXSAhPSBOVUxMKQorCQlhcmVuYXNfbWFwID0gYXJlbmFzW2luZF07
CisJZWxzZSB7CisJCW1hbGxvY19zcGluX2xvY2soJmFyZW5hc19sb2NrKTsKKwkJaWYgKGFyZW5h
c1tpbmRdICE9IE5VTEwpCisJCQlhcmVuYXNfbWFwID0gYXJlbmFzW2luZF07CisJCWVsc2UKKwkJ
CWFyZW5hc19tYXAgPSBhcmVuYXNfZXh0ZW5kKGluZCk7CisJCW1hbGxvY19zcGluX3VubG9jaygm
YXJlbmFzX2xvY2spOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgTUFMTE9DX01BRworc3RhdGlj
IGlubGluZSB2b2lkICoKK21hZ19hbGxvYyhtYWdfdCAqbWFnKQoreworCisJaWYgKG1hZy0+bnJv
dW5kcyA9PSAwKQorCQlyZXR1cm4gKE5VTEwpOworCW1hZy0+bnJvdW5kcy0tOworCisJcmV0dXJu
IChtYWctPnJvdW5kc1ttYWctPm5yb3VuZHNdKTsKK30KKworc3RhdGljIHZvaWQKK21hZ19sb2Fk
KG1hZ190ICptYWcpCit7CisJYXJlbmFfdCAqYXJlbmE7CisJYXJlbmFfYmluX3QgKmJpbjsKKwlh
cmVuYV9ydW5fdCAqcnVuOworCXZvaWQgKnJvdW5kOworCXNpemVfdCBpOworCisJYXJlbmEgPSBj
aG9vc2VfYXJlbmEoKTsKKwliaW4gPSAmYXJlbmEtPmJpbnNbbWFnLT5iaW5pbmRdOworI2lmZGVm
IE1BTExPQ19CQUxBTkNFCisJYXJlbmFfbG9ja19iYWxhbmNlKGFyZW5hKTsKKyNlbHNlCisJbWFs
bG9jX3NwaW5fbG9jaygmYXJlbmEtPmxvY2spOworI2VuZGlmCisJZm9yIChpID0gbWFnLT5ucm91
bmRzOyBpIDwgbWF4X3JvdW5kczsgaSsrKSB7CisJCWlmICgocnVuID0gYmluLT5ydW5jdXIpICE9
IE5VTEwgJiYgcnVuLT5uZnJlZSA+IDApCisJCQlyb3VuZCA9IGFyZW5hX2Jpbl9tYWxsb2NfZWFz
eShhcmVuYSwgYmluLCBydW4pOworCQllbHNlCisJCQlyb3VuZCA9IGFyZW5hX2Jpbl9tYWxsb2Nf
aGFyZChhcmVuYSwgYmluKTsKKwkJaWYgKHJvdW5kID09IE5VTEwpCisJCQlicmVhazsKKwkJbWFn
LT5yb3VuZHNbaV0gPSByb3VuZDsKKwl9CisjaWZkZWYgTUFMTE9DX1NUQVRTCisJYmluLT5zdGF0
cy5ubWFncysrOworCWFyZW5hLT5zdGF0cy5ubWFsbG9jX3NtYWxsICs9IChpIC0gbWFnLT5ucm91
bmRzKTsKKwlhcmVuYS0+c3RhdHMuYWxsb2NhdGVkX3NtYWxsICs9IChpIC0gbWFnLT5ucm91bmRz
KSAqIGJpbi0+cmVnX3NpemU7CisjZW5kaWYKKwltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5s
b2NrKTsKKwltYWctPm5yb3VuZHMgPSBpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorbWFn
X3JhY2tfYWxsb2MobWFnX3JhY2tfdCAqcmFjaywgc2l6ZV90IHNpemUsIGJvb2wgemVybykKK3sK
Kwl2b2lkICpyZXQ7CisJYmluX21hZ3NfdCAqYmluX21hZ3M7CisJbWFnX3QgKm1hZzsKKwlzaXpl
X3QgYmluaW5kOworCisJYmluaW5kID0gc2l6ZTJiaW5bc2l6ZV07CisJYXNzZXJ0KGJpbmluZCA8
IG5iaW5zKTsKKwliaW5fbWFncyA9ICZyYWNrLT5iaW5fbWFnc1tiaW5pbmRdOworCisJbWFnID0g
YmluX21hZ3MtPmN1cm1hZzsKKwlpZiAobWFnID09IE5VTEwpIHsKKwkJLyogQ3JlYXRlIGFuIGlu
aXRpYWwgbWFnYXppbmUgZm9yIHRoaXMgc2l6ZSBjbGFzcy4gKi8KKwkJYXNzZXJ0KGJpbl9tYWdz
LT5zcGFyZW1hZyA9PSBOVUxMKTsKKwkJbWFnID0gbWFnX2NyZWF0ZShjaG9vc2VfYXJlbmEoKSwg
YmluaW5kKTsKKwkJaWYgKG1hZyA9PSBOVUxMKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJYmluX21h
Z3MtPmN1cm1hZyA9IG1hZzsKKwkJbWFnX2xvYWQobWFnKTsKKwl9CisKKwlyZXQgPSBtYWdfYWxs
b2MobWFnKTsKKwlpZiAocmV0ID09IE5VTEwpIHsKKwkJaWYgKGJpbl9tYWdzLT5zcGFyZW1hZyAh
PSBOVUxMKSB7CisJCQlpZiAoYmluX21hZ3MtPnNwYXJlbWFnLT5ucm91bmRzID4gMCkgeworCQkJ
CS8qIFN3YXAgbWFnYXppbmVzLiAqLworCQkJCWJpbl9tYWdzLT5jdXJtYWcgPSBiaW5fbWFncy0+
c3BhcmVtYWc7CisJCQkJYmluX21hZ3MtPnNwYXJlbWFnID0gbWFnOworCQkJCW1hZyA9IGJpbl9t
YWdzLT5jdXJtYWc7CisJCQl9IGVsc2UgeworCQkJCS8qIFJlbG9hZCB0aGUgY3VycmVudCBtYWdh
emluZS4gKi8KKwkJCQltYWdfbG9hZChtYWcpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ3Jl
YXRlIGEgc2Vjb25kIG1hZ2F6aW5lLiAqLworCQkJbWFnID0gbWFnX2NyZWF0ZShjaG9vc2VfYXJl
bmEoKSwgYmluaW5kKTsKKwkJCWlmIChtYWcgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKE5VTEwpOwor
CQkJbWFnX2xvYWQobWFnKTsKKwkJCWJpbl9tYWdzLT5zcGFyZW1hZyA9IGJpbl9tYWdzLT5jdXJt
YWc7CisJCQliaW5fbWFncy0+Y3VybWFnID0gbWFnOworCQl9CisJCXJldCA9IG1hZ19hbGxvYyht
YWcpOworCQlpZiAocmV0ID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWlmICh6
ZXJvID09IGZhbHNlKSB7CisJCWlmIChvcHRfanVuaykKKwkJCW1lbXNldChyZXQsIDB4YTUsIHNp
emUpOworCQllbHNlIGlmIChvcHRfemVybykKKwkJCW1lbXNldChyZXQsIDAsIHNpemUpOworCX0g
ZWxzZQorCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKworCXJldHVybiAocmV0KTsKK30KKyNlbmRp
ZgorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYXJlbmFfbWFsbG9jX3NtYWxsKGFyZW5hX3QgKmFy
ZW5hLCBzaXplX3Qgc2l6ZSwgYm9vbCB6ZXJvKQoreworCXZvaWQgKnJldDsKKwlhcmVuYV9iaW5f
dCAqYmluOworCWFyZW5hX3J1bl90ICpydW47CisJc2l6ZV90IGJpbmluZDsKKworCWJpbmluZCA9
IHNpemUyYmluW3NpemVdOworCWFzc2VydChiaW5pbmQgPCBuYmlucyk7CisJYmluID0gJmFyZW5h
LT5iaW5zW2JpbmluZF07CisJc2l6ZSA9IGJpbi0+cmVnX3NpemU7CisKKyNpZmRlZiBNQUxMT0Nf
QkFMQU5DRQorCWFyZW5hX2xvY2tfYmFsYW5jZShhcmVuYSk7CisjZWxzZQorCW1hbGxvY19zcGlu
X2xvY2soJmFyZW5hLT5sb2NrKTsKKyNlbmRpZgorCWlmICgocnVuID0gYmluLT5ydW5jdXIpICE9
IE5VTEwgJiYgcnVuLT5uZnJlZSA+IDApCisJCXJldCA9IGFyZW5hX2Jpbl9tYWxsb2NfZWFzeShh
cmVuYSwgYmluLCBydW4pOworCWVsc2UKKwkJcmV0ID0gYXJlbmFfYmluX21hbGxvY19oYXJkKGFy
ZW5hLCBiaW4pOworCisJaWYgKHJldCA9PSBOVUxMKSB7CisJCW1hbGxvY19zcGluX3VubG9jaygm
YXJlbmEtPmxvY2spOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworI2lmZGVmIE1BTExPQ19TVEFU
UworCWJpbi0+c3RhdHMubnJlcXVlc3RzKys7CisJYXJlbmEtPnN0YXRzLm5tYWxsb2Nfc21hbGwr
KzsKKwlhcmVuYS0+c3RhdHMuYWxsb2NhdGVkX3NtYWxsICs9IHNpemU7CisjZW5kaWYKKwltYWxs
b2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5sb2NrKTsKKworCWlmICh6ZXJvID09IGZhbHNlKSB7CisJ
CWlmIChvcHRfanVuaykKKwkJCW1lbXNldChyZXQsIDB4YTUsIHNpemUpOworCQllbHNlIGlmIChv
cHRfemVybykKKwkJCW1lbXNldChyZXQsIDAsIHNpemUpOworCX0gZWxzZQorCQltZW1zZXQocmV0
LCAwLCBzaXplKTsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHZvaWQgKgorYXJlbmFf
bWFsbG9jX2xhcmdlKGFyZW5hX3QgKmFyZW5hLCBzaXplX3Qgc2l6ZSwgYm9vbCB6ZXJvKQorewor
CXZvaWQgKnJldDsKKworCS8qIExhcmdlIGFsbG9jYXRpb24uICovCisJc2l6ZSA9IFBBR0VfQ0VJ
TElORyhzaXplKTsKKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQorCWFyZW5hX2xvY2tfYmFsYW5jZShh
cmVuYSk7CisjZWxzZQorCW1hbGxvY19zcGluX2xvY2soJmFyZW5hLT5sb2NrKTsKKyNlbmRpZgor
CXJldCA9ICh2b2lkICopYXJlbmFfcnVuX2FsbG9jKGFyZW5hLCBzaXplLCB0cnVlLCB6ZXJvKTsK
KwlpZiAocmV0ID09IE5VTEwpIHsKKwkJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYS0+bG9jayk7
CisJCXJldHVybiAoTlVMTCk7CisJfQorI2lmZGVmIE1BTExPQ19TVEFUUworCWFyZW5hLT5zdGF0
cy5ubWFsbG9jX2xhcmdlKys7CisJYXJlbmEtPnN0YXRzLmFsbG9jYXRlZF9sYXJnZSArPSBzaXpl
OworI2VuZGlmCisJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYS0+bG9jayk7CisKKwlpZiAoemVy
byA9PSBmYWxzZSkgeworCQlpZiAob3B0X2p1bmspCisJCQltZW1zZXQocmV0LCAweGE1LCBzaXpl
KTsKKwkJZWxzZSBpZiAob3B0X3plcm8pCisJCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwl9CisK
KwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCithcmVuYV9tYWxsb2Mo
YXJlbmFfdCAqYXJlbmEsIHNpemVfdCBzaXplLCBib29sIHplcm8pCit7CisKKwlhc3NlcnQoYXJl
bmEgIT0gTlVMTCk7CisJYXNzZXJ0KGFyZW5hLT5tYWdpYyA9PSBBUkVOQV9NQUdJQyk7CisJYXNz
ZXJ0KHNpemUgIT0gMCk7CisJYXNzZXJ0KFFVQU5UVU1fQ0VJTElORyhzaXplKSA8PSBhcmVuYV9t
YXhjbGFzcyk7CisKKwlpZiAoc2l6ZSA8PSBiaW5fbWF4Y2xhc3MpIHsKKyNpZmRlZiBNQUxMT0Nf
TUFHCisJCWlmIChfX2lzdGhyZWFkZWQgJiYgb3B0X21hZykgeworCQkJbWFnX3JhY2tfdCAqcmFj
ayA9IG1hZ19yYWNrOworCQkJaWYgKHJhY2sgPT0gTlVMTCkgeworCQkJCXJhY2sgPSBtYWdfcmFj
a19jcmVhdGUoYXJlbmEpOworCQkJCWlmIChyYWNrID09IE5VTEwpCisJCQkJCXJldHVybiAoTlVM
TCk7CisJCQkJbWFnX3JhY2sgPSByYWNrOworCQkJfQorCQkJcmV0dXJuIChtYWdfcmFja19hbGxv
YyhyYWNrLCBzaXplLCB6ZXJvKSk7CisJCX0gZWxzZQorI2VuZGlmCisJCQlyZXR1cm4gKGFyZW5h
X21hbGxvY19zbWFsbChhcmVuYSwgc2l6ZSwgemVybykpOworCX0gZWxzZQorCQlyZXR1cm4gKGFy
ZW5hX21hbGxvY19sYXJnZShhcmVuYSwgc2l6ZSwgemVybykpOworfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgKgoraW1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKworCWFzc2VydChzaXplICE9IDApOwor
CisJaWYgKHNpemUgPD0gYXJlbmFfbWF4Y2xhc3MpCisJCXJldHVybiAoYXJlbmFfbWFsbG9jKGNo
b29zZV9hcmVuYSgpLCBzaXplLCBmYWxzZSkpOworCWVsc2UKKwkJcmV0dXJuIChodWdlX21hbGxv
YyhzaXplLCBmYWxzZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgoraWNhbGxvYyhzaXpl
X3Qgc2l6ZSkKK3sKKworCWlmIChzaXplIDw9IGFyZW5hX21heGNsYXNzKQorCQlyZXR1cm4gKGFy
ZW5hX21hbGxvYyhjaG9vc2VfYXJlbmEoKSwgc2l6ZSwgdHJ1ZSkpOworCWVsc2UKKwkJcmV0dXJu
IChodWdlX21hbGxvYyhzaXplLCB0cnVlKSk7Cit9CisKKy8qIE9ubHkgaGFuZGxlcyBsYXJnZSBh
bGxvY2F0aW9ucyB0aGF0IHJlcXVpcmUgbW9yZSB0aGFuIHBhZ2UgYWxpZ25tZW50LiAqLworc3Rh
dGljIHZvaWQgKgorYXJlbmFfcGFsbG9jKGFyZW5hX3QgKmFyZW5hLCBzaXplX3QgYWxpZ25tZW50
LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsbG9jX3NpemUpCit7CisJdm9pZCAqcmV0OworCXNpemVf
dCBvZmZzZXQ7CisJYXJlbmFfY2h1bmtfdCAqY2h1bms7CisKKwlhc3NlcnQoKHNpemUgJiBwYWdl
c2l6ZV9tYXNrKSA9PSAwKTsKKwlhc3NlcnQoKGFsaWdubWVudCAmIHBhZ2VzaXplX21hc2spID09
IDApOworCisjaWZkZWYgTUFMTE9DX0JBTEFOQ0UKKwlhcmVuYV9sb2NrX2JhbGFuY2UoYXJlbmEp
OworI2Vsc2UKKwltYWxsb2Nfc3Bpbl9sb2NrKCZhcmVuYS0+bG9jayk7CisjZW5kaWYKKwlyZXQg
PSAodm9pZCAqKWFyZW5hX3J1bl9hbGxvYyhhcmVuYSwgYWxsb2Nfc2l6ZSwgdHJ1ZSwgZmFsc2Up
OworCWlmIChyZXQgPT0gTlVMTCkgeworCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5sb2Nr
KTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwljaHVuayA9IChhcmVuYV9jaHVua190ICopQ0hV
TktfQUREUjJCQVNFKHJldCk7CisKKwlvZmZzZXQgPSAodWludHB0cl90KXJldCAmIChhbGlnbm1l
bnQgLSAxKTsKKwlhc3NlcnQoKG9mZnNldCAmIHBhZ2VzaXplX21hc2spID09IDApOworCWFzc2Vy
dChvZmZzZXQgPCBhbGxvY19zaXplKTsKKwlpZiAob2Zmc2V0ID09IDApCisJCWFyZW5hX3J1bl90
cmltX3RhaWwoYXJlbmEsIGNodW5rLCByZXQsIGFsbG9jX3NpemUsIHNpemUsIGZhbHNlKTsKKwll
bHNlIHsKKwkJc2l6ZV90IGxlYWRzaXplLCB0cmFpbHNpemU7CisKKwkJbGVhZHNpemUgPSBhbGln
bm1lbnQgLSBvZmZzZXQ7CisJCWlmIChsZWFkc2l6ZSA+IDApIHsKKwkJCWFyZW5hX3J1bl90cmlt
X2hlYWQoYXJlbmEsIGNodW5rLCByZXQsIGFsbG9jX3NpemUsCisJCQkgICAgYWxsb2Nfc2l6ZSAt
IGxlYWRzaXplKTsKKwkJCXJldCA9ICh2b2lkICopKCh1aW50cHRyX3QpcmV0ICsgbGVhZHNpemUp
OworCQl9CisKKwkJdHJhaWxzaXplID0gYWxsb2Nfc2l6ZSAtIGxlYWRzaXplIC0gc2l6ZTsKKwkJ
aWYgKHRyYWlsc2l6ZSAhPSAwKSB7CisJCQkvKiBUcmltIHRyYWlsaW5nIHNwYWNlLiAqLworCQkJ
YXNzZXJ0KHRyYWlsc2l6ZSA8IGFsbG9jX3NpemUpOworCQkJYXJlbmFfcnVuX3RyaW1fdGFpbChh
cmVuYSwgY2h1bmssIHJldCwgc2l6ZSArIHRyYWlsc2l6ZSwKKwkJCSAgICBzaXplLCBmYWxzZSk7
CisJCX0KKwl9CisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlhcmVuYS0+c3RhdHMubm1hbGxvY19s
YXJnZSsrOworCWFyZW5hLT5zdGF0cy5hbGxvY2F0ZWRfbGFyZ2UgKz0gc2l6ZTsKKyNlbmRpZgor
CW1hbGxvY19zcGluX3VubG9jaygmYXJlbmEtPmxvY2spOworCisJaWYgKG9wdF9qdW5rKQorCQlt
ZW1zZXQocmV0LCAweGE1LCBzaXplKTsKKwllbHNlIGlmIChvcHRfemVybykKKwkJbWVtc2V0KHJl
dCwgMCwgc2l6ZSk7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgor
aXBhbGxvYyhzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQ7CisJ
c2l6ZV90IGNlaWxfc2l6ZTsKKworCS8qCisJICogUm91bmQgc2l6ZSB1cCB0byB0aGUgbmVhcmVz
dCBtdWx0aXBsZSBvZiBhbGlnbm1lbnQuCisJICoKKwkgKiBUaGlzIGRvbmUsIHdlIGNhbiB0YWtl
IGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IGZvciBlYWNoIHNtYWxsCisJICogc2l6ZSBjbGFz
cywgZXZlcnkgb2JqZWN0IGlzIGFsaWduZWQgYXQgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3bwor
CSAqIHRoYXQgaXMgbm9uLXplcm8gaW4gdGhlIGJhc2UgdHdvIHJlcHJlc2VudGF0aW9uIG9mIHRo
ZSBzaXplLiAgRm9yCisJICogZXhhbXBsZToKKwkgKgorCSAqICAgU2l6ZSB8ICAgQmFzZSAyIHwg
TWluaW11bSBhbGlnbm1lbnQKKwkgKiAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t
LS0tCisJICogICAgIDk2IHwgIDExMDAwMDAgfCAgMzIKKwkgKiAgICAxNDQgfCAxMDEwMDAwMCB8
ICAzMgorCSAqICAgIDE5MiB8IDExMDAwMDAwIHwgIDY0CisJICoKKwkgKiBEZXBlbmRpbmcgb24g
cnVudGltZSBzZXR0aW5ncywgaXQgaXMgcG9zc2libGUgdGhhdCBhcmVuYV9tYWxsb2MoKQorCSAq
IHdpbGwgZnVydGhlciByb3VuZCB1cCB0byBhIHBvd2VyIG9mIHR3bywgYnV0IHRoYXQgbmV2ZXIg
Y2F1c2VzCisJICogY29ycmVjdG5lc3MgaXNzdWVzLgorCSAqLworCWNlaWxfc2l6ZSA9IChzaXpl
ICsgKGFsaWdubWVudCAtIDEpKSAmICgtYWxpZ25tZW50KTsKKwkvKgorCSAqIChjZWlsX3NpemUg
PCBzaXplKSBwcm90ZWN0cyBhZ2FpbnN0IHRoZSBjb21iaW5hdGlvbiBvZiBtYXhpbWFsCisJICog
YWxpZ25tZW50IGFuZCBzaXplIGdyZWF0ZXIgdGhhbiBtYXhpbWFsIGFsaWdubWVudC4KKwkgKi8K
KwlpZiAoY2VpbF9zaXplIDwgc2l6ZSkgeworCQkvKiBzaXplX3Qgb3ZlcmZsb3cuICovCisJCXJl
dHVybiAoTlVMTCk7CisJfQorCisJaWYgKGNlaWxfc2l6ZSA8PSBwYWdlc2l6ZSB8fCAoYWxpZ25t
ZW50IDw9IHBhZ2VzaXplCisJICAgICYmIGNlaWxfc2l6ZSA8PSBhcmVuYV9tYXhjbGFzcykpCisJ
CXJldCA9IGFyZW5hX21hbGxvYyhjaG9vc2VfYXJlbmEoKSwgY2VpbF9zaXplLCBmYWxzZSk7CisJ
ZWxzZSB7CisJCXNpemVfdCBydW5fc2l6ZTsKKworCQkvKgorCQkgKiBXZSBjYW4ndCBhY2hpZXZl
IHN1YnBhZ2UgYWxpZ25tZW50LCBzbyByb3VuZCB1cCBhbGlnbm1lbnQKKwkJICogcGVybWFuZW50
bHk7IGl0IG1ha2VzIGxhdGVyIGNhbGN1bGF0aW9ucyBzaW1wbGVyLgorCQkgKi8KKwkJYWxpZ25t
ZW50ID0gUEFHRV9DRUlMSU5HKGFsaWdubWVudCk7CisJCWNlaWxfc2l6ZSA9IFBBR0VfQ0VJTElO
RyhzaXplKTsKKwkJLyoKKwkJICogKGNlaWxfc2l6ZSA8IHNpemUpIHByb3RlY3RzIGFnYWluc3Qg
dmVyeSBsYXJnZSBzaXplcyB3aXRoaW4KKwkJICogcGFnZXNpemUgb2YgU0laRV9UX01BWC4KKwkJ
ICoKKwkJICogKGNlaWxfc2l6ZSArIGFsaWdubWVudCA8IGNlaWxfc2l6ZSkgcHJvdGVjdHMgYWdh
aW5zdCB0aGUKKwkJICogY29tYmluYXRpb24gb2YgbWF4aW1hbCBhbGlnbm1lbnQgYW5kIGNlaWxf
c2l6ZSBsYXJnZSBlbm91Z2gKKwkJICogdG8gY2F1c2Ugb3ZlcmZsb3cuICBUaGlzIGlzIHNpbWls
YXIgdG8gdGhlIGZpcnN0IG92ZXJmbG93CisJCSAqIGNoZWNrIGFib3ZlLCBidXQgaXQgbmVlZHMg
dG8gYmUgcmVwZWF0ZWQgZHVlIHRvIHRoZSBuZXcKKwkJICogY2VpbF9zaXplIHZhbHVlLCB3aGlj
aCBtYXkgbm93IGJlICplcXVhbCogdG8gbWF4aW1hbAorCQkgKiBhbGlnbm1lbnQsIHdoZXJlYXMg
YmVmb3JlIHdlIG9ubHkgZGV0ZWN0ZWQgb3ZlcmZsb3cgaWYgdGhlCisJCSAqIG9yaWdpbmFsIHNp
emUgd2FzICpncmVhdGVyKiB0aGFuIG1heGltYWwgYWxpZ25tZW50LgorCQkgKi8KKwkJaWYgKGNl
aWxfc2l6ZSA8IHNpemUgfHwgY2VpbF9zaXplICsgYWxpZ25tZW50IDwgY2VpbF9zaXplKSB7CisJ
CQkvKiBzaXplX3Qgb3ZlcmZsb3cuICovCisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJLyoK
KwkJICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBvdmVyLXNpemUgcnVuIHRoYXQgYXJlbmFf
cGFsbG9jKCkKKwkJICogd291bGQgbmVlZCB0byBhbGxvY2F0ZSBpbiBvcmRlciB0byBndWFyYW50
ZWUgdGhlIGFsaWdubWVudC4KKwkJICovCisJCWlmIChjZWlsX3NpemUgPj0gYWxpZ25tZW50KQor
CQkJcnVuX3NpemUgPSBjZWlsX3NpemUgKyBhbGlnbm1lbnQgLSBwYWdlc2l6ZTsKKwkJZWxzZSB7
CisJCQkvKgorCQkJICogSXQgaXMgcG9zc2libGUgdGhhdCAoYWxpZ25tZW50IDw8IDEpIHdpbGwg
Y2F1c2UKKwkJCSAqIG92ZXJmbG93LCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB3ZSBh
bHNvCisJCQkgKiBzdWJ0cmFjdCBwYWdlc2l6ZSwgd2hpY2ggaW4gdGhlIGNhc2Ugb2Ygb3ZlcmZs
b3cKKwkJCSAqIGxlYXZlcyB1cyB3aXRoIGEgdmVyeSBsYXJnZSBydW5fc2l6ZS4gIFRoYXQgY2F1
c2VzCisJCQkgKiB0aGUgZmlyc3QgY29uZGl0aW9uYWwgYmVsb3cgdG8gZmFpbCwgd2hpY2ggbWVh
bnMKKwkJCSAqIHRoYXQgdGhlIGJvZ3VzIHJ1bl9zaXplIHZhbHVlIG5ldmVyIGdldHMgdXNlZCBm
b3IKKwkJCSAqIGFueXRoaW5nIGltcG9ydGFudC4KKwkJCSAqLworCQkJcnVuX3NpemUgPSAoYWxp
Z25tZW50IDw8IDEpIC0gcGFnZXNpemU7CisJCX0KKworCQlpZiAocnVuX3NpemUgPD0gYXJlbmFf
bWF4Y2xhc3MpIHsKKwkJCXJldCA9IGFyZW5hX3BhbGxvYyhjaG9vc2VfYXJlbmEoKSwgYWxpZ25t
ZW50LCBjZWlsX3NpemUsCisJCQkgICAgcnVuX3NpemUpOworCQl9IGVsc2UgaWYgKGFsaWdubWVu
dCA8PSBjaHVua3NpemUpCisJCQlyZXQgPSBodWdlX21hbGxvYyhjZWlsX3NpemUsIGZhbHNlKTsK
KwkJZWxzZQorCQkJcmV0ID0gaHVnZV9wYWxsb2MoYWxpZ25tZW50LCBjZWlsX3NpemUpOworCX0K
KworCWFzc2VydCgoKHVpbnRwdHJfdClyZXQgJiAoYWxpZ25tZW50IC0gMSkpID09IDApOworCXJl
dHVybiAocmV0KTsKK30KKworLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uIHBv
aW50ZWQgdG8gYnkgcHRyLiAqLworc3RhdGljIHNpemVfdAorYXJlbmFfc2FsbG9jKGNvbnN0IHZv
aWQgKnB0cikKK3sKKwlzaXplX3QgcmV0OworCWFyZW5hX2NodW5rX3QgKmNodW5rOworCXNpemVf
dCBwYWdlaW5kLCBtYXBiaXRzOworCisJYXNzZXJ0KHB0ciAhPSBOVUxMKTsKKwlhc3NlcnQoQ0hV
TktfQUREUjJCQVNFKHB0cikgIT0gcHRyKTsKKworCWNodW5rID0gKGFyZW5hX2NodW5rX3QgKilD
SFVOS19BRERSMkJBU0UocHRyKTsKKwlwYWdlaW5kID0gKCgodWludHB0cl90KXB0ciAtICh1aW50
cHRyX3QpY2h1bmspID4+IHBhZ2VzaXplXzJwb3cpOworCW1hcGJpdHMgPSBjaHVuay0+bWFwW3Bh
Z2VpbmRdLmJpdHM7CisJYXNzZXJ0KChtYXBiaXRzICYgQ0hVTktfTUFQX0FMTE9DQVRFRCkgIT0g
MCk7CisJaWYgKChtYXBiaXRzICYgQ0hVTktfTUFQX0xBUkdFKSA9PSAwKSB7CisJCWFyZW5hX3J1
bl90ICpydW4gPSAoYXJlbmFfcnVuX3QgKikobWFwYml0cyAmIH5wYWdlc2l6ZV9tYXNrKTsKKwkJ
YXNzZXJ0KHJ1bi0+bWFnaWMgPT0gQVJFTkFfUlVOX01BR0lDKTsKKwkJcmV0ID0gcnVuLT5iaW4t
PnJlZ19zaXplOworCX0gZWxzZSB7CisJCXJldCA9IG1hcGJpdHMgJiB+cGFnZXNpemVfbWFzazsK
KwkJYXNzZXJ0KHJldCAhPSAwKTsKKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBp
bmxpbmUgc2l6ZV90Citpc2FsbG9jKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlzaXplX3QgcmV0Owor
CWFyZW5hX2NodW5rX3QgKmNodW5rOworCisJYXNzZXJ0KHB0ciAhPSBOVUxMKTsKKworCWNodW5r
ID0gKGFyZW5hX2NodW5rX3QgKilDSFVOS19BRERSMkJBU0UocHRyKTsKKwlpZiAoY2h1bmsgIT0g
cHRyKSB7CisJCS8qIFJlZ2lvbi4gKi8KKwkJYXNzZXJ0KGNodW5rLT5hcmVuYS0+bWFnaWMgPT0g
QVJFTkFfTUFHSUMpOworCisJCXJldCA9IGFyZW5hX3NhbGxvYyhwdHIpOworCX0gZWxzZSB7CisJ
CWV4dGVudF9ub2RlX3QgKm5vZGUsIGtleTsKKworCQkvKiBDaHVuayAoaHVnZSBhbGxvY2F0aW9u
KS4gKi8KKworCQltYWxsb2NfbXV0ZXhfbG9jaygmaHVnZV9tdHgpOworCisJCS8qIEV4dHJhY3Qg
ZnJvbSB0cmVlIG9mIGh1Z2UgYWxsb2NhdGlvbnMuICovCisJCWtleS5hZGRyID0gX19ERUNPTlNU
KHZvaWQgKiwgcHRyKTsKKwkJbm9kZSA9IGV4dGVudF90cmVlX2FkX3NlYXJjaCgmaHVnZSwgJmtl
eSk7CisJCWFzc2VydChub2RlICE9IE5VTEwpOworCisJCXJldCA9IG5vZGUtPnNpemU7CisKKwkJ
bWFsbG9jX211dGV4X3VubG9jaygmaHVnZV9tdHgpOworCX0KKworCXJldHVybiAocmV0KTsKK30K
Kworc3RhdGljIGlubGluZSB2b2lkCithcmVuYV9kYWxsb2Nfc21hbGwoYXJlbmFfdCAqYXJlbmEs
IGFyZW5hX2NodW5rX3QgKmNodW5rLCB2b2lkICpwdHIsCisgICAgYXJlbmFfY2h1bmtfbWFwX3Qg
Km1hcGVsbSkKK3sKKwlhcmVuYV9ydW5fdCAqcnVuOworCWFyZW5hX2Jpbl90ICpiaW47CisJc2l6
ZV90IHNpemU7CisKKwlydW4gPSAoYXJlbmFfcnVuX3QgKikobWFwZWxtLT5iaXRzICYgfnBhZ2Vz
aXplX21hc2spOworCWFzc2VydChydW4tPm1hZ2ljID09IEFSRU5BX1JVTl9NQUdJQyk7CisJYmlu
ID0gcnVuLT5iaW47CisJc2l6ZSA9IGJpbi0+cmVnX3NpemU7CisKKwlpZiAob3B0X2p1bmspCisJ
CW1lbXNldChwdHIsIDB4NWEsIHNpemUpOworCisJYXJlbmFfcnVuX3JlZ19kYWxsb2MocnVuLCBi
aW4sIHB0ciwgc2l6ZSk7CisJcnVuLT5uZnJlZSsrOworCisJaWYgKHJ1bi0+bmZyZWUgPT0gYmlu
LT5ucmVncykgeworCQkvKiBEZWFsbG9jYXRlIHJ1bi4gKi8KKwkJaWYgKHJ1biA9PSBiaW4tPnJ1
bmN1cikKKwkJCWJpbi0+cnVuY3VyID0gTlVMTDsKKwkJZWxzZSBpZiAoYmluLT5ucmVncyAhPSAx
KSB7CisJCQlzaXplX3QgcnVuX3BhZ2VpbmQgPSAoKCh1aW50cHRyX3QpcnVuIC0KKwkJCSAgICAo
dWludHB0cl90KWNodW5rKSkgPj4gcGFnZXNpemVfMnBvdzsKKwkJCWFyZW5hX2NodW5rX21hcF90
ICpydW5fbWFwZWxtID0KKwkJCSAgICAmY2h1bmstPm1hcFtydW5fcGFnZWluZF07CisJCQkvKgor
CQkJICogVGhpcyBibG9jaydzIGNvbmRpdGlvbmFsIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGlmIHRo
ZQorCQkJICogcnVuIG9ubHkgY29udGFpbnMgb25lIHJlZ2lvbiwgdGhlbiBpdCBuZXZlciBnZXRz
CisJCQkgKiBpbnNlcnRlZCBpbnRvIHRoZSBub24tZnVsbCBydW5zIHRyZWUuCisJCQkgKi8KKwkJ
CWFyZW5hX3J1bl90cmVlX3JlbW92ZSgmYmluLT5ydW5zLCBydW5fbWFwZWxtKTsKKwkJfQorI2lm
ZGVmIE1BTExPQ19ERUJVRworCQlydW4tPm1hZ2ljID0gMDsKKyNlbmRpZgorCQlhcmVuYV9ydW5f
ZGFsbG9jKGFyZW5hLCBydW4sIHRydWUpOworI2lmZGVmIE1BTExPQ19TVEFUUworCQliaW4tPnN0
YXRzLmN1cnJ1bnMtLTsKKyNlbmRpZgorCX0gZWxzZSBpZiAocnVuLT5uZnJlZSA9PSAxICYmIHJ1
biAhPSBiaW4tPnJ1bmN1cikgeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCBiaW4tPnJ1bmN1
ciBhbHdheXMgcmVmZXJzIHRvIHRoZSBsb3dlc3QKKwkJICogbm9uLWZ1bGwgcnVuLCBpZiBvbmUg
ZXhpc3RzLgorCQkgKi8KKwkJaWYgKGJpbi0+cnVuY3VyID09IE5VTEwpCisJCQliaW4tPnJ1bmN1
ciA9IHJ1bjsKKwkJZWxzZSBpZiAoKHVpbnRwdHJfdClydW4gPCAodWludHB0cl90KWJpbi0+cnVu
Y3VyKSB7CisJCQkvKiBTd2l0Y2ggcnVuY3VyLiAqLworCQkJaWYgKGJpbi0+cnVuY3VyLT5uZnJl
ZSA+IDApIHsKKwkJCQlhcmVuYV9jaHVua190ICpydW5jdXJfY2h1bmsgPQorCQkJCSAgICBDSFVO
S19BRERSMkJBU0UoYmluLT5ydW5jdXIpOworCQkJCXNpemVfdCBydW5jdXJfcGFnZWluZCA9CisJ
CQkJICAgICgoKHVpbnRwdHJfdCliaW4tPnJ1bmN1ciAtCisJCQkJICAgICh1aW50cHRyX3QpcnVu
Y3VyX2NodW5rKSkgPj4gcGFnZXNpemVfMnBvdzsKKwkJCQlhcmVuYV9jaHVua19tYXBfdCAqcnVu
Y3VyX21hcGVsbSA9CisJCQkJICAgICZydW5jdXJfY2h1bmstPm1hcFtydW5jdXJfcGFnZWluZF07
CisKKwkJCQkvKiBJbnNlcnQgcnVuY3VyLiAqLworCQkJCWFyZW5hX3J1bl90cmVlX2luc2VydCgm
YmluLT5ydW5zLAorCQkJCSAgICBydW5jdXJfbWFwZWxtKTsKKwkJCX0KKwkJCWJpbi0+cnVuY3Vy
ID0gcnVuOworCQl9IGVsc2UgeworCQkJc2l6ZV90IHJ1bl9wYWdlaW5kID0gKCgodWludHB0cl90
KXJ1biAtCisJCQkgICAgKHVpbnRwdHJfdCljaHVuaykpID4+IHBhZ2VzaXplXzJwb3c7CisJCQlh
cmVuYV9jaHVua19tYXBfdCAqcnVuX21hcGVsbSA9CisJCQkgICAgJmNodW5rLT5tYXBbcnVuX3Bh
Z2VpbmRdOworCisJCQlhc3NlcnQoYXJlbmFfcnVuX3RyZWVfc2VhcmNoKCZiaW4tPnJ1bnMsIHJ1
bl9tYXBlbG0pID09CisJCQkgICAgTlVMTCk7CisJCQlhcmVuYV9ydW5fdHJlZV9pbnNlcnQoJmJp
bi0+cnVucywgcnVuX21hcGVsbSk7CisJCX0KKwl9CisjaWZkZWYgTUFMTE9DX1NUQVRTCisJYXJl
bmEtPnN0YXRzLmFsbG9jYXRlZF9zbWFsbCAtPSBzaXplOworCWFyZW5hLT5zdGF0cy5uZGFsbG9j
X3NtYWxsKys7CisjZW5kaWYKK30KKworI2lmZGVmIE1BTExPQ19NQUcKK3N0YXRpYyB2b2lkCitt
YWdfdW5sb2FkKG1hZ190ICptYWcpCit7CisJYXJlbmFfY2h1bmtfdCAqY2h1bms7CisJYXJlbmFf
dCAqYXJlbmE7CisJdm9pZCAqcm91bmQ7CisJc2l6ZV90IGksIG5kZWZlcnJlZCwgbnJvdW5kczsK
KworCWZvciAobmRlZmVycmVkID0gbWFnLT5ucm91bmRzOyBuZGVmZXJyZWQgPiAwOykgeworCQlu
cm91bmRzID0gbmRlZmVycmVkOworCQkvKiBMb2NrIHRoZSBhcmVuYSBhc3NvY2lhdGVkIHdpdGgg
dGhlIGZpcnN0IHJvdW5kLiAqLworCQljaHVuayA9IChhcmVuYV9jaHVua190ICopQ0hVTktfQURE
UjJCQVNFKG1hZy0+cm91bmRzWzBdKTsKKwkJYXJlbmEgPSBjaHVuay0+YXJlbmE7CisjaWZkZWYg
TUFMTE9DX0JBTEFOQ0UKKwkJYXJlbmFfbG9ja19iYWxhbmNlKGFyZW5hKTsKKyNlbHNlCisJCW1h
bGxvY19zcGluX2xvY2soJmFyZW5hLT5sb2NrKTsKKyNlbmRpZgorCQkvKiBEZWFsbG9jYXRlIGV2
ZXJ5IHJvdW5kIHRoYXQgYmVsb25ncyB0byB0aGUgbG9ja2VkIGFyZW5hLiAqLworCQlmb3IgKGkg
PSBuZGVmZXJyZWQgPSAwOyBpIDwgbnJvdW5kczsgaSsrKSB7CisJCQlyb3VuZCA9IG1hZy0+cm91
bmRzW2ldOworCQkJY2h1bmsgPSAoYXJlbmFfY2h1bmtfdCAqKUNIVU5LX0FERFIyQkFTRShyb3Vu
ZCk7CisJCQlpZiAoY2h1bmstPmFyZW5hID09IGFyZW5hKSB7CisJCQkJc2l6ZV90IHBhZ2VpbmQg
PSAoKCh1aW50cHRyX3Qpcm91bmQgLQorCQkJCSAgICAodWludHB0cl90KWNodW5rKSA+PiBwYWdl
c2l6ZV8ycG93KTsKKwkJCQlhcmVuYV9jaHVua19tYXBfdCAqbWFwZWxtID0KKwkJCQkgICAgJmNo
dW5rLT5tYXBbcGFnZWluZF07CisJCQkJYXJlbmFfZGFsbG9jX3NtYWxsKGFyZW5hLCBjaHVuaywg
cm91bmQsIG1hcGVsbSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyByb3VuZCB3
YXMgYWxsb2NhdGVkIHZpYSBhIGRpZmZlcmVudAorCQkJCSAqIGFyZW5hIHRoYW4gdGhlIG9uZSB0
aGF0IGlzIGN1cnJlbnRseSBsb2NrZWQuCisJCQkJICogU3Rhc2ggdGhlIHJvdW5kLCBzbyB0aGF0
IGl0IGNhbiBiZSBoYW5kbGVkCisJCQkJICogaW4gYSBmdXR1cmUgcGFzcy4KKwkJCQkgKi8KKwkJ
CQltYWctPnJvdW5kc1tuZGVmZXJyZWRdID0gcm91bmQ7CisJCQkJbmRlZmVycmVkKys7CisJCQl9
CisJCX0KKwkJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYS0+bG9jayk7CisJfQorCisJbWFnLT5u
cm91bmRzID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCittYWdfcmFja19kYWxsb2MobWFn
X3JhY2tfdCAqcmFjaywgdm9pZCAqcHRyKQoreworCWFyZW5hX3QgKmFyZW5hOworCWFyZW5hX2No
dW5rX3QgKmNodW5rOworCWFyZW5hX3J1bl90ICpydW47CisJYXJlbmFfYmluX3QgKmJpbjsKKwli
aW5fbWFnc190ICpiaW5fbWFnczsKKwltYWdfdCAqbWFnOworCXNpemVfdCBwYWdlaW5kLCBiaW5p
bmQ7CisJYXJlbmFfY2h1bmtfbWFwX3QgKm1hcGVsbTsKKworCWNodW5rID0gKGFyZW5hX2NodW5r
X3QgKilDSFVOS19BRERSMkJBU0UocHRyKTsKKwlhcmVuYSA9IGNodW5rLT5hcmVuYTsKKwlwYWdl
aW5kID0gKCgodWludHB0cl90KXB0ciAtICh1aW50cHRyX3QpY2h1bmspID4+IHBhZ2VzaXplXzJw
b3cpOworCW1hcGVsbSA9ICZjaHVuay0+bWFwW3BhZ2VpbmRdOworCXJ1biA9IChhcmVuYV9ydW5f
dCAqKShtYXBlbG0tPmJpdHMgJiB+cGFnZXNpemVfbWFzayk7CisJYXNzZXJ0KHJ1bi0+bWFnaWMg
PT0gQVJFTkFfUlVOX01BR0lDKTsKKwliaW4gPSBydW4tPmJpbjsKKwliaW5pbmQgPSAoKHVpbnRw
dHJfdCliaW4gLSAodWludHB0cl90KSZhcmVuYS0+YmlucykgLworCSAgICBzaXplb2YoYXJlbmFf
YmluX3QpOworCWFzc2VydChiaW5pbmQgPCBuYmlucyk7CisKKwlpZiAob3B0X2p1bmspCisJCW1l
bXNldChwdHIsIDB4NWEsIGFyZW5hLT5iaW5zW2JpbmluZF0ucmVnX3NpemUpOworCisJYmluX21h
Z3MgPSAmcmFjay0+YmluX21hZ3NbYmluaW5kXTsKKwltYWcgPSBiaW5fbWFncy0+Y3VybWFnOwor
CWlmIChtYWcgPT0gTlVMTCkgeworCQkvKiBDcmVhdGUgYW4gaW5pdGlhbCBtYWdhemluZSBmb3Ig
dGhpcyBzaXplIGNsYXNzLiAqLworCQlhc3NlcnQoYmluX21hZ3MtPnNwYXJlbWFnID09IE5VTEwp
OworCQltYWcgPSBtYWdfY3JlYXRlKGNob29zZV9hcmVuYSgpLCBiaW5pbmQpOworCQlpZiAobWFn
ID09IE5VTEwpIHsKKwkJCW1hbGxvY19zcGluX2xvY2soJmFyZW5hLT5sb2NrKTsKKwkJCWFyZW5h
X2RhbGxvY19zbWFsbChhcmVuYSwgY2h1bmssIHB0ciwgbWFwZWxtKTsKKwkJCW1hbGxvY19zcGlu
X3VubG9jaygmYXJlbmEtPmxvY2spOworCQkJcmV0dXJuOworCQl9CisJCWJpbl9tYWdzLT5jdXJt
YWcgPSBtYWc7CisJfQorCisJaWYgKG1hZy0+bnJvdW5kcyA9PSBtYXhfcm91bmRzKSB7CisJCWlm
IChiaW5fbWFncy0+c3BhcmVtYWcgIT0gTlVMTCkgeworCQkJaWYgKGJpbl9tYWdzLT5zcGFyZW1h
Zy0+bnJvdW5kcyA8IG1heF9yb3VuZHMpIHsKKwkJCQkvKiBTd2FwIG1hZ2F6aW5lcy4gKi8KKwkJ
CQliaW5fbWFncy0+Y3VybWFnID0gYmluX21hZ3MtPnNwYXJlbWFnOworCQkJCWJpbl9tYWdzLT5z
cGFyZW1hZyA9IG1hZzsKKwkJCQltYWcgPSBiaW5fbWFncy0+Y3VybWFnOworCQkJfSBlbHNlIHsK
KwkJCQkvKiBVbmxvYWQgdGhlIGN1cnJlbnQgbWFnYXppbmUuICovCisJCQkJbWFnX3VubG9hZCht
YWcpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ3JlYXRlIGEgc2Vjb25kIG1hZ2F6aW5lLiAq
LworCQkJbWFnID0gbWFnX2NyZWF0ZShjaG9vc2VfYXJlbmEoKSwgYmluaW5kKTsKKwkJCWlmICht
YWcgPT0gTlVMTCkgeworCQkJCW1hZyA9IHJhY2stPmJpbl9tYWdzW2JpbmluZF0uY3VybWFnOwor
CQkJCW1hZ191bmxvYWQobWFnKTsKKwkJCX0gZWxzZSB7CisJCQkJYmluX21hZ3MtPnNwYXJlbWFn
ID0gYmluX21hZ3MtPmN1cm1hZzsKKwkJCQliaW5fbWFncy0+Y3VybWFnID0gbWFnOworCQkJfQor
CQl9CisJCWFzc2VydChtYWctPm5yb3VuZHMgPCBtYXhfcm91bmRzKTsKKwl9CisJbWFnLT5yb3Vu
ZHNbbWFnLT5ucm91bmRzXSA9IHB0cjsKKwltYWctPm5yb3VuZHMrKzsKK30KKyNlbmRpZgorCitz
dGF0aWMgdm9pZAorYXJlbmFfZGFsbG9jX2xhcmdlKGFyZW5hX3QgKmFyZW5hLCBhcmVuYV9jaHVu
a190ICpjaHVuaywgdm9pZCAqcHRyKQoreworCS8qIExhcmdlIGFsbG9jYXRpb24uICovCisJbWFs
bG9jX3NwaW5fbG9jaygmYXJlbmEtPmxvY2spOworCisjaWZuZGVmIE1BTExPQ19TVEFUUworCWlm
IChvcHRfanVuaykKKyNlbmRpZgorCXsKKwkJc2l6ZV90IHBhZ2VpbmQgPSAoKHVpbnRwdHJfdClw
dHIgLSAodWludHB0cl90KWNodW5rKSA+PgorCQkgICAgcGFnZXNpemVfMnBvdzsKKwkJc2l6ZV90
IHNpemUgPSBjaHVuay0+bWFwW3BhZ2VpbmRdLmJpdHMgJiB+cGFnZXNpemVfbWFzazsKKworI2lm
ZGVmIE1BTExPQ19TVEFUUworCQlpZiAob3B0X2p1bmspCisjZW5kaWYKKwkJCW1lbXNldChwdHIs
IDB4NWEsIHNpemUpOworI2lmZGVmIE1BTExPQ19TVEFUUworCQlhcmVuYS0+c3RhdHMuYWxsb2Nh
dGVkX2xhcmdlIC09IHNpemU7CisjZW5kaWYKKwl9CisjaWZkZWYgTUFMTE9DX1NUQVRTCisJYXJl
bmEtPnN0YXRzLm5kYWxsb2NfbGFyZ2UrKzsKKyNlbmRpZgorCisJYXJlbmFfcnVuX2RhbGxvYyhh
cmVuYSwgKGFyZW5hX3J1bl90ICopcHRyLCB0cnVlKTsKKwltYWxsb2Nfc3Bpbl91bmxvY2soJmFy
ZW5hLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithcmVuYV9kYWxsb2MoYXJlbmFf
dCAqYXJlbmEsIGFyZW5hX2NodW5rX3QgKmNodW5rLCB2b2lkICpwdHIpCit7CisJc2l6ZV90IHBh
Z2VpbmQ7CisJYXJlbmFfY2h1bmtfbWFwX3QgKm1hcGVsbTsKKworCWFzc2VydChhcmVuYSAhPSBO
VUxMKTsKKwlhc3NlcnQoYXJlbmEtPm1hZ2ljID09IEFSRU5BX01BR0lDKTsKKwlhc3NlcnQoY2h1
bmstPmFyZW5hID09IGFyZW5hKTsKKwlhc3NlcnQocHRyICE9IE5VTEwpOworCWFzc2VydChDSFVO
S19BRERSMkJBU0UocHRyKSAhPSBwdHIpOworCisJcGFnZWluZCA9ICgoKHVpbnRwdHJfdClwdHIg
LSAodWludHB0cl90KWNodW5rKSA+PiBwYWdlc2l6ZV8ycG93KTsKKwltYXBlbG0gPSAmY2h1bmst
Pm1hcFtwYWdlaW5kXTsKKwlhc3NlcnQoKG1hcGVsbS0+Yml0cyAmIENIVU5LX01BUF9BTExPQ0FU
RUQpICE9IDApOworCWlmICgobWFwZWxtLT5iaXRzICYgQ0hVTktfTUFQX0xBUkdFKSA9PSAwKSB7
CisJCS8qIFNtYWxsIGFsbG9jYXRpb24uICovCisjaWZkZWYgTUFMTE9DX01BRworCQlpZiAoX19p
c3RocmVhZGVkICYmIG9wdF9tYWcpIHsKKwkJCW1hZ19yYWNrX3QgKnJhY2sgPSBtYWdfcmFjazsK
KwkJCWlmIChyYWNrID09IE5VTEwpIHsKKwkJCQlyYWNrID0gbWFnX3JhY2tfY3JlYXRlKGFyZW5h
KTsKKwkJCQlpZiAocmFjayA9PSBOVUxMKSB7CisJCQkJCW1hbGxvY19zcGluX2xvY2soJmFyZW5h
LT5sb2NrKTsKKwkJCQkJYXJlbmFfZGFsbG9jX3NtYWxsKGFyZW5hLCBjaHVuaywgcHRyLAorCQkJ
CQkgICAgbWFwZWxtKTsKKwkJCQkJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYS0+bG9jayk7CisJ
CQkJfQorCQkJCW1hZ19yYWNrID0gcmFjazsKKwkJCX0KKwkJCW1hZ19yYWNrX2RhbGxvYyhyYWNr
LCBwdHIpOworCQl9IGVsc2UgeworI2VuZGlmCisJCQltYWxsb2Nfc3Bpbl9sb2NrKCZhcmVuYS0+
bG9jayk7CisJCQlhcmVuYV9kYWxsb2Nfc21hbGwoYXJlbmEsIGNodW5rLCBwdHIsIG1hcGVsbSk7
CisJCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5sb2NrKTsKKyNpZmRlZiBNQUxMT0NfTUFH
CisJCX0KKyNlbmRpZgorCX0gZWxzZQorCQlhcmVuYV9kYWxsb2NfbGFyZ2UoYXJlbmEsIGNodW5r
LCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lkYWxsb2Modm9pZCAqcHRyKQorewor
CWFyZW5hX2NodW5rX3QgKmNodW5rOworCisJYXNzZXJ0KHB0ciAhPSBOVUxMKTsKKworCWNodW5r
ID0gKGFyZW5hX2NodW5rX3QgKilDSFVOS19BRERSMkJBU0UocHRyKTsKKwlpZiAoY2h1bmsgIT0g
cHRyKQorCQlhcmVuYV9kYWxsb2MoY2h1bmstPmFyZW5hLCBjaHVuaywgcHRyKTsKKwllbHNlCisJ
CWh1Z2VfZGFsbG9jKHB0cik7Cit9CisKK3N0YXRpYyB2b2lkCithcmVuYV9yYWxsb2NfbGFyZ2Vf
c2hyaW5rKGFyZW5hX3QgKmFyZW5hLCBhcmVuYV9jaHVua190ICpjaHVuaywgdm9pZCAqcHRyLAor
ICAgIHNpemVfdCBzaXplLCBzaXplX3Qgb2xkc2l6ZSkKK3sKKworCWFzc2VydChzaXplIDwgb2xk
c2l6ZSk7CisKKwkvKgorCSAqIFNocmluayB0aGUgcnVuLCBhbmQgbWFrZSB0cmFpbGluZyBwYWdl
cyBhdmFpbGFibGUgZm9yIG90aGVyCisJICogYWxsb2NhdGlvbnMuCisJICovCisjaWZkZWYgTUFM
TE9DX0JBTEFOQ0UKKwlhcmVuYV9sb2NrX2JhbGFuY2UoYXJlbmEpOworI2Vsc2UKKwltYWxsb2Nf
c3Bpbl9sb2NrKCZhcmVuYS0+bG9jayk7CisjZW5kaWYKKwlhcmVuYV9ydW5fdHJpbV90YWlsKGFy
ZW5hLCBjaHVuaywgKGFyZW5hX3J1bl90ICopcHRyLCBvbGRzaXplLCBzaXplLAorCSAgICB0cnVl
KTsKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlhcmVuYS0+c3RhdHMuYWxsb2NhdGVkX2xhcmdlIC09
IG9sZHNpemUgLSBzaXplOworI2VuZGlmCisJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYS0+bG9j
ayk7Cit9CisKK3N0YXRpYyBib29sCithcmVuYV9yYWxsb2NfbGFyZ2VfZ3JvdyhhcmVuYV90ICph
cmVuYSwgYXJlbmFfY2h1bmtfdCAqY2h1bmssIHZvaWQgKnB0ciwKKyAgICBzaXplX3Qgc2l6ZSwg
c2l6ZV90IG9sZHNpemUpCit7CisJc2l6ZV90IHBhZ2VpbmQgPSAoKHVpbnRwdHJfdClwdHIgLSAo
dWludHB0cl90KWNodW5rKSA+PiBwYWdlc2l6ZV8ycG93OworCXNpemVfdCBucGFnZXMgPSBvbGRz
aXplID4+IHBhZ2VzaXplXzJwb3c7CisKKwlhc3NlcnQob2xkc2l6ZSA9PSAoY2h1bmstPm1hcFtw
YWdlaW5kXS5iaXRzICYgfnBhZ2VzaXplX21hc2spKTsKKworCS8qIFRyeSB0byBleHRlbmQgdGhl
IHJ1bi4gKi8KKwlhc3NlcnQoc2l6ZSA+IG9sZHNpemUpOworI2lmZGVmIE1BTExPQ19CQUxBTkNF
CisJYXJlbmFfbG9ja19iYWxhbmNlKGFyZW5hKTsKKyNlbHNlCisJbWFsbG9jX3NwaW5fbG9jaygm
YXJlbmEtPmxvY2spOworI2VuZGlmCisJaWYgKHBhZ2VpbmQgKyBucGFnZXMgPCBjaHVua19ucGFn
ZXMgJiYgKGNodW5rLT5tYXBbcGFnZWluZCtucGFnZXNdLmJpdHMKKwkgICAgJiBDSFVOS19NQVBf
QUxMT0NBVEVEKSA9PSAwICYmIChjaHVuay0+bWFwW3BhZ2VpbmQrbnBhZ2VzXS5iaXRzICYKKwkg
ICAgfnBhZ2VzaXplX21hc2spID49IHNpemUgLSBvbGRzaXplKSB7CisJCS8qCisJCSAqIFRoZSBu
ZXh0IHJ1biBpcyBhdmFpbGFibGUgYW5kIHN1ZmZpY2llbnRseSBsYXJnZS4gIFNwbGl0IHRoZQor
CQkgKiBmb2xsb3dpbmcgcnVuLCB0aGVuIG1lcmdlIHRoZSBmaXJzdCBwYXJ0IHdpdGggdGhlIGV4
aXN0aW5nCisJCSAqIGFsbG9jYXRpb24uCisJCSAqLworCQlhcmVuYV9ydW5fc3BsaXQoYXJlbmEs
IChhcmVuYV9ydW5fdCAqKSgodWludHB0cl90KWNodW5rICsKKwkJICAgICgocGFnZWluZCtucGFn
ZXMpIDw8IHBhZ2VzaXplXzJwb3cpKSwgc2l6ZSAtIG9sZHNpemUsIHRydWUsCisJCSAgICBmYWxz
ZSk7CisKKwkJY2h1bmstPm1hcFtwYWdlaW5kXS5iaXRzID0gc2l6ZSB8IENIVU5LX01BUF9MQVJH
RSB8CisJCSAgICBDSFVOS19NQVBfQUxMT0NBVEVEOworCQljaHVuay0+bWFwW3BhZ2VpbmQrbnBh
Z2VzXS5iaXRzID0gQ0hVTktfTUFQX0xBUkdFIHwKKwkJICAgIENIVU5LX01BUF9BTExPQ0FURUQ7
CisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwkJYXJlbmEtPnN0YXRzLmFsbG9jYXRlZF9sYXJnZSAr
PSBzaXplIC0gb2xkc2l6ZTsKKyNlbmRpZgorCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5s
b2NrKTsKKwkJcmV0dXJuIChmYWxzZSk7CisJfQorCW1hbGxvY19zcGluX3VubG9jaygmYXJlbmEt
PmxvY2spOworCisJcmV0dXJuICh0cnVlKTsKK30KKworLyoKKyAqIFRyeSB0byByZXNpemUgYSBs
YXJnZSBhbGxvY2F0aW9uLCBpbiBvcmRlciB0byBhdm9pZCBjb3B5aW5nLiAgVGhpcyB3aWxsCisg
KiBhbHdheXMgZmFpbCBpZiBncm93aW5nIGFuIG9iamVjdCwgYW5kIHRoZSBmb2xsb3dpbmcgcnVu
IGlzIGFscmVhZHkgaW4gdXNlLgorICovCitzdGF0aWMgYm9vbAorYXJlbmFfcmFsbG9jX2xhcmdl
KHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBvbGRzaXplKQoreworCXNpemVfdCBwc2l6
ZTsKKworCXBzaXplID0gUEFHRV9DRUlMSU5HKHNpemUpOworCWlmIChwc2l6ZSA9PSBvbGRzaXpl
KSB7CisJCS8qIFNhbWUgc2l6ZSBjbGFzcy4gKi8KKwkJaWYgKG9wdF9qdW5rICYmIHNpemUgPCBv
bGRzaXplKSB7CisJCQltZW1zZXQoKHZvaWQgKikoKHVpbnRwdHJfdClwdHIgKyBzaXplKSwgMHg1
YSwgb2xkc2l6ZSAtCisJCQkgICAgc2l6ZSk7CisJCX0KKwkJcmV0dXJuIChmYWxzZSk7CisJfSBl
bHNlIHsKKwkJYXJlbmFfY2h1bmtfdCAqY2h1bms7CisJCWFyZW5hX3QgKmFyZW5hOworCisJCWNo
dW5rID0gKGFyZW5hX2NodW5rX3QgKilDSFVOS19BRERSMkJBU0UocHRyKTsKKwkJYXJlbmEgPSBj
aHVuay0+YXJlbmE7CisJCWFzc2VydChhcmVuYS0+bWFnaWMgPT0gQVJFTkFfTUFHSUMpOworCisJ
CWlmIChwc2l6ZSA8IG9sZHNpemUpIHsKKwkJCS8qIEZpbGwgYmVmb3JlIHNocmlua2luZyBpbiBv
cmRlciBhdm9pZCBhIHJhY2UuICovCisJCQlpZiAob3B0X2p1bmspIHsKKwkJCQltZW1zZXQoKHZv
aWQgKikoKHVpbnRwdHJfdClwdHIgKyBzaXplKSwgMHg1YSwKKwkJCQkgICAgb2xkc2l6ZSAtIHNp
emUpOworCQkJfQorCQkJYXJlbmFfcmFsbG9jX2xhcmdlX3NocmluayhhcmVuYSwgY2h1bmssIHB0
ciwgcHNpemUsCisJCQkgICAgb2xkc2l6ZSk7CisJCQlyZXR1cm4gKGZhbHNlKTsKKwkJfSBlbHNl
IHsKKwkJCWJvb2wgcmV0ID0gYXJlbmFfcmFsbG9jX2xhcmdlX2dyb3coYXJlbmEsIGNodW5rLCBw
dHIsCisJCQkgICAgcHNpemUsIG9sZHNpemUpOworCQkJaWYgKHJldCA9PSBmYWxzZSAmJiBvcHRf
emVybykgeworCQkJCW1lbXNldCgodm9pZCAqKSgodWludHB0cl90KXB0ciArIG9sZHNpemUpLCAw
LAorCQkJCSAgICBzaXplIC0gb2xkc2l6ZSk7CisJCQl9CisJCQlyZXR1cm4gKHJldCk7CisJCX0K
Kwl9Cit9CisKK3N0YXRpYyB2b2lkICoKK2FyZW5hX3JhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBz
aXplLCBzaXplX3Qgb2xkc2l6ZSkKK3sKKwl2b2lkICpyZXQ7CisJc2l6ZV90IGNvcHlzaXplOwor
CisJLyogVHJ5IHRvIGF2b2lkIG1vdmluZyB0aGUgYWxsb2NhdGlvbi4gKi8KKwlpZiAoc2l6ZSA8
PSBiaW5fbWF4Y2xhc3MpIHsKKwkJaWYgKG9sZHNpemUgPD0gYmluX21heGNsYXNzICYmIHNpemUy
YmluW3NpemVdID09CisJCSAgICBzaXplMmJpbltvbGRzaXplXSkKKwkJCWdvdG8gSU5fUExBQ0U7
CisJfSBlbHNlIHsKKwkJaWYgKG9sZHNpemUgPiBiaW5fbWF4Y2xhc3MgJiYgb2xkc2l6ZSA8PSBh
cmVuYV9tYXhjbGFzcykgeworCQkJYXNzZXJ0KHNpemUgPiBiaW5fbWF4Y2xhc3MpOworCQkJaWYg
KGFyZW5hX3JhbGxvY19sYXJnZShwdHIsIHNpemUsIG9sZHNpemUpID09IGZhbHNlKQorCQkJCXJl
dHVybiAocHRyKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gc2l6
ZSBhbmQgb2xkc2l6ZSBhcmUgZGlmZmVyZW50IGVub3VnaCB0aGF0IHdlCisJICogbmVlZCB0byBt
b3ZlIHRoZSBvYmplY3QuICBJbiB0aGF0IGNhc2UsIGZhbGwgYmFjayB0byBhbGxvY2F0aW5nIG5l
dworCSAqIHNwYWNlIGFuZCBjb3B5aW5nLgorCSAqLworCXJldCA9IGFyZW5hX21hbGxvYyhjaG9v
c2VfYXJlbmEoKSwgc2l6ZSwgZmFsc2UpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJcmV0dXJuIChO
VUxMKTsKKworCS8qIEp1bmsvemVyby1maWxsaW5nIHdlcmUgYWxyZWFkeSBkb25lIGJ5IGFyZW5h
X21hbGxvYygpLiAqLworCWNvcHlzaXplID0gKHNpemUgPCBvbGRzaXplKSA/IHNpemUgOiBvbGRz
aXplOworCW1lbWNweShyZXQsIHB0ciwgY29weXNpemUpOworCWlkYWxsb2MocHRyKTsKKwlyZXR1
cm4gKHJldCk7CitJTl9QTEFDRToKKwlpZiAob3B0X2p1bmsgJiYgc2l6ZSA8IG9sZHNpemUpCisJ
CW1lbXNldCgodm9pZCAqKSgodWludHB0cl90KXB0ciArIHNpemUpLCAweDVhLCBvbGRzaXplIC0g
c2l6ZSk7CisJZWxzZSBpZiAob3B0X3plcm8gJiYgc2l6ZSA+IG9sZHNpemUpCisJCW1lbXNldCgo
dm9pZCAqKSgodWludHB0cl90KXB0ciArIG9sZHNpemUpLCAwLCBzaXplIC0gb2xkc2l6ZSk7CisJ
cmV0dXJuIChwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgoraXJhbGxvYyh2b2lkICpw
dHIsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBvbGRzaXplOworCisJYXNzZXJ0KHB0ciAhPSBO
VUxMKTsKKwlhc3NlcnQoc2l6ZSAhPSAwKTsKKworCW9sZHNpemUgPSBpc2FsbG9jKHB0cik7CisK
KwlpZiAoc2l6ZSA8PSBhcmVuYV9tYXhjbGFzcykKKwkJcmV0dXJuIChhcmVuYV9yYWxsb2MocHRy
LCBzaXplLCBvbGRzaXplKSk7CisJZWxzZQorCQlyZXR1cm4gKGh1Z2VfcmFsbG9jKHB0ciwgc2l6
ZSwgb2xkc2l6ZSkpOworfQorCitzdGF0aWMgYm9vbAorYXJlbmFfbmV3KGFyZW5hX3QgKmFyZW5h
KQoreworCXVuc2lnbmVkIGk7CisJYXJlbmFfYmluX3QgKmJpbjsKKwlzaXplX3QgcHJldl9ydW5f
c2l6ZTsKKworCWlmIChtYWxsb2Nfc3Bpbl9pbml0KCZhcmVuYS0+bG9jaykpCisJCXJldHVybiAo
dHJ1ZSk7CisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwltZW1zZXQoJmFyZW5hLT5zdGF0cywgMCwg
c2l6ZW9mKGFyZW5hX3N0YXRzX3QpKTsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSBjaHVua3Mu
ICovCisJYXJlbmFfY2h1bmtfdHJlZV9kaXJ0eV9uZXcoJmFyZW5hLT5jaHVua3NfZGlydHkpOwor
CWFyZW5hLT5zcGFyZSA9IE5VTEw7CisKKwlhcmVuYS0+bmRpcnR5ID0gMDsKKworCWFyZW5hX2F2
YWlsX3RyZWVfbmV3KCZhcmVuYS0+cnVuc19hdmFpbCk7CisKKyNpZmRlZiBNQUxMT0NfQkFMQU5D
RQorCWFyZW5hLT5jb250ZW50aW9uID0gMDsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSBiaW5z
LiAqLworCXByZXZfcnVuX3NpemUgPSBwYWdlc2l6ZTsKKworCWkgPSAwOworI2lmZGVmIE1BTExP
Q19USU5ZCisJLyogKDJebiktc3BhY2VkIHRpbnkgYmlucy4gKi8KKwlmb3IgKDsgaSA8IG50Ymlu
czsgaSsrKSB7CisJCWJpbiA9ICZhcmVuYS0+Ymluc1tpXTsKKwkJYmluLT5ydW5jdXIgPSBOVUxM
OworCQlhcmVuYV9ydW5fdHJlZV9uZXcoJmJpbi0+cnVucyk7CisKKwkJYmluLT5yZWdfc2l6ZSA9
ICgxVSA8PCAoVElOWV9NSU5fMlBPVyArIGkpKTsKKworCQlwcmV2X3J1bl9zaXplID0gYXJlbmFf
YmluX3J1bl9zaXplX2NhbGMoYmluLCBwcmV2X3J1bl9zaXplKTsKKworI2lmZGVmIE1BTExPQ19T
VEFUUworCQltZW1zZXQoJmJpbi0+c3RhdHMsIDAsIHNpemVvZihtYWxsb2NfYmluX3N0YXRzX3Qp
KTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJLyogUXVhbnR1bS1zcGFjZWQgYmlucy4gKi8KKwlm
b3IgKDsgaSA8IG50YmlucyArIG5xYmluczsgaSsrKSB7CisJCWJpbiA9ICZhcmVuYS0+Ymluc1tp
XTsKKwkJYmluLT5ydW5jdXIgPSBOVUxMOworCQlhcmVuYV9ydW5fdHJlZV9uZXcoJmJpbi0+cnVu
cyk7CisKKwkJYmluLT5yZWdfc2l6ZSA9IChpIC0gbnRiaW5zICsgMSkgPDwgUVVBTlRVTV8yUE9X
OworCisJCXByZXZfcnVuX3NpemUgPSBhcmVuYV9iaW5fcnVuX3NpemVfY2FsYyhiaW4sIHByZXZf
cnVuX3NpemUpOworCisjaWZkZWYgTUFMTE9DX1NUQVRTCisJCW1lbXNldCgmYmluLT5zdGF0cywg
MCwgc2l6ZW9mKG1hbGxvY19iaW5fc3RhdHNfdCkpOworI2VuZGlmCisJfQorCisJLyogQ2FjaGVs
aW5lLXNwYWNlZCBiaW5zLiAqLworCWZvciAoOyBpIDwgbnRiaW5zICsgbnFiaW5zICsgbmNiaW5z
OyBpKyspIHsKKwkJYmluID0gJmFyZW5hLT5iaW5zW2ldOworCQliaW4tPnJ1bmN1ciA9IE5VTEw7
CisJCWFyZW5hX3J1bl90cmVlX25ldygmYmluLT5ydW5zKTsKKworCQliaW4tPnJlZ19zaXplID0g
Y3NwYWNlX21pbiArICgoaSAtIChudGJpbnMgKyBucWJpbnMpKSA8PAorCQkgICAgQ0FDSEVMSU5F
XzJQT1cpOworCisJCXByZXZfcnVuX3NpemUgPSBhcmVuYV9iaW5fcnVuX3NpemVfY2FsYyhiaW4s
IHByZXZfcnVuX3NpemUpOworCisjaWZkZWYgTUFMTE9DX1NUQVRTCisJCW1lbXNldCgmYmluLT5z
dGF0cywgMCwgc2l6ZW9mKG1hbGxvY19iaW5fc3RhdHNfdCkpOworI2VuZGlmCisJfQorCisJLyog
U3VicGFnZS1zcGFjZWQgYmlucy4gKi8KKwlmb3IgKDsgaSA8IG5iaW5zOyBpKyspIHsKKwkJYmlu
ID0gJmFyZW5hLT5iaW5zW2ldOworCQliaW4tPnJ1bmN1ciA9IE5VTEw7CisJCWFyZW5hX3J1bl90
cmVlX25ldygmYmluLT5ydW5zKTsKKworCQliaW4tPnJlZ19zaXplID0gc3NwYWNlX21pbiArICgo
aSAtIChudGJpbnMgKyBucWJpbnMgKyBuY2JpbnMpKQorCQkgICAgPDwgU1VCUEFHRV8yUE9XKTsK
KworCQlwcmV2X3J1bl9zaXplID0gYXJlbmFfYmluX3J1bl9zaXplX2NhbGMoYmluLCBwcmV2X3J1
bl9zaXplKTsKKworI2lmZGVmIE1BTExPQ19TVEFUUworCQltZW1zZXQoJmJpbi0+c3RhdHMsIDAs
IHNpemVvZihtYWxsb2NfYmluX3N0YXRzX3QpKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIE1BTExP
Q19ERUJVRworCWFyZW5hLT5tYWdpYyA9IEFSRU5BX01BR0lDOworI2VuZGlmCisKKwlyZXR1cm4g
KGZhbHNlKTsKK30KKworLyogQ3JlYXRlIGEgbmV3IGFyZW5hIGFuZCBpbnNlcnQgaXQgaW50byB0
aGUgYXJlbmFzIGFycmF5IGF0IGluZGV4IGluZC4gKi8KK3N0YXRpYyBhcmVuYV90ICoKK2FyZW5h
c19leHRlbmQodW5zaWduZWQgaW5kKQoreworCWFyZW5hX3QgKnJldDsKKworCS8qIEFsbG9jYXRl
IGVub3VnaCBzcGFjZSBmb3IgdHJhaWxpbmcgYmlucy4gKi8KKwlyZXQgPSAoYXJlbmFfdCAqKWJh
c2VfYWxsb2Moc2l6ZW9mKGFyZW5hX3QpCisJICAgICsgKHNpemVvZihhcmVuYV9iaW5fdCkgKiAo
bmJpbnMgLSAxKSkpOworCWlmIChyZXQgIT0gTlVMTCAmJiBhcmVuYV9uZXcocmV0KSA9PSBmYWxz
ZSkgeworCQlhcmVuYXNbaW5kXSA9IHJldDsKKwkJcmV0dXJuIChyZXQpOworCX0KKwkvKiBPbmx5
IHJlYWNoZWQgaWYgdGhlcmUgaXMgYW4gT09NIGVycm9yLiAqLworCisJLyoKKwkgKiBPT00gaGVy
ZSBpcyBxdWl0ZSBpbmNvbnZlbmllbnQgdG8gcHJvcGFnYXRlLCBzaW5jZSBkZWFsaW5nIHdpdGgg
aXQKKwkgKiB3b3VsZCByZXF1aXJlIGEgY2hlY2sgZm9yIGZhaWx1cmUgaW4gdGhlIGZhc3QgcGF0
aC4gIEluc3RlYWQsIHB1bnQKKwkgKiBieSB1c2luZyBhcmVuYXNbMF0uICBJbiBwcmFjdGljZSwg
dGhpcyBpcyBhbiBleHRyZW1lbHkgdW5saWtlbHkKKwkgKiBmYWlsdXJlLgorCSAqLworCV9tYWxs
b2NfbWVzc2FnZShfZ2V0cHJvZ25hbWUoKSwKKwkgICAgIjogKG1hbGxvYykgRXJyb3IgaW5pdGlh
bGl6aW5nIGFyZW5hXG4iLCAiIiwgIiIpOworCWlmIChvcHRfYWJvcnQpCisJCWFib3J0KCk7CisK
KwlyZXR1cm4gKGFyZW5hc1swXSk7Cit9CisKKyNpZmRlZiBNQUxMT0NfTUFHCitzdGF0aWMgbWFn
X3QgKgorbWFnX2NyZWF0ZShhcmVuYV90ICphcmVuYSwgc2l6ZV90IGJpbmluZCkKK3sKKwltYWdf
dCAqcmV0OworCisJaWYgKHNpemVvZihtYWdfdCkgKyAoc2l6ZW9mKHZvaWQgKikgKiAobWF4X3Jv
dW5kcyAtIDEpKSA8PQorCSAgICBiaW5fbWF4Y2xhc3MpIHsKKwkJcmV0ID0gYXJlbmFfbWFsbG9j
X3NtYWxsKGFyZW5hLCBzaXplb2YobWFnX3QpICsgKHNpemVvZih2b2lkICopCisJCSAgICAqICht
YXhfcm91bmRzIC0gMSkpLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaW1hbGxvYyhzaXpl
b2YobWFnX3QpICsgKHNpemVvZih2b2lkICopICogKG1heF9yb3VuZHMgLQorCQkgICAgMSkpKTsK
Kwl9CisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCXJldC0+YmluaW5kID0g
YmluaW5kOworCXJldC0+bnJvdW5kcyA9IDA7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRp
YyB2b2lkCittYWdfZGVzdHJveShtYWdfdCAqbWFnKQoreworCWFyZW5hX3QgKmFyZW5hOworCWFy
ZW5hX2NodW5rX3QgKmNodW5rOworCXNpemVfdCBwYWdlaW5kOworCWFyZW5hX2NodW5rX21hcF90
ICptYXBlbG07CisKKwljaHVuayA9IENIVU5LX0FERFIyQkFTRShtYWcpOworCWFyZW5hID0gY2h1
bmstPmFyZW5hOworCXBhZ2VpbmQgPSAoKCh1aW50cHRyX3QpbWFnIC0gKHVpbnRwdHJfdCljaHVu
aykgPj4gcGFnZXNpemVfMnBvdyk7CisJbWFwZWxtID0gJmNodW5rLT5tYXBbcGFnZWluZF07CisK
Kwlhc3NlcnQobWFnLT5ucm91bmRzID09IDApOworCWlmIChzaXplb2YobWFnX3QpICsgKHNpemVv
Zih2b2lkICopICogKG1heF9yb3VuZHMgLSAxKSkgPD0KKwkgICAgYmluX21heGNsYXNzKSB7CisJ
CW1hbGxvY19zcGluX2xvY2soJmFyZW5hLT5sb2NrKTsKKwkJYXJlbmFfZGFsbG9jX3NtYWxsKGFy
ZW5hLCBjaHVuaywgbWFnLCBtYXBlbG0pOworCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5s
b2NrKTsKKwl9IGVsc2UKKwkJaWRhbGxvYyhtYWcpOworfQorCitzdGF0aWMgbWFnX3JhY2tfdCAq
CittYWdfcmFja19jcmVhdGUoYXJlbmFfdCAqYXJlbmEpCit7CisKKwlhc3NlcnQoc2l6ZW9mKG1h
Z19yYWNrX3QpICsgKHNpemVvZihiaW5fbWFnc190ICopICogKG5iaW5zIC0gMSkpIDw9CisJICAg
IGJpbl9tYXhjbGFzcyk7CisJcmV0dXJuIChhcmVuYV9tYWxsb2Nfc21hbGwoYXJlbmEsIHNpemVv
ZihtYWdfcmFja190KSArCisJICAgIChzaXplb2YoYmluX21hZ3NfdCkgKiAobmJpbnMgLSAxKSks
IHRydWUpKTsKK30KKworc3RhdGljIHZvaWQKK21hZ19yYWNrX2Rlc3Ryb3kobWFnX3JhY2tfdCAq
cmFjaykKK3sKKwlhcmVuYV90ICphcmVuYTsKKwlhcmVuYV9jaHVua190ICpjaHVuazsKKwliaW5f
bWFnc190ICpiaW5fbWFnczsKKwlzaXplX3QgaSwgcGFnZWluZDsKKwlhcmVuYV9jaHVua19tYXBf
dCAqbWFwZWxtOworCisJZm9yIChpID0gMDsgaSA8IG5iaW5zOyBpKyspIHsKKwkJYmluX21hZ3Mg
PSAmcmFjay0+YmluX21hZ3NbaV07CisJCWlmIChiaW5fbWFncy0+Y3VybWFnICE9IE5VTEwpIHsK
KwkJCWFzc2VydChiaW5fbWFncy0+Y3VybWFnLT5iaW5pbmQgPT0gaSk7CisJCQltYWdfdW5sb2Fk
KGJpbl9tYWdzLT5jdXJtYWcpOworCQkJbWFnX2Rlc3Ryb3koYmluX21hZ3MtPmN1cm1hZyk7CisJ
CX0KKwkJaWYgKGJpbl9tYWdzLT5zcGFyZW1hZyAhPSBOVUxMKSB7CisJCQlhc3NlcnQoYmluX21h
Z3MtPnNwYXJlbWFnLT5iaW5pbmQgPT0gaSk7CisJCQltYWdfdW5sb2FkKGJpbl9tYWdzLT5zcGFy
ZW1hZyk7CisJCQltYWdfZGVzdHJveShiaW5fbWFncy0+c3BhcmVtYWcpOworCQl9CisJfQorCisJ
Y2h1bmsgPSBDSFVOS19BRERSMkJBU0UocmFjayk7CisJYXJlbmEgPSBjaHVuay0+YXJlbmE7CisJ
cGFnZWluZCA9ICgoKHVpbnRwdHJfdClyYWNrIC0gKHVpbnRwdHJfdCljaHVuaykgPj4gcGFnZXNp
emVfMnBvdyk7CisJbWFwZWxtID0gJmNodW5rLT5tYXBbcGFnZWluZF07CisKKwltYWxsb2Nfc3Bp
bl9sb2NrKCZhcmVuYS0+bG9jayk7CisJYXJlbmFfZGFsbG9jX3NtYWxsKGFyZW5hLCBjaHVuaywg
cmFjaywgbWFwZWxtKTsKKwltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5sb2NrKTsKK30KKyNl
bmRpZgorCisvKgorICogRW5kIGFyZW5hLgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwor
LyoKKyAqIEJlZ2luIGdlbmVyYWwgaW50ZXJuYWwgZnVuY3Rpb25zLgorICovCisKK3N0YXRpYyB2
b2lkICoKK2h1Z2VfbWFsbG9jKHNpemVfdCBzaXplLCBib29sIHplcm8pCit7CisJdm9pZCAqcmV0
OworCXNpemVfdCBjc2l6ZTsKKwlleHRlbnRfbm9kZV90ICpub2RlOworCisJLyogQWxsb2NhdGUg
b25lIG9yIG1vcmUgY29udGlndW91cyBjaHVua3MgZm9yIHRoaXMgcmVxdWVzdC4gKi8KKworCWNz
aXplID0gQ0hVTktfQ0VJTElORyhzaXplKTsKKwlpZiAoY3NpemUgPT0gMCkgeworCQkvKiBzaXpl
IGlzIGxhcmdlIGVub3VnaCB0byBjYXVzZSBzaXplX3Qgd3JhcC1hcm91bmQuICovCisJCXJldHVy
biAoTlVMTCk7CisJfQorCisJLyogQWxsb2NhdGUgYW4gZXh0ZW50IG5vZGUgd2l0aCB3aGljaCB0
byB0cmFjayB0aGUgY2h1bmsuICovCisJbm9kZSA9IGJhc2Vfbm9kZV9hbGxvYygpOworCWlmIChu
b2RlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXQgPSBjaHVua19hbGxvYyhjc2l6
ZSwgemVybyk7CisJaWYgKHJldCA9PSBOVUxMKSB7CisJCWJhc2Vfbm9kZV9kZWFsbG9jKG5vZGUp
OworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIEluc2VydCBub2RlIGludG8gaHVnZS4gKi8K
Kwlub2RlLT5hZGRyID0gcmV0OworCW5vZGUtPnNpemUgPSBjc2l6ZTsKKworCW1hbGxvY19tdXRl
eF9sb2NrKCZodWdlX210eCk7CisJZXh0ZW50X3RyZWVfYWRfaW5zZXJ0KCZodWdlLCBub2RlKTsK
KyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlodWdlX25tYWxsb2MrKzsKKwlodWdlX2FsbG9jYXRlZCAr
PSBjc2l6ZTsKKyNlbmRpZgorCW1hbGxvY19tdXRleF91bmxvY2soJmh1Z2VfbXR4KTsKKworCWlm
ICh6ZXJvID09IGZhbHNlKSB7CisJCWlmIChvcHRfanVuaykKKwkJCW1lbXNldChyZXQsIDB4YTUs
IGNzaXplKTsKKwkJZWxzZSBpZiAob3B0X3plcm8pCisJCQltZW1zZXQocmV0LCAwLCBjc2l6ZSk7
CisJfQorCisJcmV0dXJuIChyZXQpOworfQorCisvKiBPbmx5IGhhbmRsZXMgbGFyZ2UgYWxsb2Nh
dGlvbnMgdGhhdCByZXF1aXJlIG1vcmUgdGhhbiBjaHVuayBhbGlnbm1lbnQuICovCitzdGF0aWMg
dm9pZCAqCitodWdlX3BhbGxvYyhzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkKK3sKKwl2
b2lkICpyZXQ7CisJc2l6ZV90IGFsbG9jX3NpemUsIGNodW5rX3NpemUsIG9mZnNldDsKKwlleHRl
bnRfbm9kZV90ICpub2RlOworCisJLyoKKwkgKiBUaGlzIGFsbG9jYXRpb24gcmVxdWlyZXMgYWxp
Z25tZW50IHRoYXQgaXMgZXZlbiBsYXJnZXIgdGhhbiBjaHVuaworCSAqIGFsaWdubWVudC4gIFRo
aXMgbWVhbnMgdGhhdCBodWdlX21hbGxvYygpIGlzbid0IGdvb2QgZW5vdWdoLgorCSAqCisJICog
QWxsb2NhdGUgYWxtb3N0IHR3aWNlIGFzIG1hbnkgY2h1bmtzIGFzIGFyZSBkZW1hbmRlZCBieSB0
aGUgc2l6ZSBvcgorCSAqIGFsaWdubWVudCwgaW4gb3JkZXIgdG8gYXNzdXJlIHRoZSBhbGlnbm1l
bnQgY2FuIGJlIGFjaGlldmVkLCB0aGVuCisJICogdW5tYXAgbGVhZGluZyBhbmQgdHJhaWxpbmcg
Y2h1bmtzLgorCSAqLworCWFzc2VydChhbGlnbm1lbnQgPj0gY2h1bmtzaXplKTsKKworCWNodW5r
X3NpemUgPSBDSFVOS19DRUlMSU5HKHNpemUpOworCisJaWYgKHNpemUgPj0gYWxpZ25tZW50KQor
CQlhbGxvY19zaXplID0gY2h1bmtfc2l6ZSArIGFsaWdubWVudCAtIGNodW5rc2l6ZTsKKwllbHNl
CisJCWFsbG9jX3NpemUgPSAoYWxpZ25tZW50IDw8IDEpIC0gY2h1bmtzaXplOworCisJLyogQWxs
b2NhdGUgYW4gZXh0ZW50IG5vZGUgd2l0aCB3aGljaCB0byB0cmFjayB0aGUgY2h1bmsuICovCisJ
bm9kZSA9IGJhc2Vfbm9kZV9hbGxvYygpOworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiAo
TlVMTCk7CisKKwlyZXQgPSBjaHVua19hbGxvYyhhbGxvY19zaXplLCBmYWxzZSk7CisJaWYgKHJl
dCA9PSBOVUxMKSB7CisJCWJhc2Vfbm9kZV9kZWFsbG9jKG5vZGUpOworCQlyZXR1cm4gKE5VTEwp
OworCX0KKworCW9mZnNldCA9ICh1aW50cHRyX3QpcmV0ICYgKGFsaWdubWVudCAtIDEpOworCWFz
c2VydCgob2Zmc2V0ICYgY2h1bmtzaXplX21hc2spID09IDApOworCWFzc2VydChvZmZzZXQgPCBh
bGxvY19zaXplKTsKKwlpZiAob2Zmc2V0ID09IDApIHsKKwkJLyogVHJpbSB0cmFpbGluZyBzcGFj
ZS4gKi8KKwkJY2h1bmtfZGVhbGxvYygodm9pZCAqKSgodWludHB0cl90KXJldCArIGNodW5rX3Np
emUpLCBhbGxvY19zaXplCisJCSAgICAtIGNodW5rX3NpemUpOworCX0gZWxzZSB7CisJCXNpemVf
dCB0cmFpbHNpemU7CisKKwkJLyogVHJpbSBsZWFkaW5nIHNwYWNlLiAqLworCQljaHVua19kZWFs
bG9jKHJldCwgYWxpZ25tZW50IC0gb2Zmc2V0KTsKKworCQlyZXQgPSAodm9pZCAqKSgodWludHB0
cl90KXJldCArIChhbGlnbm1lbnQgLSBvZmZzZXQpKTsKKworCQl0cmFpbHNpemUgPSBhbGxvY19z
aXplIC0gKGFsaWdubWVudCAtIG9mZnNldCkgLSBjaHVua19zaXplOworCQlpZiAodHJhaWxzaXpl
ICE9IDApIHsKKwkJICAgIC8qIFRyaW0gdHJhaWxpbmcgc3BhY2UuICovCisJCSAgICBhc3NlcnQo
dHJhaWxzaXplIDwgYWxsb2Nfc2l6ZSk7CisJCSAgICBjaHVua19kZWFsbG9jKCh2b2lkICopKCh1
aW50cHRyX3QpcmV0ICsgY2h1bmtfc2l6ZSksCisJCQl0cmFpbHNpemUpOworCQl9CisJfQorCisJ
LyogSW5zZXJ0IG5vZGUgaW50byBodWdlLiAqLworCW5vZGUtPmFkZHIgPSByZXQ7CisJbm9kZS0+
c2l6ZSA9IGNodW5rX3NpemU7CisKKwltYWxsb2NfbXV0ZXhfbG9jaygmaHVnZV9tdHgpOworCWV4
dGVudF90cmVlX2FkX2luc2VydCgmaHVnZSwgbm9kZSk7CisjaWZkZWYgTUFMTE9DX1NUQVRTCisJ
aHVnZV9ubWFsbG9jKys7CisJaHVnZV9hbGxvY2F0ZWQgKz0gY2h1bmtfc2l6ZTsKKyNlbmRpZgor
CW1hbGxvY19tdXRleF91bmxvY2soJmh1Z2VfbXR4KTsKKworCWlmIChvcHRfanVuaykKKwkJbWVt
c2V0KHJldCwgMHhhNSwgY2h1bmtfc2l6ZSk7CisJZWxzZSBpZiAob3B0X3plcm8pCisJCW1lbXNl
dChyZXQsIDAsIGNodW5rX3NpemUpOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgdm9p
ZCAqCitodWdlX3JhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgb2xkc2l6ZSkK
K3sKKwl2b2lkICpyZXQ7CisJc2l6ZV90IGNvcHlzaXplOworCisJLyogQXZvaWQgbW92aW5nIHRo
ZSBhbGxvY2F0aW9uIGlmIHRoZSBzaXplIGNsYXNzIHdvdWxkIG5vdCBjaGFuZ2UuICovCisJaWYg
KG9sZHNpemUgPiBhcmVuYV9tYXhjbGFzcyAmJgorCSAgICBDSFVOS19DRUlMSU5HKHNpemUpID09
IENIVU5LX0NFSUxJTkcob2xkc2l6ZSkpIHsKKwkJaWYgKG9wdF9qdW5rICYmIHNpemUgPCBvbGRz
aXplKSB7CisJCQltZW1zZXQoKHZvaWQgKikoKHVpbnRwdHJfdClwdHIgKyBzaXplKSwgMHg1YSwg
b2xkc2l6ZQorCQkJICAgIC0gc2l6ZSk7CisJCX0gZWxzZSBpZiAob3B0X3plcm8gJiYgc2l6ZSA+
IG9sZHNpemUpIHsKKwkJCW1lbXNldCgodm9pZCAqKSgodWludHB0cl90KXB0ciArIG9sZHNpemUp
LCAwLCBzaXplCisJCQkgICAgLSBvbGRzaXplKTsKKwkJfQorCQlyZXR1cm4gKHB0cik7CisJfQor
CisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBzaXplIGFuZCBvbGRzaXplIGFyZSBkaWZm
ZXJlbnQgZW5vdWdoIHRoYXQgd2UKKwkgKiBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBzaXplIGNs
YXNzLiAgSW4gdGhhdCBjYXNlLCBmYWxsIGJhY2sgdG8KKwkgKiBhbGxvY2F0aW5nIG5ldyBzcGFj
ZSBhbmQgY29weWluZy4KKwkgKi8KKwlyZXQgPSBodWdlX21hbGxvYyhzaXplLCBmYWxzZSk7CisJ
aWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJY29weXNpemUgPSAoc2l6ZSA8
IG9sZHNpemUpID8gc2l6ZSA6IG9sZHNpemU7CisJbWVtY3B5KHJldCwgcHRyLCBjb3B5c2l6ZSk7
CisJaWRhbGxvYyhwdHIpOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHZvaWQKK2h1Z2Vf
ZGFsbG9jKHZvaWQgKnB0cikKK3sKKwlleHRlbnRfbm9kZV90ICpub2RlLCBrZXk7CisKKwltYWxs
b2NfbXV0ZXhfbG9jaygmaHVnZV9tdHgpOworCisJLyogRXh0cmFjdCBmcm9tIHRyZWUgb2YgaHVn
ZSBhbGxvY2F0aW9ucy4gKi8KKwlrZXkuYWRkciA9IHB0cjsKKwlub2RlID0gZXh0ZW50X3RyZWVf
YWRfc2VhcmNoKCZodWdlLCAma2V5KTsKKwlhc3NlcnQobm9kZSAhPSBOVUxMKTsKKwlhc3NlcnQo
bm9kZS0+YWRkciA9PSBwdHIpOworCWV4dGVudF90cmVlX2FkX3JlbW92ZSgmaHVnZSwgbm9kZSk7
CisKKyNpZmRlZiBNQUxMT0NfU1RBVFMKKwlodWdlX25kYWxsb2MrKzsKKwlodWdlX2FsbG9jYXRl
ZCAtPSBub2RlLT5zaXplOworI2VuZGlmCisKKwltYWxsb2NfbXV0ZXhfdW5sb2NrKCZodWdlX210
eCk7CisKKwkvKiBVbm1hcCBjaHVuay4gKi8KKyNpZmRlZiBNQUxMT0NfRFNTCisJaWYgKG9wdF9k
c3MgJiYgb3B0X2p1bmspCisJCW1lbXNldChub2RlLT5hZGRyLCAweDVhLCBub2RlLT5zaXplKTsK
KyNlbmRpZgorCWNodW5rX2RlYWxsb2Mobm9kZS0+YWRkciwgbm9kZS0+c2l6ZSk7CisKKwliYXNl
X25vZGVfZGVhbGxvYyhub2RlKTsKK30KKworc3RhdGljIHZvaWQKK21hbGxvY19wcmludF9zdGF0
cyh2b2lkKQoreworCisJaWYgKG9wdF9wcmludF9zdGF0cykgeworCQljaGFyIHNbVU1BWDJTX0JV
RlNJWkVdOworCQlfbWFsbG9jX21lc3NhZ2UoIl9fXyBCZWdpbiBtYWxsb2Mgc3RhdGlzdGljcyBf
X19cbiIsICIiLCAiIiwKKwkJICAgICIiKTsKKwkJX21hbGxvY19tZXNzYWdlKCJBc3NlcnRpb25z
ICIsCisjaWZkZWYgTkRFQlVHCisJCSAgICAiZGlzYWJsZWQiLAorI2Vsc2UKKwkJICAgICJlbmFi
bGVkIiwKKyNlbmRpZgorCQkgICAgIlxuIiwgIiIpOworCQlfbWFsbG9jX21lc3NhZ2UoIkJvb2xl
YW4gTUFMTE9DX09QVElPTlM6ICIsCisJCSAgICBvcHRfYWJvcnQgPyAiQSIgOiAiYSIsICIiLCAi
Iik7CisjaWZkZWYgTUFMTE9DX0RTUworCQlfbWFsbG9jX21lc3NhZ2Uob3B0X2RzcyA/ICJEIiA6
ICJkIiwgIiIsICIiLCAiIik7CisjZW5kaWYKKyNpZmRlZiBNQUxMT0NfTUFHCisJCV9tYWxsb2Nf
bWVzc2FnZShvcHRfbWFnID8gIkciIDogImciLCAiIiwgIiIsICIiKTsKKyNlbmRpZgorCQlfbWFs
bG9jX21lc3NhZ2Uob3B0X2p1bmsgPyAiSiIgOiAiaiIsICIiLCAiIiwgIiIpOworI2lmZGVmIE1B
TExPQ19EU1MKKwkJX21hbGxvY19tZXNzYWdlKG9wdF9tbWFwID8gIk0iIDogIm0iLCAiIiwgIiIs
ICIiKTsKKyNlbmRpZgorCQlfbWFsbG9jX21lc3NhZ2Uob3B0X3V0cmFjZSA/ICJQVSIgOiAiUHUi
LAorCQkgICAgb3B0X3N5c3YgPyAiViIgOiAidiIsCisJCSAgICBvcHRfeG1hbGxvYyA/ICJYIiA6
ICJ4IiwKKwkJICAgIG9wdF96ZXJvID8gIlpcbiIgOiAielxuIik7CisKKwkJX21hbGxvY19tZXNz
YWdlKCJDUFVzOiAiLCB1bWF4MnMobmNwdXMsIHMpLCAiXG4iLCAiIik7CisJCV9tYWxsb2NfbWVz
c2FnZSgiTWF4IGFyZW5hczogIiwgdW1heDJzKG5hcmVuYXMsIHMpLCAiXG4iLCAiIik7CisjaWZk
ZWYgTUFMTE9DX0JBTEFOQ0UKKwkJX21hbGxvY19tZXNzYWdlKCJBcmVuYSBiYWxhbmNlIHRocmVz
aG9sZDogIiwKKwkJICAgIHVtYXgycyhvcHRfYmFsYW5jZV90aHJlc2hvbGQsIHMpLCAiXG4iLCAi
Iik7CisjZW5kaWYKKwkJX21hbGxvY19tZXNzYWdlKCJQb2ludGVyIHNpemU6ICIsIHVtYXgycyhz
aXplb2Yodm9pZCAqKSwgcyksCisJCSAgICAiXG4iLCAiIik7CisJCV9tYWxsb2NfbWVzc2FnZSgi
UXVhbnR1bSBzaXplOiAiLCB1bWF4MnMoUVVBTlRVTSwgcyksICJcbiIsICIiKTsKKwkJX21hbGxv
Y19tZXNzYWdlKCJDYWNoZWxpbmUgc2l6ZSAoYXNzdW1lZCk6ICIsIHVtYXgycyhDQUNIRUxJTkUs
CisJCSAgICBzKSwgIlxuIiwgIiIpOworI2lmZGVmIE1BTExPQ19USU5ZCisJCV9tYWxsb2NfbWVz
c2FnZSgiVGlueSAyXm4tc3BhY2VkIHNpemVzOiBbIiwgdW1heDJzKCgxVSA8PAorCQkgICAgVElO
WV9NSU5fMlBPVyksIHMpLCAiLi4iLCAiIik7CisJCV9tYWxsb2NfbWVzc2FnZSh1bWF4MnMoKHFz
cGFjZV9taW4gPj4gMSksIHMpLCAiXVxuIiwgIiIsICIiKTsKKyNlbmRpZgorCQlfbWFsbG9jX21l
c3NhZ2UoIlF1YW50dW0tc3BhY2VkIHNpemVzOiBbIiwgdW1heDJzKHFzcGFjZV9taW4sCisJCSAg
ICBzKSwgIi4uIiwgIiIpOworCQlfbWFsbG9jX21lc3NhZ2UodW1heDJzKHFzcGFjZV9tYXgsIHMp
LCAiXVxuIiwgIiIsICIiKTsKKwkJX21hbGxvY19tZXNzYWdlKCJDYWNoZWxpbmUtc3BhY2VkIHNp
emVzOiBbIiwgdW1heDJzKGNzcGFjZV9taW4sCisJCSAgICBzKSwgIi4uIiwgIiIpOworCQlfbWFs
bG9jX21lc3NhZ2UodW1heDJzKGNzcGFjZV9tYXgsIHMpLCAiXVxuIiwgIiIsICIiKTsKKwkJX21h
bGxvY19tZXNzYWdlKCJTdWJwYWdlLXNwYWNlZCBzaXplczogWyIsIHVtYXgycyhzc3BhY2VfbWlu
LAorCQkgICAgcyksICIuLiIsICIiKTsKKwkJX21hbGxvY19tZXNzYWdlKHVtYXgycyhzc3BhY2Vf
bWF4LCBzKSwgIl1cbiIsICIiLCAiIik7CisjaWZkZWYgTUFMTE9DX01BRworCQlfbWFsbG9jX21l
c3NhZ2UoIlJvdW5kcyBwZXIgbWFnYXppbmU6ICIsIHVtYXgycyhtYXhfcm91bmRzLCBzKSwKKwkJ
ICAgICJcbiIsICIiKTsKKyNlbmRpZgorCQlfbWFsbG9jX21lc3NhZ2UoIk1heCBkaXJ0eSBwYWdl
cyBwZXIgYXJlbmE6ICIsCisJCSAgICB1bWF4MnMob3B0X2RpcnR5X21heCwgcyksICJcbiIsICIi
KTsKKworCQlfbWFsbG9jX21lc3NhZ2UoIkNodW5rIHNpemU6ICIsIHVtYXgycyhjaHVua3NpemUs
IHMpLCAiIiwgIiIpOworCQlfbWFsbG9jX21lc3NhZ2UoIiAoMl4iLCB1bWF4MnMob3B0X2NodW5r
XzJwb3csIHMpLCAiKVxuIiwgIiIpOworCisjaWZkZWYgTUFMTE9DX1NUQVRTCisJCXsKKwkJCXNp
emVfdCBhbGxvY2F0ZWQsIG1hcHBlZDsKKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQorCQkJdWludDY0
X3QgbmJhbGFuY2UgPSAwOworI2VuZGlmCisJCQl1bnNpZ25lZCBpOworCQkJYXJlbmFfdCAqYXJl
bmE7CisKKwkJCS8qIENhbGN1bGF0ZSBhbmQgcHJpbnQgYWxsb2NhdGVkL21hcHBlZCBzdGF0cy4g
Ki8KKworCQkJLyogYXJlbmFzLiAqLworCQkJZm9yIChpID0gMCwgYWxsb2NhdGVkID0gMDsgaSA8
IG5hcmVuYXM7IGkrKykgeworCQkJCWlmIChhcmVuYXNbaV0gIT0gTlVMTCkgeworCQkJCQltYWxs
b2Nfc3Bpbl9sb2NrKCZhcmVuYXNbaV0tPmxvY2spOworCQkJCQlhbGxvY2F0ZWQgKz0KKwkJCQkJ
ICAgIGFyZW5hc1tpXS0+c3RhdHMuYWxsb2NhdGVkX3NtYWxsOworCQkJCQlhbGxvY2F0ZWQgKz0K
KwkJCQkJICAgIGFyZW5hc1tpXS0+c3RhdHMuYWxsb2NhdGVkX2xhcmdlOworI2lmZGVmIE1BTExP
Q19CQUxBTkNFCisJCQkJCW5iYWxhbmNlICs9IGFyZW5hc1tpXS0+c3RhdHMubmJhbGFuY2U7Cisj
ZW5kaWYKKwkJCQkJbWFsbG9jX3NwaW5fdW5sb2NrKCZhcmVuYXNbaV0tPmxvY2spOworCQkJCX0K
KwkJCX0KKworCQkJLyogaHVnZS9iYXNlLiAqLworCQkJbWFsbG9jX211dGV4X2xvY2soJmh1Z2Vf
bXR4KTsKKwkJCWFsbG9jYXRlZCArPSBodWdlX2FsbG9jYXRlZDsKKwkJCW1hcHBlZCA9IHN0YXRz
X2NodW5rcy5jdXJjaHVua3MgKiBjaHVua3NpemU7CisJCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZo
dWdlX210eCk7CisKKwkJCW1hbGxvY19tdXRleF9sb2NrKCZiYXNlX210eCk7CisJCQltYXBwZWQg
Kz0gYmFzZV9tYXBwZWQ7CisJCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZiYXNlX210eCk7CisKKwkJ
CW1hbGxvY19wcmludGYoIkFsbG9jYXRlZDogJXp1LCBtYXBwZWQ6ICV6dVxuIiwKKwkJCSAgICBh
bGxvY2F0ZWQsIG1hcHBlZCk7CisKKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQorCQkJbWFsbG9jX3By
aW50ZigiQXJlbmEgYmFsYW5jZSByZWFzc2lnbm1lbnRzOiAlbGx1XG4iLAorCQkJICAgIG5iYWxh
bmNlKTsKKyNlbmRpZgorCisJCQkvKiBQcmludCBjaHVuayBzdGF0cy4gKi8KKwkJCXsKKwkJCQlj
aHVua19zdGF0c190IGNodW5rc19zdGF0czsKKworCQkJCW1hbGxvY19tdXRleF9sb2NrKCZodWdl
X210eCk7CisJCQkJY2h1bmtzX3N0YXRzID0gc3RhdHNfY2h1bmtzOworCQkJCW1hbGxvY19tdXRl
eF91bmxvY2soJmh1Z2VfbXR4KTsKKworCQkJCW1hbGxvY19wcmludGYoImNodW5rczogbmNodW5r
cyAgICIKKwkJCQkgICAgImhpZ2hjaHVua3MgICAgY3VyY2h1bmtzXG4iKTsKKwkJCQltYWxsb2Nf
cHJpbnRmKCIgICUxM2xsdSUxM2x1JTEzbHVcbiIsCisJCQkJICAgIGNodW5rc19zdGF0cy5uY2h1
bmtzLAorCQkJCSAgICBjaHVua3Nfc3RhdHMuaGlnaGNodW5rcywKKwkJCQkgICAgY2h1bmtzX3N0
YXRzLmN1cmNodW5rcyk7CisJCQl9CisKKwkJCS8qIFByaW50IGNodW5rIHN0YXRzLiAqLworCQkJ
bWFsbG9jX3ByaW50ZigKKwkJCSAgICAiaHVnZTogbm1hbGxvYyAgICAgIG5kYWxsb2MgICAgYWxs
b2NhdGVkXG4iKTsKKwkJCW1hbGxvY19wcmludGYoIiAlMTJsbHUgJTEybGx1ICUxMnp1XG4iLAor
CQkJICAgIGh1Z2Vfbm1hbGxvYywgaHVnZV9uZGFsbG9jLCBodWdlX2FsbG9jYXRlZCk7CisKKwkJ
CS8qIFByaW50IHN0YXRzIGZvciBlYWNoIGFyZW5hLiAqLworCQkJZm9yIChpID0gMDsgaSA8IG5h
cmVuYXM7IGkrKykgeworCQkJCWFyZW5hID0gYXJlbmFzW2ldOworCQkJCWlmIChhcmVuYSAhPSBO
VUxMKSB7CisJCQkJCW1hbGxvY19wcmludGYoCisJCQkJCSAgICAiXG5hcmVuYXNbJXVdOlxuIiwg
aSk7CisJCQkJCW1hbGxvY19zcGluX2xvY2soJmFyZW5hLT5sb2NrKTsKKwkJCQkJc3RhdHNfcHJp
bnQoYXJlbmEpOworCQkJCQltYWxsb2Nfc3Bpbl91bmxvY2soJmFyZW5hLT5sb2NrKTsKKwkJCQl9
CisJCQl9CisJCX0KKyNlbmRpZiAvKiAjaWZkZWYgTUFMTE9DX1NUQVRTICovCisJCV9tYWxsb2Nf
bWVzc2FnZSgiLS0tIEVuZCBtYWxsb2Mgc3RhdGlzdGljcyAtLS1cbiIsICIiLCAiIiwgIiIpOwor
CX0KK30KKworI2lmZGVmIE1BTExPQ19ERUJVRworc3RhdGljIHZvaWQKK3NpemUyYmluX3ZhbGlk
YXRlKHZvaWQpCit7CisJc2l6ZV90IGksIHNpemUsIGJpbmluZDsKKworCWFzc2VydChzaXplMmJp
blswXSA9PSAweGZmVSk7CisJaSA9IDE7CisjICBpZmRlZiBNQUxMT0NfVElOWQorCS8qIFRpbnku
ICovCisJZm9yICg7IGkgPCAoMVUgPDwgVElOWV9NSU5fMlBPVyk7IGkrKykgeworCQlzaXplID0g
cG93Ml9jZWlsKDFVIDw8IFRJTllfTUlOXzJQT1cpOworCQliaW5pbmQgPSBmZnMoKGludCkoc2l6
ZSA+PiAoVElOWV9NSU5fMlBPVyArIDEpKSk7CisJCWFzc2VydChzaXplMmJpbltpXSA9PSBiaW5p
bmQpOworCX0KKwlmb3IgKDsgaSA8IHFzcGFjZV9taW47IGkrKykgeworCQlzaXplID0gcG93Ml9j
ZWlsKGkpOworCQliaW5pbmQgPSBmZnMoKGludCkoc2l6ZSA+PiAoVElOWV9NSU5fMlBPVyArIDEp
KSk7CisJCWFzc2VydChzaXplMmJpbltpXSA9PSBiaW5pbmQpOworCX0KKyMgIGVuZGlmCisJLyog
UXVhbnR1bS1zcGFjZWQuICovCisJZm9yICg7IGkgPD0gcXNwYWNlX21heDsgaSsrKSB7CisJCXNp
emUgPSBRVUFOVFVNX0NFSUxJTkcoaSk7CisJCWJpbmluZCA9IG50YmlucyArIChzaXplID4+IFFV
QU5UVU1fMlBPVykgLSAxOworCQlhc3NlcnQoc2l6ZTJiaW5baV0gPT0gYmluaW5kKTsKKwl9CisJ
LyogQ2FjaGVsaW5lLXNwYWNlZC4gKi8KKwlmb3IgKDsgaSA8PSBjc3BhY2VfbWF4OyBpKyspIHsK
KwkJc2l6ZSA9IENBQ0hFTElORV9DRUlMSU5HKGkpOworCQliaW5pbmQgPSBudGJpbnMgKyBucWJp
bnMgKyAoKHNpemUgLSBjc3BhY2VfbWluKSA+PgorCQkgICAgQ0FDSEVMSU5FXzJQT1cpOworCQlh
c3NlcnQoc2l6ZTJiaW5baV0gPT0gYmluaW5kKTsKKwl9CisJLyogU3ViLXBhZ2UuICovCisJZm9y
ICg7IGkgPD0gc3NwYWNlX21heDsgaSsrKSB7CisJCXNpemUgPSBTVUJQQUdFX0NFSUxJTkcoaSk7
CisJCWJpbmluZCA9IG50YmlucyArIG5xYmlucyArIG5jYmlucyArICgoc2l6ZSAtIHNzcGFjZV9t
aW4pCisJCSAgICA+PiBTVUJQQUdFXzJQT1cpOworCQlhc3NlcnQoc2l6ZTJiaW5baV0gPT0gYmlu
aW5kKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wKK3NpemUyYmluX2luaXQodm9pZCkK
K3sKKworCWlmIChvcHRfcXNwYWNlX21heF8ycG93ICE9IFFTUEFDRV9NQVhfMlBPV19ERUZBVUxU
CisJICAgIHx8IG9wdF9jc3BhY2VfbWF4XzJwb3cgIT0gQ1NQQUNFX01BWF8yUE9XX0RFRkFVTFQp
CisJCXJldHVybiAoc2l6ZTJiaW5faW5pdF9oYXJkKCkpOworCisJc2l6ZTJiaW4gPSBjb25zdF9z
aXplMmJpbjsKKyNpZmRlZiBNQUxMT0NfREVCVUcKKwlhc3NlcnQoc2l6ZW9mKGNvbnN0X3NpemUy
YmluKSA9PSBiaW5fbWF4Y2xhc3MgKyAxKTsKKwlzaXplMmJpbl92YWxpZGF0ZSgpOworI2VuZGlm
CisJcmV0dXJuIChmYWxzZSk7Cit9CisKK3N0YXRpYyBib29sCitzaXplMmJpbl9pbml0X2hhcmQo
dm9pZCkKK3sKKwlzaXplX3QgaSwgc2l6ZSwgYmluaW5kOworCXVpbnQ4X3QgKmN1c3RvbV9zaXpl
MmJpbjsKKworCWFzc2VydChvcHRfcXNwYWNlX21heF8ycG93ICE9IFFTUEFDRV9NQVhfMlBPV19E
RUZBVUxUCisJICAgIHx8IG9wdF9jc3BhY2VfbWF4XzJwb3cgIT0gQ1NQQUNFX01BWF8yUE9XX0RF
RkFVTFQpOworCisJY3VzdG9tX3NpemUyYmluID0gKHVpbnQ4X3QgKiliYXNlX2FsbG9jKGJpbl9t
YXhjbGFzcyArIDEpOworCWlmIChjdXN0b21fc2l6ZTJiaW4gPT0gTlVMTCkKKwkJcmV0dXJuICh0
cnVlKTsKKworCWN1c3RvbV9zaXplMmJpblswXSA9IDB4ZmZVOworCWkgPSAxOworI2lmZGVmIE1B
TExPQ19USU5ZCisJLyogVGlueS4gKi8KKwlmb3IgKDsgaSA8ICgxVSA8PCBUSU5ZX01JTl8yUE9X
KTsgaSsrKSB7CisJCXNpemUgPSBwb3cyX2NlaWwoMVUgPDwgVElOWV9NSU5fMlBPVyk7CisJCWJp
bmluZCA9IGZmcygoaW50KShzaXplID4+IChUSU5ZX01JTl8yUE9XICsgMSkpKTsKKwkJY3VzdG9t
X3NpemUyYmluW2ldID0gYmluaW5kOworCX0KKwlmb3IgKDsgaSA8IHFzcGFjZV9taW47IGkrKykg
eworCQlzaXplID0gcG93Ml9jZWlsKGkpOworCQliaW5pbmQgPSBmZnMoKGludCkoc2l6ZSA+PiAo
VElOWV9NSU5fMlBPVyArIDEpKSk7CisJCWN1c3RvbV9zaXplMmJpbltpXSA9IGJpbmluZDsKKwl9
CisjZW5kaWYKKwkvKiBRdWFudHVtLXNwYWNlZC4gKi8KKwlmb3IgKDsgaSA8PSBxc3BhY2VfbWF4
OyBpKyspIHsKKwkJc2l6ZSA9IFFVQU5UVU1fQ0VJTElORyhpKTsKKwkJYmluaW5kID0gbnRiaW5z
ICsgKHNpemUgPj4gUVVBTlRVTV8yUE9XKSAtIDE7CisJCWN1c3RvbV9zaXplMmJpbltpXSA9IGJp
bmluZDsKKwl9CisJLyogQ2FjaGVsaW5lLXNwYWNlZC4gKi8KKwlmb3IgKDsgaSA8PSBjc3BhY2Vf
bWF4OyBpKyspIHsKKwkJc2l6ZSA9IENBQ0hFTElORV9DRUlMSU5HKGkpOworCQliaW5pbmQgPSBu
dGJpbnMgKyBucWJpbnMgKyAoKHNpemUgLSBjc3BhY2VfbWluKSA+PgorCQkgICAgQ0FDSEVMSU5F
XzJQT1cpOworCQljdXN0b21fc2l6ZTJiaW5baV0gPSBiaW5pbmQ7CisJfQorCS8qIFN1Yi1wYWdl
LiAqLworCWZvciAoOyBpIDw9IHNzcGFjZV9tYXg7IGkrKykgeworCQlzaXplID0gU1VCUEFHRV9D
RUlMSU5HKGkpOworCQliaW5pbmQgPSBudGJpbnMgKyBucWJpbnMgKyBuY2JpbnMgKyAoKHNpemUg
LSBzc3BhY2VfbWluKSA+PgorCQkgICAgU1VCUEFHRV8yUE9XKTsKKwkJY3VzdG9tX3NpemUyYmlu
W2ldID0gYmluaW5kOworCX0KKworCXNpemUyYmluID0gY3VzdG9tX3NpemUyYmluOworI2lmZGVm
IE1BTExPQ19ERUJVRworCXNpemUyYmluX3ZhbGlkYXRlKCk7CisjZW5kaWYKKwlyZXR1cm4gKGZh
bHNlKTsKK30KKworc3RhdGljIHVuc2lnbmVkCittYWxsb2NfbmNwdXModm9pZCkKK3sKKwl1bnNp
Z25lZCByZXQ7CisJaW50IGZkLCBucmVhZCwgY29sdW1uOworCWNoYXIgYnVmWzFdOworCXN0YXRp
YyBjb25zdCBjaGFyIG1hdGNoc3RyW10gPSAicHJvY2Vzc29yXHQ6IjsKKworCS8qCisJICogc3lz
Y29uZigzKSB3b3VsZCBiZSB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhl
IG51bWJlcgorCSAqIG9mIENQVXMsIGJ1dCBpdCB1c2VzIG1hbGxvYyBpbnRlcm5hbGx5LCB3aGlj
aCBjYXVzZXMgdW50ZW5uYWJsZQorCSAqIHJlY3Vyc2lvbiBkdXJpbmcgbWFsbG9jIGluaXRpYWxp
emF0aW9uLgorCSAqLworCWZkID0gb3BlbigiL3Byb2MvY3B1aW5mbyIsIE9fUkRPTkxZKTsKKwlp
ZiAoZmQgPT0gLTEpCisJCXJldHVybiAoMSk7IC8qIEVycm9yLiAqLworCS8qCisJICogQ291bnQg
dGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBtYXRjaHN0ciBhdCB0aGUgYmVnaW5uaW5ncyBv
ZgorCSAqIGxpbmVzLiAgVGhpcyB0cmVhdHMgaHlwZXJ0aHJlYWRlZCBDUFVzIGFzIG11bHRpcGxl
IHByb2Nlc3NvcnMuCisJICovCisJY29sdW1uID0gMDsKKwlyZXQgPSAwOworCXdoaWxlICh0cnVl
KSB7CisJCW5yZWFkID0gcmVhZChmZCwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlpZiAobnJlYWQg
PD0gMCkKKwkJCWJyZWFrOyAvKiBFT0Ygb3IgZXJyb3IuICovCisKKwkJaWYgKGJ1ZlswXSA9PSAn
XG4nKQorCQkJY29sdW1uID0gMDsKKwkJZWxzZSBpZiAoY29sdW1uICE9IC0xKSB7CisJCQlpZiAo
YnVmWzBdID09IG1hdGNoc3RyW2NvbHVtbl0pIHsKKwkJCQljb2x1bW4rKzsKKwkJCQlpZiAoY29s
dW1uID09IHNpemVvZihtYXRjaHN0cikgLSAxKSB7CisJCQkJCWNvbHVtbiA9IC0xOworCQkJCQly
ZXQrKzsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQljb2x1bW4gPSAtMTsKKwkJfQorCX0KKwlpZiAo
cmV0ID09IDApCisJCXJldCA9IDE7IC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHRoZSBwYXJz
ZXIuICovCisJY2xvc2UoZmQpOworCisJcmV0dXJuIChyZXQpOworfQorLyoKKyAqIEZyZWVCU0Qn
cyBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiBjYWxscyBtYWxsb2MoMyksIHNvIHRoZSBtYWxsb2MK
KyAqIGltcGxlbWVudGF0aW9uIGhhcyB0byB0YWtlIHBhaW5zIHRvIGF2b2lkIGluZmluaXRlIHJl
Y3Vyc2lvbiBkdXJpbmcKKyAqIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGJv
b2wKK21hbGxvY19pbml0KHZvaWQpCit7CisKKwlpZiAobWFsbG9jX2luaXRpYWxpemVkID09IGZh
bHNlKQorCQlyZXR1cm4gKG1hbGxvY19pbml0X2hhcmQoKSk7CisKKwlyZXR1cm4gKGZhbHNlKTsK
K30KKworc3RhdGljIGJvb2wKK21hbGxvY19pbml0X2hhcmQodm9pZCkKK3sKKwl1bnNpZ25lZCBp
OworCWludCBsaW5rbGVuOworCWNoYXIgYnVmW1BBVEhfTUFYICsgMV07CisJY29uc3QgY2hhciAq
b3B0czsKKworCW1hbGxvY19tdXRleF9sb2NrKCZpbml0X2xvY2spOworCWlmIChtYWxsb2NfaW5p
dGlhbGl6ZWQpIHsKKwkJLyoKKwkJICogQW5vdGhlciB0aHJlYWQgaW5pdGlhbGl6ZWQgdGhlIGFs
bG9jYXRvciBiZWZvcmUgdGhpcyBvbmUKKwkJICogYWNxdWlyZWQgaW5pdF9sb2NrLgorCQkgKi8K
KwkJbWFsbG9jX211dGV4X3VubG9jaygmaW5pdF9sb2NrKTsKKwkJcmV0dXJuIChmYWxzZSk7CisJ
fQorCisJLyogR2V0IG51bWJlciBvZiBDUFVzLiAqLworCW5jcHVzID0gbWFsbG9jX25jcHVzKCk7
CisKKwkvKiBHZXQgcGFnZSBzaXplLiAqLworCXsKKwkJbG9uZyByZXN1bHQ7CisKKwkJcmVzdWx0
ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCQlhc3NlcnQocmVzdWx0ICE9IC0xKTsKKwkJcGFn
ZXNpemUgPSAodW5zaWduZWQpcmVzdWx0OworCisJCS8qCisJCSAqIFdlIGFzc3VtZSB0aGF0IHBh
Z2VzaXplIGlzIGEgcG93ZXIgb2YgMiB3aGVuIGNhbGN1bGF0aW5nCisJCSAqIHBhZ2VzaXplX21h
c2sgYW5kIHBhZ2VzaXplXzJwb3cuCisJCSAqLworCQlhc3NlcnQoKChyZXN1bHQgLSAxKSAmIHJl
c3VsdCkgPT0gMCk7CisJCXBhZ2VzaXplX21hc2sgPSByZXN1bHQgLSAxOworCQlwYWdlc2l6ZV8y
cG93ID0gZmZzKChpbnQpcmVzdWx0KSAtIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkr
KykgeworCQl1bnNpZ25lZCBqOworCisJCS8qIEdldCBydW50aW1lIGNvbmZpZ3VyYXRpb24uICov
CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpZiAoKGxpbmtsZW4gPSByZWFkbGluaygi
L2V0Yy9tYWxsb2MuY29uZiIsIGJ1ZiwKKwkJCQkJCXNpemVvZihidWYpIC0gMSkpICE9IC0xKSB7
CisJCQkJLyoKKwkJCQkgKiBVc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAiL2V0Yy9tYWxsb2MuY29u
ZiIKKwkJCQkgKiBzeW1ib2xpYyBsaW5rJ3MgbmFtZS4KKwkJCQkgKi8KKwkJCQlidWZbbGlua2xl
bl0gPSAnXDAnOworCQkJCW9wdHMgPSBidWY7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vIGNvbmZp
Z3VyYXRpb24gc3BlY2lmaWVkLiAqLworCQkJCWJ1ZlswXSA9ICdcMCc7CisJCQkJb3B0cyA9IGJ1
ZjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoaXNzZXR1Z2lkKCkgPT0gMCAm
JiAob3B0cyA9CisJCQkgICAgZ2V0ZW52KCJNQUxMT0NfT1BUSU9OUyIpKSAhPSBOVUxMKSB7CisJ
CQkJLyoKKwkJCQkgKiBEbyBub3RoaW5nOyBvcHRzIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8K
KwkJCQkgKiB0aGUgdmFsdWUgb2YgdGhlIE1BTExPQ19PUFRJT05TIGVudmlyb25tZW50CisJCQkJ
ICogdmFyaWFibGUuCisJCQkJICovCisJCQl9IGVsc2UgeworCQkJCS8qIE5vIGNvbmZpZ3VyYXRp
b24gc3BlY2lmaWVkLiAqLworCQkJCWJ1ZlswXSA9ICdcMCc7CisJCQkJb3B0cyA9IGJ1ZjsKKwkJ
CX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpZiAoX21hbGxvY19vcHRpb25zICE9IE5VTEwp
IHsKKwkJCQkvKgorCQkJCSAqIFVzZSBvcHRpb25zIHRoYXQgd2VyZSBjb21waWxlZCBpbnRvIHRo
ZQorCQkJCSAqIHByb2dyYW0uCisJCQkJICovCisJCQkJb3B0cyA9IF9tYWxsb2Nfb3B0aW9uczsK
KwkJCX0gZWxzZSB7CisJCQkJLyogTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICovCisJCQkJ
YnVmWzBdID0gJ1wwJzsKKwkJCQlvcHRzID0gYnVmOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1
bHQ6CisJCQkvKiBOT1RSRUFDSEVEICovCisJCQlhc3NlcnQoZmFsc2UpOworCQl9CisKKwkJZm9y
IChqID0gMDsgb3B0c1tqXSAhPSAnXDAnOyBqKyspIHsKKwkJCXVuc2lnbmVkIGssIG5yZXBzOwor
CQkJYm9vbCBuc2VlbjsKKworCQkJLyogUGFyc2UgcmVwZXRpdGlvbiBjb3VudCwgaWYgYW55LiAq
LworCQkJZm9yIChucmVwcyA9IDAsIG5zZWVuID0gZmFsc2U7OyBqKyssIG5zZWVuID0gdHJ1ZSkg
eworCQkJCXN3aXRjaCAob3B0c1tqXSkgeworCQkJCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2Ug
JzInOiBjYXNlICczJzoKKwkJCQkJY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAn
Nyc6CisJCQkJCWNhc2UgJzgnOiBjYXNlICc5JzoKKwkJCQkJCW5yZXBzICo9IDEwOworCQkJCQkJ
bnJlcHMgKz0gb3B0c1tqXSAtICcwJzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJ
CQkJZ290byBNQUxMT0NfT1VUOworCQkJCX0KKwkJCX0KK01BTExPQ19PVVQ6CisJCQlpZiAobnNl
ZW4gPT0gZmFsc2UpCisJCQkJbnJlcHMgPSAxOworCisJCQlmb3IgKGsgPSAwOyBrIDwgbnJlcHM7
IGsrKykgeworCQkJCXN3aXRjaCAob3B0c1tqXSkgeworCQkJCWNhc2UgJ2EnOgorCQkJCQlvcHRf
YWJvcnQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQSc6CisJCQkJCW9wdF9hYm9y
dCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2InOgorI2lmZGVmIE1BTExPQ19CQUxB
TkNFCisJCQkJCW9wdF9iYWxhbmNlX3RocmVzaG9sZCA+Pj0gMTsKKyNlbmRpZgorCQkJCQlicmVh
azsKKwkJCQljYXNlICdCJzoKKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQorCQkJCQlpZiAob3B0X2Jh
bGFuY2VfdGhyZXNob2xkID09IDApCisJCQkJCQlvcHRfYmFsYW5jZV90aHJlc2hvbGQgPSAxOwor
CQkJCQllbHNlIGlmICgob3B0X2JhbGFuY2VfdGhyZXNob2xkIDw8IDEpCisJCQkJCSAgICA+IG9w
dF9iYWxhbmNlX3RocmVzaG9sZCkKKwkJCQkJCW9wdF9iYWxhbmNlX3RocmVzaG9sZCA8PD0gMTsK
KyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQljYXNlICdjJzoKKwkJCQkJaWYgKG9wdF9jc3BhY2Vf
bWF4XzJwb3cgLSAxID4KKwkJCQkJICAgIG9wdF9xc3BhY2VfbWF4XzJwb3cgJiYKKwkJCQkJICAg
IG9wdF9jc3BhY2VfbWF4XzJwb3cgPgorCQkJCQkgICAgQ0FDSEVMSU5FXzJQT1cpCisJCQkJCQlv
cHRfY3NwYWNlX21heF8ycG93LS07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0MnOgorCQkJCQlp
ZiAob3B0X2NzcGFjZV9tYXhfMnBvdyA8IHBhZ2VzaXplXzJwb3cKKwkJCQkJICAgIC0gMSkKKwkJ
CQkJCW9wdF9jc3BhY2VfbWF4XzJwb3crKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZCc6Cisj
aWZkZWYgTUFMTE9DX0RTUworCQkJCQlvcHRfZHNzID0gZmFsc2U7CisjZW5kaWYKKwkJCQkJYnJl
YWs7CisJCQkJY2FzZSAnRCc6CisjaWZkZWYgTUFMTE9DX0RTUworCQkJCQlvcHRfZHNzID0gdHJ1
ZTsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQljYXNlICdmJzoKKwkJCQkJb3B0X2RpcnR5X21h
eCA+Pj0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRic6CisJCQkJCWlmIChvcHRfZGlydHlf
bWF4ID09IDApCisJCQkJCQlvcHRfZGlydHlfbWF4ID0gMTsKKwkJCQkJZWxzZSBpZiAoKG9wdF9k
aXJ0eV9tYXggPDwgMSkgIT0gMCkKKwkJCQkJCW9wdF9kaXJ0eV9tYXggPDw9IDE7CisJCQkJCWJy
ZWFrOworI2lmZGVmIE1BTExPQ19NQUcKKwkJCQljYXNlICdnJzoKKwkJCQkJb3B0X21hZyA9IGZh
bHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdHJzoKKwkJCQkJb3B0X21hZyA9IHRydWU7CisJ
CQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSAnaic6CisJCQkJCW9wdF9qdW5rID0gZmFsc2U7
CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0onOgorCQkJCQlvcHRfanVuayA9IHRydWU7CisJCQkJ
CWJyZWFrOworCQkJCWNhc2UgJ2snOgorCQkJCQkvKgorCQkJCQkgKiBDaHVua3MgYWx3YXlzIHJl
cXVpcmUgYXQgbGVhc3Qgb25lCisJCQkJCSAqIGhlYWRlciBwYWdlLCBzbyBjaHVua3MgY2FuIG5l
dmVyIGJlCisJCQkJCSAqIHNtYWxsZXIgdGhhbiB0d28gcGFnZXMuCisJCQkJCSAqLworCQkJCQlp
ZiAob3B0X2NodW5rXzJwb3cgPiBwYWdlc2l6ZV8ycG93ICsgMSkKKwkJCQkJCW9wdF9jaHVua18y
cG93LS07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0snOgorCQkJCQlpZiAob3B0X2NodW5rXzJw
b3cgKyAxIDwKKwkJCQkJICAgIChzaXplb2Yoc2l6ZV90KSA8PCAzKSkKKwkJCQkJCW9wdF9jaHVu
a18ycG93Kys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ20nOgorI2lmZGVmIE1BTExPQ19EU1MK
KwkJCQkJb3B0X21tYXAgPSBmYWxzZTsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQljYXNlICdN
JzoKKyNpZmRlZiBNQUxMT0NfRFNTCisJCQkJCW9wdF9tbWFwID0gdHJ1ZTsKKyNlbmRpZgorCQkJ
CQlicmVhazsKKwkJCQljYXNlICduJzoKKwkJCQkJb3B0X25hcmVuYXNfbHNoaWZ0LS07CisJCQkJ
CWJyZWFrOworCQkJCWNhc2UgJ04nOgorCQkJCQlvcHRfbmFyZW5hc19sc2hpZnQrKzsKKwkJCQkJ
YnJlYWs7CisJCQkJY2FzZSAncCc6CisJCQkJCW9wdF9wcmludF9zdGF0cyA9IGZhbHNlOworCQkJ
CQlicmVhazsKKwkJCQljYXNlICdQJzoKKwkJCQkJb3B0X3ByaW50X3N0YXRzID0gdHJ1ZTsKKwkJ
CQkJYnJlYWs7CisJCQkJY2FzZSAncSc6CisJCQkJCWlmIChvcHRfcXNwYWNlX21heF8ycG93ID4g
UVVBTlRVTV8yUE9XKQorCQkJCQkJb3B0X3FzcGFjZV9tYXhfMnBvdy0tOworCQkJCQlicmVhazsK
KwkJCQljYXNlICdRJzoKKwkJCQkJaWYgKG9wdF9xc3BhY2VfbWF4XzJwb3cgKyAxIDwKKwkJCQkJ
ICAgIG9wdF9jc3BhY2VfbWF4XzJwb3cpCisJCQkJCQlvcHRfcXNwYWNlX21heF8ycG93Kys7CisJ
CQkJCWJyZWFrOworI2lmZGVmIE1BTExPQ19NQUcKKwkJCQljYXNlICdSJzoKKwkJCQkJaWYgKG9w
dF9tYWdfc2l6ZV8ycG93ICsgMSA8ICg4VSA8PAorCQkJCQkgICAgU0laRU9GX1BUUl8yUE9XKSkK
KwkJCQkJCW9wdF9tYWdfc2l6ZV8ycG93Kys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3InOgor
CQkJCQkvKgorCQkJCQkgKiBNYWtlIHN1cmUgdGhlcmUncyBhbHdheXMgYXQgbGVhc3QKKwkJCQkJ
ICogb25lIHJvdW5kIHBlciBtYWdhemluZS4KKwkJCQkJICovCisJCQkJCWlmICgoMVUgPDwgKG9w
dF9tYWdfc2l6ZV8ycG93LTEpKSA+PQorCQkJCQkgICAgc2l6ZW9mKG1hZ190KSkKKwkJCQkJCW9w
dF9tYWdfc2l6ZV8ycG93LS07CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSAndSc6CisJ
CQkJCW9wdF91dHJhY2UgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnVSc6CisJCQkJ
CW9wdF91dHJhY2UgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICd2JzoKKwkJCQkJb3B0
X3N5c3YgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnVic6CisJCQkJCW9wdF9zeXN2
ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAneCc6CisJCQkJCW9wdF94bWFsbG9jID0g
ZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1gnOgorCQkJCQlvcHRfeG1hbGxvYyA9IHRy
dWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3onOgorCQkJCQlvcHRfemVybyA9IGZhbHNlOwor
CQkJCQlicmVhazsKKwkJCQljYXNlICdaJzoKKwkJCQkJb3B0X3plcm8gPSB0cnVlOworCQkJCQli
cmVhazsKKwkJCQlkZWZhdWx0OiB7CisJCQkJCWNoYXIgY2J1ZlsyXTsKKworCQkJCQljYnVmWzBd
ID0gb3B0c1tqXTsKKwkJCQkJY2J1ZlsxXSA9ICdcMCc7CisJCQkJCV9tYWxsb2NfbWVzc2FnZShf
Z2V0cHJvZ25hbWUoKSwKKwkJCQkJICAgICI6IChtYWxsb2MpIFVuc3VwcG9ydGVkIGNoYXJhY3Rl
ciAiCisJCQkJCSAgICAiaW4gbWFsbG9jIG9wdGlvbnM6ICciLCBjYnVmLAorCQkJCQkgICAgIidc
biIpOworCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBNQUxMT0NfRFNTCisJ
LyogTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgc29tZSBtZXRob2QgZm9yIGFjcXVpcmluZyBtZW1v
cnkuICovCisJaWYgKG9wdF9kc3MgPT0gZmFsc2UgJiYgb3B0X21tYXAgPT0gZmFsc2UpCisJCW9w
dF9tbWFwID0gdHJ1ZTsKKyNlbmRpZgorCisJLyogVGFrZSBjYXJlIHRvIGNhbGwgYXRleGl0KCkg
b25seSBvbmNlLiAqLworCWlmIChvcHRfcHJpbnRfc3RhdHMpIHsKKwkJLyogUHJpbnQgc3RhdGlz
dGljcyBhdCBleGl0LiAqLworCQlhdGV4aXQobWFsbG9jX3ByaW50X3N0YXRzKTsKKwl9CisKKwkv
KiBSZWdpc3RlciBmb3JrIGhhbmRsZXJzLiAqLworCXB0aHJlYWRfYXRmb3JrKF9tYWxsb2NfcHJl
Zm9yaywgX21hbGxvY19wb3N0Zm9yaywgX21hbGxvY19wb3N0Zm9yayk7CisKKyNpZmRlZiBNQUxM
T0NfTUFHCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBudW1iZXIgb2Ygcm91bmRzIHBl
ciBtYWdhemluZSwgdGFraW5nIGludG8KKwkgKiBhY2NvdW50IGhlYWRlciBvdmVyaGVhZC4KKwkg
Ki8KKwltYXhfcm91bmRzID0gKDFMTFUgPDwgKG9wdF9tYWdfc2l6ZV8ycG93IC0gU0laRU9GX1BU
Ul8yUE9XKSkgLQorCSAgICAoc2l6ZW9mKG1hZ190KSA+PiBTSVpFT0ZfUFRSXzJQT1cpICsgMTsK
KyNlbmRpZgorCisJLyogU2V0IHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIG9w
dF9bcWNdc3BhY2VfbWF4XzJwb3cuICovCisJcXNwYWNlX21heCA9ICgxVSA8PCBvcHRfcXNwYWNl
X21heF8ycG93KTsKKwljc3BhY2VfbWluID0gQ0FDSEVMSU5FX0NFSUxJTkcocXNwYWNlX21heCk7
CisJaWYgKGNzcGFjZV9taW4gPT0gcXNwYWNlX21heCkKKwkJY3NwYWNlX21pbiArPSBDQUNIRUxJ
TkU7CisJY3NwYWNlX21heCA9ICgxVSA8PCBvcHRfY3NwYWNlX21heF8ycG93KTsKKwlzc3BhY2Vf
bWluID0gU1VCUEFHRV9DRUlMSU5HKGNzcGFjZV9tYXgpOworCWlmIChzc3BhY2VfbWluID09IGNz
cGFjZV9tYXgpCisJCXNzcGFjZV9taW4gKz0gU1VCUEFHRTsKKwlhc3NlcnQoc3NwYWNlX21pbiA8
IHBhZ2VzaXplKTsKKwlzc3BhY2VfbWF4ID0gcGFnZXNpemUgLSBTVUJQQUdFOworCisjaWZkZWYg
TUFMTE9DX1RJTlkKKwlhc3NlcnQoUVVBTlRVTV8yUE9XID49IFRJTllfTUlOXzJQT1cpOworI2Vu
ZGlmCisJYXNzZXJ0KG50YmlucyA8PSBRVUFOVFVNXzJQT1cpOworCW5xYmlucyA9IHFzcGFjZV9t
YXggPj4gUVVBTlRVTV8yUE9XOworCW5jYmlucyA9ICgoY3NwYWNlX21heCAtIGNzcGFjZV9taW4p
ID4+IENBQ0hFTElORV8yUE9XKSArIDE7CisJbnNiaW5zID0gKChzc3BhY2VfbWF4IC0gc3NwYWNl
X21pbikgPj4gU1VCUEFHRV8yUE9XKSArIDE7CisJbmJpbnMgPSBudGJpbnMgKyBucWJpbnMgKyBu
Y2JpbnMgKyBuc2JpbnM7CisKKwlpZiAoc2l6ZTJiaW5faW5pdCgpKSB7CisJCW1hbGxvY19tdXRl
eF91bmxvY2soJmluaXRfbG9jayk7CisJCXJldHVybiAodHJ1ZSk7CisJfQorCisJLyogU2V0IHZh
cmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIG9wdF9jaHVua18ycG93LiAqLworCWNo
dW5rc2l6ZSA9ICgxTFUgPDwgb3B0X2NodW5rXzJwb3cpOworCWNodW5rc2l6ZV9tYXNrID0gY2h1
bmtzaXplIC0gMTsKKwljaHVua19ucGFnZXMgPSAoY2h1bmtzaXplID4+IHBhZ2VzaXplXzJwb3cp
OworCXsKKwkJc2l6ZV90IGhlYWRlcl9zaXplOworCisJCS8qCisJCSAqIENvbXB1dGUgdGhlIGhl
YWRlciBzaXplIHN1Y2ggdGhhdCBpdCBpcyBsYXJnZSBlbm91Z2ggdG8KKwkJICogY29udGFpbiB0
aGUgcGFnZSBtYXAuCisJCSAqLworCQloZWFkZXJfc2l6ZSA9IHNpemVvZihhcmVuYV9jaHVua190
KSArCisJCSAgICAoc2l6ZW9mKGFyZW5hX2NodW5rX21hcF90KSAqIChjaHVua19ucGFnZXMgLSAx
KSk7CisJCWFyZW5hX2NodW5rX2hlYWRlcl9ucGFnZXMgPSAoaGVhZGVyX3NpemUgPj4gcGFnZXNp
emVfMnBvdykgKworCQkgICAgKChoZWFkZXJfc2l6ZSAmIHBhZ2VzaXplX21hc2spICE9IDApOwor
CX0KKwlhcmVuYV9tYXhjbGFzcyA9IGNodW5rc2l6ZSAtIChhcmVuYV9jaHVua19oZWFkZXJfbnBh
Z2VzIDw8CisJICAgIHBhZ2VzaXplXzJwb3cpOworCisJVVRSQUNFKDAsIDAsIDApOworCisjaWZk
ZWYgTUFMTE9DX1NUQVRTCisJbWVtc2V0KCZzdGF0c19jaHVua3MsIDAsIHNpemVvZihjaHVua19z
dGF0c190KSk7CisjZW5kaWYKKworCS8qIFZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0aGF0IHJlZ2Fy
ZCBjb25maWd1cmF0aW9uLiAqLworCWFzc2VydChjaHVua3NpemUgPj0gcGFnZXNpemUpOworCisJ
LyogSW5pdGlhbGl6ZSBjaHVua3MgZGF0YS4gKi8KKwlpZiAobWFsbG9jX211dGV4X2luaXQoJmh1
Z2VfbXR4KSkgeworCQltYWxsb2NfbXV0ZXhfdW5sb2NrKCZpbml0X2xvY2spOworCQlyZXR1cm4g
KHRydWUpOworCX0KKwlleHRlbnRfdHJlZV9hZF9uZXcoJmh1Z2UpOworI2lmZGVmIE1BTExPQ19E
U1MKKwlpZiAobWFsbG9jX211dGV4X2luaXQoJmRzc19tdHgpKSB7CisJCW1hbGxvY19tdXRleF91
bmxvY2soJmluaXRfbG9jayk7CisJCXJldHVybiAodHJ1ZSk7CisJfQorCWRzc19iYXNlID0gc2Jy
aygwKTsKKwlkc3NfcHJldiA9IGRzc19iYXNlOworCWRzc19tYXggPSBkc3NfYmFzZTsKKwlleHRl
bnRfdHJlZV9zemFkX25ldygmZHNzX2NodW5rc19zemFkKTsKKwlleHRlbnRfdHJlZV9hZF9uZXco
JmRzc19jaHVua3NfYWQpOworI2VuZGlmCisjaWZkZWYgTUFMTE9DX1NUQVRTCisJaHVnZV9ubWFs
bG9jID0gMDsKKwlodWdlX25kYWxsb2MgPSAwOworCWh1Z2VfYWxsb2NhdGVkID0gMDsKKyNlbmRp
ZgorCisJLyogSW5pdGlhbGl6ZSBiYXNlIGFsbG9jYXRpb24gZGF0YSBzdHJ1Y3R1cmVzLiAqLwor
I2lmZGVmIE1BTExPQ19TVEFUUworCWJhc2VfbWFwcGVkID0gMDsKKyNlbmRpZgorI2lmZGVmIE1B
TExPQ19EU1MKKwkvKgorCSAqIEFsbG9jYXRlIGEgYmFzZSBjaHVuayBoZXJlLCBzaW5jZSBpdCBk
b2Vzbid0IGFjdHVhbGx5IGhhdmUgdG8gYmUKKwkgKiBjaHVuay1hbGlnbmVkLiAgRG9pbmcgdGhp
cyBiZWZvcmUgYWxsb2NhdGluZyBhbnkgb3RoZXIgY2h1bmtzIGFsbG93cworCSAqIHRoZSB1c2Ug
b2Ygc3BhY2UgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgd2FzdGVkLgorCSAqLworCWlmIChvcHRf
ZHNzKQorCQliYXNlX3BhZ2VzX2FsbG9jKDApOworI2VuZGlmCisJYmFzZV9ub2RlcyA9IE5VTEw7
CisJaWYgKG1hbGxvY19tdXRleF9pbml0KCZiYXNlX210eCkpIHsKKwkJbWFsbG9jX211dGV4X3Vu
bG9jaygmaW5pdF9sb2NrKTsKKwkJcmV0dXJuICh0cnVlKTsKKwl9CisKKwlpZiAobmNwdXMgPiAx
KSB7CisJCS8qCisJCSAqIEZvciBTTVAgc3lzdGVtcywgY3JlYXRlIHR3aWNlIGFzIG1hbnkgYXJl
bmFzIGFzIHRoZXJlIGFyZQorCQkgKiBDUFVzIGJ5IGRlZmF1bHQuCisJCSAqLworCQlvcHRfbmFy
ZW5hc19sc2hpZnQrKzsKKwl9CisKKwkvKiBEZXRlcm1pbmUgaG93IG1hbnkgYXJlbmFzIHRvIHVz
ZS4gKi8KKwluYXJlbmFzID0gbmNwdXM7CisJaWYgKG9wdF9uYXJlbmFzX2xzaGlmdCA+IDApIHsK
KwkJaWYgKChuYXJlbmFzIDw8IG9wdF9uYXJlbmFzX2xzaGlmdCkgPiBuYXJlbmFzKQorCQkJbmFy
ZW5hcyA8PD0gb3B0X25hcmVuYXNfbHNoaWZ0OworCQkvKgorCQkgKiBNYWtlIHN1cmUgbm90IHRv
IGV4Y2VlZCB0aGUgbGltaXRzIG9mIHdoYXQgYmFzZV9hbGxvYygpIGNhbgorCQkgKiBoYW5kbGUu
CisJCSAqLworCQlpZiAobmFyZW5hcyAqIHNpemVvZihhcmVuYV90ICopID4gY2h1bmtzaXplKQor
CQkJbmFyZW5hcyA9IGNodW5rc2l6ZSAvIHNpemVvZihhcmVuYV90ICopOworCX0gZWxzZSBpZiAo
b3B0X25hcmVuYXNfbHNoaWZ0IDwgMCkgeworCQlpZiAoKG5hcmVuYXMgPj4gLW9wdF9uYXJlbmFz
X2xzaGlmdCkgPCBuYXJlbmFzKQorCQkJbmFyZW5hcyA+Pj0gLW9wdF9uYXJlbmFzX2xzaGlmdDsK
KwkJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhcmVuYS4gKi8KKwkJaWYgKG5h
cmVuYXMgPT0gMCkKKwkJCW5hcmVuYXMgPSAxOworCX0KKyNpZmRlZiBNQUxMT0NfQkFMQU5DRQor
CWFzc2VydChuYXJlbmFzICE9IDApOworCWZvciAobmFyZW5hc18ycG93ID0gMDsKKwkgICAgIChu
YXJlbmFzID4+IChuYXJlbmFzXzJwb3cgKyAxKSkgIT0gMDsKKwkgICAgIG5hcmVuYXNfMnBvdysr
KTsKKyNlbmRpZgorCisjaWZkZWYgTk9fVExTCisJaWYgKG5hcmVuYXMgPiAxKSB7CisJCXN0YXRp
YyBjb25zdCB1bnNpZ25lZCBwcmltZXNbXSA9IHsxLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwK
KwkJICAgIDIzLCAyOSwgMzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2NywgNzEsIDcz
LCA3OSwgODMsCisJCSAgICA4OSwgOTcsIDEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEz
MSwgMTM3LCAxMzksIDE0OSwKKwkJICAgIDE1MSwgMTU3LCAxNjMsIDE2NywgMTczLCAxNzksIDE4
MSwgMTkxLCAxOTMsIDE5NywgMTk5LCAyMTEsCisJCSAgICAyMjMsIDIyNywgMjI5LCAyMzMsIDIz
OSwgMjQxLCAyNTEsIDI1NywgMjYzfTsKKwkJdW5zaWduZWQgbnByaW1lcywgcGFyZW5hczsKKwor
CQkvKgorCQkgKiBQaWNrIGEgcHJpbWUgbnVtYmVyIG9mIGhhc2ggYXJlbmFzIHRoYXQgaXMgbW9y
ZSB0aGFuIG5hcmVuYXMKKwkJICogc28gdGhhdCBkaXJlY3QgaGFzaGluZyBvZiBwdGhyZWFkX3Nl
bGYoKSBwb2ludGVycyB0ZW5kcyB0bworCQkgKiBzcHJlYWQgYWxsb2NhdGlvbnMgZXZlbmx5IGFt
b25nIHRoZSBhcmVuYXMuCisJCSAqLworCQlhc3NlcnQoKG5hcmVuYXMgJiAxKSA9PSAwKTsgLyog
bmFyZW5hcyBtdXN0IGJlIGV2ZW4uICovCisJCW5wcmltZXMgPSAoc2l6ZW9mKHByaW1lcykgPj4g
U0laRU9GX0lOVF8yUE9XKTsKKwkJcGFyZW5hcyA9IHByaW1lc1tucHJpbWVzIC0gMV07IC8qIElu
IGNhc2Ugbm90IGVub3VnaCBwcmltZXMuICovCisJCWZvciAoaSA9IDE7IGkgPCBucHJpbWVzOyBp
KyspIHsKKwkJCWlmIChwcmltZXNbaV0gPiBuYXJlbmFzKSB7CisJCQkJcGFyZW5hcyA9IHByaW1l
c1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQluYXJlbmFzID0gcGFyZW5hczsKKwl9Cisj
ZW5kaWYKKworI2lmbmRlZiBOT19UTFMKKyMgIGlmbmRlZiBNQUxMT0NfQkFMQU5DRQorCW5leHRf
YXJlbmEgPSAwOworIyAgZW5kaWYKKyNlbmRpZgorCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxp
emUgYXJlbmFzLiAqLworCWFyZW5hcyA9IChhcmVuYV90ICoqKWJhc2VfYWxsb2Moc2l6ZW9mKGFy
ZW5hX3QgKikgKiBuYXJlbmFzKTsKKwlpZiAoYXJlbmFzID09IE5VTEwpIHsKKwkJbWFsbG9jX211
dGV4X3VubG9jaygmaW5pdF9sb2NrKTsKKwkJcmV0dXJuICh0cnVlKTsKKwl9CisJLyoKKwkgKiBa
ZXJvIHRoZSBhcnJheS4gIEluIHByYWN0aWNlLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgcHJlLXpl
cm9lZCwKKwkgKiBzaW5jZSBpdCB3YXMganVzdCBtbWFwKCllZCwgYnV0IGxldCdzIGJlIHN1cmUu
CisJICovCisJbWVtc2V0KGFyZW5hcywgMCwgc2l6ZW9mKGFyZW5hX3QgKikgKiBuYXJlbmFzKTsK
KworCS8qCisJICogSW5pdGlhbGl6ZSBvbmUgYXJlbmEgaGVyZS4gIFRoZSByZXN0IGFyZSBsYXpp
bHkgY3JlYXRlZCBpbgorCSAqIGNob29zZV9hcmVuYV9oYXJkKCkuCisJICovCisJYXJlbmFzX2V4
dGVuZCgwKTsKKwlpZiAoYXJlbmFzWzBdID09IE5VTEwpIHsKKwkJbWFsbG9jX211dGV4X3VubG9j
aygmaW5pdF9sb2NrKTsKKwkJcmV0dXJuICh0cnVlKTsKKwl9CisjaWZuZGVmIE5PX1RMUworCS8q
CisJICogQXNzaWduIHRoZSBpbml0aWFsIGFyZW5hIHRvIHRoZSBpbml0aWFsIHRocmVhZCwgaW4g
b3JkZXIgdG8gYXZvaWQKKwkgKiBzcHVyaW91cyBjcmVhdGlvbiBvZiBhbiBleHRyYSBhcmVuYSBp
ZiB0aGUgYXBwbGljYXRpb24gc3dpdGNoZXMgdG8KKwkgKiB0aHJlYWRlZCBtb2RlLgorCSAqLwor
CWFyZW5hc19tYXAgPSBhcmVuYXNbMF07CisjZW5kaWYKKwkvKgorCSAqIFNlZWQgaGVyZSBmb3Ig
dGhlIGluaXRpYWwgdGhyZWFkLCBzaW5jZSBjaG9vc2VfYXJlbmFfaGFyZCgpIGlzIG9ubHkKKwkg
KiBjYWxsZWQgZm9yIG90aGVyIHRocmVhZHMuICBUaGUgc2VlZCB2YWx1ZSBkb2Vzbid0IHJlYWxs
eSBtYXR0ZXIuCisJICovCisjaWZkZWYgTUFMTE9DX0JBTEFOQ0UKKwlTUFJOKGJhbGFuY2UsIDQy
KTsKKyNlbmRpZgorCisJbWFsbG9jX3NwaW5faW5pdCgmYXJlbmFzX2xvY2spOworCisJbWFsbG9j
X2luaXRpYWxpemVkID0gdHJ1ZTsKKwltYWxsb2NfbXV0ZXhfdW5sb2NrKCZpbml0X2xvY2spOwor
CXJldHVybiAoZmFsc2UpOworfQorCisvKgorICogRW5kIGdlbmVyYWwgaW50ZXJuYWwgZnVuY3Rp
b25zLgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEJlZ2luIG1hbGxvYygz
KS1jb21wYXRpYmxlIGZ1bmN0aW9ucy4KKyAqLworCit2b2lkICoKK21hbGxvYyhzaXplX3Qgc2l6
ZSkKK3sKKwl2b2lkICpyZXQ7CisKKwlpZiAobWFsbG9jX2luaXQoKSkgeworCQlyZXQgPSBOVUxM
OworCQlnb3RvIFJFVFVSTjsKKwl9CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCWlmIChvcHRfc3lz
diA9PSBmYWxzZSkKKwkJCXNpemUgPSAxOworCQllbHNlIHsKKwkJCXJldCA9IE5VTEw7CisJCQln
b3RvIFJFVFVSTjsKKwkJfQorCX0KKworCXJldCA9IGltYWxsb2Moc2l6ZSk7CisKK1JFVFVSTjoK
KwlpZiAocmV0ID09IE5VTEwpIHsKKwkJaWYgKG9wdF94bWFsbG9jKSB7CisJCQlfbWFsbG9jX21l
c3NhZ2UoX2dldHByb2duYW1lKCksCisJCQkgICAgIjogKG1hbGxvYykgRXJyb3IgaW4gbWFsbG9j
KCk6IG91dCBvZiBtZW1vcnlcbiIsICIiLAorCQkJICAgICIiKTsKKwkJCWFib3J0KCk7CisJCX0K
KwkJZXJybm8gPSBFTk9NRU07CisJfQorCisJVVRSQUNFKDAsIHNpemUsIHJldCk7CisJcmV0dXJu
IChyZXQpOworfQorCitpbnQKK3Bvc2l4X21lbWFsaWduKHZvaWQgKiptZW1wdHIsIHNpemVfdCBh
bGlnbm1lbnQsIHNpemVfdCBzaXplKQoreworCWludCByZXQ7CisJdm9pZCAqcmVzdWx0OworCisJ
aWYgKG1hbGxvY19pbml0KCkpCisJCXJlc3VsdCA9IE5VTEw7CisJZWxzZSB7CisJCS8qIE1ha2Ug
c3VyZSB0aGF0IGFsaWdubWVudCBpcyBhIGxhcmdlIGVub3VnaCBwb3dlciBvZiAyLiAqLworCQlp
ZiAoKChhbGlnbm1lbnQgLSAxKSAmIGFsaWdubWVudCkgIT0gMAorCQkgICAgfHwgYWxpZ25tZW50
IDwgc2l6ZW9mKHZvaWQgKikpIHsKKwkJCWlmIChvcHRfeG1hbGxvYykgeworCQkJCV9tYWxsb2Nf
bWVzc2FnZShfZ2V0cHJvZ25hbWUoKSwKKwkJCQkgICAgIjogKG1hbGxvYykgRXJyb3IgaW4gcG9z
aXhfbWVtYWxpZ24oKTogIgorCQkJCSAgICAiaW52YWxpZCBhbGlnbm1lbnRcbiIsICIiLCAiIik7
CisJCQkJYWJvcnQoKTsKKwkJCX0KKwkJCXJlc3VsdCA9IE5VTEw7CisJCQlyZXQgPSBFSU5WQUw7
CisJCQlnb3RvIFJFVFVSTjsKKwkJfQorCisJCXJlc3VsdCA9IGlwYWxsb2MoYWxpZ25tZW50LCBz
aXplKTsKKwl9CisKKwlpZiAocmVzdWx0ID09IE5VTEwpIHsKKwkJaWYgKG9wdF94bWFsbG9jKSB7
CisJCQlfbWFsbG9jX21lc3NhZ2UoX2dldHByb2duYW1lKCksCisJCQkiOiAobWFsbG9jKSBFcnJv
ciBpbiBwb3NpeF9tZW1hbGlnbigpOiBvdXQgb2YgbWVtb3J5XG4iLAorCQkJIiIsICIiKTsKKwkJ
CWFib3J0KCk7CisJCX0KKwkJcmV0ID0gRU5PTUVNOworCQlnb3RvIFJFVFVSTjsKKwl9CisKKwkq
bWVtcHRyID0gcmVzdWx0OworCXJldCA9IDA7CisKK1JFVFVSTjoKKwlVVFJBQ0UoMCwgc2l6ZSwg
cmVzdWx0KTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3ZvaWQgKgorY2FsbG9jKHNpemVfdCBudW0s
IHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldDsKKwlzaXplX3QgbnVtX3NpemU7CisKKwlpZiAo
bWFsbG9jX2luaXQoKSkgeworCQludW1fc2l6ZSA9IDA7CisJCXJldCA9IE5VTEw7CisJCWdvdG8g
UkVUVVJOOworCX0KKworCW51bV9zaXplID0gbnVtICogc2l6ZTsKKwlpZiAobnVtX3NpemUgPT0g
MCkgeworCQlpZiAoKG9wdF9zeXN2ID09IGZhbHNlKSAmJiAoKG51bSA9PSAwKSB8fCAoc2l6ZSA9
PSAwKSkpCisJCQludW1fc2l6ZSA9IDE7CisJCWVsc2UgeworCQkJcmV0ID0gTlVMTDsKKwkJCWdv
dG8gUkVUVVJOOworCQl9CisJLyoKKwkgKiBUcnkgdG8gYXZvaWQgZGl2aXNpb24gaGVyZS4gIFdl
IGtub3cgdGhhdCBpdCBpc24ndCBwb3NzaWJsZSB0bworCSAqIG92ZXJmbG93IGR1cmluZyBtdWx0
aXBsaWNhdGlvbiBpZiBuZWl0aGVyIG9wZXJhbmQgdXNlcyBhbnkgb2YgdGhlCisJICogbW9zdCBz
aWduaWZpY2FudCBoYWxmIG9mIHRoZSBiaXRzIGluIGEgc2l6ZV90LgorCSAqLworCX0gZWxzZSBp
ZiAoKChudW0gfCBzaXplKSAmIChTSVpFX1RfTUFYIDw8IChzaXplb2Yoc2l6ZV90KSA8PCAyKSkp
CisJICAgICYmIChudW1fc2l6ZSAvIHNpemUgIT0gbnVtKSkgeworCQkvKiBzaXplX3Qgb3ZlcmZs
b3cuICovCisJCXJldCA9IE5VTEw7CisJCWdvdG8gUkVUVVJOOworCX0KKworCXJldCA9IGljYWxs
b2MobnVtX3NpemUpOworCitSRVRVUk46CisJaWYgKHJldCA9PSBOVUxMKSB7CisJCWlmIChvcHRf
eG1hbGxvYykgeworCQkJX21hbGxvY19tZXNzYWdlKF9nZXRwcm9nbmFtZSgpLAorCQkJICAgICI6
IChtYWxsb2MpIEVycm9yIGluIGNhbGxvYygpOiBvdXQgb2YgbWVtb3J5XG4iLCAiIiwKKwkJCSAg
ICAiIik7CisJCQlhYm9ydCgpOworCQl9CisJCWVycm5vID0gRU5PTUVNOworCX0KKworCVVUUkFD
RSgwLCBudW1fc2l6ZSwgcmV0KTsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3ZvaWQgKgorcmVhbGxv
Yyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldDsKKworCWlmIChzaXplID09
IDApIHsKKwkJaWYgKG9wdF9zeXN2ID09IGZhbHNlKQorCQkJc2l6ZSA9IDE7CisJCWVsc2Ugewor
CQkJaWYgKHB0ciAhPSBOVUxMKQorCQkJCWlkYWxsb2MocHRyKTsKKwkJCXJldCA9IE5VTEw7CisJ
CQlnb3RvIFJFVFVSTjsKKwkJfQorCX0KKworCWlmIChwdHIgIT0gTlVMTCkgeworCQlhc3NlcnQo
bWFsbG9jX2luaXRpYWxpemVkKTsKKworCQlyZXQgPSBpcmFsbG9jKHB0ciwgc2l6ZSk7CisKKwkJ
aWYgKHJldCA9PSBOVUxMKSB7CisJCQlpZiAob3B0X3htYWxsb2MpIHsKKwkJCQlfbWFsbG9jX21l
c3NhZ2UoX2dldHByb2duYW1lKCksCisJCQkJICAgICI6IChtYWxsb2MpIEVycm9yIGluIHJlYWxs
b2MoKTogb3V0IG9mICIKKwkJCQkgICAgIm1lbW9yeVxuIiwgIiIsICIiKTsKKwkJCQlhYm9ydCgp
OworCQkJfQorCQkJZXJybm8gPSBFTk9NRU07CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWFsbG9j
X2luaXQoKSkKKwkJCXJldCA9IE5VTEw7CisJCWVsc2UKKwkJCXJldCA9IGltYWxsb2Moc2l6ZSk7
CisKKwkJaWYgKHJldCA9PSBOVUxMKSB7CisJCQlpZiAob3B0X3htYWxsb2MpIHsKKwkJCQlfbWFs
bG9jX21lc3NhZ2UoX2dldHByb2duYW1lKCksCisJCQkJICAgICI6IChtYWxsb2MpIEVycm9yIGlu
IHJlYWxsb2MoKTogb3V0IG9mICIKKwkJCQkgICAgIm1lbW9yeVxuIiwgIiIsICIiKTsKKwkJCQlh
Ym9ydCgpOworCQkJfQorCQkJZXJybm8gPSBFTk9NRU07CisJCX0KKwl9CisKK1JFVFVSTjoKKwlV
VFJBQ0UocHRyLCBzaXplLCByZXQpOworCXJldHVybiAocmV0KTsKK30KKwordm9pZAorZnJlZSh2
b2lkICpwdHIpCit7CisJVVRSQUNFKHB0ciwgMCwgMCk7CisJaWYgKHB0ciAhPSBOVUxMKSB7CisJ
CWFzc2VydChtYWxsb2NfaW5pdGlhbGl6ZWQpOworCisJCWlkYWxsb2MocHRyKTsKKwl9Cit9CisK
Ky8qCisgKiBFbmQgbWFsbG9jKDMpLWNvbXBhdGlibGUgZnVuY3Rpb25zLgorICovCisvKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqLworLyoKKyAqIEJlZ2luIG5vbi1zdGFuZGFyZCBmdW5jdGlvbnMuCisg
Ki8KKworc2l6ZV90CittYWxsb2NfdXNhYmxlX3NpemUoY29uc3Qgdm9pZCAqcHRyKQoreworCisJ
YXNzZXJ0KHB0ciAhPSBOVUxMKTsKKworCXJldHVybiAoaXNhbGxvYyhwdHIpKTsKK30KKworLyoK
KyAqIEVuZCBub24tc3RhbmRhcmQgZnVuY3Rpb25zLgorICovCisvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqLworLyoKKyAqIEJlZ2luIGxpYnJhcnktcHJpdmF0ZSBmdW5jdGlvbnMuCisgKi8KKworLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBCZWdpbiB0aHJlYWQgY2FjaGUuCisgKi8KKwor
LyoKKyAqIFdlIHByb3ZpZGUgYW4gdW5wdWJsaXNoZWQgaW50ZXJmYWNlIGluIG9yZGVyIHRvIHJl
Y2VpdmUgbm90aWZpY2F0aW9ucyBmcm9tCisgKiB0aGUgcHRocmVhZHMgbGlicmFyeSB3aGVuZXZl
ciBhIHRocmVhZCBleGl0cy4gIFRoaXMgYWxsb3dzIHVzIHRvIGNsZWFuIHVwCisgKiB0aHJlYWQg
Y2FjaGVzLgorICovCit2b2lkCitfbWFsbG9jX3RocmVhZF9jbGVhbnVwKHZvaWQpCit7CisKKyNp
ZmRlZiBNQUxMT0NfTUFHCisJaWYgKG1hZ19yYWNrICE9IE5VTEwpIHsKKwkJYXNzZXJ0KG1hZ19y
YWNrICE9ICh2b2lkICopLTEpOworCQltYWdfcmFja19kZXN0cm95KG1hZ19yYWNrKTsKKyNpZmRl
ZiBNQUxMT0NfREVCVUcKKwkJbWFnX3JhY2sgPSAodm9pZCAqKS0xOworI2VuZGlmCisJfQorI2Vu
ZGlmCit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSB0aHJl
YWRpbmcgbGlicmFyaWVzIGZvciBwcm90ZWN0aW9uIG9mCisgKiBtYWxsb2MgZHVyaW5nIGZvcmso
KS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIHByb2dyYW0gaXMKKyAq
IHJ1bm5pbmcgaW4gdGhyZWFkZWQgbW9kZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB3
aGV0aGVyIHRoZSBwcm9ncmFtCisgKiBpcyB0aHJlYWRlZCBoZXJlLgorICovCisKK3ZvaWQKK19t
YWxsb2NfcHJlZm9yayh2b2lkKQoreworCXVuc2lnbmVkIGk7CisKKwkvKiBBY3F1aXJlIGFsbCBt
dXRleGVzIGluIGEgc2FmZSBvcmRlci4gKi8KKworCW1hbGxvY19zcGluX2xvY2soJmFyZW5hc19s
b2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZW5hczsgaSsrKSB7CisJCWlmIChhcmVuYXNbaV0g
IT0gTlVMTCkKKwkJCW1hbGxvY19zcGluX2xvY2soJmFyZW5hc1tpXS0+bG9jayk7CisJfQorCW1h
bGxvY19zcGluX3VubG9jaygmYXJlbmFzX2xvY2spOworCisJbWFsbG9jX211dGV4X2xvY2soJmJh
c2VfbXR4KTsKKworCW1hbGxvY19tdXRleF9sb2NrKCZodWdlX210eCk7CisKKyNpZmRlZiBNQUxM
T0NfRFNTCisJbWFsbG9jX211dGV4X2xvY2soJmRzc19tdHgpOworI2VuZGlmCit9CisKK3ZvaWQK
K19tYWxsb2NfcG9zdGZvcmsodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogUmVsZWFzZSBh
bGwgbXV0ZXhlcywgbm93IHRoYXQgZm9yaygpIGhhcyBjb21wbGV0ZWQuICovCisKKyNpZmRlZiBN
QUxMT0NfRFNTCisJbWFsbG9jX211dGV4X3VubG9jaygmZHNzX210eCk7CisjZW5kaWYKKworCW1h
bGxvY19tdXRleF91bmxvY2soJmh1Z2VfbXR4KTsKKworCW1hbGxvY19tdXRleF91bmxvY2soJmJh
c2VfbXR4KTsKKworCW1hbGxvY19zcGluX2xvY2soJmFyZW5hc19sb2NrKTsKKwlmb3IgKGkgPSAw
OyBpIDwgbmFyZW5hczsgaSsrKSB7CisJCWlmIChhcmVuYXNbaV0gIT0gTlVMTCkKKwkJCW1hbGxv
Y19zcGluX3VubG9jaygmYXJlbmFzW2ldLT5sb2NrKTsKKwl9CisJbWFsbG9jX3NwaW5fdW5sb2Nr
KCZhcmVuYXNfbG9jayk7Cit9CisKKy8qCisgKiBFbmQgbGlicmFyeS1wcml2YXRlIGZ1bmN0aW9u
cy4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23978</attachid>
            <date>2008-10-01 03:28:33 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>rb.h (red-black tree for JEmalloc)</desc>
            <filename>rb.h.patch</filename>
            <type>text/plain</type>
            <size>37969</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9yYi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRD
b3JlL3d0Zi9yYi5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3JiLmgJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsOTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEphc29uIEV2YW5zIDxqYXNvbmVARnJlZUJTRC5vcmc+Lgor
ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UocyksIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgIHVubW9kaWZpZWQg
b3RoZXIgdGhhbiB0aGUgYWxsb3dhYmxlIGFkZGl0aW9uIG9mIG9uZSBvciBtb3JlCisgKiAgICBj
b3B5cmlnaHQgbm90aWNlcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UocyksIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAg
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjcHAgbWFjcm8gaW1wbGVt
ZW50YXRpb24gb2YgbGVmdC1sZWFuaW5nIHJlZC1ibGFjayB0cmVlcy4KKyAqCisgKiBVc2FnZToK
KyAqCisgKiAgIChPcHRpb25hbCwgc2VlIGFzc2VydCgzKS4pCisgKiAgICNkZWZpbmUgTkRFQlVH
CisgKgorICogICAoUmVxdWlyZWQuKQorICogICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgKiAgICNp
bmNsdWRlIDxyYi5oPgorICogICAuLi4KKyAqCisgKiBBbGwgb3BlcmF0aW9ucyBhcmUgZG9uZSBu
b24tcmVjdXJzaXZlbHkuICBQYXJlbnQgcG9pbnRlcnMgYXJlIG5vdCB1c2VkLCBhbmQKKyAqIGNv
bG9yIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHJpZ2h0
LWNoaWxkIHBvaW50ZXJzLAorICogdGh1cyBtYWtpbmcgbm9kZSBsaW5rYWdlIGFzIGNvbXBhY3Qg
YXMgaXMgcG9zc2libGUgZm9yIHJlZC1ibGFjayB0cmVlcy4KKyAqCisgKiBTb21lIG1hY3JvcyB1
c2UgYSBjb21wYXJpc29uIGZ1bmN0aW9uIHBvaW50ZXIsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGhh
dmUgdGhlCisgKiBmb2xsb3dpbmcgcHJvdG90eXBlOgorICoKKyAqICAgaW50IChhX2NtcCAqKShh
X3R5cGUgKmFfbm9kZSwgYV90eXBlICphX290aGVyKTsKKyAqICAgICAgICAgICAgICAgICAgICAg
ICAgIF5eXl5eXgorICogICAgICAgICAgICAgICAgICAgICAgb3IgYV9rZXkKKyAqCisgKiBJbnRl
cnByZXRhdGlvbiBvZiBjb21wYXJpc2lvbiBmdW5jdGlvbiByZXR1cm4gdmFsdWVzOgorICoKKyAq
ICAgLTEgOiBhX25vZGUgPCAgYV9vdGhlcgorICogICAgMCA6IGFfbm9kZSA9PSBhX290aGVyCisg
KiAgICAxIDogYV9ub2RlID4gIGFfb3RoZXIKKyAqCisgKiBJbiBhbGwgY2FzZXMsIHRoZSBhX25v
ZGUgb3IgYV9rZXkgbWFjcm8gYXJndW1lbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQor
ICogY29tcGFyaXNvbiBmdW5jdGlvbiwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gd3JpdGUg
Y29tcGFyaXNvbiBmdW5jdGlvbnMKKyAqIHRoYXQgdHJlYXQgdGhlIGZpcnN0IGFyZ3VtZW50IHNw
ZWNpYWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFJCX0hfCisj
ZGVmaW5lCVJCX0hfCisKKy8vX19GQlNESUQoIiRGcmVlQlNEOiBoZWFkL2xpYi9saWJjL3N0ZGxp
Yi9yYi5oIDE3ODk5NSAyMDA4LTA1LTE0IDE4OjMzOjEzWiBqYXNvbmUgJCIpOworCisvKiBOb2Rl
IHN0cnVjdHVyZS4gKi8KKyNkZWZpbmUJcmJfbm9kZShhX3R5cGUpCQkJCQkJCVwKK3N0cnVjdCB7
CQkJCQkJCQlcCisgICAgYV90eXBlICpyYm5fbGVmdDsJCQkJCQkJXAorICAgIGFfdHlwZSAqcmJu
X3JpZ2h0X3JlZDsJCQkJCQlcCit9CisKKy8qIFJvb3Qgc3RydWN0dXJlLiAqLworI2RlZmluZQly
Yl90cmVlKGFfdHlwZSkJCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKyAgICBhX3R5cGUgKnJi
dF9yb290OwkJCQkJCQlcCisgICAgYV90eXBlIHJidF9uaWw7CQkJCQkJCVwKK30KKworLyogTGVm
dCBhY2Nlc3NvcnMuICovCisjZGVmaW5lCXJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIGFf
bm9kZSkJCQkJXAorICAgICgoYV9ub2RlKS0+YV9maWVsZC5yYm5fbGVmdCkKKyNkZWZpbmUJcmJw
X2xlZnRfc2V0KGFfdHlwZSwgYV9maWVsZCwgYV9ub2RlLCBhX2xlZnQpIGRvIHsJCVwKKyAgICAo
YV9ub2RlKS0+YV9maWVsZC5yYm5fbGVmdCA9IGFfbGVmdDsJCQkJXAorfSB3aGlsZSAoMCkKKwor
LyogUmlnaHQgYWNjZXNzb3JzLiAqLworI2RlZmluZQlyYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9m
aWVsZCwgYV9ub2RlKQkJCQlcCisgICAgKChhX3R5cGUgKikgKCgoaW50cHRyX3QpIChhX25vZGUp
LT5hX2ZpZWxkLnJibl9yaWdodF9yZWQpCQlcCisgICAgICAmICgoc3NpemVfdCktMikpKQorI2Rl
ZmluZQlyYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9maWVsZCwgYV9ub2RlLCBhX3JpZ2h0KSBkbyB7
CQlcCisgICAgKGFfbm9kZSktPmFfZmllbGQucmJuX3JpZ2h0X3JlZCA9IChhX3R5cGUgKikgKCgo
dWludHB0cl90KSBhX3JpZ2h0KQlcCisgICAgICB8ICgoKHVpbnRwdHJfdCkgKGFfbm9kZSktPmFf
ZmllbGQucmJuX3JpZ2h0X3JlZCkgJiAoKHNpemVfdCkxKSkpOwlcCit9IHdoaWxlICgwKQorCisv
KiBDb2xvciBhY2Nlc3NvcnMuICovCisjZGVmaW5lCXJicF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVs
ZCwgYV9ub2RlKQkJCQlcCisgICAgKChib29sKSAoKCh1aW50cHRyX3QpIChhX25vZGUpLT5hX2Zp
ZWxkLnJibl9yaWdodF9yZWQpCQlcCisgICAgICAmICgoc2l6ZV90KTEpKSkKKyNkZWZpbmUJcmJw
X2NvbG9yX3NldChhX3R5cGUsIGFfZmllbGQsIGFfbm9kZSwgYV9yZWQpIGRvIHsJCVwKKyAgICAo
YV9ub2RlKS0+YV9maWVsZC5yYm5fcmlnaHRfcmVkID0gKGFfdHlwZSAqKSAoKCgoaW50cHRyX3Qp
CQlcCisgICAgICAoYV9ub2RlKS0+YV9maWVsZC5yYm5fcmlnaHRfcmVkKSAmICgoc3NpemVfdCkt
MikpCQkJXAorICAgICAgfCAoKHNzaXplX3QpYV9yZWQpKTsJCQkJCQlcCit9IHdoaWxlICgwKQor
I2RlZmluZQlyYnBfcmVkX3NldChhX3R5cGUsIGFfZmllbGQsIGFfbm9kZSkgZG8gewkJCVwKKyAg
ICAoYV9ub2RlKS0+YV9maWVsZC5yYm5fcmlnaHRfcmVkID0gKGFfdHlwZSAqKSAoKCh1aW50cHRy
X3QpCQlcCisgICAgICAoYV9ub2RlKS0+YV9maWVsZC5yYm5fcmlnaHRfcmVkKSB8ICgoc2l6ZV90
KTEpKTsJCQlcCit9IHdoaWxlICgwKQorI2RlZmluZQlyYnBfYmxhY2tfc2V0KGFfdHlwZSwgYV9m
aWVsZCwgYV9ub2RlKSBkbyB7CQkJXAorICAgIChhX25vZGUpLT5hX2ZpZWxkLnJibl9yaWdodF9y
ZWQgPSAoYV90eXBlICopICgoKGludHB0cl90KQkJXAorICAgICAgKGFfbm9kZSktPmFfZmllbGQu
cmJuX3JpZ2h0X3JlZCkgJiAoKHNzaXplX3QpLTIpKTsJCVwKK30gd2hpbGUgKDApCisKKy8qIE5v
ZGUgaW5pdGlhbGl6ZXIuICovCisjZGVmaW5lCXJicF9ub2RlX25ldyhhX3R5cGUsIGFfZmllbGQs
IGFfdHJlZSwgYV9ub2RlKSBkbyB7CQlcCisgICAgcmJwX2xlZnRfc2V0KGFfdHlwZSwgYV9maWVs
ZCwgKGFfbm9kZSksICYoYV90cmVlKS0+cmJ0X25pbCk7CVwKKyAgICByYnBfcmlnaHRfc2V0KGFf
dHlwZSwgYV9maWVsZCwgKGFfbm9kZSksICYoYV90cmVlKS0+cmJ0X25pbCk7CVwKKyAgICByYnBf
cmVkX3NldChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpKTsJCQkJXAorfSB3aGlsZSAoMCkKKwor
LyogVHJlZSBpbml0aWFsaXplci4gKi8KKyNkZWZpbmUJcmJfbmV3KGFfdHlwZSwgYV9maWVsZCwg
YV90cmVlKSBkbyB7CQkJCVwKKyAgICAoYV90cmVlKS0+cmJ0X3Jvb3QgPSAmKGFfdHJlZSktPnJi
dF9uaWw7CQkJCVwKKyAgICByYnBfbm9kZV9uZXcoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsICYo
YV90cmVlKS0+cmJ0X25pbCk7CQlcCisgICAgcmJwX2JsYWNrX3NldChhX3R5cGUsIGFfZmllbGQs
ICYoYV90cmVlKS0+cmJ0X25pbCk7CQkJXAorfSB3aGlsZSAoMCkKKworLyogVHJlZSBvcGVyYXRp
b25zLiAqLworI2RlZmluZQlyYnBfYmxhY2tfaGVpZ2h0KGFfdHlwZSwgYV9maWVsZCwgYV90cmVl
LCByX2hlaWdodCkgZG8gewlcCisgICAgYV90eXBlICpyYnBfYmhfdDsJCQkJCQkJXAorICAgIGZv
ciAocmJwX2JoX3QgPSAoYV90cmVlKS0+cmJ0X3Jvb3QsIChyX2hlaWdodCkgPSAwOwkJCVwKKyAg
ICAgIHJicF9iaF90ICE9ICYoYV90cmVlKS0+cmJ0X25pbDsJCQkJCVwKKyAgICAgIHJicF9iaF90
ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2JoX3QpKSB7CQlcCisJaWYgKHJi
cF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2JoX3QpID09IGZhbHNlKSB7CQlcCisJICAg
IChyX2hlaWdodCkrKzsJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdo
aWxlICgwKQorCisjZGVmaW5lCXJicF9maXJzdChhX3R5cGUsIGFfZmllbGQsIGFfdHJlZSwgYV9y
b290LCByX25vZGUpIGRvIHsJCVwKKyAgICBmb3IgKChyX25vZGUpID0gKGFfcm9vdCk7CQkJCQkJ
XAorICAgICAgcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgKHJfbm9kZSkpICE9ICYoYV90
cmVlKS0+cmJ0X25pbDsJXAorICAgICAgKHJfbm9kZSkgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBh
X2ZpZWxkLCAocl9ub2RlKSkpIHsJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKwor
I2RlZmluZQlyYnBfbGFzdChhX3R5cGUsIGFfZmllbGQsIGFfdHJlZSwgYV9yb290LCByX25vZGUp
IGRvIHsJCVwKKyAgICBmb3IgKChyX25vZGUpID0gKGFfcm9vdCk7CQkJCQkJXAorICAgICAgcmJw
X3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIChyX25vZGUpKSAhPSAmKGFfdHJlZSktPnJidF9u
aWw7CVwKKyAgICAgIChyX25vZGUpID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIChy
X25vZGUpKSkgewkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCXJi
cF9uZXh0KGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIGFfdHJlZSwgYV9ub2RlLCByX25vZGUpIGRv
IHsJXAorICAgIGlmIChyYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSkpCQkJ
XAorICAgICAgIT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CQkJCQkJXAorCXJicF9maXJzdChhX3R5
cGUsIGFfZmllbGQsIGFfdHJlZSwgcmJwX3JpZ2h0X2dldChhX3R5cGUsCVwKKwkgIGFfZmllbGQs
IChhX25vZGUpKSwgKHJfbm9kZSkpOwkJCQlcCisgICAgfSBlbHNlIHsJCQkJCQkJCVwKKwlhX3R5
cGUgKnJicF9uX3QgPSAoYV90cmVlKS0+cmJ0X3Jvb3Q7CQkJCVwKKwlhc3NlcnQocmJwX25fdCAh
PSAmKGFfdHJlZSktPnJidF9uaWwpOwkJCQlcCisJKHJfbm9kZSkgPSAmKGFfdHJlZSktPnJidF9u
aWw7CQkJCQlcCisJd2hpbGUgKHRydWUpIHsJCQkJCQkJXAorCSAgICBpbnQgcmJwX25fY21wID0g
KGFfY21wKSgoYV9ub2RlKSwgcmJwX25fdCk7CQkJXAorCSAgICBpZiAocmJwX25fY21wIDwgMCkg
ewkJCQkJXAorCQkocl9ub2RlKSA9IHJicF9uX3Q7CQkJCQlcCisJCXJicF9uX3QgPSByYnBfbGVm
dF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbl90KTsJXAorCSAgICB9IGVsc2UgaWYgKHJicF9u
X2NtcCA+IDApIHsJCQkJCVwKKwkJcmJwX25fdCA9IHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2Zp
ZWxkLCByYnBfbl90KTsJXAorCSAgICB9IGVsc2UgewkJCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlc
CisJICAgIH0JCQkJCQkJCVwKKwkgICAgYXNzZXJ0KHJicF9uX3QgIT0gJihhX3RyZWUpLT5yYnRf
bmlsKTsJCQlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisj
ZGVmaW5lCXJicF9wcmV2KGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIGFfdHJlZSwgYV9ub2RlLCBy
X25vZGUpIGRvIHsJXAorICAgIGlmIChyYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9u
b2RlKSkgIT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7XAorCXJicF9sYXN0KGFfdHlwZSwgYV9maWVs
ZCwgYV90cmVlLCByYnBfbGVmdF9nZXQoYV90eXBlLAkJXAorCSAgYV9maWVsZCwgKGFfbm9kZSkp
LCAocl9ub2RlKSk7CQkJCVwKKyAgICB9IGVsc2UgewkJCQkJCQkJXAorCWFfdHlwZSAqcmJwX3Bf
dCA9IChhX3RyZWUpLT5yYnRfcm9vdDsJCQkJXAorCWFzc2VydChyYnBfcF90ICE9ICYoYV90cmVl
KS0+cmJ0X25pbCk7CQkJCVwKKwkocl9ub2RlKSA9ICYoYV90cmVlKS0+cmJ0X25pbDsJCQkJCVwK
Kwl3aGlsZSAodHJ1ZSkgewkJCQkJCQlcCisJICAgIGludCByYnBfcF9jbXAgPSAoYV9jbXApKChh
X25vZGUpLCByYnBfcF90KTsJCQlcCisJICAgIGlmIChyYnBfcF9jbXAgPCAwKSB7CQkJCQlcCisJ
CXJicF9wX3QgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcF90KTsJXAorCSAg
ICB9IGVsc2UgaWYgKHJicF9wX2NtcCA+IDApIHsJCQkJCVwKKwkJKHJfbm9kZSkgPSByYnBfcF90
OwkJCQkJXAorCQlyYnBfcF90ID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9w
X3QpOwlcCisJICAgIH0gZWxzZSB7CQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkgICAgfQkJ
CQkJCQkJXAorCSAgICBhc3NlcnQocmJwX3BfdCAhPSAmKGFfdHJlZSktPnJidF9uaWwpOwkJCVwK
Kwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJcmJf
Zmlyc3QoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsIHJfbm9kZSkgZG8gewkJCVwKKyAgICByYnBf
Zmlyc3QoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsIChhX3RyZWUpLT5yYnRfcm9vdCwgKHJfbm9k
ZSkpOwlcCisgICAgaWYgKChyX25vZGUpID09ICYoYV90cmVlKS0+cmJ0X25pbCkgewkJCQlcCisJ
KHJfbm9kZSkgPSBOVUxMOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKwor
I2RlZmluZQlyYl9sYXN0KGFfdHlwZSwgYV9maWVsZCwgYV90cmVlLCByX25vZGUpIGRvIHsJCQlc
CisgICAgcmJwX2xhc3QoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsIChhX3RyZWUpLT5yYnRfcm9v
dCwgcl9ub2RlKTsJXAorICAgIGlmICgocl9ub2RlKSA9PSAmKGFfdHJlZSktPnJidF9uaWwpIHsJ
CQkJXAorCShyX25vZGUpID0gTlVMTDsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUg
KDApCisKKyNkZWZpbmUJcmJfbmV4dChhX3R5cGUsIGFfZmllbGQsIGFfY21wLCBhX3RyZWUsIGFf
bm9kZSwgcl9ub2RlKSBkbyB7CVwKKyAgICByYnBfbmV4dChhX3R5cGUsIGFfZmllbGQsIGFfY21w
LCBhX3RyZWUsIChhX25vZGUpLCAocl9ub2RlKSk7CVwKKyAgICBpZiAoKHJfbm9kZSkgPT0gJihh
X3RyZWUpLT5yYnRfbmlsKSB7CQkJCVwKKwkocl9ub2RlKSA9IE5VTEw7CQkJCQkJXAorICAgIH0J
CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCXJiX3ByZXYoYV90eXBlLCBhX2ZpZWxk
LCBhX2NtcCwgYV90cmVlLCBhX25vZGUsIHJfbm9kZSkgZG8gewlcCisgICAgcmJwX3ByZXYoYV90
eXBlLCBhX2ZpZWxkLCBhX2NtcCwgYV90cmVlLCAoYV9ub2RlKSwgKHJfbm9kZSkpOwlcCisgICAg
aWYgKChyX25vZGUpID09ICYoYV90cmVlKS0+cmJ0X25pbCkgewkJCQlcCisJKHJfbm9kZSkgPSBO
VUxMOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlyYl9z
ZWFyY2goYV90eXBlLCBhX2ZpZWxkLCBhX2NtcCwgYV90cmVlLCBhX2tleSwgcl9ub2RlKSBkbyB7
CVwKKyAgICBpbnQgcmJwX3NlX2NtcDsJCQkJCQkJXAorICAgIChyX25vZGUpID0gKGFfdHJlZSkt
PnJidF9yb290OwkJCQkJXAorICAgIHdoaWxlICgocl9ub2RlKSAhPSAmKGFfdHJlZSktPnJidF9u
aWwJCQkJXAorICAgICAgJiYgKHJicF9zZV9jbXAgPSAoYV9jbXApKChhX2tleSksIChyX25vZGUp
KSkgIT0gMCkgewkJXAorCWlmIChyYnBfc2VfY21wIDwgMCkgewkJCQkJCVwKKwkgICAgKHJfbm9k
ZSkgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAocl9ub2RlKSk7CQlcCisJfSBlbHNl
IHsJCQkJCQkJXAorCSAgICAocl9ub2RlKSA9IHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxk
LCAocl9ub2RlKSk7CVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICBpZiAoKHJf
bm9kZSkgPT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CQkJCVwKKwkocl9ub2RlKSA9IE5VTEw7CQkJ
CQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogRmluZCBhIG1hdGNo
IGlmIGl0IGV4aXN0cy4gIE90aGVyd2lzZSwgZmluZCB0aGUgbmV4dCBncmVhdGVyIG5vZGUsIGlm
IG9uZQorICogZXhpc3RzLgorICovCisjZGVmaW5lCXJiX25zZWFyY2goYV90eXBlLCBhX2ZpZWxk
LCBhX2NtcCwgYV90cmVlLCBhX2tleSwgcl9ub2RlKSBkbyB7CVwKKyAgICBhX3R5cGUgKnJicF9u
c190ID0gKGFfdHJlZSktPnJidF9yb290OwkJCQlcCisgICAgKHJfbm9kZSkgPSBOVUxMOwkJCQkJ
CQlcCisgICAgd2hpbGUgKHJicF9uc190ICE9ICYoYV90cmVlKS0+cmJ0X25pbCkgewkJCQlcCisJ
aW50IHJicF9uc19jbXAgPSAoYV9jbXApKChhX2tleSksIHJicF9uc190KTsJCQlcCisJaWYgKHJi
cF9uc19jbXAgPCAwKSB7CQkJCQkJXAorCSAgICAocl9ub2RlKSA9IHJicF9uc190OwkJCQkJXAor
CSAgICByYnBfbnNfdCA9IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9uc190KTsJ
CVwKKwl9IGVsc2UgaWYgKHJicF9uc19jbXAgPiAwKSB7CQkJCQlcCisJICAgIHJicF9uc190ID0g
cmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9uc190KTsJXAorCX0gZWxzZSB7CQkJ
CQkJCVwKKwkgICAgKHJfbm9kZSkgPSByYnBfbnNfdDsJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJ
CVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBG
aW5kIGEgbWF0Y2ggaWYgaXQgZXhpc3RzLiAgT3RoZXJ3aXNlLCBmaW5kIHRoZSBwcmV2aW91cyBs
ZXNzZXIgbm9kZSwgaWYgb25lCisgKiBleGlzdHMuCisgKi8KKyNkZWZpbmUJcmJfcHNlYXJjaChh
X3R5cGUsIGFfZmllbGQsIGFfY21wLCBhX3RyZWUsIGFfa2V5LCByX25vZGUpIGRvIHsJXAorICAg
IGFfdHlwZSAqcmJwX3BzX3QgPSAoYV90cmVlKS0+cmJ0X3Jvb3Q7CQkJCVwKKyAgICAocl9ub2Rl
KSA9IE5VTEw7CQkJCQkJCVwKKyAgICB3aGlsZSAocmJwX3BzX3QgIT0gJihhX3RyZWUpLT5yYnRf
bmlsKSB7CQkJCVwKKwlpbnQgcmJwX3BzX2NtcCA9IChhX2NtcCkoKGFfa2V5KSwgcmJwX3BzX3Qp
OwkJCVwKKwlpZiAocmJwX3BzX2NtcCA8IDApIHsJCQkJCQlcCisJICAgIHJicF9wc190ID0gcmJw
X2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3BzX3QpOwkJXAorCX0gZWxzZSBpZiAocmJw
X3BzX2NtcCA+IDApIHsJCQkJCVwKKwkgICAgKHJfbm9kZSkgPSByYnBfcHNfdDsJCQkJCVwKKwkg
ICAgcmJwX3BzX3QgPSByYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3BzX3QpOwlc
CisJfSBlbHNlIHsJCQkJCQkJXAorCSAgICAocl9ub2RlKSA9IHJicF9wc190OwkJCQkJXAorCSAg
ICBicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAo
MCkKKworI2RlZmluZQlyYnBfcm90YXRlX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCBhX25vZGUsIHJf
bm9kZSkgZG8gewkJXAorICAgIChyX25vZGUpID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmll
bGQsIChhX25vZGUpKTsJCVwKKyAgICByYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9maWVsZCwgKGFf
bm9kZSksCQkJCVwKKyAgICAgIHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIChyX25vZGUp
KSk7CQkJCVwKKyAgICByYnBfbGVmdF9zZXQoYV90eXBlLCBhX2ZpZWxkLCAocl9ub2RlKSwgKGFf
bm9kZSkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJcmJwX3JvdGF0ZV9yaWdodChhX3R5
cGUsIGFfZmllbGQsIGFfbm9kZSwgcl9ub2RlKSBkbyB7CQlcCisgICAgKHJfbm9kZSkgPSByYnBf
bGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSk7CQkJXAorICAgIHJicF9sZWZ0X3Nl
dChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpLAkJCQlcCisgICAgICByYnBfcmlnaHRfZ2V0KGFf
dHlwZSwgYV9maWVsZCwgKHJfbm9kZSkpKTsJCQlcCisgICAgcmJwX3JpZ2h0X3NldChhX3R5cGUs
IGFfZmllbGQsIChyX25vZGUpLCAoYV9ub2RlKSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmlu
ZQlyYnBfbGVhbl9sZWZ0KGFfdHlwZSwgYV9maWVsZCwgYV9ub2RlLCByX25vZGUpIGRvIHsJCVwK
KyAgICBib29sIHJicF9sbF9yZWQ7CQkJCQkJCVwKKyAgICByYnBfcm90YXRlX2xlZnQoYV90eXBl
LCBhX2ZpZWxkLCAoYV9ub2RlKSwgKHJfbm9kZSkpOwkJXAorICAgIHJicF9sbF9yZWQgPSByYnBf
cmVkX2dldChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpKTsJCVwKKyAgICByYnBfY29sb3Jfc2V0
KGFfdHlwZSwgYV9maWVsZCwgKHJfbm9kZSksIHJicF9sbF9yZWQpOwkJXAorICAgIHJicF9yZWRf
c2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSkpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm
aW5lCXJicF9sZWFuX3JpZ2h0KGFfdHlwZSwgYV9maWVsZCwgYV9ub2RlLCByX25vZGUpIGRvIHsJ
CVwKKyAgICBib29sIHJicF9scl9yZWQ7CQkJCQkJCVwKKyAgICByYnBfcm90YXRlX3JpZ2h0KGFf
dHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIChyX25vZGUpKTsJCVwKKyAgICByYnBfbHJfcmVkID0g
cmJwX3JlZF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSk7CQlcCisgICAgcmJwX2NvbG9y
X3NldChhX3R5cGUsIGFfZmllbGQsIChyX25vZGUpLCByYnBfbHJfcmVkKTsJCVwKKyAgICByYnBf
cmVkX3NldChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpKTsJCQkJXAorfSB3aGlsZSAoMCkKKwor
I2RlZmluZQlyYnBfbW92ZV9yZWRfbGVmdChhX3R5cGUsIGFfZmllbGQsIGFfbm9kZSwgcl9ub2Rl
KSBkbyB7CQlcCisgICAgYV90eXBlICpyYnBfbXJsX3QsICpyYnBfbXJsX3U7CQkJCQlcCisgICAg
cmJwX21ybF90ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSkpOwkJXAor
ICAgIHJicF9yZWRfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX21ybF90KTsJCQkJXAorICAgIHJi
cF9tcmxfdCA9IHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSk7CQlcCisg
ICAgcmJwX21ybF91ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX21ybF90KTsJ
CVwKKyAgICBpZiAocmJwX3JlZF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJsX3UpKSB7CQkJ
XAorCXJicF9yb3RhdGVfcmlnaHQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJsX3QsIHJicF9tcmxf
dSk7CVwKKwlyYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIHJicF9tcmxf
dSk7CQlcCisJcmJwX3JvdGF0ZV9sZWZ0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIChyX25v
ZGUpKTsJCVwKKwlyYnBfbXJsX3QgPSByYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgKGFf
bm9kZSkpOwkJXAorCWlmIChyYnBfcmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9tcmxfdCkp
IHsJCQlcCisJICAgIHJicF9ibGFja19zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJsX3QpOwkJ
CVwKKwkgICAgcmJwX3JlZF9zZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSk7CQkJXAorCSAg
ICByYnBfcm90YXRlX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSwgcmJwX21ybF90KTsJ
XAorCSAgICByYnBfbGVmdF9zZXQoYV90eXBlLCBhX2ZpZWxkLCAocl9ub2RlKSwgcmJwX21ybF90
KTsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJICAgIHJicF9ibGFja19zZXQoYV90eXBlLCBhX2Zp
ZWxkLCAoYV9ub2RlKSk7CQkJXAorCX0JCQkJCQkJCVwKKyAgICB9IGVsc2UgewkJCQkJCQkJXAor
CXJicF9yZWRfc2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSkpOwkJCQlcCisJcmJwX3JvdGF0
ZV9sZWZ0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIChyX25vZGUpKTsJCVwKKyAgICB9CQkJ
CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlyYnBfbW92ZV9yZWRfcmlnaHQoYV90eXBl
LCBhX2ZpZWxkLCBhX25vZGUsIHJfbm9kZSkgZG8gewlcCisgICAgYV90eXBlICpyYnBfbXJyX3Q7
CQkJCQkJCVwKKyAgICByYnBfbXJyX3QgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAo
YV9ub2RlKSk7CQlcCisgICAgaWYgKHJicF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX21y
cl90KSkgewkJCVwKKwlhX3R5cGUgKnJicF9tcnJfdSwgKnJicF9tcnJfdjsJCQkJCVwKKwlyYnBf
bXJyX3UgPSByYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX21ycl90KTsJCVwKKwly
YnBfbXJyX3YgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3UpOwkJXAor
CWlmIChyYnBfcmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9tcnJfdikpIHsJCQlcCisJICAg
IHJicF9jb2xvcl9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3UsCQkJXAorCSAgICAgIHJi
cF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSkpKTsJCQlcCisJICAgIHJicF9ibGFj
a19zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3YpOwkJCVwKKwkgICAgcmJwX3JvdGF0ZV9s
ZWZ0KGFfdHlwZSwgYV9maWVsZCwgcmJwX21ycl90LCByYnBfbXJyX3UpOwlcCisJICAgIHJicF9s
ZWZ0X3NldChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpLCByYnBfbXJyX3UpOwkJXAorCSAgICBy
YnBfcm90YXRlX3JpZ2h0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIChyX25vZGUpKTsJXAor
CSAgICByYnBfcm90YXRlX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSwgcmJwX21ycl90
KTsJXAorCSAgICByYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9maWVsZCwgKHJfbm9kZSksIHJicF9t
cnJfdCk7CVwKKwl9IGVsc2UgewkJCQkJCQlcCisJICAgIHJicF9jb2xvcl9zZXQoYV90eXBlLCBh
X2ZpZWxkLCByYnBfbXJyX3QsCQkJXAorCSAgICAgIHJicF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVs
ZCwgKGFfbm9kZSkpKTsJCQlcCisJICAgIHJicF9yZWRfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJw
X21ycl91KTsJCQlcCisJICAgIHJicF9yb3RhdGVfcmlnaHQoYV90eXBlLCBhX2ZpZWxkLCAoYV9u
b2RlKSwgKHJfbm9kZSkpOwlcCisJICAgIHJicF9yb3RhdGVfbGVmdChhX3R5cGUsIGFfZmllbGQs
IChhX25vZGUpLCByYnBfbXJyX3QpOwlcCisJICAgIHJicF9yaWdodF9zZXQoYV90eXBlLCBhX2Zp
ZWxkLCAocl9ub2RlKSwgcmJwX21ycl90KTsJXAorCX0JCQkJCQkJCVwKKwlyYnBfcmVkX3NldChh
X3R5cGUsIGFfZmllbGQsIChhX25vZGUpKTsJCQkJXAorICAgIH0gZWxzZSB7CQkJCQkJCQlcCisJ
cmJwX3JlZF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3QpOwkJCVwKKwlyYnBfbXJyX3Qg
PSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3QpOwkJXAorCWlmIChyYnBf
cmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9tcnJfdCkpIHsJCQlcCisJICAgIHJicF9ibGFj
a19zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfbXJyX3QpOwkJCVwKKwkgICAgcmJwX3JvdGF0ZV9y
aWdodChhX3R5cGUsIGFfZmllbGQsIChhX25vZGUpLCAocl9ub2RlKSk7CVwKKwkgICAgcmJwX3Jv
dGF0ZV9sZWZ0KGFfdHlwZSwgYV9maWVsZCwgKGFfbm9kZSksIHJicF9tcnJfdCk7CVwKKwkgICAg
cmJwX3JpZ2h0X3NldChhX3R5cGUsIGFfZmllbGQsIChyX25vZGUpLCByYnBfbXJyX3QpOwlcCisJ
fSBlbHNlIHsJCQkJCQkJXAorCSAgICByYnBfcm90YXRlX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCAo
YV9ub2RlKSwgKHJfbm9kZSkpOwlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdo
aWxlICgwKQorCisjZGVmaW5lCXJiX2luc2VydChhX3R5cGUsIGFfZmllbGQsIGFfY21wLCBhX3Ry
ZWUsIGFfbm9kZSkgZG8gewkJXAorICAgIGFfdHlwZSByYnBfaV9zOwkJCQkJCQlcCisgICAgYV90
eXBlICpyYnBfaV9nLCAqcmJwX2lfcCwgKnJicF9pX2MsICpyYnBfaV90LCAqcmJwX2lfdTsJCVwK
KyAgICBpbnQgcmJwX2lfY21wID0gMDsJCQkJCQkJXAorICAgIHJicF9pX2cgPSAmKGFfdHJlZSkt
PnJidF9uaWw7CQkJCQlcCisgICAgcmJwX2xlZnRfc2V0KGFfdHlwZSwgYV9maWVsZCwgJnJicF9p
X3MsIChhX3RyZWUpLT5yYnRfcm9vdCk7CVwKKyAgICByYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9m
aWVsZCwgJnJicF9pX3MsICYoYV90cmVlKS0+cmJ0X25pbCk7CVwKKyAgICByYnBfYmxhY2tfc2V0
KGFfdHlwZSwgYV9maWVsZCwgJnJicF9pX3MpOwkJCQlcCisgICAgcmJwX2lfcCA9ICZyYnBfaV9z
OwkJCQkJCQlcCisgICAgcmJwX2lfYyA9IChhX3RyZWUpLT5yYnRfcm9vdDsJCQkJCVwKKyAgICAv
KiBJdGVyYXRpdmVseSBzZWFyY2ggZG93biB0aGUgdHJlZSBmb3IgdGhlIGluc2VydGlvbiBwb2lu
dCwgICAgICAqL1wKKyAgICAvKiBzcGxpdHRpbmcgNC1ub2RlcyBhcyB0aGV5IGFyZSBlbmNvdW50
ZXJlZC4gIEF0IHRoZSBlbmQgb2YgZWFjaCAqL1wKKyAgICAvKiBpdGVyYXRpb24sIHJicF9pX2ct
PnJicF9pX3AtPnJicF9pX2MgaXMgYSAzLWxldmVsIHBhdGggZG93biAgICAqL1wKKyAgICAvKiB0
aGUgdHJlZSwgYXNzdW1pbmcgYSBzdWZmaWNpZW50bHkgZGVlcCB0cmVlLiAgICAgICAgICAgICAg
ICAgICAqL1wKKyAgICB3aGlsZSAocmJwX2lfYyAhPSAmKGFfdHJlZSktPnJidF9uaWwpIHsJCQkJ
XAorCXJicF9pX3QgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfaV9jKTsJCVwK
KwlyYnBfaV91ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfdCk7CQlcCisJ
aWYgKHJicF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfdCkJCQlcCisJICAmJiByYnBf
cmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9pX3UpKSB7CQkJXAorCSAgICAvKiByYnBfaV9j
IGlzIHRoZSB0b3Agb2YgYSBsb2dpY2FsIDQtbm9kZSwgc28gc3BsaXQgaXQuICAgKi9cCisJICAg
IC8qIFRoaXMgaXRlcmF0aW9uIGRvZXMgbm90IG1vdmUgZG93biB0aGUgdHJlZSwgZHVlIHRvIHRo
ZSAqL1wKKwkgICAgLyogZGlzcnVwdGl2ZW5lc3Mgb2Ygbm9kZSBzcGxpdHRpbmcuICAgICAgICAg
ICAgICAgICAgICAgICovXAorCSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKi9cCisJICAgIC8qIFJvdGF0ZSByaWdodC4gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1wKKwkgICAgcmJwX3JvdGF0ZV9y
aWdodChhX3R5cGUsIGFfZmllbGQsIHJicF9pX2MsIHJicF9pX3QpOwlcCisJICAgIC8qIFBhc3Mg
cmVkIGxpbmtzIHVwIG9uZSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqL1wKKwkg
ICAgcmJwX2lfdSA9IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9pX3QpOwkJXAor
CSAgICByYnBfYmxhY2tfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfdSk7CQkJXAorCSAgICBp
ZiAocmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfcCkgPT0gcmJwX2lfYykgewlc
CisJCXJicF9sZWZ0X3NldChhX3R5cGUsIGFfZmllbGQsIHJicF9pX3AsIHJicF9pX3QpOwlcCisJ
CXJicF9pX2MgPSByYnBfaV90OwkJCQkJXAorCSAgICB9IGVsc2UgewkJCQkJCQlcCisJCS8qIHJi
cF9pX2Mgd2FzIHRoZSByaWdodCBjaGlsZCBvZiByYnBfaV9wLCBzbyByb3RhdGUgICovXAorCQkv
KiBsZWZ0IGluIG9yZGVyIHRvIG1haW50YWluIHRoZSBsZWZ0LWxlYW5pbmcgICAgICAgICAqL1wK
KwkJLyogaW52YXJpYW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ki9cCisJCWFzc2VydChyYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfcCkJCVwK
KwkJICA9PSByYnBfaV9jKTsJCQkJCQlcCisJCXJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxk
LCByYnBfaV9wLCByYnBfaV90KTsJXAorCQlyYnBfbGVhbl9sZWZ0KGFfdHlwZSwgYV9maWVsZCwg
cmJwX2lfcCwgcmJwX2lfdSk7CVwKKwkJaWYgKHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQs
IHJicF9pX2cpID09IHJicF9pX3ApIHtcCisJCSAgICByYnBfbGVmdF9zZXQoYV90eXBlLCBhX2Zp
ZWxkLCByYnBfaV9nLCByYnBfaV91KTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJICAgIGFzc2Vy
dChyYnBfcmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lfZykJXAorCQkgICAgICA9PSBy
YnBfaV9wKTsJCQkJCVwKKwkJICAgIHJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBf
aV9nLCByYnBfaV91KTsJXAorCQl9CQkJCQkJCVwKKwkJcmJwX2lfcCA9IHJicF9pX3U7CQkJCQlc
CisJCXJicF9pX2NtcCA9IChhX2NtcCkoKGFfbm9kZSksIHJicF9pX3ApOwkJCVwKKwkJaWYgKHJi
cF9pX2NtcCA8IDApIHsJCQkJCVwKKwkJICAgIHJicF9pX2MgPSByYnBfbGVmdF9nZXQoYV90eXBl
LCBhX2ZpZWxkLCByYnBfaV9wKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJICAgIGFzc2VydChy
YnBfaV9jbXAgPiAwKTsJCQkJXAorCQkgICAgcmJwX2lfYyA9IHJicF9yaWdodF9nZXQoYV90eXBl
LCBhX2ZpZWxkLCByYnBfaV9wKTsJXAorCQl9CQkJCQkJCVwKKwkJY29udGludWU7CQkJCQkJXAor
CSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJicF9pX2cgPSByYnBfaV9wOwkJCQkJCVwK
KwlyYnBfaV9wID0gcmJwX2lfYzsJCQkJCQlcCisJcmJwX2lfY21wID0gKGFfY21wKSgoYV9ub2Rl
KSwgcmJwX2lfYyk7CQkJCVwKKwlpZiAocmJwX2lfY21wIDwgMCkgewkJCQkJCVwKKwkgICAgcmJw
X2lfYyA9IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9pX2MpOwkJXAorCX0gZWxz
ZSB7CQkJCQkJCVwKKwkgICAgYXNzZXJ0KHJicF9pX2NtcCA+IDApOwkJCQkJXAorCSAgICByYnBf
aV9jID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9pX2MpOwkJXAorCX0JCQkJ
CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIC8qIHJicF9pX3Agbm93IHJlZmVycyB0byB0aGUg
bm9kZSB1bmRlciB3aGljaCB0byBpbnNlcnQuICAgICAgICAgICovXAorICAgIHJicF9ub2RlX25l
dyhhX3R5cGUsIGFfZmllbGQsIGFfdHJlZSwgKGFfbm9kZSkpOwkJCVwKKyAgICBpZiAocmJwX2lf
Y21wID4gMCkgewkJCQkJCVwKKwlyYnBfcmlnaHRfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lf
cCwgKGFfbm9kZSkpOwkJXAorCXJicF9sZWFuX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCByYnBfaV9w
LCByYnBfaV90KTsJCVwKKwlpZiAocmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2lf
ZykgPT0gcmJwX2lfcCkgewlcCisJICAgIHJicF9sZWZ0X3NldChhX3R5cGUsIGFfZmllbGQsIHJi
cF9pX2csIHJicF9pX3QpOwkJXAorCX0gZWxzZSBpZiAocmJwX3JpZ2h0X2dldChhX3R5cGUsIGFf
ZmllbGQsIHJicF9pX2cpID09IHJicF9pX3ApIHtcCisJICAgIHJicF9yaWdodF9zZXQoYV90eXBl
LCBhX2ZpZWxkLCByYnBfaV9nLCByYnBfaV90KTsJCVwKKwl9CQkJCQkJCQlcCisgICAgfSBlbHNl
IHsJCQkJCQkJCVwKKwlyYnBfbGVmdF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfaV9wLCAoYV9u
b2RlKSk7CQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICAvKiBVcGRhdGUgdGhlIHJvb3QgYW5kIG1h
a2Ugc3VyZSB0aGF0IGl0IGlzIGJsYWNrLiAgICAgICAgICAgICAgICAqL1wKKyAgICAoYV90cmVl
KS0+cmJ0X3Jvb3QgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAmcmJwX2lfcyk7CVwK
KyAgICByYnBfYmxhY2tfc2V0KGFfdHlwZSwgYV9maWVsZCwgKGFfdHJlZSktPnJidF9yb290KTsJ
CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCXJiX3JlbW92ZShhX3R5cGUsIGFfZmllbGQsIGFf
Y21wLCBhX3RyZWUsIGFfbm9kZSkgZG8gewkJXAorICAgIGFfdHlwZSByYnBfcl9zOwkJCQkJCQlc
CisgICAgYV90eXBlICpyYnBfcl9wLCAqcmJwX3JfYywgKnJicF9yX3hwLCAqcmJwX3JfdCwgKnJi
cF9yX3U7CQlcCisgICAgaW50IHJicF9yX2NtcDsJCQkJCQkJXAorICAgIHJicF9sZWZ0X3NldChh
X3R5cGUsIGFfZmllbGQsICZyYnBfcl9zLCAoYV90cmVlKS0+cmJ0X3Jvb3QpOwlcCisgICAgcmJw
X3JpZ2h0X3NldChhX3R5cGUsIGFfZmllbGQsICZyYnBfcl9zLCAmKGFfdHJlZSktPnJidF9uaWwp
OwlcCisgICAgcmJwX2JsYWNrX3NldChhX3R5cGUsIGFfZmllbGQsICZyYnBfcl9zKTsJCQkJXAor
ICAgIHJicF9yX3AgPSAmcmJwX3JfczsJCQkJCQkJXAorICAgIHJicF9yX2MgPSAoYV90cmVlKS0+
cmJ0X3Jvb3Q7CQkJCQlcCisgICAgcmJwX3JfeHAgPSAmKGFfdHJlZSktPnJidF9uaWw7CQkJCQlc
CisgICAgLyogSXRlcmF0ZSBkb3duIHRoZSB0cmVlLCBidXQgYWx3YXlzIHRyYW5zZm9ybSAyLW5v
ZGVzIHRvIDMtIG9yICAgKi9cCisgICAgLyogNC1ub2RlcyBpbiBvcmRlciB0byBtYWludGFpbiB0
aGUgaW52YXJpYW50IHRoYXQgdGhlIGN1cnJlbnQgICAgKi9cCisgICAgLyogbm9kZSBpcyBub3Qg
YSAyLW5vZGUuICBUaGlzIGFsbG93cyBzaW1wbGUgZGVsZXRpb24gb25jZSBhIGxlYWYgKi9cCisg
ICAgLyogaXMgcmVhY2hlZC4gIEhhbmRsZSB0aGUgcm9vdCBzcGVjaWFsbHkgdGhvdWdoLCBzaW5j
ZSB0aGVyZSBtYXkgKi9cCisgICAgLyogYmUgbm8gd2F5IHRvIGNvbnZlcnQgaXQgZnJvbSBhIDIt
bm9kZSB0byBhIDMtbm9kZS4gICAgICAgICAgICAgKi9cCisgICAgcmJwX3JfY21wID0gKGFfY21w
KSgoYV9ub2RlKSwgcmJwX3JfYyk7CQkJCVwKKyAgICBpZiAocmJwX3JfY21wIDwgMCkgewkJCQkJ
CVwKKwlyYnBfcl90ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYyk7CQlc
CisJcmJwX3JfdSA9IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3QpOwkJXAor
CWlmIChyYnBfcmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3QpID09IGZhbHNlCQlcCisJ
ICAmJiByYnBfcmVkX2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3UpID09IGZhbHNlKSB7CQlc
CisJICAgIC8qIEFwcGx5IHN0YW5kYXJkIHRyYW5zZm9ybSB0byBwcmVwYXJlIGZvciBsZWZ0IG1v
dmUuICAgICAqL1wKKwkgICAgcmJwX21vdmVfcmVkX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCByYnBf
cl9jLCByYnBfcl90KTsJXAorCSAgICByYnBfYmxhY2tfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJw
X3JfdCk7CQkJXAorCSAgICByYnBfbGVmdF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wLCBy
YnBfcl90KTsJCVwKKwkgICAgcmJwX3JfYyA9IHJicF9yX3Q7CQkJCQkJXAorCX0gZWxzZSB7CQkJ
CQkJCVwKKwkgICAgLyogTW92ZSBsZWZ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICovXAorCSAgICByYnBfcl9wID0gcmJwX3JfYzsJCQkJCQlcCisJICAgIHJi
cF9yX2MgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9jKTsJCVwKKwl9CQkJ
CQkJCQlcCisgICAgfSBlbHNlIHsJCQkJCQkJCVwKKwlpZiAocmJwX3JfY21wID09IDApIHsJCQkJ
CQlcCisJICAgIGFzc2VydCgoYV9ub2RlKSA9PSByYnBfcl9jKTsJCQkJXAorCSAgICBpZiAocmJw
X3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MpCQkJXAorCSAgICAgID09ICYoYV90
cmVlKS0+cmJ0X25pbCkgewkJCQkJXAorCQkvKiBEZWxldGUgcm9vdCBub2RlICh3aGljaCBpcyBh
bHNvIGEgbGVhZiBub2RlKS4gICAgICAqL1wKKwkJaWYgKHJicF9sZWZ0X2dldChhX3R5cGUsIGFf
ZmllbGQsIHJicF9yX2MpCQlcCisJCSAgIT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CQkJCVwKKwkJ
ICAgIHJicF9sZWFuX3JpZ2h0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYywgcmJwX3JfdCk7CVwK
KwkJICAgIHJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl90LAkJXAorCQkgICAg
ICAmKGFfdHJlZSktPnJidF9uaWwpOwkJCQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkgICAgcmJw
X3JfdCA9ICYoYV90cmVlKS0+cmJ0X25pbDsJCQlcCisJCX0JCQkJCQkJXAorCQlyYnBfbGVmdF9z
ZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wLCByYnBfcl90KTsJXAorCSAgICB9IGVsc2UgewkJ
CQkJCQlcCisJCS8qIFRoaXMgaXMgdGhlIG5vZGUgd2Ugd2FudCB0byBkZWxldGUsIGJ1dCB3ZSB3
aWxsICAgICovXAorCQkvKiBpbnN0ZWFkIHN3YXAgaXQgd2l0aCBpdHMgc3VjY2Vzc29yIGFuZCBk
ZWxldGUgdGhlICAqL1wKKwkJLyogc3VjY2Vzc29yLiAgUmVjb3JkIGVub3VnaCBpbmZvcm1hdGlv
biB0byBkbyB0aGUgICAgKi9cCisJCS8qIHN3YXAgbGF0ZXIuICByYnBfcl94cCBpcyB0aGUgYV9u
b2RlJ3MgcGFyZW50LiAgICAgICovXAorCQlyYnBfcl94cCA9IHJicF9yX3A7CQkJCQlcCisJCXJi
cF9yX2NtcCA9IDE7IC8qIE5vdGUgdGhhdCBkZWxldGlvbiBpcyBpbmNvbXBsZXRlLiAgICovXAor
CSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlmIChyYnBfcl9jbXAgPT0gMSkgewkJCQkJ
CVwKKwkgICAgaWYgKHJicF9yZWRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX2xlZnRfZ2V0KGFf
dHlwZSwJXAorCSAgICAgIGFfZmllbGQsIHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxkLCBy
YnBfcl9jKSkpCVwKKwkgICAgICA9PSBmYWxzZSkgewkJCQkJCVwKKwkJcmJwX3JfdCA9IHJicF9s
ZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MpOwlcCisJCWlmIChyYnBfcmVkX2dldChh
X3R5cGUsIGFfZmllbGQsIHJicF9yX3QpKSB7CQlcCisJCSAgICAvKiBTdGFuZGFyZCB0cmFuc2Zv
cm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXAorCQkgICAgcmJwX21vdmVfcmVkX3Jp
Z2h0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYywJXAorCQkgICAgICByYnBfcl90KTsJCQkJCQlc
CisJCX0gZWxzZSB7CQkJCQkJXAorCQkgICAgLyogUm9vdC1zcGVjaWZpYyB0cmFuc2Zvcm0uICAg
ICAgICAgICAgICAgICAgICAgICAqL1wKKwkJICAgIHJicF9yZWRfc2V0KGFfdHlwZSwgYV9maWVs
ZCwgcmJwX3JfYyk7CQlcCisJCSAgICByYnBfcl91ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9m
aWVsZCwgcmJwX3JfdCk7CVwKKwkJICAgIGlmIChyYnBfcmVkX2dldChhX3R5cGUsIGFfZmllbGQs
IHJicF9yX3UpKSB7CVwKKwkJCXJicF9ibGFja19zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl91
KTsJXAorCQkJcmJwX3JvdGF0ZV9yaWdodChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MsCVwKKwkJ
CSAgcmJwX3JfdCk7CQkJCQlcCisJCQlyYnBfcm90YXRlX2xlZnQoYV90eXBlLCBhX2ZpZWxkLCBy
YnBfcl9jLAlcCisJCQkgIHJicF9yX3UpOwkJCQkJXAorCQkJcmJwX3JpZ2h0X3NldChhX3R5cGUs
IGFfZmllbGQsIHJicF9yX3QsCQlcCisJCQkgIHJicF9yX3UpOwkJCQkJXAorCQkgICAgfSBlbHNl
IHsJCQkJCQlcCisJCQlyYnBfcmVkX3NldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3QpOwkJXAor
CQkJcmJwX3JvdGF0ZV9sZWZ0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYywJXAorCQkJICByYnBf
cl90KTsJCQkJCVwKKwkJICAgIH0JCQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJcmJwX2xlZnRfc2V0
KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfcCwgcmJwX3JfdCk7CVwKKwkJcmJwX3JfYyA9IHJicF9y
X3Q7CQkJCQlcCisJICAgIH0gZWxzZSB7CQkJCQkJCVwKKwkJLyogTW92ZSByaWdodC4gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cCisJCXJicF9yX3AgPSByYnBfcl9j
OwkJCQkJXAorCQlyYnBfcl9jID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9y
X2MpOwlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAg
ICBpZiAocmJwX3JfY21wICE9IDApIHsJCQkJCQlcCisJd2hpbGUgKHRydWUpIHsJCQkJCQkJXAor
CSAgICBhc3NlcnQocmJwX3JfcCAhPSAmKGFfdHJlZSktPnJidF9uaWwpOwkJCVwKKwkgICAgcmJw
X3JfY21wID0gKGFfY21wKSgoYV9ub2RlKSwgcmJwX3JfYyk7CQkJXAorCSAgICBpZiAocmJwX3Jf
Y21wIDwgMCkgewkJCQkJXAorCQlyYnBfcl90ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVs
ZCwgcmJwX3JfYyk7CVwKKwkJaWYgKHJicF9yX3QgPT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CQkJ
XAorCQkgICAgLyogcmJwX3JfYyBub3cgcmVmZXJzIHRvIHRoZSBzdWNjZXNzb3Igbm9kZSB0byAg
ICAqL1wKKwkJICAgIC8qIHJlbG9jYXRlLCBhbmQgcmJwX3JfeHAvYV9ub2RlIHJlZmVyIHRvIHRo
ZSAgICAgKi9cCisJCSAgICAvKiBjb250ZXh0IGZvciB0aGUgcmVsb2NhdGlvbi4gICAgICAgICAg
ICAgICAgICAgICovXAorCQkgICAgaWYgKHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJi
cF9yX3hwKQkJXAorCQkgICAgICA9PSAoYV9ub2RlKSkgewkJCQkJXAorCQkJcmJwX2xlZnRfc2V0
KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfeHAsCQlcCisJCQkgIHJicF9yX2MpOwkJCQkJXAorCQkg
ICAgfSBlbHNlIHsJCQkJCQlcCisJCQlhc3NlcnQocmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmll
bGQsCQlcCisJCQkgIHJicF9yX3hwKSA9PSAoYV9ub2RlKSk7CQkJXAorCQkJcmJwX3JpZ2h0X3Nl
dChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3hwLAlcCisJCQkgIHJicF9yX2MpOwkJCQkJXAorCQkg
ICAgfQkJCQkJCQlcCisJCSAgICByYnBfbGVmdF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9j
LAkJXAorCQkgICAgICByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSkpOwkJ
XAorCQkgICAgcmJwX3JpZ2h0X3NldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MsCQlcCisJCSAg
ICAgIHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSkpOwlcCisJCSAgICBy
YnBfY29sb3Jfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYywJCVwKKwkJICAgICAgcmJwX3Jl
ZF9nZXQoYV90eXBlLCBhX2ZpZWxkLCAoYV9ub2RlKSkpOwkJXAorCQkgICAgaWYgKHJicF9sZWZ0
X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3ApCQlcCisJCSAgICAgID09IHJicF9yX2MpIHsJ
CQkJCVwKKwkJCXJicF9sZWZ0X3NldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3AsCQlcCisJCQkg
ICYoYV90cmVlKS0+cmJ0X25pbCk7CQkJCVwKKwkJICAgIH0gZWxzZSB7CQkJCQkJXAorCQkJYXNz
ZXJ0KHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wKQlcCisJCQkgID09IHJi
cF9yX2MpOwkJCQkJXAorCQkJcmJwX3JpZ2h0X3NldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3As
CQlcCisJCQkgICYoYV90cmVlKS0+cmJ0X25pbCk7CQkJCVwKKwkJICAgIH0JCQkJCQkJXAorCQkg
ICAgYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJcmJwX3JfdSA9IHJicF9sZWZ0X2dldChh
X3R5cGUsIGFfZmllbGQsIHJicF9yX3QpOwlcCisJCWlmIChyYnBfcmVkX2dldChhX3R5cGUsIGFf
ZmllbGQsIHJicF9yX3QpID09IGZhbHNlCVwKKwkJICAmJiByYnBfcmVkX2dldChhX3R5cGUsIGFf
ZmllbGQsIHJicF9yX3UpID09IGZhbHNlKSB7CVwKKwkJICAgIHJicF9tb3ZlX3JlZF9sZWZ0KGFf
dHlwZSwgYV9maWVsZCwgcmJwX3JfYywJCVwKKwkJICAgICAgcmJwX3JfdCk7CQkJCQkJXAorCQkg
ICAgaWYgKHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3ApCQlcCisJCSAgICAg
ID09IHJicF9yX2MpIHsJCQkJCVwKKwkJCXJicF9sZWZ0X3NldChhX3R5cGUsIGFfZmllbGQsIHJi
cF9yX3AsIHJicF9yX3QpO1wKKwkJICAgIH0gZWxzZSB7CQkJCQkJXAorCQkJcmJwX3JpZ2h0X3Nl
dChhX3R5cGUsIGFfZmllbGQsIHJicF9yX3AsCQlcCisJCQkgIHJicF9yX3QpOwkJCQkJXAorCQkg
ICAgfQkJCQkJCQlcCisJCSAgICByYnBfcl9jID0gcmJwX3JfdDsJCQkJCVwKKwkJfSBlbHNlIHsJ
CQkJCQlcCisJCSAgICByYnBfcl9wID0gcmJwX3JfYzsJCQkJCVwKKwkJICAgIHJicF9yX2MgPSBy
YnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9jKTsJXAorCQl9CQkJCQkJCVwKKwkg
ICAgfSBlbHNlIHsJCQkJCQkJXAorCQkvKiBDaGVjayB3aGV0aGVyIHRvIGRlbGV0ZSB0aGlzIG5v
ZGUgKGl0IGhhcyB0byBiZSAgICAqL1wKKwkJLyogdGhlIGNvcnJlY3Qgbm9kZSBhbmQgYSBsZWFm
IG5vZGUpLiAgICAgICAgICAgICAgICAgKi9cCisJCWlmIChyYnBfcl9jbXAgPT0gMCkgewkJCQkJ
XAorCQkgICAgYXNzZXJ0KChhX25vZGUpID09IHJicF9yX2MpOwkJCVwKKwkJICAgIGlmIChyYnBf
cmlnaHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfYykJCVwKKwkJICAgICAgPT0gJihhX3Ry
ZWUpLT5yYnRfbmlsKSB7CQkJCVwKKwkJCS8qIERlbGV0ZSBsZWFmIG5vZGUuICAgICAgICAgICAg
ICAgICAgICAgICAgICAqL1wKKwkJCWlmIChyYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCBy
YnBfcl9jKQlcCisJCQkgICE9ICYoYV90cmVlKS0+cmJ0X25pbCkgewkJCVwKKwkJCSAgICByYnBf
bGVhbl9yaWdodChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MsCVwKKwkJCSAgICAgIHJicF9yX3Qp
OwkJCQkJXAorCQkJICAgIHJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl90LAlc
CisJCQkgICAgICAmKGFfdHJlZSktPnJidF9uaWwpOwkJCVwKKwkJCX0gZWxzZSB7CQkJCQlcCisJ
CQkgICAgcmJwX3JfdCA9ICYoYV90cmVlKS0+cmJ0X25pbDsJCVwKKwkJCX0JCQkJCQlcCisJCQlp
ZiAocmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3JfcCkJXAorCQkJICA9PSByYnBf
cl9jKSB7CQkJCQlcCisJCQkgICAgcmJwX2xlZnRfc2V0KGFfdHlwZSwgYV9maWVsZCwgcmJwX3Jf
cCwJXAorCQkJICAgICAgcmJwX3JfdCk7CQkJCQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJICAg
IHJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wLAlcCisJCQkgICAgICByYnBf
cl90KTsJCQkJCVwKKwkJCX0JCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCSAgICB9IGVsc2Ug
ewkJCQkJCVwKKwkJCS8qIFRoaXMgaXMgdGhlIG5vZGUgd2Ugd2FudCB0byBkZWxldGUsIGJ1dCB3
ZSAqL1wKKwkJCS8qIHdpbGwgaW5zdGVhZCBzd2FwIGl0IHdpdGggaXRzIHN1Y2Nlc3NvciAgICAq
L1wKKwkJCS8qIGFuZCBkZWxldGUgdGhlIHN1Y2Nlc3Nvci4gIFJlY29yZCBlbm91Z2ggICAqL1wK
KwkJCS8qIGluZm9ybWF0aW9uIHRvIGRvIHRoZSBzd2FwIGxhdGVyLiAgICAgICAgICAqL1wKKwkJ
CS8qIHJicF9yX3hwIGlzIGFfbm9kZSdzIHBhcmVudC4gICAgICAgICAgICAgICAqL1wKKwkJCXJi
cF9yX3hwID0gcmJwX3JfcDsJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCX0JCQkJCQkJXAorCQly
YnBfcl90ID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9yX2MpOwlcCisJCXJi
cF9yX3UgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl90KTsJXAorCQlpZiAo
cmJwX3JlZF9nZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl91KSA9PSBmYWxzZSkgewlcCisJCSAg
ICByYnBfbW92ZV9yZWRfcmlnaHQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9jLAlcCisJCSAgICAg
IHJicF9yX3QpOwkJCQkJCVwKKwkJICAgIGlmIChyYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxk
LCByYnBfcl9wKQkJXAorCQkgICAgICA9PSByYnBfcl9jKSB7CQkJCQlcCisJCQlyYnBfbGVmdF9z
ZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wLCByYnBfcl90KTtcCisJCSAgICB9IGVsc2UgewkJ
CQkJCVwKKwkJCXJicF9yaWdodF9zZXQoYV90eXBlLCBhX2ZpZWxkLCByYnBfcl9wLAkJXAorCQkJ
ICByYnBfcl90KTsJCQkJCVwKKwkJICAgIH0JCQkJCQkJXAorCQkgICAgcmJwX3JfYyA9IHJicF9y
X3Q7CQkJCQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkgICAgcmJwX3JfcCA9IHJicF9yX2M7CQkJ
CQlcCisJCSAgICByYnBfcl9jID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsIHJicF9y
X2MpOwlcCisJCX0JCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0J
CQkJCQkJCQlcCisgICAgLyogVXBkYXRlIHJvb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKi9cCisgICAgKGFfdHJlZSktPnJidF9yb290ID0gcmJw
X2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwgJnJicF9yX3MpOwlcCit9IHdoaWxlICgwKQorCisv
KgorICogVGhlIHJiX3dyYXAoKSBtYWNybyBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHdy
YXAgZnVuY3Rpb25zIGFyb3VuZCB0aGUKKyAqIGNwcCBtYWNyb3MuICBUaGUgbWFpbiBiZW5lZml0
cyBvZiB3cmFwcGluZyBhcmUgdGhhdCAxKSByZXBlYXRlZCBtYWNybworICogZXhwYW5zaW9uIGNh
biBjYXVzZSBjb2RlIGJsb2F0LCBlc3BlY2lhbGx5IGZvciByYl97aW5zZXJ0LHJlbW92ZSkoKSwg
YW5kCisgKiAyKSB0eXBlLCBsaW5rYWdlLCBjb21wYXJpc29uIGZ1bmN0aW9ucywgZXRjLiBuZWVk
IG5vdCBiZSBzcGVjaWZpZWQgYXQgZXZlcnkKKyAqIGNhbGwgcG9pbnQuCisgKi8KKworI2RlZmlu
ZQlyYl93cmFwKGFfYXR0ciwgYV9wcmVmaXgsIGFfdHJlZV90eXBlLCBhX3R5cGUsIGFfZmllbGQs
IGFfY21wKQlcCithX2F0dHIgdm9pZAkJCQkJCQkJXAorYV9wcmVmaXgjI25ldyhhX3RyZWVfdHlw
ZSAqdHJlZSkgewkJCQkJXAorICAgIHJiX25ldyhhX3R5cGUsIGFfZmllbGQsIHRyZWUpOwkJCQkJ
XAorfQkJCQkJCQkJCVwKK2FfYXR0ciBhX3R5cGUgKgkJCQkJCQkJXAorYV9wcmVmaXgjI2ZpcnN0
KGFfdHJlZV90eXBlICp0cmVlKSB7CQkJCQlcCisgICAgYV90eXBlICpyZXQ7CQkJCQkJCVwKKyAg
ICByYl9maXJzdChhX3R5cGUsIGFfZmllbGQsIHRyZWUsIHJldCk7CQkJCVwKKyAgICByZXR1cm4g
KHJldCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCithX2F0dHIgYV90eXBlICoJCQkJCQkJCVwKK2Ff
cHJlZml4IyNsYXN0KGFfdHJlZV90eXBlICp0cmVlKSB7CQkJCQlcCisgICAgYV90eXBlICpyZXQ7
CQkJCQkJCVwKKyAgICByYl9sYXN0KGFfdHlwZSwgYV9maWVsZCwgdHJlZSwgcmV0KTsJCQkJXAor
ICAgIHJldHVybiAocmV0KTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK2FfYXR0ciBhX3R5cGUgKgkJ
CQkJCQkJXAorYV9wcmVmaXgjI25leHQoYV90cmVlX3R5cGUgKnRyZWUsIGFfdHlwZSAqbm9kZSkg
ewkJCVwKKyAgICBhX3R5cGUgKnJldDsJCQkJCQkJXAorICAgIHJiX25leHQoYV90eXBlLCBhX2Zp
ZWxkLCBhX2NtcCwgdHJlZSwgbm9kZSwgcmV0KTsJCQlcCisgICAgcmV0dXJuIChyZXQpOwkJCQkJ
CQlcCit9CQkJCQkJCQkJXAorYV9hdHRyIGFfdHlwZSAqCQkJCQkJCQlcCithX3ByZWZpeCMjcHJl
dihhX3RyZWVfdHlwZSAqdHJlZSwgYV90eXBlICpub2RlKSB7CQkJXAorICAgIGFfdHlwZSAqcmV0
OwkJCQkJCQlcCisgICAgcmJfcHJldihhX3R5cGUsIGFfZmllbGQsIGFfY21wLCB0cmVlLCBub2Rl
LCByZXQpOwkJCVwKKyAgICByZXR1cm4gKHJldCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCithX2F0
dHIgYV90eXBlICoJCQkJCQkJCVwKK2FfcHJlZml4IyNzZWFyY2goYV90cmVlX3R5cGUgKnRyZWUs
IGFfdHlwZSAqa2V5KSB7CQkJXAorICAgIGFfdHlwZSAqcmV0OwkJCQkJCQlcCisgICAgcmJfc2Vh
cmNoKGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIHRyZWUsIGtleSwgcmV0KTsJCQlcCisgICAgcmV0
dXJuIChyZXQpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorYV9hdHRyIGFfdHlwZSAqCQkJCQkJCQlc
CithX3ByZWZpeCMjbnNlYXJjaChhX3RyZWVfdHlwZSAqdHJlZSwgYV90eXBlICprZXkpIHsJCQlc
CisgICAgYV90eXBlICpyZXQ7CQkJCQkJCVwKKyAgICByYl9uc2VhcmNoKGFfdHlwZSwgYV9maWVs
ZCwgYV9jbXAsIHRyZWUsIGtleSwgcmV0KTsJCQlcCisgICAgcmV0dXJuIChyZXQpOwkJCQkJCQlc
Cit9CQkJCQkJCQkJXAorYV9hdHRyIGFfdHlwZSAqCQkJCQkJCQlcCithX3ByZWZpeCMjcHNlYXJj
aChhX3RyZWVfdHlwZSAqdHJlZSwgYV90eXBlICprZXkpIHsJCQlcCisgICAgYV90eXBlICpyZXQ7
CQkJCQkJCVwKKyAgICByYl9wc2VhcmNoKGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIHRyZWUsIGtl
eSwgcmV0KTsJCQlcCisgICAgcmV0dXJuIChyZXQpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorYV9h
dHRyIHZvaWQJCQkJCQkJCVwKK2FfcHJlZml4IyNpbnNlcnQoYV90cmVlX3R5cGUgKnRyZWUsIGFf
dHlwZSAqbm9kZSkgewkJCVwKKyAgICByYl9pbnNlcnQoYV90eXBlLCBhX2ZpZWxkLCBhX2NtcCwg
dHJlZSwgbm9kZSk7CQkJXAorfQkJCQkJCQkJCVwKK2FfYXR0ciB2b2lkCQkJCQkJCQlcCithX3By
ZWZpeCMjcmVtb3ZlKGFfdHJlZV90eXBlICp0cmVlLCBhX3R5cGUgKm5vZGUpIHsJCQlcCisgICAg
cmJfcmVtb3ZlKGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIHRyZWUsIG5vZGUpOwkJCVwKK30KKwor
LyoKKyAqIFRoZSBpdGVyYXRvcnMgc2ltdWxhdGUgcmVjdXJzaW9uIHZpYSBhbiBhcnJheSBvZiBw
b2ludGVycyB0aGF0IHN0b3JlIHRoZQorICogY3VycmVudCBwYXRoLiAgVGhpcyBpcyBjcml0aWNh
bCB0byBwZXJmb3JtYW5jZSwgc2luY2UgYSBzZXJpZXMgb2YgY2FsbHMgdG8KKyAqIHJiX3tuZXh0
LHByZXZ9KCkgd291bGQgcmVxdWlyZSB0aW1lIHByb3BvcnRpb25hbCB0byAobiBsZyBuKSwgd2hl
cmVhcyB0aGlzCisgKiBpbXBsZW1lbnRhdGlvbiBvbmx5IHJlcXVpcmVzIHRpbWUgcHJvcG9ydGlv
bmFsIHRvIChuKS4KKyAqCisgKiBTaW5jZSB0aGUgaXRlcmF0b3JzIGNhY2hlIGEgcGF0aCBkb3du
IHRoZSB0cmVlLCBhbnkgdHJlZSBtb2RpZmljYXRpb24gbWF5CisgKiBjYXVzZSB0aGUgY2FjaGVk
IHBhdGggdG8gYmVjb21lIGludmFsaWQuICBJbiBvcmRlciB0byBjb250aW51ZSBpdGVyYXRpb24s
CisgKiB1c2Ugc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKyAqCisgKiAg
IHsKKyAqICAgICAgIGFfdHlwZSAqbm9kZSwgKnRub2RlOworICoKKyAqICAgICAgIHJiX2ZvcmVh
Y2hfYmVnaW4oYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsIG5vZGUpIHsKKyAqICAgICAgICAgICAu
Li4KKyAqICAgICAgICAgICByYl9uZXh0KGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIGFfdHJlZSwg
bm9kZSwgdG5vZGUpOworICogICAgICAgICAgIHJiX3JlbW92ZShhX3R5cGUsIGFfZmllbGQsIGFf
Y21wLCBhX3RyZWUsIG5vZGUpOworICogICAgICAgICAgIHJiX2ZvcmVhY2hfbmV4dChhX3R5cGUs
IGFfZmllbGQsIGFfY21wLCBhX3RyZWUsIHRub2RlKTsKKyAqICAgICAgICAgICAuLi4KKyAqICAg
ICAgIH0gcmJfZm9yZWFjaF9lbmQoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUsIG5vZGUpCisgKiAg
IH0KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpZGlvbSBpcyBub3QgYWR2aXNlZCBpZiBldmVyeSBp
dGVyYXRpb24gbW9kaWZpZXMgdGhlIHRyZWUsCisgKiBzaW5jZSBpbiB0aGF0IGNhc2UgdGhlcmUg
aXMgbm8gYWxnb3JpdGhtaWMgY29tcGxleGl0eSBpbXByb3ZlbWVudCBvdmVyIGEKKyAqIHNlcmll
cyBvZiByYl97bmV4dCxwcmV2fSgpIGNhbGxzLCB0aHVzIG1ha2luZyB0aGUgc2V0dXAgb3Zlcmhl
YWQgd2FzdGVkCisgKiBlZmZvcnQuCisgKi8KKworI2RlZmluZQlyYl9mb3JlYWNoX2JlZ2luKGFf
dHlwZSwgYV9maWVsZCwgYV90cmVlLCBhX3ZhcikgewkJXAorICAgIC8qIENvbXB1dGUgdGhlIG1h
eGltdW0gcG9zc2libGUgdHJlZSBkZXB0aCAoM1ggdGhlIGJsYWNrIGhlaWdodCkuICovXAorICAg
IHVuc2lnbmVkIHJicF9mX2hlaWdodDsJCQkJCQlcCisgICAgcmJwX2JsYWNrX2hlaWdodChhX3R5
cGUsIGFfZmllbGQsIGFfdHJlZSwgcmJwX2ZfaGVpZ2h0KTsJCVwKKyAgICByYnBfZl9oZWlnaHQg
Kj0gMzsJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJLyogSW5pdGlhbGl6ZSB0aGUgcGF0aCB0
byBjb250YWluIHRoZSBsZWZ0IHNwaW5lLiAgICAgICAgICAgICAqL1wKKwlhX3R5cGUgKnJicF9m
X3BhdGhbcmJwX2ZfaGVpZ2h0XTsJCQkJXAorCWFfdHlwZSAqcmJwX2Zfbm9kZTsJCQkJCQlcCisJ
Ym9vbCByYnBfZl9zeW5jZWQgPSBmYWxzZTsJCQkJCVwKKwl1bnNpZ25lZCByYnBfZl9kZXB0aCA9
IDA7CQkJCQlcCisJaWYgKChhX3RyZWUpLT5yYnRfcm9vdCAhPSAmKGFfdHJlZSktPnJidF9uaWwp
IHsJCQlcCisJICAgIHJicF9mX3BhdGhbcmJwX2ZfZGVwdGhdID0gKGFfdHJlZSktPnJidF9yb290
OwkJXAorCSAgICByYnBfZl9kZXB0aCsrOwkJCQkJCVwKKwkgICAgd2hpbGUgKChyYnBfZl9ub2Rl
ID0gcmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwJCVwKKwkgICAgICByYnBfZl9wYXRoW3Ji
cF9mX2RlcHRoLTFdKSkgIT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CVwKKwkJcmJwX2ZfcGF0aFty
YnBfZl9kZXB0aF0gPSByYnBfZl9ub2RlOwkJCVwKKwkJcmJwX2ZfZGVwdGgrKzsJCQkJCQlcCisJ
ICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJLyogV2hpbGUgdGhlIHBhdGggaXMgbm9uLWVt
cHR5LCBpdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAqL1wKKwl3aGlsZSAocmJwX2ZfZGVw
dGggPiAwKSB7CQkJCQlcCisJICAgIChhX3ZhcikgPSByYnBfZl9wYXRoW3JicF9mX2RlcHRoLTFd
OworCisvKiBPbmx5IHVzZSBpZiBtb2RpZnlpbmcgdGhlIHRyZWUgZHVyaW5nIGl0ZXJhdGlvbi4g
Ki8KKyNkZWZpbmUJcmJfZm9yZWFjaF9uZXh0KGFfdHlwZSwgYV9maWVsZCwgYV9jbXAsIGFfdHJl
ZSwgYV9ub2RlKQkJXAorCSAgICAvKiBSZS1pbml0aWFsaXplIHRoZSBwYXRoIHRvIGNvbnRhaW4g
dGhlIHBhdGggdG8gYV9ub2RlLiAgKi9cCisJICAgIHJicF9mX2RlcHRoID0gMDsJCQkJCQlcCisJ
ICAgIGlmIChhX25vZGUgIT0gTlVMTCkgewkJCQkJXAorCQlpZiAoKGFfdHJlZSktPnJidF9yb290
ICE9ICYoYV90cmVlKS0+cmJ0X25pbCkgewkJXAorCQkgICAgcmJwX2ZfcGF0aFtyYnBfZl9kZXB0
aF0gPSAoYV90cmVlKS0+cmJ0X3Jvb3Q7CVwKKwkJICAgIHJicF9mX2RlcHRoKys7CQkJCQlcCisJ
CSAgICByYnBfZl9ub2RlID0gcmJwX2ZfcGF0aFswXTsJCQkJXAorCQkgICAgd2hpbGUgKHRydWUp
IHsJCQkJCVwKKwkJCWludCByYnBfZl9jbXAgPSAoYV9jbXApKChhX25vZGUpLAkJXAorCQkJICBy
YnBfZl9wYXRoW3JicF9mX2RlcHRoLTFdKTsJCQlcCisJCQlpZiAocmJwX2ZfY21wIDwgMCkgewkJ
CQlcCisJCQkgICAgcmJwX2Zfbm9kZSA9IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsCVwK
KwkJCSAgICAgIHJicF9mX3BhdGhbcmJwX2ZfZGVwdGgtMV0pOwkJXAorCQkJfSBlbHNlIGlmIChy
YnBfZl9jbXAgPiAwKSB7CQkJXAorCQkJICAgIHJicF9mX25vZGUgPSByYnBfcmlnaHRfZ2V0KGFf
dHlwZSwgYV9maWVsZCwJXAorCQkJICAgICAgcmJwX2ZfcGF0aFtyYnBfZl9kZXB0aC0xXSk7CQlc
CisJCQl9IGVsc2UgewkJCQkJXAorCQkJICAgIGJyZWFrOwkJCQkJXAorCQkJfQkJCQkJCVwKKwkJ
CWFzc2VydChyYnBfZl9ub2RlICE9ICYoYV90cmVlKS0+cmJ0X25pbCk7CVwKKwkJCXJicF9mX3Bh
dGhbcmJwX2ZfZGVwdGhdID0gcmJwX2Zfbm9kZTsJCVwKKwkJCXJicF9mX2RlcHRoKys7CQkJCQlc
CisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwkgICAgcmJw
X2Zfc3luY2VkID0gdHJ1ZTsKKworI2RlZmluZQlyYl9mb3JlYWNoX2VuZChhX3R5cGUsIGFfZmll
bGQsIGFfdHJlZSwgYV92YXIpCQkJXAorCSAgICBpZiAocmJwX2Zfc3luY2VkKSB7CQkJCQkJXAor
CQlyYnBfZl9zeW5jZWQgPSBmYWxzZTsJCQkJCVwKKwkJY29udGludWU7CQkJCQkJXAorCSAgICB9
CQkJCQkJCQlcCisJICAgIC8qIEZpbmQgdGhlIHN1Y2Nlc3Nvci4gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAqL1wKKwkgICAgaWYgKChyYnBfZl9ub2RlID0gcmJwX3JpZ2h0X2dl
dChhX3R5cGUsIGFfZmllbGQsCQlcCisJICAgICAgcmJwX2ZfcGF0aFtyYnBfZl9kZXB0aC0xXSkp
ICE9ICYoYV90cmVlKS0+cmJ0X25pbCkgewlcCisJICAgICAgICAvKiBUaGUgc3VjY2Vzc29yIGlz
IHRoZSBsZWZ0LW1vc3Qgbm9kZSBpbiB0aGUgcmlnaHQgICAqL1wKKwkJLyogc3VidHJlZS4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cCisJCXJicF9mX3BhdGhb
cmJwX2ZfZGVwdGhdID0gcmJwX2Zfbm9kZTsJCQlcCisJCXJicF9mX2RlcHRoKys7CQkJCQkJXAor
CQl3aGlsZSAoKHJicF9mX25vZGUgPSByYnBfbGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLAlcCisJ
CSAgcmJwX2ZfcGF0aFtyYnBfZl9kZXB0aC0xXSkpICE9ICYoYV90cmVlKS0+cmJ0X25pbCkgewlc
CisJCSAgICByYnBfZl9wYXRoW3JicF9mX2RlcHRoXSA9IHJicF9mX25vZGU7CQlcCisJCSAgICBy
YnBfZl9kZXB0aCsrOwkJCQkJXAorCQl9CQkJCQkJCVwKKwkgICAgfSBlbHNlIHsJCQkJCQkJXAor
CQkvKiBUaGUgc3VjY2Vzc29yIGlzIGFib3ZlIHRoZSBjdXJyZW50IG5vZGUuICBVbndpbmQgICAq
L1wKKwkJLyogdW50aWwgYSBsZWZ0LWxlYW5pbmcgZWRnZSBpcyByZW1vdmVkIGZyb20gdGhlICAg
ICAgKi9cCisJCS8qIHBhdGgsIG9yIHRoZSBwYXRoIGlzIGVtcHR5LiAgICAgICAgICAgICAgICAg
ICAgICAgICovXAorCQlmb3IgKHJicF9mX2RlcHRoLS07IHJicF9mX2RlcHRoID4gMDsgcmJwX2Zf
ZGVwdGgtLSkgewlcCisJCSAgICBpZiAocmJwX2xlZnRfZ2V0KGFfdHlwZSwgYV9maWVsZCwJCQlc
CisJCSAgICAgIHJicF9mX3BhdGhbcmJwX2ZfZGVwdGgtMV0pCQkJXAorCQkgICAgICA9PSByYnBf
Zl9wYXRoW3JicF9mX2RlcHRoXSkgewkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJICAgIH0JCQkJ
CQkJXAorCQl9CQkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJ
CQkJCQkJXAorfQorCisjZGVmaW5lCXJiX2ZvcmVhY2hfcmV2ZXJzZV9iZWdpbihhX3R5cGUsIGFf
ZmllbGQsIGFfdHJlZSwgYV92YXIpIHsJXAorICAgIC8qIENvbXB1dGUgdGhlIG1heGltdW0gcG9z
c2libGUgdHJlZSBkZXB0aCAoM1ggdGhlIGJsYWNrIGhlaWdodCkuICovXAorICAgIHVuc2lnbmVk
IHJicF9mcl9oZWlnaHQ7CQkJCQkJXAorICAgIHJicF9ibGFja19oZWlnaHQoYV90eXBlLCBhX2Zp
ZWxkLCBhX3RyZWUsIHJicF9mcl9oZWlnaHQpOwkJXAorICAgIHJicF9mcl9oZWlnaHQgKj0gMzsJ
CQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJLyogSW5pdGlhbGl6ZSB0aGUgcGF0aCB0byBjb250
YWluIHRoZSByaWdodCBzcGluZS4gICAgICAgICAgICAqL1wKKwlhX3R5cGUgKnJicF9mcl9wYXRo
W3JicF9mcl9oZWlnaHRdOwkJCQlcCisJYV90eXBlICpyYnBfZnJfbm9kZTsJCQkJCQlcCisJYm9v
bCByYnBfZnJfc3luY2VkID0gZmFsc2U7CQkJCQlcCisJdW5zaWduZWQgcmJwX2ZyX2RlcHRoID0g
MDsJCQkJCVwKKwlpZiAoKGFfdHJlZSktPnJidF9yb290ICE9ICYoYV90cmVlKS0+cmJ0X25pbCkg
ewkJCVwKKwkgICAgcmJwX2ZyX3BhdGhbcmJwX2ZyX2RlcHRoXSA9IChhX3RyZWUpLT5yYnRfcm9v
dDsJCVwKKwkgICAgcmJwX2ZyX2RlcHRoKys7CQkJCQkJXAorCSAgICB3aGlsZSAoKHJicF9mcl9u
b2RlID0gcmJwX3JpZ2h0X2dldChhX3R5cGUsIGFfZmllbGQsCVwKKwkgICAgICByYnBfZnJfcGF0
aFtyYnBfZnJfZGVwdGgtMV0pKSAhPSAmKGFfdHJlZSktPnJidF9uaWwpIHsJXAorCQlyYnBfZnJf
cGF0aFtyYnBfZnJfZGVwdGhdID0gcmJwX2ZyX25vZGU7CQlcCisJCXJicF9mcl9kZXB0aCsrOwkJ
CQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwkvKiBXaGlsZSB0aGUgcGF0aCBp
cyBub24tZW1wdHksIGl0ZXJhdGUuICAgICAgICAgICAgICAgICAgICAgICovXAorCXdoaWxlIChy
YnBfZnJfZGVwdGggPiAwKSB7CQkJCQlcCisJICAgIChhX3ZhcikgPSByYnBfZnJfcGF0aFtyYnBf
ZnJfZGVwdGgtMV07CisKKy8qIE9ubHkgdXNlIGlmIG1vZGlmeWluZyB0aGUgdHJlZSBkdXJpbmcg
aXRlcmF0aW9uLiAqLworI2RlZmluZQlyYl9mb3JlYWNoX3JldmVyc2VfcHJldihhX3R5cGUsIGFf
ZmllbGQsIGFfY21wLCBhX3RyZWUsIGFfbm9kZSkJXAorCSAgICAvKiBSZS1pbml0aWFsaXplIHRo
ZSBwYXRoIHRvIGNvbnRhaW4gdGhlIHBhdGggdG8gYV9ub2RlLiAgKi9cCisJICAgIHJicF9mcl9k
ZXB0aCA9IDA7CQkJCQkJXAorCSAgICBpZiAoYV9ub2RlICE9IE5VTEwpIHsJCQkJCVwKKwkJaWYg
KChhX3RyZWUpLT5yYnRfcm9vdCAhPSAmKGFfdHJlZSktPnJidF9uaWwpIHsJCVwKKwkJICAgIHJi
cF9mcl9wYXRoW3JicF9mcl9kZXB0aF0gPSAoYV90cmVlKS0+cmJ0X3Jvb3Q7CVwKKwkJICAgIHJi
cF9mcl9kZXB0aCsrOwkJCQkJXAorCQkgICAgcmJwX2ZyX25vZGUgPSByYnBfZnJfcGF0aFswXTsJ
CQlcCisJCSAgICB3aGlsZSAodHJ1ZSkgewkJCQkJXAorCQkJaW50IHJicF9mcl9jbXAgPSAoYV9j
bXApKChhX25vZGUpLAkJXAorCQkJICByYnBfZnJfcGF0aFtyYnBfZnJfZGVwdGgtMV0pOwkJCVwK
KwkJCWlmIChyYnBfZnJfY21wIDwgMCkgewkJCQlcCisJCQkgICAgcmJwX2ZyX25vZGUgPSByYnBf
bGVmdF9nZXQoYV90eXBlLCBhX2ZpZWxkLAlcCisJCQkgICAgICByYnBfZnJfcGF0aFtyYnBfZnJf
ZGVwdGgtMV0pOwkJXAorCQkJfSBlbHNlIGlmIChyYnBfZnJfY21wID4gMCkgewkJCVwKKwkJCSAg
ICByYnBfZnJfbm9kZSA9IHJicF9yaWdodF9nZXQoYV90eXBlLCBhX2ZpZWxkLFwKKwkJCSAgICAg
IHJicF9mcl9wYXRoW3JicF9mcl9kZXB0aC0xXSk7CQlcCisJCQl9IGVsc2UgewkJCQkJXAorCQkJ
ICAgIGJyZWFrOwkJCQkJXAorCQkJfQkJCQkJCVwKKwkJCWFzc2VydChyYnBfZnJfbm9kZSAhPSAm
KGFfdHJlZSktPnJidF9uaWwpOwlcCisJCQlyYnBfZnJfcGF0aFtyYnBfZnJfZGVwdGhdID0gcmJw
X2ZyX25vZGU7CVwKKwkJCXJicF9mcl9kZXB0aCsrOwkJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJ
CX0JCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJICAgIHJicF9mcl9zeW5jZWQgPSB0cnVlOwor
CisjZGVmaW5lCXJiX2ZvcmVhY2hfcmV2ZXJzZV9lbmQoYV90eXBlLCBhX2ZpZWxkLCBhX3RyZWUs
IGFfdmFyKQkJXAorCSAgICBpZiAocmJwX2ZyX3N5bmNlZCkgewkJCQkJXAorCQlyYnBfZnJfc3lu
Y2VkID0gZmFsc2U7CQkJCQlcCisJCWNvbnRpbnVlOwkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAor
CSAgICBpZiAocmJwX2ZyX2RlcHRoID09IDApIHsJCQkJCVwKKwkJLyogcmJfZm9yZWFjaF9yZXZl
cnNlX3N5bmMoKSB3YXMgY2FsbGVkIHdpdGggYSBOVUxMICAgKi9cCisJCS8qIGFfbm9kZS4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXAorCQlicmVhazsJCQkJ
CQkJXAorCSAgICB9CQkJCQkJCQlcCisJICAgIC8qIEZpbmQgdGhlIHByZWRlY2Vzc29yLiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1wKKwkgICAgaWYgKChyYnBfZnJfbm9kZSA9
IHJicF9sZWZ0X2dldChhX3R5cGUsIGFfZmllbGQsCQlcCisJICAgICAgcmJwX2ZyX3BhdGhbcmJw
X2ZyX2RlcHRoLTFdKSkgIT0gJihhX3RyZWUpLT5yYnRfbmlsKSB7CVwKKwkgICAgICAgIC8qIFRo
ZSBwcmVkZWNlc3NvciBpcyB0aGUgcmlnaHQtbW9zdCBub2RlIGluIHRoZSBsZWZ0ICovXAorCQkv
KiBzdWJ0cmVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1wK
KwkJcmJwX2ZyX3BhdGhbcmJwX2ZyX2RlcHRoXSA9IHJicF9mcl9ub2RlOwkJXAorCQlyYnBfZnJf
ZGVwdGgrKzsJCQkJCQlcCisJCXdoaWxlICgocmJwX2ZyX25vZGUgPSByYnBfcmlnaHRfZ2V0KGFf
dHlwZSwgYV9maWVsZCwJXAorCQkgIHJicF9mcl9wYXRoW3JicF9mcl9kZXB0aC0xXSkpICE9ICYo
YV90cmVlKS0+cmJ0X25pbCkge1wKKwkJICAgIHJicF9mcl9wYXRoW3JicF9mcl9kZXB0aF0gPSBy
YnBfZnJfbm9kZTsJCVwKKwkJICAgIHJicF9mcl9kZXB0aCsrOwkJCQkJXAorCQl9CQkJCQkJCVwK
KwkgICAgfSBlbHNlIHsJCQkJCQkJXAorCQkvKiBUaGUgcHJlZGVjZXNzb3IgaXMgYWJvdmUgdGhl
IGN1cnJlbnQgbm9kZS4gIFVud2luZCAqL1wKKwkJLyogdW50aWwgYSByaWdodC1sZWFuaW5nIGVk
Z2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSAgICAgKi9cCisJCS8qIHBhdGgsIG9yIHRoZSBwYXRoIGlz
IGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICovXAorCQlmb3IgKHJicF9mcl9kZXB0aC0t
OyByYnBfZnJfZGVwdGggPiAwOyByYnBfZnJfZGVwdGgtLSkge1wKKwkJICAgIGlmIChyYnBfcmln
aHRfZ2V0KGFfdHlwZSwgYV9maWVsZCwJCQlcCisJCSAgICAgIHJicF9mcl9wYXRoW3JicF9mcl9k
ZXB0aC0xXSkJCQlcCisJCSAgICAgID09IHJicF9mcl9wYXRoW3JicF9mcl9kZXB0aF0pIHsJCQlc
CisJCQlicmVhazsJCQkJCQlcCisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIH0J
CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30KKworI2VuZGlmIC8qIFJC
X0hfICovCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23979</attachid>
            <date>2008-10-01 03:29:18 -0700</date>
            <delta_ts>2010-03-17 02:14:43 -0700</delta_ts>
            <desc>Enable TC/JEmalloc under linux-qt (enable_jetcmalloc.patch)</desc>
            <filename>enable_jetcmalloc.patch</filename>
            <type>text/plain</type>
            <size>5819</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9qc2MucHJvCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2tqcy9qc2MucHJvCShyZXZpc2lvbiAzNzA0OCkKKysrIEphdmFTY3JpcHRDb3JlL2tq
cy9qc2MucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0xNCw4ICsxNCwxMSBAQAogQ09ORklHICs9IGJ1
aWxkaW5nLWxpYnMKIAogQ09ORklHKHJlbGVhc2UpIHsKLSAgICBERUZJTkVTICs9IE5ERUJVRyBV
U0VfU1lTVEVNX01BTExPQworICAgIERFRklORVMgKz0gTkRFQlVHCiB9CishQ09ORklHKHRjbWFs
bG9jKSB7CisgICAgREVGSU5FUyArPSBVU0VfU1lTVEVNX01BTExPQworfQogCiBpbmNsdWRlKCQk
UFdELy4uLy4uL1dlYktpdC5wcmkpCiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9GYXN0TWFs
bG9jLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvRmFzdE1hbGxvYy5jcHAJ
KHJldmlzaW9uIDM3MDQ4KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL0Zhc3RNYWxsb2MuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC05NCw2ICs5NCwxMiBAQAogI2RlZmluZSBGT1JDRV9TWVNURU1fTUFM
TE9DIDEKICNlbmRpZgogCisjaWYgIWRlZmluZWQoVVNFX0pFX01BTExPQykKKyNkZWZpbmUgRk9S
Q0VfSkVfTUFMTE9DIDAKKyNlbHNlCisjZGVmaW5lIEZPUkNFX0pFX01BTExPQyAxCisjZW5kaWYK
KwogI2RlZmluZSBUQ01BTExPQ19UUkFDS19ERUNPTU1JVEVEX1NQQU5TIChIQVZFKFZJUlRVQUxB
TExPQykpCiAKICNpZm5kZWYgTkRFQlVHCkBAIC0xNjksOSArMTc1LDI0IEBACiAKIH0gLy8gbmFt
ZXNwYWNlIFdURgogCi0jaWYgRk9SQ0VfU1lTVEVNX01BTExPQworI2lmIEZPUkNFX1NZU1RFTV9N
QUxMT0MgfHwgRk9SQ0VfSkVfTUFMTE9DCiAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAhRk9S
Q0VfSkVfTUFMTE9DCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKworI2lmZGVmIF9f
Y3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiSkVtYWxsb2MuaCIK
KworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKICNpZiAhUExBVEZP
Uk0oV0lOX09TKQogICAgICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjZW5kaWYKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS5wcmkJKHJldmlzaW9uIDM3MDQ4KQorKysgSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUucHJpCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsNiArMTQ2LDEwIEBACiAg
ICAgd3RmL1RocmVhZGluZ1F0LmNwcCBcCiAgICAgd3RmL3F0L01haW5UaHJlYWRRdC5jcHAKIAor
Q09ORklHKGplbWFsbG9jKSB7CisgICAgU09VUkNFUyArPSB3dGYvSkVtYWxsb2MuYworfQorCiAj
IEdFTkVSQVRPUiAxLUE6IExVVCBjcmVhdG9yCiBsdXQub3V0cHV0ID0gJCRHRU5FUkFURURfU09V
UkNFU19ESVIvJHtRTUFLRV9GSUxFX0JBU0V9Lmx1dC5oCiBsdXQuY29tbWFuZHMgPSBwZXJsICQk
UFdEL2tqcy9jcmVhdGVfaGFzaF90YWJsZSAke1FNQUtFX0ZJTEVfTkFNRX0gLWkgPiAke1FNQUtF
X0ZJTEVfT1VUfQpJbmRleDogR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gR05VbWFrZWZp
bGUuYW0JKHJldmlzaW9uIDM3MDQ4KQorKysgR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkK
QEAgLTI1NSwxMCArMjU1LDEwIEBACiAJLURCVUlMRElOR19HVEtfXz0xIFwKIAktRFdURl9DSEFO
R0VTCiAKLWlmICFFTkFCTEVfRkFTVF9NQUxMT0MKLWdsb2JhbF9jcHBmbGFncyArPSBcCi0JLURV
U0VfU1lTVEVNX01BTExPQwotZW5kaWYKKyNpZiAhRU5BQkxFX0ZBU1RfTUFMTE9DCisjZ2xvYmFs
X2NwcGZsYWdzICs9IFwKKyMJLURVU0VfU1lTVEVNX01BTExPQworI2VuZGlmCiAKIGlmIFRBUkdF
VF9YMTEKIGdsb2JhbF9jcHBmbGFncyArPSAtRFhQX1VOSVgKSW5kZXg6IFdlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0ZGlycy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdGRpcnMucG0JKHJldmlzaW9uIDM3MDQ4KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRkaXJzLnBtCSh3b3JraW5nIGNvcHkpCkBAIC04NzQsMTQgKzg3NCwzMCBAQAogICAgIHJldHVy
biAkcmVzdWx0OwogfQogCi1zdWIgYnVpbGRRTWFrZVF0UHJvamVjdCgkJCkKK3N1YiBnZXRNZW1v
cnlNYW5hZ2UoJCkgeworCisgICAgbXkgKCRtZW1vcnlNYW5hZ2UpID0gQF87CisKKyAgICBpZiAo
JG1lbW9yeU1hbmFnZSBlcSAidGNtYWxsb2MiIHx8ICRtZW1vcnlNYW5hZ2UgZXEgImplbWFsbG9j
IikgeworICAgICAgICByZXR1cm4gIkNPTkZJRys9Ii4kbWVtb3J5TWFuYWdlOworICAgIH0KKwor
ICAgIHJldHVybiAiIjsKK30KKworc3ViIGJ1aWxkUU1ha2VRdFByb2plY3QoJCQkKQogewotICAg
IG15ICgkcHJvamVjdCwgJGNsZWFuKSA9IEBfOworICAgIG15ICgkcHJvamVjdCwgJGNsZWFuLCAk
bWVtb3J5TWFuYWdlKSA9IEBfOwogCiAgICAgbXkgQGJ1aWxkQXJncyA9ICgiQ09ORklHKz1xdC1w
b3J0Iik7Ci0gICAgcmV0dXJuIGJ1aWxkUU1ha2VQcm9qZWN0KCRjbGVhbiwgQGJ1aWxkQXJncyk7
Ci19CiAKKyAgICBpZiAoJG1lbW9yeU1hbmFnZSBuZSAiIikgeworICAgICAgICBwdXNoIEBidWls
ZEFyZ3MsZ2V0TWVtb3J5TWFuYWdlKCRtZW1vcnlNYW5hZ2UpOworICAgIH0KKworICAgICByZXR1
cm4gYnVpbGRRTWFrZVByb2plY3QoJGNsZWFuLCBAYnVpbGRBcmdzKTsKKyB9CisKIHN1YiBidWls
ZEd0a1Byb2plY3QoJCRAKQogewogICAgIG15ICgkcHJvamVjdCwgJGNsZWFuLCBAYnVpbGRBcmdz
KSA9IEBfOwpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy9idWlsZC13ZWJraXQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy9idWlsZC13ZWJraXQJKHJldmlzaW9uIDM3MDQ4KQor
KysgV2ViS2l0VG9vbHMvU2NyaXB0cy9idWlsZC13ZWJraXQJKHdvcmtpbmcgY29weSkKQEAgLTYw
LDYgKzYwLDEwIEBACiBteSAkYnVpbGRVbml2ZXJzYWwgPSAwOwogbXkgJGJ1aWxkU2l4dHlGb3Vy
Qml0ID0gMDsKIAorbXkgJHRjbWFsbG9jID0gMDsKK215ICRqZW1hbGxvYyA9IDA7CitteSAkbWVt
b3J5TWFuYWdlID0gIiI7CisKIG15ICRwcm9ncmFtTmFtZSA9IGJhc2VuYW1lKCQwKTsKIG15ICR1
c2FnZSA9IDw8RU9GOwogVXNhZ2U6ICRwcm9ncmFtTmFtZSBbb3B0aW9uc10gW29wdGlvbnMgdG8g
cGFzcyB0byBidWlsZCBzeXN0ZW1dCkBAIC04NSw2ICs4OSw4IEBACiAgIC0tW25vLV14c2x0ICAg
ICAgICAgICAgICAgICAgIFRvZ2dsZSBYU0xUIHN1cHBvcnQgKGRlZmF1bHQ6ICR4c2x0U3VwcG9y
dCkKICAgLS1bbm8tXXZpZGVvICAgICAgICAgICAgICAgICAgVG9nZ2xlIFZpZGVvIHN1cHBvcnQg
KGRlZmF1bHQ6ICR2aWRlb1N1cHBvcnQpCiAgIC0tW25vLV1jb3ZlcmFnZSAgICAgICAgICAgICAg
IFRvZ2dsZSBjb2RlIGNvdmVyYWdlIHN1cHBvcnQgKGRlZmF1bHQ6ICRjb3ZlcmFnZVN1cHBvcnQp
CisgIC0tdGNtYWxsb2MgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBUQ21hbGxvYyBiZWhpbmQg
UXQgcG9ydAorICAtLWplbWFsbG9jICAgICAgICAgICAgICAgICAgICBFbmFibGUgSkVtYWxsb2Mg
YmVoaW5kIFF0IHBvcnQKIEVPRgogCiBHZXRPcHRpb25zKCdkYXRhYmFzZSEnID0+IFwkZGF0YWJh
c2VTdXBwb3J0LApAQCAtMTA2LDEzICsxMTIsMjEgQEAKICAgICAgICAgICAgJ2hlbHAnID0+IFwk
c2hvd0hlbHAsCiAgICAgICAgICAgICd1bml2ZXJzYWwnID0+IFwkYnVpbGRVbml2ZXJzYWwsCiAg
ICAgICAgICAgICc2NC1iaXQnID0+IFwkYnVpbGRTaXh0eUZvdXJCaXQsCi0gICAgICAgICAgICdj
bGVhbicgPT4gXCRjbGVhbik7CisgICAgICAgICAgICdjbGVhbicgPT4gXCRjbGVhbiwKKyAgICAg
ICAgICAgJ3RjbWFsbG9jJyA9PiBcJHRjbWFsbG9jLAorICAgICAgICAgICAnamVtYWxsb2MnID0+
IFwkamVtYWxsb2MpOwogCiBpZiAoJHNob3dIZWxwKSB7CiAgICBwcmludCBTVERFUlIgJHVzYWdl
OwogICAgZXhpdCAxOwogfQogCitpZigkdGNtYWxsb2MpIHsKKyAgICAkbWVtb3J5TWFuYWdlPSJ0
Y21hbGxvYyI7Cit9IGVsc2lmKCRqZW1hbGxvYykgeworICAgICRtZW1vcnlNYW5hZ2U9ImplbWFs
bG9jIjsKK30KKwogJHN2Z0V4cGVyaW1lbnRhbFN1cHBvcnQgPSAwIHVubGVzcyAkc3ZnU3VwcG9y
dDsKICRzdmdBbmltYXRpb25TdXBwb3J0ID0gMCB1bmxlc3MgJHN2Z1N1cHBvcnQ7CiAkc3ZnRmls
dGVyc1N1cHBvcnQgPSAwIHVubGVzcyAkc3ZnU3VwcG9ydDsKQEAgLTMwMCw3ICszMTQsNyBAQAog
ICAgICAgICAgICAgY2hkaXIgIi4uIiBvciBkaWU7CiAgICAgICAgICAgICBuZXh0OwogICAgICAg
ICB9Ci0gICAgICAgICRyZXN1bHQgPSBidWlsZFFNYWtlUXRQcm9qZWN0KCRkaXIsICRjbGVhbik7
CisgICAgICAgICRyZXN1bHQgPSBidWlsZFFNYWtlUXRQcm9qZWN0KCRkaXIsICRjbGVhbiwgJG1l
bW9yeU1hbmFnZSk7CiAgICAgfSBlbHNpZiAoaXNPU1goKSkgewogICAgICAgICAkcmVzdWx0ID0g
c3lzdGVtICJ4Y29kZWJ1aWxkIiwgIi1wcm9qZWN0IiwgIiRkaXIueGNvZGVwcm9qIiwgQG9wdGlv
bnMsICRvdmVycmlkZUZlYXR1cmVEZWZpbmVzU3RyaW5nLCBAY292ZXJhZ2VTdXBwb3J0T3B0aW9u
LCBAQVJHVjsKICAgICB9IGVsc2lmIChpc0N5Z3dpbigpKSB7CkluZGV4OiBXZWJLaXQucHJpCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC5wcmkJKHJldmlzaW9uIDM3MDQ4KQorKysgV2ViS2l0LnByaQko
d29ya2luZyBjb3B5KQpAQCAtMTUsNyArMTUsNiBAQAogICAgIERFUEVORFBBVEggKz0gJCRQV0Qv
V2ViS2l0L3F0L0FwaQogfQogCi1ERUZJTkVTICs9IFVTRV9TWVNURU1fTUFMTE9DCiBDT05GSUco
cmVsZWFzZSkgewogICAgIERFRklORVMgKz0gTkRFQlVHCiB9CkBAIC0yMyw2ICsyMiwxOCBAQAog
QkFTRV9ESVIgPSAkJFBXRAogSU5DTFVERVBBVEggKz0gJCRQV0QvV2ViS2l0L3F0L0FwaQogCitD
T05GSUcodGNtYWxsb2MpIHsKK1FNQUtFX0NYWEZMQVMgKz0gLWx0Y21hbGxvYworUU1BS0VfQ0ZM
QUdTICs9IC1sdGNtYWxsb2MKK1FNQUtFX0xGTEFHUyArPSAtbHRjbWFsbG9jCit9IGVsc2Ugewor
REVGSU5FUyArPSBVU0VfU1lTVEVNX01BTExPQworfQorCitDT05GSUcoamVtYWxsb2MpIHsKK0RF
RklORVMgKz0gVVNFX0pFX01BTExPQworfQorCiAjCiAjIEZvciBidWlsZHMgaW5zaWRlIFF0IHdl
IGludGVycHJldCB0aGUgb3V0cHV0IHJ1bGUgYW5kIHRoZSBpbnB1dCBvZiBlYWNoIGV4dHJhIGNv
bXBpbGVyIG1hbnVhbGx5CiAjIGFuZCBhZGQgdGhlIHJlc3VsdGluZyBzb3VyY2VzIHRvIHRoZSBT
T1VSQ0VTIHZhcmlhYmxlLCBiZWNhdXNlIHRoZSBidWlsZCBpbnNpZGUgUXQgY29udGFpbnMgYWxy
ZWFkeQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50881</attachid>
            <date>2010-03-17 02:14:43 -0700</date>
            <delta_ts>2010-03-17 02:17:26 -0700</delta_ts>
            <desc>Switching between system allocator and TCmalloc in build-webkit</desc>
            <filename>switch.patch</filename>
            <type>text/plain</type>
            <size>2303</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAxZDMyMmUxLi45MGE1ZTVlIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDMt
MTcgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgVVNFX1NZU1RFTV9NQUxMT0Mg
ZmxhZyB0byBidWlsZC13ZWJraXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTIxMjcyCisKKyAgICAgICAgQWRkIHN5c3RlbS1hbGxvYyBmbGFnIHRvIGJ1
aWxkLXdlYmtpdC4gSXQgbWFrZXMgZWFzeSB0byBzd2l0Y2gKKyAgICAgICAgYmV0d2VlbiBzeXN0
ZW0gYWxsb2NhdG9yIGFuZCBUQ21hbGxvYy4KKworICAgICAgICAqIFNjcmlwdHMvYnVpbGQtd2Vi
a2l0OgorCiAyMDEwLTAzLTE2ICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAg
ICAgICAgTm8gcmV2aWV3LCByb2xsaW5nIG91dCByNTYwNDQuCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdCBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVpbGQtd2Vi
a2l0CmluZGV4IDIwZGVlYTAuLmY4YjI2ODYgMTAwNzU1Ci0tLSBhL1dlYktpdFRvb2xzL1Njcmlw
dHMvYnVpbGQtd2Via2l0CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVpbGQtd2Via2l0CkBA
IC01Myw3ICs1Myw3IEBAIG15ICRzdGFydFRpbWUgPSB0aW1lKCk7CiAKIG15ICgkdGhyZWVEQ2Fu
dmFzU3VwcG9ydCwgJHRocmVlRFJlbmRlcmluZ1N1cHBvcnQsICRjaGFubmVsTWVzc2FnaW5nU3Vw
cG9ydCwgJGNsaWVudEJhc2VkR2VvbG9jYXRpb25TdXBwb3J0LCAkZGF0YWJhc2VTdXBwb3J0LCAk
ZGF0YWdyaWRTdXBwb3J0LCAkZGF0YWxpc3RTdXBwb3J0LAogICAgICRkb21TdG9yYWdlU3VwcG9y
dCwgJGV2ZW50c291cmNlU3VwcG9ydCwgJGZpbHRlcnNTdXBwb3J0LCAkZ2VvbG9jYXRpb25TdXBw
b3J0LCAkaWNvbkRhdGFiYXNlU3VwcG9ydCwgJGluZGV4ZWREYXRhYmFzZVN1cHBvcnQsCi0gICAg
JGphdmFTY3JpcHREZWJ1Z2dlclN1cHBvcnQsICRtYXRobWxTdXBwb3J0LCAkb2ZmbGluZVdlYkFw
cGxpY2F0aW9uU3VwcG9ydCwgJHJ1YnlTdXBwb3J0LCAkc2FuZGJveFN1cHBvcnQsICRzaGFyZWRX
b3JrZXJzU3VwcG9ydCwKKyAgICAkamF2YVNjcmlwdERlYnVnZ2VyU3VwcG9ydCwgJG1hdGhtbFN1
cHBvcnQsICRvZmZsaW5lV2ViQXBwbGljYXRpb25TdXBwb3J0LCAkc3lzdGVtTWFsbG9jU3VwcG9y
dCwgJHJ1YnlTdXBwb3J0LCAkc2FuZGJveFN1cHBvcnQsICRzaGFyZWRXb3JrZXJzU3VwcG9ydCwK
ICAgICAkc3ZnU3VwcG9ydCwgJHN2Z0FuaW1hdGlvblN1cHBvcnQsICRzdmdBc0ltYWdlU3VwcG9y
dCwgJHN2Z0RPTU9iakNCaW5kaW5nc1N1cHBvcnQsICRzdmdGb250c1N1cHBvcnQsCiAgICAgJHN2
Z0ZvcmVpZ25PYmplY3RTdXBwb3J0LCAkc3ZnVXNlU3VwcG9ydCwgJHZpZGVvU3VwcG9ydCwgJHdl
YlNvY2tldHNTdXBwb3J0LCAkd21sU3VwcG9ydCwgJHdjc3NTdXBwb3J0LCAkeGh0bWxtcFN1cHBv
cnQsICR3b3JrZXJzU3VwcG9ydCwKICAgICAkeHBhdGhTdXBwb3J0LCAkeHNsdFN1cHBvcnQsICRj
b3ZlcmFnZVN1cHBvcnQsICRub3RpZmljYXRpb25zU3VwcG9ydCwgJGJsb2JTbGljZVN1cHBvcnQs
ICR0aWxlZEJhY2tpbmdTdG9yZVN1cHBvcnQpOwpAQCAtMTE5LDYgKzExOSw5IEBAIG15IEBmZWF0
dXJlcyA9ICgKICAgICB7IG9wdGlvbiA9PiAicnVieSIsIGRlc2MgPT4gIlRvZ2dsZSBIVE1MNSBS
dWJ5IHN1cHBvcnQiLAogICAgICAgZGVmaW5lID0+ICJFTkFCTEVfUlVCWSIsIGRlZmF1bHQgPT4g
MSwgdmFsdWUgPT4gXCRydWJ5U3VwcG9ydCB9LAogCisgICAgeyBvcHRpb24gPT4gInN5c3RlbS1t
YWxsb2MiLCBkZXNjID0+ICJUb2dnbGUgc3lzdGVtIGFsbG9jYXRvciBpbnN0ZWFkIG9mIFRDbWFs
bG9jIiwKKyAgICAgIGRlZmluZSA9PiAiVVNFX1NZU1RFTV9NQUxMT0MiLCBkZWZhdWx0ID0+IDAs
IHZhbHVlID0+IFwkc3lzdGVtTWFsbG9jU3VwcG9ydCB9LAorCiAgICAgeyBvcHRpb24gPT4gInNh
bmRib3giLCBkZXNjID0+ICJUb2dnbGUgSFRNTDUgU2FuZGJveGVkIGlmcmFtZSBzdXBwb3J0IiwK
ICAgICAgIGRlZmluZSA9PiAiRU5BQkxFX1NBTkRCT1giLCBkZWZhdWx0ID0+IDEsIHZhbHVlID0+
IFwkc2FuZGJveFN1cHBvcnQgfSwKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50882</attachid>
            <date>2010-03-17 02:17:26 -0700</date>
            <delta_ts>2010-03-19 00:47:33 -0700</delta_ts>
            <desc>Switching between system allocator and TCmalloc in build-webkit</desc>
            <filename>switch.patch</filename>
            <type>text/plain</type>
            <size>2303</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAxZDMyMmUxLi45MGE1ZTVlIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDMt
MTcgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgVVNFX1NZU1RFTV9NQUxMT0Mg
ZmxhZyB0byBidWlsZC13ZWJraXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTIxMjcyCisKKyAgICAgICAgQWRkIHN5c3RlbS1hbGxvYyBmbGFnIHRvIGJ1
aWxkLXdlYmtpdC4gSXQgbWFrZXMgZWFzeSB0byBzd2l0Y2gKKyAgICAgICAgYmV0d2VlbiBzeXN0
ZW0gYWxsb2NhdG9yIGFuZCBUQ21hbGxvYy4KKworICAgICAgICAqIFNjcmlwdHMvYnVpbGQtd2Vi
a2l0OgorCiAyMDEwLTAzLTE2ICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAg
ICAgICAgTm8gcmV2aWV3LCByb2xsaW5nIG91dCByNTYwNDQuCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdCBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVpbGQtd2Vi
a2l0CmluZGV4IDIwZGVlYTAuLmY4NjYxODggMTAwNzU1Ci0tLSBhL1dlYktpdFRvb2xzL1Njcmlw
dHMvYnVpbGQtd2Via2l0CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVpbGQtd2Via2l0CkBA
IC01Myw3ICs1Myw3IEBAIG15ICRzdGFydFRpbWUgPSB0aW1lKCk7CiAKIG15ICgkdGhyZWVEQ2Fu
dmFzU3VwcG9ydCwgJHRocmVlRFJlbmRlcmluZ1N1cHBvcnQsICRjaGFubmVsTWVzc2FnaW5nU3Vw
cG9ydCwgJGNsaWVudEJhc2VkR2VvbG9jYXRpb25TdXBwb3J0LCAkZGF0YWJhc2VTdXBwb3J0LCAk
ZGF0YWdyaWRTdXBwb3J0LCAkZGF0YWxpc3RTdXBwb3J0LAogICAgICRkb21TdG9yYWdlU3VwcG9y
dCwgJGV2ZW50c291cmNlU3VwcG9ydCwgJGZpbHRlcnNTdXBwb3J0LCAkZ2VvbG9jYXRpb25TdXBw
b3J0LCAkaWNvbkRhdGFiYXNlU3VwcG9ydCwgJGluZGV4ZWREYXRhYmFzZVN1cHBvcnQsCi0gICAg
JGphdmFTY3JpcHREZWJ1Z2dlclN1cHBvcnQsICRtYXRobWxTdXBwb3J0LCAkb2ZmbGluZVdlYkFw
cGxpY2F0aW9uU3VwcG9ydCwgJHJ1YnlTdXBwb3J0LCAkc2FuZGJveFN1cHBvcnQsICRzaGFyZWRX
b3JrZXJzU3VwcG9ydCwKKyAgICAkamF2YVNjcmlwdERlYnVnZ2VyU3VwcG9ydCwgJG1hdGhtbFN1
cHBvcnQsICRvZmZsaW5lV2ViQXBwbGljYXRpb25TdXBwb3J0LCAkcnVieVN1cHBvcnQsICRzeXN0
ZW1NYWxsb2NTdXBwb3J0LCAkc2FuZGJveFN1cHBvcnQsICRzaGFyZWRXb3JrZXJzU3VwcG9ydCwK
ICAgICAkc3ZnU3VwcG9ydCwgJHN2Z0FuaW1hdGlvblN1cHBvcnQsICRzdmdBc0ltYWdlU3VwcG9y
dCwgJHN2Z0RPTU9iakNCaW5kaW5nc1N1cHBvcnQsICRzdmdGb250c1N1cHBvcnQsCiAgICAgJHN2
Z0ZvcmVpZ25PYmplY3RTdXBwb3J0LCAkc3ZnVXNlU3VwcG9ydCwgJHZpZGVvU3VwcG9ydCwgJHdl
YlNvY2tldHNTdXBwb3J0LCAkd21sU3VwcG9ydCwgJHdjc3NTdXBwb3J0LCAkeGh0bWxtcFN1cHBv
cnQsICR3b3JrZXJzU3VwcG9ydCwKICAgICAkeHBhdGhTdXBwb3J0LCAkeHNsdFN1cHBvcnQsICRj
b3ZlcmFnZVN1cHBvcnQsICRub3RpZmljYXRpb25zU3VwcG9ydCwgJGJsb2JTbGljZVN1cHBvcnQs
ICR0aWxlZEJhY2tpbmdTdG9yZVN1cHBvcnQpOwpAQCAtMTE5LDYgKzExOSw5IEBAIG15IEBmZWF0
dXJlcyA9ICgKICAgICB7IG9wdGlvbiA9PiAicnVieSIsIGRlc2MgPT4gIlRvZ2dsZSBIVE1MNSBS
dWJ5IHN1cHBvcnQiLAogICAgICAgZGVmaW5lID0+ICJFTkFCTEVfUlVCWSIsIGRlZmF1bHQgPT4g
MSwgdmFsdWUgPT4gXCRydWJ5U3VwcG9ydCB9LAogCisgICAgeyBvcHRpb24gPT4gInN5c3RlbS1t
YWxsb2MiLCBkZXNjID0+ICJUb2dnbGUgc3lzdGVtIGFsbG9jYXRvciBpbnN0ZWFkIG9mIFRDbWFs
bG9jIiwKKyAgICAgIGRlZmluZSA9PiAiVVNFX1NZU1RFTV9NQUxMT0MiLCBkZWZhdWx0ID0+IDAs
IHZhbHVlID0+IFwkc3lzdGVtTWFsbG9jU3VwcG9ydCB9LAorCiAgICAgeyBvcHRpb24gPT4gInNh
bmRib3giLCBkZXNjID0+ICJUb2dnbGUgSFRNTDUgU2FuZGJveGVkIGlmcmFtZSBzdXBwb3J0IiwK
ICAgICAgIGRlZmluZSA9PiAiRU5BQkxFX1NBTkRCT1giLCBkZWZhdWx0ID0+IDEsIHZhbHVlID0+
IFwkc2FuZGJveFN1cHBvcnQgfSwKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>