<?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>7582</bug_id>
          
          <creation_ts>2006-03-03 15:52:38 -0800</creation_ts>
          <short_desc>c_utility.cpp contains CFString OS X platform-dependent code; should use ICU</short_desc>
          <delta_ts>2006-03-12 11:01:46 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Carson">dacarson</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>35018</commentid>
    <comment_count>0</comment_count>
    <who name="David Carson">dacarson</who>
    <bug_when>2006-03-03 15:52:38 -0800</bug_when>
    <thetext>c_utility.cpp is using CFString to convert from UTF8/Latin1 to UTF16.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35019</commentid>
    <comment_count>1</comment_count>
      <attachid>6832</attachid>
    <who name="David Carson">dacarson</who>
    <bug_when>2006-03-03 15:55:55 -0800</bug_when>
    <thetext>Created attachment 6832
proposed patch

Proposed patch makes use of libicu rather than platform APIs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35035</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2006-03-04 02:08:28 -0800</bug_when>
    <thetext>According to the ICU converter explorer &lt;http://www-950.ibm.com/software/globalization/icu/demo/converters?conv=latin1&amp;s=ALL&gt;, &quot;latin1&quot; actually has holes - will this work correctly for such?

Perhaps we should use sample code from &lt;http://www.unicode.org/Public/PROGRAMS/CVTUTF/&gt; to convert between UTF encodings, rather than adjust the ICU results. IMO, this would improve both performance and maintainability of the code. Also, what if the string passed from the plugin already had a replacement character in it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35076</commentid>
    <comment_count>3</comment_count>
      <attachid>6832</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-03-04 12:08:53 -0800</bug_when>
    <thetext>Comment on attachment 6832
proposed patch

Excellent thing to do -- no reason for this to use CoreFoundation just to convert to UTF-8.

Ideally we would svn copy uenum.h, ucnv.h, and ucnv_err.h from WebCore instead of checking new copies in. But that&apos;s pretty unimportant.

+    *UTF16Length = UTF8Length+1; 

Our normal coding style would have spaces around the + operator here.

+    *UTF16Chars = NULL;

Our coding style is to use 0 for this sort of thing instead of NULL.

+    UConverter* conv = ucnv_open( &quot;utf8&quot;, &amp;status);
+        conv = ucnv_open( &quot;latin1&quot;, &amp;status);

There&apos;s a space before &quot;utf8&quot; and &quot;latin1&quot; there.

+        ucnv_toUChars(conv, *UTF16Chars, *UTF16Length, UTF8Chars,
+                                 UTF8Length, &amp;status); 

Seems short enough to fit on one line.

+        if (U_SUCCESS(status)) {
+            for (unsigned int i=0; i&lt;*UTF16Length &amp;&amp; U_SUCCESS(status); i++) {
+                if ((*UTF16Chars)[i] == 0xFFFD) {
+                    status = U_INVALID_CHAR_FOUND;
+                }
+            }
+        }

Our coding style doesn&apos;t use spaces around single-character things, so these braces should be removed. Also, we use &quot;unsigned&quot; instead of &quot;unsigned int&quot; and put spaces around things like the = in &quot;i = 0&quot; and the &lt;  in &quot;i &lt; *UTF16Length&quot;. Also seems unnecessary to have the if (U_SUCCESS) around the thing -- the loop already takes care of that.

For conversion from UTF-8 to UTF-16 and from Latin-1 to UTF-16 there are much more efficient ways than calling ucnv -- on the other hand ucnv is at least as good as calling CF, so that seems fine. UString::UTF8String has UTF-16 -&gt; UTF-8 code and decode() in function.cpp has a function that converts from UTF-8 to UTF-16, but I think it&apos;s better to not make more of these. The conversion from Latin-1 to UTF-16 is literally just turning unsigned chars into unsigned shorts, so it&apos;s a shame to call the library for that case. But I&apos;m probably &quot;optimizing for the wrong thing&quot;; seems unnecessary to write custom code for something that&apos;s unlikely to be performance-critical.

Overall, the change looks great. How did you test it? Is there a way we can test this in one of the layout tests, perhaps with our test plug-in?

Marking review-, not for the minor style issues above, but because we need a change log and if possible a test to land along with this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35077</commentid>
    <comment_count>4</comment_count>
      <attachid>6832</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-03-04 12:16:10 -0800</bug_when>
    <thetext>Comment on attachment 6832
proposed patch

I just read Alexey&apos;s comments, he makes some good points:

    1) Are we sure that Latin-1 has no holes in ICU? We need to make sure of this. These holes have caused actual incompatibilities with plug-ins recently, so it&apos;s not just a theoretical issue.
    2) It&apos;s not a good strategy to post-process to look for the replacement character as a way to detect failure.

I&apos;m not sure that I agree that writing custom code would increase maintainability. But I agree that if this code ends up being hot, it&apos;s going to be pretty slow to do a ucnv_open every time. We&apos;ve seen that be a problem before.

Given that, I think we should consider custom code, especially for the Latin-1 to UTF-16 case.

As far as the UTF-8 to UTF-16 case, I&apos;m not quite as sure that we need custom code. But it would be nice to not have to forbid the replacement character. If we stick with ICU, we can use ucnv_setFromUCallBack to control ICU&apos;s behavior. But since the UTF-8 to UTF-16 conversion is pretty simple, maybe we should do it ourselves as Alexey suggests instead of calling the general character conversion library.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35196</commentid>
    <comment_count>5</comment_count>
      <attachid>6886</attachid>
    <who name="David Carson">dacarson</who>
    <bug_when>2006-03-05 19:47:08 -0800</bug_when>
    <thetext>Created attachment 6886
new patch with changes and ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35203</commentid>
    <comment_count>6</comment_count>
      <attachid>6886</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-03-05 21:19:23 -0800</bug_when>
    <thetext>Comment on attachment 6886
new patch with changes and ChangeLog

Looks good, r=me.

We could simplify this by doing the malloc outside either if statement, but it&apos;s good as is.

At some point we should test that ucnv_open is fast enough when used over and over again like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>36017</commentid>
    <comment_count>7</comment_count>
      <attachid>6886</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2006-03-12 11:01:46 -0800</bug_when>
    <thetext>Comment on attachment 6886
new patch with changes and ChangeLog

This doesn&apos;t set the result length correctly; bug 7708 has a fix.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6832</attachid>
            <date>2006-03-03 15:55:55 -0800</date>
            <delta_ts>2006-03-05 19:47:08 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>libicu-c_Utilit.cpp.txt</filename>
            <type>text/plain</type>
            <size>108189</size>
            <attacher name="David Carson">dacarson</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL2ljdS91bmljb2RlL3VlbnVtLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWVudW0uaAkocmV2aXNpb24gMCkKKysrIEphdmFT
Y3JpcHRDb3JlL2ljdS91bmljb2RlL3VlbnVtLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTI5
IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAw
Mi0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24g
YW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqCisqICAgZmlsZSBuYW1lOiAgdWVudW0uaAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisq
ICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246MgorKgorKiAgIGNy
ZWF0ZWQgb246IDIwMDJqdWwwOAorKiAgIGNyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbgor
Ki8KKworI2lmbmRlZiBfX1VFTlVNX0gKKyNkZWZpbmUgX19VRU5VTV9ICisKKyNpbmNsdWRlICJ1
bmljb2RlL3V0eXBlcy5oIgorCisvKioKKyAqIEFuIGVudW1lcmF0aW9uIG9iamVjdC4KKyAqIEZv
ciB1c2FnZSBpbiBDIHByb2dyYW1zLgorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK3N0cnVjdCBV
RW51bWVyYXRpb247CisvKiogc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBlbnVtZXJhdGlvbiBv
YmplY3QgaW5zdGFuY2UgQHN0YWJsZSBJQ1UgMi4yICovCit0eXBlZGVmIHN0cnVjdCBVRW51bWVy
YXRpb24gVUVudW1lcmF0aW9uOworCisvKioKKyAqIERpc3Bvc2VzIG9mIHJlc291cmNlcyBpbiB1
c2UgYnkgdGhlIGl0ZXJhdG9yLiAgSWYgZW4gaXMgTlVMTCwKKyAqIGRvZXMgbm90aGluZy4gIEFm
dGVyIHRoaXMgY2FsbCwgYW55IGNoYXIqIG9yIFVDaGFyKiBwb2ludGVyCisgKiByZXR1cm5lZCBi
eSB1ZW51bV91bmV4dCgpIG9yIHVlbnVtX25leHQoKSBpcyBpbnZhbGlkLgorICogQHBhcmFtIGVu
IFVFbnVtZXJhdGlvbiBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8K
K1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1ZW51bV9jbG9zZShVRW51bWVyYXRpb24qIGVuKTsK
KworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgaXRlcmF0
b3IgdHJhdmVyc2VzLiAgSWYKKyAqIHRoZSBpdGVyYXRvciBpcyBvdXQtb2Ytc3luYyB3aXRoIGl0
cyBzZXJ2aWNlLCBzdGF0dXMgaXMgc2V0IHRvCisgKiBVX0VOVU1fT1VUX09GX1NZTkNfRVJST1Iu
CisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24uIEl0IGNhbiBlbmQgdXAgYmVpbmcg
dmVyeQorICogZXhwZW5zaXZlIGFzIGFsbCB0aGUgaXRlbXMgbWlnaHQgaGF2ZSB0byBiZSBwcmUt
ZmV0Y2hlZCAoZGVwZW5kaW5nCisgKiBvbiB0aGUgdHlwZSBvZiBkYXRhIGJlaW5nIHRyYXZlcnNl
ZCkuIFVzZSB3aXRoIGNhdXRpb24gYW5kIG9ubHkgCisgKiB3aGVuIG5lY2Vzc2FyeS4KKyAqIEBw
YXJhbSBlbiBVRW51bWVyYXRpb24gc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBwYXJhbSBzdGF0dXMg
ZXJyb3IgY29kZSwgY2FuIGJlIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBpZiB0aGUKKyAqICAg
ICAgICAgICAgICAgaXRlcmF0b3IgaXMgb3V0IG9mIHN5bmMuCisgKiBAcmV0dXJuIG51bWJlciBv
ZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IKKyAqIEBzdGFibGUgSUNVIDIuMgorICovCitVX1NU
QUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWVudW1fY291bnQoVUVudW1lcmF0aW9uKiBlbiwgVUVy
cm9yQ29kZSogc3RhdHVzKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4g
dGhlIGl0ZXJhdG9yJ3MgbGlzdC4gIElmIHRoZXJlIGFyZQorICogbm8gbW9yZSBlbGVtZW50cywg
cmV0dXJucyBOVUxMLiAgSWYgdGhlIGl0ZXJhdG9yIGlzIG91dC1vZi1zeW5jCisgKiB3aXRoIGl0
cyBzZXJ2aWNlLCBzdGF0dXMgaXMgc2V0IHRvIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBhbmQK
KyAqIE5VTEwgaXMgcmV0dXJuZWQuICBJZiB0aGUgbmF0aXZlIHNlcnZpY2Ugc3RyaW5nIGlzIGEg
Y2hhciogc3RyaW5nLAorICogaXQgaXMgY29udmVydGVkIHRvIFVDaGFyKiB3aXRoIHRoZSBpbnZh
cmlhbnQgY29udmVydGVyLgorICogVGhlIHJlc3VsdCBpcyB0ZXJtaW5hdGVkIGJ5IChVQ2hhcikw
LgorICogQHBhcmFtIGVuIHRoZSBpdGVyYXRvciBvYmplY3QKKyAqIEBwYXJhbSByZXN1bHRMZW5n
dGggcG9pbnRlciB0byByZWNlaXZlIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdAorICogICAgICAg
ICAgICAgICAgICAgICAobm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgXFwwKS4KKyAqICAg
ICAgICAgICAgICAgICAgICAgSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCBpdCBpcyBpZ25vcmVkLgor
ICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSwgc2V0IHRvIFVfRU5VTV9PVVRfT0ZfU1lO
Q19FUlJPUiBpZgorICogICAgICAgICAgICAgICB0aGUgaXRlcmF0b3IgaXMgb3V0IG9mIHN5bmMg
d2l0aCBpdHMgc2VydmljZS4KKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcuICBU
aGUgc3RyaW5nIHdpbGwgYmUKKyAqICAgICAgICAgemVyby10ZXJtaW5hdGVkLiAgVGhlIHJldHVy
biBwb2ludGVyIGlzIG93bmVkIGJ5IHRoaXMgaXRlcmF0b3IKKyAqICAgICAgICAgYW5kIG11c3Qg
bm90IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBwb2ludGVyIGlzIHZhbGlkCisgKiAg
ICAgICAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYW55IHVlbnVtXy4uLiBtZXRob2QsIGluY2x1
ZGluZworICogICAgICAgICB1ZW51bV9uZXh0KCkgb3IgdWVudW1fdW5leHQoKS4gIFdoZW4gYWxs
IHN0cmluZ3MgaGF2ZSBiZWVuCisgKiAgICAgICAgIHRyYXZlcnNlZCwgcmV0dXJucyBOVUxMLgor
ICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIGNvbnN0IFVDaGFyKiBVX0VYUE9SVDIK
K3VlbnVtX3VuZXh0KFVFbnVtZXJhdGlvbiogZW4sCisgICAgICAgICAgICBpbnQzMl90KiByZXN1
bHRMZW5ndGgsCisgICAgICAgICAgICBVRXJyb3JDb2RlKiBzdGF0dXMpOworCisvKioKKyAqIFJl
dHVybnMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IncyBsaXN0LiAgSWYgdGhlcmUg
YXJlCisgKiBubyBtb3JlIGVsZW1lbnRzLCByZXR1cm5zIE5VTEwuICBJZiB0aGUgaXRlcmF0b3Ig
aXMgb3V0LW9mLXN5bmMKKyAqIHdpdGggaXRzIHNlcnZpY2UsIHN0YXR1cyBpcyBzZXQgdG8gVV9F
TlVNX09VVF9PRl9TWU5DX0VSUk9SIGFuZAorICogTlVMTCBpcyByZXR1cm5lZC4gIElmIHRoZSBu
YXRpdmUgc2VydmljZSBzdHJpbmcgaXMgYSBVQ2hhcioKKyAqIHN0cmluZywgaXQgaXMgY29udmVy
dGVkIHRvIGNoYXIqIHdpdGggdGhlIGludmFyaWFudCBjb252ZXJ0ZXIuCisgKiBUaGUgcmVzdWx0
IGlzIHRlcm1pbmF0ZWQgYnkgKGNoYXIpMC4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzCisgKiAo
YmVjYXVzZSBhIGNoYXJhY3RlciBjYW5ub3QgYmUgY29udmVydGVkKSB0aGVuIHN0YXR1cyBpcyBz
ZXQgdG8KKyAqIFVfSU5WQVJJQU5UX0NPTlZFUlNJT05fRVJST1IgYW5kIHRoZSByZXR1cm4gdmFs
dWUgaXMgdW5kZWZpbmVkCisgKiAoYnV0IG5vbi1OVUxMKS4KKyAqIEBwYXJhbSBlbiB0aGUgaXRl
cmF0b3Igb2JqZWN0CisgKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIHBvaW50ZXIgdG8gcmVjZWl2ZSB0
aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQKKyAqICAgICAgICAgICAgICAgICAgICAgKG5vdCBpbmNs
dWRpbmcgdGhlIHRlcm1pbmF0aW5nIFxcMCkuCisgKiAgICAgICAgICAgICAgICAgICAgIElmIHRo
ZSBwb2ludGVyIGlzIE5VTEwgaXQgaXMgaWdub3JlZC4KKyAqIEBwYXJhbSBzdGF0dXMgdGhlIGVy
cm9yIGNvZGUsIHNldCB0byBVX0VOVU1fT1VUX09GX1NZTkNfRVJST1IgaWYKKyAqICAgICAgICAg
ICAgICAgdGhlIGl0ZXJhdG9yIGlzIG91dCBvZiBzeW5jIHdpdGggaXRzIHNlcnZpY2UuICBTZXQg
dG8KKyAqICAgICAgICAgICAgICAgVV9JTlZBUklBTlRfQ09OVkVSU0lPTl9FUlJPUiBpZiB0aGUg
dW5kZXJseWluZyBuYXRpdmUgc3RyaW5nIGlzCisgKiAgICAgICAgICAgICAgIFVDaGFyKiBhbmQg
Y29udmVyc2lvbiB0byBjaGFyKiB3aXRoIHRoZSBpbnZhcmlhbnQgY29udmVydGVyCisgKiAgICAg
ICAgICAgICAgIGZhaWxzLiBUaGlzIGVycm9yIHBlcnRhaW5zIG9ubHkgdG8gY3VycmVudCBzdHJp
bmcsIHNvIGl0ZXJhdGlvbgorICogICAgICAgICAgICAgICBtaWdodCBiZSBhYmxlIHRvIGNvbnRp
bnVlIHN1Y2Nlc3NmdWxseS4KKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcuICBU
aGUgc3RyaW5nIHdpbGwgYmUKKyAqICAgICAgICAgemVyby10ZXJtaW5hdGVkLiAgVGhlIHJldHVy
biBwb2ludGVyIGlzIG93bmVkIGJ5IHRoaXMgaXRlcmF0b3IKKyAqICAgICAgICAgYW5kIG11c3Qg
bm90IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBwb2ludGVyIGlzIHZhbGlkCisgKiAg
ICAgICAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYW55IHVlbnVtXy4uLiBtZXRob2QsIGluY2x1
ZGluZworICogICAgICAgICB1ZW51bV9uZXh0KCkgb3IgdWVudW1fdW5leHQoKS4gIFdoZW4gYWxs
IHN0cmluZ3MgaGF2ZSBiZWVuCisgKiAgICAgICAgIHRyYXZlcnNlZCwgcmV0dXJucyBOVUxMLgor
ICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIqIFVfRVhQT1JUMgor
dWVudW1fbmV4dChVRW51bWVyYXRpb24qIGVuLAorICAgICAgICAgICBpbnQzMl90KiByZXN1bHRM
ZW5ndGgsCisgICAgICAgICAgIFVFcnJvckNvZGUqIHN0YXR1cyk7CisKKy8qKgorICogUmVzZXRz
IHRoZSBpdGVyYXRvciB0byB0aGUgY3VycmVudCBsaXN0IG9mIHNlcnZpY2UgSURzLiAgVGhpcwor
ICogcmUtZXN0YWJsaXNoZXMgc3luYyB3aXRoIHRoZSBzZXJ2aWNlIGFuZCByZXdpbmRzIHRoZSBp
dGVyYXRvcgorICogdG8gc3RhcnQgYXQgdGhlIGZpcnN0IGVsZW1lbnQuCisgKiBAcGFyYW0gZW4g
dGhlIGl0ZXJhdG9yIG9iamVjdAorICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSwgc2V0
IHRvIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBpZgorICogICAgICAgICAgICAgICB0aGUgaXRl
cmF0b3IgaXMgb3V0IG9mIHN5bmMgd2l0aCBpdHMgc2VydmljZS4gIAorICogQHN0YWJsZSBJQ1Ug
Mi4yCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1ZW51bV9yZXNldChVRW51bWVyYXRp
b24qIGVuLCBVRXJyb3JDb2RlKiBzdGF0dXMpOworCisjZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2ljdS91bmljb2RlL3VjbnYuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pY3Uv
dW5pY29kZS91Y252LmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0Q29yZS9pY3UvdW5pY29k
ZS91Y252LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTgxNyBAQAorLyoKKyoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBN
YWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVk
LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgorICogIHVjbnYuaDoKKyAqICBFeHRlcm5hbCBBUElzIGZvciB0aGUg
SUNVJ3MgY29kZXNldCBjb252ZXJzaW9uIGxpYnJhcnkKKyAqICBCZXJ0cmFuZCBBLiBEYW1pYmEK
KyAqCisgKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyAqCisgKiAgIERhdGUgICAgICAgIE5hbWUg
ICAgICAgIERlc2NyaXB0aW9uCisgKiAgIDA0LzA0Lzk5ICAgIGhlbGVuYSAgICAgIEZpeGVkIGlu
dGVybmFsIGhlYWRlciBpbmNsdXNpb24uCisgKiAgIDA1LzExLzAwICAgIGhlbGVuYSAgICAgIEFk
ZGVkIHNldEZhbGxiYWNrIGFuZCB1c2VzRmFsbGJhY2sgQVBJcy4KKyAqICAgMDYvMjkvMjAwMCAg
aGVsZW5hICAgICAgTWFqb3IgcmV3cml0ZSBvZiB0aGUgY2FsbGJhY2sgQVBJcy4KKyAqICAgMTIv
MDcvMjAwMCAgc3JsICAgICAgICAgVXBkYXRlIG9mIGRvY3VtZW50YXRpb24KKyAqLworCisvKioK
KyAqIFxmaWxlCisgKiBcYnJpZWYgQyBBUEk6IENoYXJhY3RlciBjb252ZXJzaW9uIAorICoKKyAq
IDxoMj5DaGFyYWN0ZXIgQ29udmVyc2lvbiBDIEFQSTwvaDI+CisgKgorICogPHA+VGhpcyBBUEkg
aXMgdXNlZCB0byBjb252ZXJ0IGNvZGVwYWdlIG9yIGNoYXJhY3RlciBlbmNvZGVkIGRhdGEgdG8g
YW5kCisgKiBmcm9tIFVURi0xNi4gWW91IGNhbiBvcGVuIGEgY29udmVydGVyIHdpdGgge0BsaW5r
IHVjbnZfb3BlbigpIH0uIFdpdGggdGhhdAorICogY29udmVydGVyLCB5b3UgY2FuIGdldCBpdHMg
cHJvcGVydGllcywgc2V0IG9wdGlvbnMsIGNvbnZlcnQgeW91ciBkYXRhIGFuZAorICogY2xvc2Ug
dGhlIGNvbnZlcnRlci48L3A+CisgKgorICogPHA+U2luY2UgbWFueSBzb2Z0d2FyZSBwcm9ncmFt
cyByZWNvZ2l6ZSBkaWZmZXJlbnQgY29udmVydGVyIG5hbWVzIGZvcgorICogZGlmZmVyZW50IHR5
cGVzIG9mIGNvbnZlcnRlcnMsIHRoZXJlIGFyZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBBUEkg
dG8KKyAqIGl0ZXJhdGUgb3ZlciB0aGUgY29udmVydGVyIGFsaWFzZXMuIFRoZSBmdW5jdGlvbnMg
e0BsaW5rIHVjbnZfZ2V0QXZhaWxhYmxlTmFtZSgpIH0sCisgKiB7QGxpbmsgdWNudl9nZXRBbGlh
cygpIH0gYW5kIHtAbGluayB1Y252X2dldFN0YW5kYXJkTmFtZSgpIH0gYXJlIHNvbWUgb2YgdGhl
CisgKiBtb3JlIGZyZXF1ZW50bHkgdXNlZCBhbGlhcyBmdW5jdGlvbnMgdG8gZ2V0IHRoaXMgaW5m
b3JtYXRpb24uPC9wPgorICoKKyAqIDxwPldoZW4gYSBjb252ZXJ0ZXIgZW5jb3VudGVycyBhbiBp
bGxlZ2FsLCBpcnJlZ3VsYXIsIGludmFsaWQgb3IgdW5tYXBwYWJsZSBjaGFyYWN0ZXIKKyAqIGl0
cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSBhIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgdG8g
cmVwbGFjZSB0aGUKKyAqIGJhZCBieXRlIHNlcXVlbmNlLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBj
aGFuZ2VkIGJ5IHVzaW5nIHtAbGluayB1Y252X2dldEZyb21VQ2FsbEJhY2soKSB9CisgKiBvciB7
QGxpbmsgdWNudl9nZXRUb1VDYWxsQmFjaygpIH0gb24gdGhlIGNvbnZlcnRlci4gVGhlIGhlYWRl
ciB1Y252X2Vyci5oIGRlZmluZXMKKyAqIG1hbnkgb3RoZXIgY2FsbGJhY2sgYWN0aW9ucyB0aGF0
IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9uLjwvcD4KKyAq
CisgKiA8cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQVBJIGNhbiBiZSBmb3VuZCBpbiBv
dXIgCisgKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlk
ZS9jb252ZXJzaW9uLmh0bWwiPlVzZXIncworICogR3VpZGU8L2E+LjwvcD4KKyAqLworCisjaWZu
ZGVmIFVDTlZfSAorI2RlZmluZSBVQ05WX0gKKworI2luY2x1ZGUgInVuaWNvZGUvdWNudl9lcnIu
aCIKKyNpbmNsdWRlICJ1bmljb2RlL3VlbnVtLmgiCisKKyNpZm5kZWYgX19VU0VUX0hfXworCisv
KioKKyAqIFVTZXQgaXMgdGhlIEMgQVBJIHR5cGUgZm9yIFVuaWNvZGUgc2V0cy4KKyAqIEl0IGlz
IGZvcndhcmQtZGVjbGFyZWQgaGVyZSB0byBhdm9pZCBpbmNsdWRpbmcgdGhlIGhlYWRlciBmaWxl
IGlmIHJlbGF0ZWQKKyAqIGNvbnZlcnNpb24gQVBJcyBhcmUgbm90IHVzZWQuCisgKiBTZWUgdW5p
Y29kZS91c2V0LmgKKyAqCisgKiBAc2VlIHVjbnZfZ2V0VW5pY29kZVNldAorICogQHN0YWJsZSBJ
Q1UgMi42CisgKi8KK3N0cnVjdCBVU2V0OworLyoqIEBzdGFibGUgSUNVIDIuNiAqLwordHlwZWRl
ZiBzdHJ1Y3QgVVNldCBVU2V0OworCisjZW5kaWYKKworI2lmICFVQ09ORklHX05PX0NPTlZFUlNJ
T04KKworVV9DREVDTF9CRUdJTgorCisvKiogTWF4aW11bSBsZW5ndGggb2YgYSBjb252ZXJ0ZXIg
bmFtZSBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTEwgQHN0YWJsZSBJQ1UgMi4wICovCisj
ZGVmaW5lIFVDTlZfTUFYX0NPTlZFUlRFUl9OQU1FX0xFTkdUSCA2MAorLyoqIE1heGltdW0gbGVu
Z3RoIG9mIGEgY29udmVydGVyIG5hbWUgaW5jbHVkaW5nIHBhdGggYW5kIHRlcm1pbmF0aW5nIE5V
TEwgQHN0YWJsZSBJQ1UgMi4wICovCisjZGVmaW5lIFVDTlZfTUFYX0ZVTExfRklMRV9OQU1FX0xF
TkdUSCAoNjAwK1VDTlZfTUFYX0NPTlZFUlRFUl9OQU1FX0xFTkdUSCkKKworLyoqIFNoaWZ0IGlu
IGZvciBFQkRDRElDX1NUQVRFRlVMIGFuZCBpc28yMDIyIHN0YXRlcyBAc3RhYmxlIElDVSAyLjAg
Ki8KKyNkZWZpbmUgIFVDTlZfU0kgMHgwRgorLyoqIFNoaWZ0IG91dCBmb3IgRUJEQ0RJQ19TVEFU
RUZVTCBhbmQgaXNvMjAyMiBzdGF0ZXMgQHN0YWJsZSBJQ1UgMi4wICovCisjZGVmaW5lICBVQ05W
X1NPIDB4MEUKKworLyoqCisgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIGJhc2ljIHR5cGVzIG9mIGNv
bnZlcnRlcnMKKyAqIEBzZWUgdWNudl9nZXRUeXBlCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwor
dHlwZWRlZiBlbnVtIHsKKyAgICBVQ05WX1VOU1VQUE9SVEVEX0NPTlZFUlRFUiA9IC0xLAorICAg
IFVDTlZfU0JDUyA9IDAsCisgICAgVUNOVl9EQkNTID0gMSwKKyAgICBVQ05WX01CQ1MgPSAyLAor
ICAgIFVDTlZfTEFUSU5fMSA9IDMsCisgICAgVUNOVl9VVEY4ID0gNCwKKyAgICBVQ05WX1VURjE2
X0JpZ0VuZGlhbiA9IDUsCisgICAgVUNOVl9VVEYxNl9MaXR0bGVFbmRpYW4gPSA2LAorICAgIFVD
TlZfVVRGMzJfQmlnRW5kaWFuID0gNywKKyAgICBVQ05WX1VURjMyX0xpdHRsZUVuZGlhbiA9IDgs
CisgICAgVUNOVl9FQkNESUNfU1RBVEVGVUwgPSA5LAorICAgIFVDTlZfSVNPXzIwMjIgPSAxMCwK
KworICAgIFVDTlZfTE1CQ1NfMSA9IDExLAorICAgIFVDTlZfTE1CQ1NfMiwgCisgICAgVUNOVl9M
TUJDU18zLAorICAgIFVDTlZfTE1CQ1NfNCwKKyAgICBVQ05WX0xNQkNTXzUsCisgICAgVUNOVl9M
TUJDU182LAorICAgIFVDTlZfTE1CQ1NfOCwKKyAgICBVQ05WX0xNQkNTXzExLAorICAgIFVDTlZf
TE1CQ1NfMTYsCisgICAgVUNOVl9MTUJDU18xNywKKyAgICBVQ05WX0xNQkNTXzE4LAorICAgIFVD
TlZfTE1CQ1NfMTksCisgICAgVUNOVl9MTUJDU19MQVNUID0gVUNOVl9MTUJDU18xOSwKKyAgICBV
Q05WX0haLAorICAgIFVDTlZfU0NTVSwKKyAgICBVQ05WX0lTQ0lJLAorICAgIFVDTlZfVVNfQVND
SUksCisgICAgVUNOVl9VVEY3LAorICAgIFVDTlZfQk9DVTEsCisgICAgVUNOVl9VVEYxNiwKKyAg
ICBVQ05WX1VURjMyLAorICAgIFVDTlZfQ0VTVTgsCisgICAgVUNOVl9JTUFQX01BSUxCT1gsCisK
KyAgICAvKiBOdW1iZXIgb2YgY29udmVydGVyIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlIGNvbnZl
cnNpb24gcm91dGluZXMuICovCisgICAgVUNOVl9OVU1CRVJfT0ZfU1VQUE9SVEVEX0NPTlZFUlRF
Ul9UWVBFUworCit9IFVDb252ZXJ0ZXJUeXBlOworCisvKioKKyAqIEVudW0gZm9yIHNwZWNpZnlp
bmcgd2hpY2ggcGxhdGZvcm0gYSBjb252ZXJ0ZXIgSUQgcmVmZXJzIHRvLgorICogVGhlIHVzZSBv
ZiBwbGF0Zm9ybS9DQ1NJRCBpcyBub3QgcmVjb21tZW5kZWQuIFNlZSB1Y252X29wZW5DQ1NJRCgp
LgorICoKKyAqIEBzZWUgdWNudl9nZXRQbGF0Zm9ybQorICogQHNlZSB1Y252X29wZW5DQ1NJRAor
ICogQHNlZSB1Y252X2dldENDU0lECisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwordHlwZWRlZiBl
bnVtIHsKKyAgICBVQ05WX1VOS05PV04gPSAtMSwKKyAgICBVQ05WX0lCTSA9IDAKK30gVUNvbnZl
cnRlclBsYXRmb3JtOworCisvKioKKyAqIEZ1bmN0aW9uIHBvaW50ZXIgZm9yIGVycm9yIGNhbGxi
YWNrIGluIHRoZSBjb2RlcGFnZSB0byB1bmljb2RlIGRpcmVjdGlvbi4KKyAqIENhbGxlZCB3aGVu
IGFuIGVycm9yIGhhcyBvY2N1cmVkIGluIGNvbnZlcnNpb24gdG8gdW5pY29kZSwgb3Igb24gb3Bl
bi9jbG9zZSBvZiB0aGUgY2FsbGJhY2sgKHNlZSByZWFzb24pLgorICogQHBhcmFtIGNvbnRleHQg
UG9pbnRlciB0byB0aGUgY2FsbGJhY2sncyBwcml2YXRlIGRhdGEKKyAqIEBwYXJhbSBhcmdzIElu
Zm9ybWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29k
ZVVuaXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdl
IHNlcXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2Vy
bmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNv
biB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBzZWUgdWNudl9zZXRUb1VDYWxsQmFjawor
ICogQHNlZSBVQ29udmVydGVyVG9Vbmljb2RlQXJncworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8K
K3R5cGVkZWYgdm9pZCAoVV9FWFBPUlQyICpVQ29udmVydGVyVG9VQ2FsbGJhY2spICgKKyAgICAg
ICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29u
dmVydGVyVG9Vbmljb2RlQXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIg
KmNvZGVVbml0cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNvbiwKKyAgICAgICAgICAgICAg
ICAgIFVFcnJvckNvZGUgKik7CisKKy8qKgorICogRnVuY3Rpb24gcG9pbnRlciBmb3IgZXJyb3Ig
Y2FsbGJhY2sgaW4gdGhlIHVuaWNvZGUgdG8gY29kZXBhZ2UgZGlyZWN0aW9uLgorICogQ2FsbGVk
IHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQgaW4gY29udmVyc2lvbiBmcm9tIHVuaWNvZGUsIG9y
IG9uIG9wZW4vY2xvc2Ugb2YgdGhlIGNhbGxiYWNrIChzZWUgcmVhc29uKS4KKyAqIEBwYXJhbSBj
b250ZXh0IFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrJ3MgcHJpdmF0ZSBkYXRhCisgKiBAcGFyYW0g
YXJncyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBh
cmFtIGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQg
VW5pY29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhl
IGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUg
VUNoYXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9p
bnQuCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2Fz
IGludm9rZWQKKyAqIEBzZWUgdWNudl9zZXRGcm9tVUNhbGxCYWNrCisgKiBAc3RhYmxlIElDVSAy
LjAKKyAqLwordHlwZWRlZiB2b2lkIChVX0VYUE9SVDIgKlVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNr
KSAoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRleHQsCisgICAgICAgICAg
ICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVW5pY29kZUFyZ3MgKmFyZ3MsCisgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFVDaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAgICAgIGludDMy
X3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBVQ2hhcjMyIGNvZGVQb2ludCwKKyAgICAg
ICAgICAgICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNvbiwKKyAgICAgICAg
ICAgICAgICAgICAgVUVycm9yQ29kZSAqKTsKKworVV9DREVDTF9FTkQKKworLyoqCisgKiBDaGFy
YWN0ZXIgdGhhdCBzZXBhcmF0ZXMgY29udmVydGVyIG5hbWVzIGZyb20gb3B0aW9ucyBhbmQgb3B0
aW9ucyBmcm9tIGVhY2ggb3RoZXIuCisgKiBAc2VlIHVjbnZfb3BlbgorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KKyNkZWZpbmUgVUNOVl9PUFRJT05fU0VQX0NIQVIgJywnCisKKy8qKgorICogU3Ry
aW5nIHZlcnNpb24gb2YgVUNOVl9PUFRJT05fU0VQX0NIQVIuIAorICogQHNlZSB1Y252X29wZW4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfT1BUSU9OX1NFUF9TVFJJTkcg
IiwiCisKKy8qKgorICogQ2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIGEgY29udmVydGVyIG9wdGlv
biBmcm9tIGl0cyB2YWx1ZS4KKyAqIEBzZWUgdWNudl9vcGVuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworI2RlZmluZSBVQ05WX1ZBTFVFX1NFUF9DSEFSICc9JworCisvKioKKyAqIFN0cmluZyB2
ZXJzaW9uIG9mIFVDTlZfVkFMVUVfU0VQX0NIQVIuIAorICogQHNlZSB1Y252X29wZW4KKyAqIEBz
dGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfVkFMVUVfU0VQX1NUUklORyAiPSIKKwor
LyoqCisgKiBDb252ZXJ0ZXIgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIGEgbG9jYWxlLgorICogRm9y
IGV4YW1wbGUsIHVjbnZfb3BlbigiU0NTVSxsb2NhbGU9amEiLCAmZXJyb3JDb2RlKTsKKyAqIFNl
ZSBjb252cnRycy50eHQuCisgKgorICogQHNlZSB1Y252X29wZW4KKyAqIEBzdGFibGUgSUNVIDIu
MAorICovCisjZGVmaW5lIFVDTlZfTE9DQUxFX09QVElPTl9TVFJJTkcgIixsb2NhbGU9IgorCisv
KioKKyAqIENvbnZlcnRlciBvcHRpb24gZm9yIHNwZWNpZnlpbmcgYSB2ZXJzaW9uIHNlbGVjdG9y
ICgwLi45KSBmb3Igc29tZSBjb252ZXJ0ZXJzLgorICogRm9yIGV4YW1wbGUsIHVjbnZfb3Blbigi
VVRGLTcsdmVyc2lvbj0xIiwgJmVycm9yQ29kZSk7CisgKiBTZWUgY29udnJ0cnMudHh0LgorICoK
KyAqIEBzZWUgdWNudl9vcGVuCisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworI2RlZmluZSBVQ05W
X1ZFUlNJT05fT1BUSU9OX1NUUklORyAiLHZlcnNpb249IgorCisvKioKKyAqIENvbnZlcnRlciBv
cHRpb24gZm9yIEVCQ0RJQyBTQkNTIG9yIG1peGVkLVNCQ1MvREJDUyAoc3RhdGVmdWwpIGNvZGVw
YWdlcy4KKyAqIFN3YXBzIFVuaWNvZGUgbWFwcGluZ3MgZm9yIEVCQ0RJQyBMRiBhbmQgTkwgY29k
ZXMsIGFzIHVzZWQgb24KKyAqIFMvMzkwICh6L09TKSBVbml4IFN5c3RlbSBTZXJ2aWNlcyAoT3Bl
biBFZGl0aW9uKS4KKyAqIEZvciBleGFtcGxlLCB1Y252X29wZW4oImlibS0xMDQ3LHN3YXBsZm5s
IiwgJmVycm9yQ29kZSk7CisgKiBTZWUgY29udnJ0cnMudHh0LgorICoKKyAqIEBzZWUgdWNudl9v
cGVuCisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworI2RlZmluZSBVQ05WX1NXQVBfTEZOTF9PUFRJ
T05fU1RSSU5HICIsc3dhcGxmbmwiCisKKy8qKgorICogRG8gYSBmdXp6eSBjb21wYXJlIG9mIGEg
dHdvIGNvbnZlcnRlci9hbGlhcyBuYW1lcy4gIFRoZSBjb21wYXJpc29uCisgKiBpcyBjYXNlLWlu
c2Vuc2l0aXZlLiAgSXQgYWxzbyBpZ25vcmVzIHRoZSBjaGFyYWN0ZXJzICctJywgJ18nLCBhbmQK
KyAqICcgJyAoZGFzaCwgdW5kZXJzY29yZSwgYW5kIHNwYWNlKS4gIFRodXMgdGhlIHN0cmluZ3Mg
IlVURi04IiwKKyAqICJ1dGZfOCIsIGFuZCAiVXRmIDgiIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQu
CisgKiAKKyAqIEBwYXJhbSBuYW1lMSBhIGNvbnZlcnRlciBuYW1lIG9yIGFsaWFzLCB6ZXJvLXRl
cm1pbmF0ZWQKKyAqIEBwYXJhbSBuYW1lMiBhIGNvbnZlcnRlciBuYW1lIG9yIGFsaWFzLCB6ZXJv
LXRlcm1pbmF0ZWQKKyAqIEByZXR1cm4gMCBpZiB0aGUgbmFtZXMgbWF0Y2gsIG9yIGEgbmVnYXRp
dmUgdmFsdWUgaWYgdGhlIG5hbWUxCisgKiBsZXhpY2FsbHkgcHJlY2VkZXMgbmFtZTIsIG9yIGEg
cG9zaXRpdmUgdmFsdWUgaWYgdGhlIG5hbWUxCisgKiBsZXhpY2FsbHkgZm9sbG93cyBuYW1lMi4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBpbnQgVV9FWFBPUlQyCit1Y252X2Nv
bXBhcmVOYW1lcyhjb25zdCBjaGFyICpuYW1lMSwgY29uc3QgY2hhciAqbmFtZTIpOworCisKKy8q
KgorICogQ3JlYXRlcyBhIFVDb252ZXJ0ZXIgb2JqZWN0IHdpdGggdGhlIG5hbWVzIHNwZWNpZmll
ZCBhcyBhIEMgc3RyaW5nLgorICogVGhlIGFjdHVhbCBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQgd2l0
aCB0aGUgYWxpYXMgZmlsZQorICogdXNpbmcgYSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21w
YXJpc29uIHRoYXQgaWdub3JlcworICogdGhlIGRlbGltaXRlcnMgJy0nLCAnXycsIGFuZCAnICcg
KGRhc2gsIHVuZGVyc2NvcmUsIGFuZCBzcGFjZSkuCisgKiBFLmcuLCB0aGUgbmFtZXMgIlVURjgi
LCAidXRmLTgiLCBhbmQgIlV0ZiA4IiBhcmUgYWxsIGVxdWl2YWxlbnQuCisgKiBJZiA8Y29kZT5O
VUxMPC9jb2RlPiBpcyBwYXNzZWQgZm9yIHRoZSBjb252ZXJ0ZXIgbmFtZSwgaXQgd2lsbCBjcmVh
dGUgb25lIHdpdGggdGhlCisgKiBnZXREZWZhdWx0TmFtZSByZXR1cm4gdmFsdWUuCisgKgorICog
PHA+QSBjb252ZXJ0ZXIgbmFtZSBmb3IgSUNVIDEuNSBhbmQgYWJvdmUgbWF5IGNvbnRhaW4gb3B0
aW9ucworICogbGlrZSBhIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIHNwZWNp
ZmljIGJlaGF2aW9yIG9mCisgKiB0aGUgbmV3bHkgaW5zdGFudGlhdGVkIGNvbnZlcnRlci4KKyAq
IFRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb25zIGRlcGVuZHMgb24gdGhlIHBhcnRpY3VsYXIgY29u
dmVydGVyLgorICogSWYgYW4gb3B0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciBvciByZWNvZ25pemVk
IGJ5IGEgZ2l2ZW4gY29udmVydGVyLCB0aGVuIGl0IGlzIGlnbm9yZWQuPC9wPgorICoKKyAqIDxw
Pk9wdGlvbnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBjb252ZXJ0ZXIgbmFtZSBzdHJpbmcsIHdpdGgg
YQorICogPGNvZGU+VUNOVl9PUFRJT05fU0VQX0NIQVI8L2NvZGU+IGJldHdlZW4gdGhlIG5hbWUg
YW5kIHRoZSBmaXJzdCBvcHRpb24gYW5kCisgKiBhbHNvIGJldHdlZW4gYWRqYWNlbnQgb3B0aW9u
cy48L3A+CisgKgorICogPHA+SWYgdGhlIGFsaWFzIGlzIGFtYmlndW91cywgdGhlbiB0aGUgcHJl
ZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gVV9B
TUJJR1VPVVNfQUxJQVNfV0FSTklORy48L3A+CisgKgorICogPHA+VGhlIGNvbnZlcnNpb24gYmVo
YXZpb3IgYW5kIG5hbWVzIGNhbiB2YXJ5IGJldHdlZW4gcGxhdGZvcm1zLiBJQ1UgbWF5CisgKiBj
b252ZXJ0IHNvbWUgY2hhcmFjdGVycyBkaWZmZXJlbnRseSBmcm9tIG90aGVyIHBsYXRmb3Jtcy4g
RGV0YWlscyBvbiB0aGlzIHRvcGljCisgKiBhcmUgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9vc3Mu
c29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL2NvbnZlcnNpb24uaHRtbCI+VXNlcidzCisg
KiBHdWlkZTwvYT4uPC9wPgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXJOYW1lIE5hbWUgb2YgdGhl
IHVjb252IHRhYmxlLCBtYXkgaGF2ZSBvcHRpb25zIGFwcGVuZGVkCisgKiBAcGFyYW0gZXJyIG91
dGdvaW5nIGVycm9yIHN0YXR1cyA8VFQ+VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUiwgVV9GSUxF
X0FDQ0VTU19FUlJPUjwvVFQ+CisgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFVuaWNvZGUgY29udmVy
dGVyIG9iamVjdCwgb3IgPFRUPk5VTEw8L1RUPiBpZiBhbiBlcnJvciBvY2N1cmVkCisgKiBAc2Vl
IHVjbnZfb3BlblUKKyAqIEBzZWUgdWNudl9vcGVuQ0NTSUQKKyAqIEBzZWUgdWNudl9jbG9zZQor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIqIFVfRVhQT1JUMiAK
K3VjbnZfb3Blbihjb25zdCBjaGFyICpjb252ZXJ0ZXJOYW1lLCBVRXJyb3JDb2RlICplcnIpOwor
CisKKy8qKgorICogQ3JlYXRlcyBhIFVuaWNvZGUgY29udmVydGVyIHdpdGggdGhlIG5hbWVzIHNw
ZWNpZmllZCBhcyB1bmljb2RlIHN0cmluZy4gCisgKiBUaGUgbmFtZSBzaG91bGQgYmUgbGltaXRl
ZCB0byB0aGUgQVNDSUktNyBhbHBoYW51bWVyaWNzIHJhbmdlLgorICogVGhlIGFjdHVhbCBuYW1l
IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgYWxpYXMgZmlsZQorICogdXNpbmcgYSBjYXNlLWlu
c2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIHRoYXQgaWdub3JlcworICogdGhlIGRlbGltaXRl
cnMgJy0nLCAnXycsIGFuZCAnICcgKGRhc2gsIHVuZGVyc2NvcmUsIGFuZCBzcGFjZSkuCisgKiBF
LmcuLCB0aGUgbmFtZXMgIlVURjgiLCAidXRmLTgiLCBhbmQgIlV0ZiA4IiBhcmUgYWxsIGVxdWl2
YWxlbnQuCisgKiBJZiA8VFQ+TlVMTDwvVFQ+IGlzIHBhc3NlZCBmb3IgdGhlIGNvbnZlcnRlciBu
YW1lLCBpdCB3aWxsIGNyZWF0ZSAKKyAqIG9uZSB3aXRoIHRoZSB1Y252X2dldERlZmF1bHROYW1l
KCkgcmV0dXJuIHZhbHVlLgorICogSWYgdGhlIGFsaWFzIGlzIGFtYmlndW91cywgdGhlbiB0aGUg
cHJlZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1cyBpcyBzZXQgdG8g
VV9BTUJJR1VPVVNfQUxJQVNfV0FSTklORy4KKyAqIEBwYXJhbSBuYW1lIDogbmFtZSBvZiB0aGUg
dWNvbnYgdGFibGUgaW4gYSB6ZXJvIHRlcm1pbmF0ZWQgCisgKiAgICAgICAgVW5pY29kZSBzdHJp
bmcKKyAqIEBwYXJhbSBlcnIgb3V0Z29pbmcgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExP
Q0FUSU9OX0VSUk9SLCAKKyAqICAgICAgICBVX0ZJTEVfQUNDRVNTX0VSUk9SPC9UVD4KKyAqIEBy
ZXR1cm4gdGhlIGNyZWF0ZWQgVW5pY29kZSBjb252ZXJ0ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwv
VFQ+IGlmIGFuIAorICogICAgICAgIGVycm9yIG9jY3VyZWQKKyAqIEBzZWUgdWNudl9vcGVuCisg
KiBAc2VlIHVjbnZfb3BlbkNDU0lECisgKiBAc2VlIHVjbnZfY2xvc2UKKyAqIEBzZWUgdWNudl9n
ZXREZWZhdWx0TmFtZQorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0
ZXIqIFVfRVhQT1JUMiAKK3VjbnZfb3BlblUoY29uc3QgVUNoYXIgKm5hbWUsCisgICAgICAgICAg
IFVFcnJvckNvZGUgKmVycik7CisKKy8qKgorICogQ3JlYXRlcyBhIFVDb252ZXJ0ZXIgb2JqZWN0
IGZyb20gYSBDQ1NJRCBudW1iZXIgYW5kIHBsYXRmb3JtIHBhaXIuCisgKiBOb3RlIHRoYXQgdGhl
IHVzZWZ1bG5lc3Mgb2YgdGhpcyBmdW5jdGlvbiBpcyBsaW1pdGVkIHRvIHBsYXRmb3JtcyB3aXRo
IG51bWVyaWMKKyAqIGVuY29kaW5nIElEcy4gT25seSBJQk0gYW5kIE1pY3Jvc29mdCBwbGF0Zm9y
bXMgdXNlIG51bWVyaWMgKDE2LWJpdCkgaWRlbnRpZmllcnMgZm9yCisgKiBlbmNvZGluZ3MuCisg
KgorICogSW4gYWRkaXRpb24sIElCTSBDQ1NJRHMgYW5kIFVuaWNvZGUgY29udmVyc2lvbiB0YWJs
ZXMgYXJlIG5vdCAxOjEgcmVsYXRlZC4KKyAqIEZvciBtYW55IElCTSBDQ1NJRHMgdGhlcmUgYXJl
IG11bHRpcGxlICh1cCB0byBzaXgpIFVuaWNvZGUgY29udmVyc2lvbiB0YWJsZXMsIGFuZAorICog
Zm9yIHNvbWUgVW5pY29kZSBjb252ZXJzaW9uIHRhYmxlcyB0aGVyZSBhcmUgbXVsdGlwbGUgQ0NT
SURzLgorICogU29tZSAiYWx0ZXJuYXRlIiBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIGFyZSBw
cm92aWRlZCBieSB0aGUKKyAqIElCTSBDRFJBIGNvbnZlcnNpb24gdGFibGUgcmVnaXN0cnkuCisg
KiBUaGUgbW9zdCBwcm9taW5lbnQgZXhhbXBsZSBvZiBhIHN5c3RlbWF0aWMgbW9kaWZpY2F0aW9u
IG9mIGNvbnZlcnNpb24gdGFibGVzIHRoYXQgaXMKKyAqIG5vdCBwcm92aWRlZCBpbiB0aGUgZm9y
bSBvZiBjb252ZXJzaW9uIHRhYmxlIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IGlzCisgKiB0aGF0
IFMvMzkwIFVuaXggU3lzdGVtIFNlcnZpY2VzIHN3YXBzIHRoZSBjb2RlcyBmb3IgTGluZSBGZWVk
IGFuZCBOZXcgTGluZSBpbiBhbGwKKyAqIEVCQ0RJQyBjb2RlcGFnZXMsIHdoaWNoIHJlcXVpcmVz
IHN1Y2ggYSBzd2FwIGluIHRoZSBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIGFzIHdlbGwuCisg
KgorICogT25seSBJQk0gZGVmYXVsdCBjb252ZXJzaW9uIHRhYmxlcyBhcmUgYWNjZXNzaWJsZSB3
aXRoIHVjbnZfb3BlbkNDU0lEKCkuCisgKiB1Y252X2dldENDU0lEKCkgd2lsbCByZXR1cm4gdGhl
IHNhbWUgQ0NTSUQgZm9yIGFsbCBjb252ZXJzaW9uIHRhYmxlcyB0aGF0IGFyZSBhc3NvY2lhdGVk
CisgKiB3aXRoIHRoYXQgQ0NTSUQuCisgKgorICogQ3VycmVudGx5LCB0aGUgb25seSAicGxhdGZv
cm0iIHN1cHBvcnRlZCBpbiB0aGUgSUNVIGNvbnZlcnRlciBBUEkgaXMgVUNOVl9JQk0uCisgKgor
ICogSW4gc3VtbWFyeSwgdGhlIHVzZSBvZiBDQ1NJRHMgYW5kIHRoZSBhc3NvY2lhdGVkIEFQSSBm
dW5jdGlvbnMgaXMgbm90IHJlY29tbWVuZGVkLgorICoKKyAqIEluIG9yZGVyIHRvIG9wZW4gYSBj
b252ZXJ0ZXIgd2l0aCB0aGUgZGVmYXVsdCBJQk0gQ0RSQSBVbmljb2RlIGNvbnZlcnNpb24gdGFi
bGUsCisgKiB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIG9yIHVzZSB0aGUgcHJlZml4ICJpYm0t
IjoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBuYW1lWzIwXTsKKyAqICAgICBzcHJpbnRmKG5hbWUs
ICJpYm0tJWh1IiwgY2NzaWQpOworICogICAgIGNudj11Y252X29wZW4obmFtZSwgJmVycm9yQ29k
ZSk7CisgKiBcZW5kY29kZQorICoKKyAqIEluIG9yZGVyIHRvIG9wZW4gYSBjb252ZXJ0ZXIgd2l0
aCB0aGUgSUJNIFMvMzkwIFVuaXggU3lzdGVtIFNlcnZpY2VzIHZhcmlhbnQKKyAqIG9mIGEgVW5p
Y29kZS9FQkNESUMgY29udmVyc2lvbiB0YWJsZSwKKyAqIHlvdSBjYW4gdXNlIHRoZSBwcmVmaXgg
ImlibS0iIHRvZ2V0aGVyIHdpdGggdGhlIG9wdGlvbiBzdHJpbmcgVUNOVl9TV0FQX0xGTkxfT1BU
SU9OX1NUUklORzoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBuYW1lWzIwXTsKKyAqICAgICBzcHJp
bnRmKG5hbWUsICJpYm0tJWh1IiBVQ05WX1NXQVBfTEZOTF9PUFRJT05fU1RSSU5HLCBjY3NpZCk7
CisgKiAgICAgY252PXVjbnZfb3BlbihuYW1lLCAmZXJyb3JDb2RlKTsKKyAqIFxlbmRjb2RlCisg
KgorICogSW4gb3JkZXIgdG8gb3BlbiBhIGNvbnZlcnRlciBmcm9tIGEgTWljcm9zb2Z0IGNvZGVw
YWdlIG51bWJlciwgdXNlIHRoZSBwcmVmaXggImNwIjoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBu
YW1lWzIwXTsKKyAqICAgICBzcHJpbnRmKG5hbWUsICJjcCVodSIsIGNvZGVwYWdlSUQpOworICog
ICAgIGNudj11Y252X29wZW4obmFtZSwgJmVycm9yQ29kZSk7CisgKiBcZW5kY29kZQorICoKKyAq
IElmIHRoZSBhbGlhcyBpcyBhbWJpZ3VvdXMsIHRoZW4gdGhlIHByZWZlcnJlZCBjb252ZXJ0ZXIg
aXMgdXNlZAorICogYW5kIHRoZSBzdGF0dXMgaXMgc2V0IHRvIFVfQU1CSUdVT1VTX0FMSUFTX1dB
Uk5JTkcuCisgKgorICogQHBhcmFtIGNvZGVwYWdlIGNvZGVwYWdlIG51bWJlciB0byBjcmVhdGUK
KyAqIEBwYXJhbSBwbGF0Zm9ybSB0aGUgcGxhdGZvcm0gaW4gd2hpY2ggdGhlIGNvZGVwYWdlIG51
bWJlciBleGlzdHMKKyAqIEBwYXJhbSBlcnIgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExP
Q0FUSU9OX0VSUk9SLCBVX0ZJTEVfQUNDRVNTX0VSUk9SPC9UVD4KKyAqIEByZXR1cm4gdGhlIGNy
ZWF0ZWQgVW5pY29kZSBjb252ZXJ0ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwvVFQ+IGlmIGFuIGVy
cm9yCisgKiAgIG9jY3VyZWQuCisgKiBAc2VlIHVjbnZfb3BlbgorICogQHNlZSB1Y252X29wZW5V
CisgKiBAc2VlIHVjbnZfY2xvc2UKKyAqIEBzZWUgdWNudl9nZXRDQ1NJRAorICogQHNlZSB1Y252
X2dldFBsYXRmb3JtCisgKiBAc2VlIFVDb252ZXJ0ZXJQbGF0Zm9ybQorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIqIFVfRVhQT1JUMgordWNudl9vcGVuQ0NTSUQo
aW50MzJfdCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJQbGF0Zm9ybSBwbGF0
Zm9ybSwKKyAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIDxwPkNy
ZWF0ZXMgYSBVQ29udmVydGVyIG9iamVjdCBzcGVjaWZpZWQgZnJvbSBhIHBhY2thZ2VOYW1lIGFu
ZCBhIGNvbnZlcnRlck5hbWUuPC9wPgorICogCisgKiA8cD5UaGUgcGFja2FnZU5hbWUgYW5kIGNv
bnZlcnRlck5hbWUgbXVzdCBwb2ludCB0byBhbiBJQ1UgdWRhdGEgb2JqZWN0LCBhcyBkZWZpbmVk
IGJ5CisgKiAgIDxjb2RlPiB1ZGF0YV9vcGVuKCBwYWNrYWdlTmFtZSwgImNudiIsIGNvbnZlcnRl
ck5hbWUsIGVycikgPC9jb2RlPiBvciBlcXVpdmFsZW50LgorICogVHlwaWNhbGx5LCBwYWNrYWdl
TmFtZSB3aWxsIHJlZmVyIHRvIGEgKC5kYXQpIGZpbGUsIG9yIHRvIGEgcGFja2FnZSByZWdpc3Rl
cmVkIHdpdGgKKyAqIHVkYXRhX3NldEFwcERhdGEoKS48L3A+CisgKiAKKyAqIDxwPlRoZSBuYW1l
IHdpbGwgTk9UIGJlIGxvb2tlZCB1cCBpbiB0aGUgYWxpYXMgbWVjaGFuaXNtLCBub3Igd2lsbCB0
aGUgY29udmVydGVyIGJlCisgKiBzdG9yZWQgaW4gdGhlIGNvbnZlcnRlciBjYWNoZSBvciB0aGUg
YWxpYXMgdGFibGUuIFRoZSBvbmx5IHdheSB0byBvcGVuIGZ1cnRoZXIgY29udmVydGVycworICog
aXMgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzLCBvciB1c2UgdGhlIHVjbnZfc2Fm
ZUNsb25lKCkgZnVuY3Rpb24gdG8gY2xvbmUgYSAKKyAqICdtYXN0ZXInIGNvbnZlcnRlci48L3A+
CisgKgorICogPHA+QSBmdXR1cmUgdmVyc2lvbiBvZiBJQ1UgbWF5IGFkZCBhbGlhcyB0YWJsZSBs
b29rdXBzIGFuZC9vciBjYWNoaW5nCisgKiB0byB0aGlzIGZ1bmN0aW9uLjwvcD4KKyAqIAorICog
PHA+RXhhbXBsZSBVc2U6CisgKiAgICAgIDxjb2RlPmNudiA9IHVjbnZfb3BlblBhY2thZ2UoIm15
YXBwIiwgIm15Y29udmVydGVyIiwgJmVycik7PC9jb2RlPgorICogPC9wPgorICoKKyAqIEBwYXJh
bSBwYWNrYWdlTmFtZSBuYW1lIG9mIHRoZSBwYWNrYWdlIChlcXVpdmFsZW50IHRvICdwYXRoJyBp
biB1ZGF0YV9vcGVuKCkgY2FsbCkKKyAqIEBwYXJhbSBjb252ZXJ0ZXJOYW1lIG5hbWUgb2YgdGhl
IGRhdGEgaXRlbSB0byBiZSB1c2VkLCB3aXRob3V0IHN1ZmZpeC4KKyAqIEBwYXJhbSBlcnIgb3V0
Z29pbmcgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SLCBVX0ZJTEVf
QUNDRVNTX0VSUk9SPC9UVD4KKyAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgVW5pY29kZSBjb252ZXJ0
ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwvVFQ+IGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqIEBzZWUg
dWRhdGFfb3BlbgorICogQHNlZSB1Y252X29wZW4KKyAqIEBzZWUgdWNudl9zYWZlQ2xvbmUKKyAq
IEBzZWUgdWNudl9jbG9zZQorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIFVDb252
ZXJ0ZXIqIFVfRVhQT1JUMiAKK3VjbnZfb3BlblBhY2thZ2UoY29uc3QgY2hhciAqcGFja2FnZU5h
bWUsIGNvbnN0IGNoYXIgKmNvbnZlcnRlck5hbWUsIFVFcnJvckNvZGUgKmVycik7CisKKy8qKgor
ICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24KKyAqIEBwYXJhbSBjbnYgY29udmVydGVy
IHRvIGJlIGNsb25lZAorICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNl
IGZvciB0aGUgbmV3IGNsb25lLiBJZiBOVUxMIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQu
IAorICogIElmIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoLCBuZXcgbWVtb3J5IHdpbGwgYmUg
YWxsb2NhdGVkLgorICogIENsaWVudHMgY2FuIHVzZSB0aGUgVV9DTlZfU0FGRUNMT05FX0JVRkZF
UlNJWkUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSBlbm91Z2ggdG8gYXZvaWQgbWVtb3J5IGFsbG9j
YXRpb25zLgorICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0
ZWQgc3BhY2UuIAorICogIElmICpwQnVmZmVyU2l6ZSA9PSAwLCBhIHN1ZmZpY2llbnQgc2l6ZSBm
b3IgdXNlIGluIGNsb25pbmcgd2lsbCAKKyAqICBiZSByZXR1cm5lZCAoJ3ByZS1mbGlnaHRpbmcn
KQorICogIElmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNh
ZmUgY2xvbmUsIAorICogIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuCisgKiBAcGFyYW0g
c3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5
IG9yIHRoZXJlIHdlcmUgZXJyb3JzCisgKiAgQW4gaW5mb3JtYXRpb25hbCBzdGF0dXMgdmFsdWUs
IFVfU0FGRUNMT05FX0FMTE9DQVRFRF9FUlJPUiwgaXMgdXNlZCBpZiBhbnkgYWxsb2NhdGlvbnMg
d2VyZSBuZWNlc3NhcnkuCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5ldyBjbG9uZQorICog
QHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIgKiBVX0VYUE9SVDIgCit1
Y252X3NhZmVDbG9uZShjb25zdCBVQ29udmVydGVyICpjbnYsIAorICAgICAgICAgICAgICAgdm9p
ZCAgICAgICAgICAgICAqc3RhY2tCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQzMl90ICAgICAg
ICAgICpwQnVmZmVyU2l6ZSwgCisgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICpzdGF0
dXMpOworCisvKioKKyAqIFxkZWYgVV9DTlZfU0FGRUNMT05FX0JVRkZFUlNJWkUKKyAqIERlZmlu
aXRpb24gb2YgYSBidWZmZXIgc2l6ZSB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIGxhcmdlIGVub3Vn
aCBmb3IKKyAqIGNvbnZlcnRlcnMgdG8gYmUgY2xvbmVkIHdpdGggdWNudl9zYWZlQ2xvbmUoKS4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVfQ05WX1NBRkVDTE9ORV9CVUZGRVJT
SVpFICAxMDI0CisKKy8qKgorICogRGVsZXRlcyB0aGUgdW5pY29kZSBjb252ZXJ0ZXIgYW5kIHJl
bGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkCisgKiB3aXRoIGp1c3QgdGhpcyBpbnN0YW5jZS4K
KyAqIERvZXMgbm90IGZyZWUgdXAgc2hhcmVkIGNvbnZlcnRlciB0YWJsZXMuCisgKgorICogQHBh
cmFtIGNvbnZlcnRlciB0aGUgY29udmVydGVyIG9iamVjdCB0byBiZSBkZWxldGVkCisgKiBAc2Vl
IHVjbnZfb3BlbgorICogQHNlZSB1Y252X29wZW5VCisgKiBAc2VlIHVjbnZfb3BlbkNDU0lECisg
KiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCAgVV9FWFBPUlQyCit1Y252X2Ns
b3NlKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIpOworCisvKioKKyAqIEZpbGxzIGluIHRoZSBvdXRw
dXQgcGFyYW1ldGVyLCBzdWJDaGFycywgd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMK
KyAqIGFzIG11bHRpcGxlIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNv
ZGUgY29udmVydGVyCisgKiBAcGFyYW0gc3ViQ2hhcnMgdGhlIHN1YnNpdHV0aW9uIGNoYXJhY3Rl
cnMKKyAqIEBwYXJhbSBsZW4gb24gaW5wdXQgdGhlIGNhcGFjaXR5IG9mIHN1YkNoYXJzLCBvbiBv
dXRwdXQgdGhlIG51bWJlciAKKyAqIG9mIGJ5dGVzIGNvcGllZCB0byBpdAorICogQHBhcmFtICBl
cnIgdGhlIG91dGdvaW5nIGVycm9yIHN0YXR1cyBjb2RlLgorICogSWYgdGhlIHN1YnN0aXR1dGlv
biBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNtYWxsLCBhbgorICogPFRUPlVfSU5ERVhfT1VUT0ZC
T1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJldHVybmVkLgorICogQHNlZSB1Y252X3NldFN1YnN0
Q2hhcnMKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgor
dWNudl9nZXRTdWJzdENoYXJzKGNvbnN0IFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAg
ICAgICAgICAgICBjaGFyICpzdWJDaGFycywKKyAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmxl
biwKKyAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIFNldHMg
dGhlIHN1YnN0aXR1dGlvbiBjaGFycyB3aGVuIGNvbnZlcnRpbmcgZnJvbSB1bmljb2RlIHRvIGEg
Y29kZXBhZ2UuIFRoZQorICogc3Vic3RpdHV0aW9uIGlzIHNwZWNpZmllZCBhcyBhIHN0cmluZyBv
ZiAxLTQgYnl0ZXMsIGFuZCBtYXkgY29udGFpbgorICogIDxUVD5OVUxMPC9UVD4gYnl0ZS4KKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gc3ViQ2hh
cnMgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYnl0ZSBzZXF1ZW5jZSB3ZSB3YW50IHNldAor
ICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHN1YkNoYXJzCisgKiBAcGFyYW0g
ZXJyIHRoZSBlcnJvciBzdGF0dXMgY29kZS4gIDxUVD5VX0lOREVYX09VVE9GQk9VTkRTX0VSUk9S
IDwvVFQ+IGlmCisgKiBsZW4gaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5
dGVzIGFsbG93ZWQgaW4gc3ViY2hhcnMKKyAqIEBzZWUgdWNudl9nZXRTdWJzdENoYXJzCisgKiBA
c3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKK3VjbnZfc2V0U3Vi
c3RDaGFycyhVQ29udmVydGVyICpjb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3Qg
Y2hhciAqc3ViQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgaW50OF90IGxlbiwKKyAgICAgICAg
ICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIEZpbGxzIGluIHRoZSBvdXRw
dXQgcGFyYW1ldGVyLCBlcnJCeXRlcywgd2l0aCB0aGUgZXJyb3IgY2hhcmFjdGVycyBmcm9tIHRo
ZQorICogbGFzdCBmYWlsaW5nIGNvbnZlcnNpb24uCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0
aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBlcnJCeXRlcyB0aGUgY29kZXBhZ2UgYnl0
ZXMgd2hpY2ggd2VyZSBpbiBlcnJvcgorICogQHBhcmFtIGxlbiBvbiBpbnB1dCB0aGUgY2FwYWNp
dHkgb2YgZXJyQnl0ZXMsIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mCisgKiAgYnl0ZXMgd2hpY2gg
d2VyZSBjb3BpZWQgdG8gaXQKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1cyBjb2RlLgor
ICogSWYgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNtYWxsLCBhbgor
ICogPFRUPlVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJldHVybmVkLgor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X2dl
dEludmFsaWRDaGFycyhjb25zdCBVQ29udmVydGVyICpjb252ZXJ0ZXIsCisgICAgICAgICAgICAg
ICAgICAgICBjaGFyICplcnJCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqbGVu
LAorICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBGaWxs
cyBpbiB0aGUgb3V0cHV0IHBhcmFtZXRlciwgZXJyQ2hhcnMsIHdpdGggdGhlIGVycm9yIGNoYXJh
Y3RlcnMgZnJvbSB0aGUKKyAqIGxhc3QgZmFpbGluZyBjb252ZXJzaW9uLgorICoKKyAqIEBwYXJh
bSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gZXJyVUNoYXJzIHRo
ZSBVQ2hhcnMgd2hpY2ggd2VyZSBpbiBlcnJvcgorICogQHBhcmFtIGxlbiBvbiBpbnB1dCB0aGUg
Y2FwYWNpdHkgb2YgZXJyVUNoYXJzLCBvbiBvdXRwdXQgdGhlIG51bWJlciBvZiAKKyAqICBVQ2hh
cnMgd2hpY2ggd2VyZSBjb3BpZWQgdG8gaXQKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1
cyBjb2RlLgorICogSWYgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNt
YWxsLCBhbgorICogPFRUPlVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJl
dHVybmVkLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQy
Cit1Y252X2dldEludmFsaWRVQ2hhcnMoY29uc3QgVUNvbnZlcnRlciAqY29udmVydGVyLAorICAg
ICAgICAgICAgICAgICAgICAgIFVDaGFyICplcnJVQ2hhcnMsCisgICAgICAgICAgICAgICAgICAg
ICAgaW50OF90ICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsK
KworLyoqCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIGEgY29udmVydGVyIHRvIHRoZSBkZWZhdWx0
IHN0YXRlLiBUaGlzIGlzIHVzZWQKKyAqIGluIHRoZSBjYXNlIG9mIGFuIGVycm9yLCB0byByZXN0
YXJ0IGEgY29udmVyc2lvbiBmcm9tIGEga25vd24gZGVmYXVsdCBzdGF0ZS4KKyAqIEl0IHdpbGwg
YWxzbyBlbXB0eSB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMuCisgKiBAcGFyYW0gY29udmVy
dGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RB
QkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X3Jlc2V0KFVDb252ZXJ0ZXIgKmNvbnZlcnRlcik7CisK
Ky8qKgorICogUmVzZXRzIHRoZSB0by1Vbmljb2RlIHBhcnQgb2YgYSBjb252ZXJ0ZXIgc3RhdGUg
dG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4g
ZXJyb3IgdG8gcmVzdGFydCBhIGNvbnZlcnNpb24gdG8KKyAqIFVuaWNvZGUgdG8gYSBrbm93biBk
ZWZhdWx0IHN0YXRlLiBJdCB3aWxsIGFsc28gZW1wdHkgdGhlIGludGVybmFsCisgKiBvdXRwdXQg
YnVmZmVycyB1c2VkIGZvciB0aGUgY29udmVyc2lvbiB0byBVbmljb2RlIGNvZGVwb2ludHMuCisg
KiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIAordWNudl9yZXNldFRvVW5pY29kZShV
Q29udmVydGVyICpjb252ZXJ0ZXIpOworCisvKioKKyAqIFJlc2V0cyB0aGUgZnJvbS1Vbmljb2Rl
IHBhcnQgb2YgYSBjb252ZXJ0ZXIgc3RhdGUgdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgKiBUaGlz
IGlzIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3IgdG8gcmVzdGFydCBhIGNvbnZlcnNpb24g
ZnJvbQorICogVW5pY29kZSB0byBhIGtub3duIGRlZmF1bHQgc3RhdGUuIEl0IHdpbGwgYWxzbyBl
bXB0eSB0aGUgaW50ZXJuYWwgb3V0cHV0CisgKiBidWZmZXJzIHVzZWQgZm9yIHRoZSBjb252ZXJz
aW9uIGZyb20gVW5pY29kZSBjb2RlcG9pbnRzLgorICogQHBhcmFtIGNvbnZlcnRlciB0aGUgVW5p
Y29kZSBjb252ZXJ0ZXIKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVf
RVhQT1JUMiAKK3VjbnZfcmVzZXRGcm9tVW5pY29kZShVQ29udmVydGVyICpjb252ZXJ0ZXIpOwor
CisvKioKKyAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIG91
dHB1dCBwZXIgVUNoYXIgaW4gY29udmVyc2lvbgorICogZnJvbSBVbmljb2RlIHVzaW5nIHRoaXMg
Y29udmVydGVyLgorICogVGhlIHJldHVybmVkIG51bWJlciBjYW4gYmUgdXNlZCB3aXRoIFVDTlZf
R0VUX01BWF9CWVRFU19GT1JfU1RSSU5HCisgKiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSB0
YXJnZXQgYnVmZmVyIGZvciBjb252ZXJzaW9uIGZyb20gVW5pY29kZS4KKyAqCisgKiBOb3RlOiBC
ZWZvcmUgSUNVIDIuOCwgdGhpcyBmdW5jdGlvbiBkaWQgbm90IHJldHVybiByZWxpYWJsZSBudW1i
ZXJzIGZvcgorICogc29tZSBzdGF0ZWZ1bCBjb252ZXJ0ZXJzIChFQkNESUNfU1RBVEVGVUwsIElT
Ty0yMDIyKSBhbmQgTE1CQ1MuCisgKgorICogVGhpcyBudW1iZXIgbWF5IG5vdCBiZSB0aGUgc2Ft
ZSBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyCisgKiAiY29udmVyc2lvbiB1bml0
Ii4gSW4gb3RoZXIgd29yZHMsIGl0IG1heSBub3QgYmUgdGhlIGludHVpdGl2ZWx5IGV4cGVjdGVk
CisgKiBudW1iZXIgb2YgYnl0ZXMgcGVyIGNoYXJhY3RlciB0aGF0IHdvdWxkIGJlIHB1Ymxpc2hl
ZCBmb3IgYSBjaGFyc2V0LAorICogYW5kIG1heSBub3QgZnVsZmlsbCBhbnkgb3RoZXIgcHVycG9z
ZSB0aGFuIHRoZSBhbGxvY2F0aW9uIG9mIGFuIG91dHB1dAorICogYnVmZmVyIG9mIGd1YXJhbnRl
ZWQgc3VmZmljaWVudCBzaXplIGZvciBhIGdpdmVuIGlucHV0IGxlbmd0aCBhbmQgY29udmVydGVy
LgorICoKKyAqIEV4YW1wbGVzIGZvciBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIHRha2VuIGludG8g
YWNjb3VudDoKKyAqIC0gU3VwcGxlbWVudGFyeSBjb2RlIHBvaW50cyBtYXkgY29udmVydCB0byBt
b3JlIGJ5dGVzIHRoYW4gQk1QIGNvZGUgcG9pbnRzLgorICogICBUaGlzIGZ1bmN0aW9uIHJldHVy
bnMgYnl0ZXMgcGVyIFVDaGFyIChVVEYtMTYgY29kZSB1bml0KSwgbm90IHBlcgorICogICBVbmlj
b2RlIGNvZGUgcG9pbnQsIGZvciBlZmZpY2llbnQgYnVmZmVyIGFsbG9jYXRpb24uCisgKiAtIFN0
YXRlLXNoaWZ0aW5nIG91dHB1dCAoU0kvU08sIGVzY2FwZXMsIGV0Yy4pIGZyb20gc3RhdGVmdWwg
Y29udmVydGVycy4KKyAqIC0gV2hlbiBtIGlucHV0IFVDaGFycyBhcmUgY29udmVydGVkIHRvIG4g
b3V0cHV0IGJ5dGVzLCB0aGVuIHRoZSBtYXhpbXVtIG0vbgorICogICBpcyB0YWtlbiBpbnRvIGFj
Y291bnQuCisgKgorICogVGhlIG51bWJlciByZXR1cm5lZCBoZXJlIGRvZXMgbm90IHRha2UgaW50
byBhY2NvdW50CisgKiAoc2VlIFVDTlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKToKKyAqIC0g
Y2FsbGJhY2tzIHdoaWNoIG91dHB1dCBtb3JlIHRoYW4gb25lIGNoYXJzZXQgY2hhcmFjdGVyIHNl
cXVlbmNlIHBlciBjYWxsLAorICogICBsaWtlIGVzY2FwZSBjYWxsYmFja3MKKyAqIC0gaW5pdGlh
bCBhbmQgZmluYWwgbm9uLWNoYXJhY3RlciBieXRlcyB0aGF0IGFyZSBvdXRwdXQgYnkgc29tZSBj
b252ZXJ0ZXJzCisgKiAgIChhdXRvbWF0aWMgQk9NcywgaW5pdGlhbCBlc2NhcGUgc2VxdWVuY2Us
IGZpbmFsIFNJLCBldGMuKQorICoKKyAqIEV4YW1wbGVzIGZvciByZXR1cm5lZCB2YWx1ZXM6Cisg
KiAtIFNCQ1MgY2hhcnNldHM6IDEKKyAqIC0gU2hpZnQtSklTOiAyCisgKiAtIFVURi0xNjogMiAo
MiBwZXIgQk1QLCA0IHBlciBzdXJyb2dhdGUgX3BhaXJfLCBCT00gbm90IGNvdW50ZWQpCisgKiAt
IFVURi04OiAzICgzIHBlciBCTVAsIDQgcGVyIHN1cnJvZ2F0ZSBfcGFpcl8pCisgKiAtIEVCQ0RJ
Q19TVEFURUZVTCAoRUJDRElDIG1peGVkIFNCQ1MvREJDUyk6IDMgKFNPICsgREJDUykKKyAqIC0g
SVNPLTIwMjI6IDMgKGFsd2F5cyBvdXRwdXRzIFVURi04KQorICogLSBJU08tMjAyMi1KUDogNiAo
NC1ieXRlIGVzY2FwZSBzZXF1ZW5jZXMgKyBEQkNTKQorICogLSBJU08tMjAyMi1DTjogOCAoNC1i
eXRlIGRlc2lnbmF0b3Igc2VxdWVuY2VzICsgMi1ieXRlIFNTMi9TUzMgKyBEQkNTKQorICoKKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgVGhlIFVuaWNvZGUgY29udmVydGVyLgorICogQHJldHVybiBUaGUg
bWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIFVDaGFyIHRoYXQgYXJlIG91dHB1dCBieSB1Y252
X2Zyb21Vbmljb2RlKCksCisgKiAgICAgICAgIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBVQ05W
X0dFVF9NQVhfQllURVNfRk9SX1NUUklORyBmb3IgYnVmZmVyIGFsbG9jYXRpb24uCisgKgorICog
QHNlZSBVQ05WX0dFVF9NQVhfQllURVNfRk9SX1NUUklORworICogQHNlZSB1Y252X2dldE1pbkNo
YXJTaXplCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgaW50OF90IFVfRVhQT1JU
MgordWNudl9nZXRNYXhDaGFyU2l6ZShjb25zdCBVQ29udmVydGVyICpjb252ZXJ0ZXIpOworCisj
aWZuZGVmIFVfSElERV9EUkFGVF9BUEkKKworLyoqCisgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9m
IGEgYnVmZmVyIGZvciBjb252ZXJzaW9uIGZyb20gVW5pY29kZSB0byBhIGNoYXJzZXQuCisgKiBU
aGUgY2FsY3VsYXRlZCBzaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VmZmljaWVudCBmb3IgdGhp
cyBjb252ZXJzaW9uLgorICoKKyAqIEl0IHRha2VzIGludG8gYWNjb3VudCBpbml0aWFsIGFuZCBm
aW5hbCBub24tY2hhcmFjdGVyIGJ5dGVzIHRoYXQgYXJlIG91dHB1dAorICogYnkgc29tZSBjb252
ZXJ0ZXJzLgorICogSXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgY2FsbGJhY2tzIHdoaWNo
IG91dHB1dCBtb3JlIHRoYW4gb25lIGNoYXJzZXQKKyAqIGNoYXJhY3RlciBzZXF1ZW5jZSBwZXIg
Y2FsbCwgbGlrZSBlc2NhcGUgY2FsbGJhY2tzLgorICogVGhlIGRlZmF1bHQgKHN1YnN0aXR1dGlv
bikgY2FsbGJhY2sgb25seSBvdXRwdXRzIG9uZSBjaGFyc2V0IGNoYXJhY3RlciBzZXF1ZW5jZS4K
KyAqCisgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBVQ2hhcnMgdG8gYmUgY29udmVydGVkLgor
ICogQHBhcmFtIG1heENoYXJTaXplIFJldHVybiB2YWx1ZSBmcm9tIHVjbnZfZ2V0TWF4Q2hhclNp
emUoKSBmb3IgdGhlIGNvbnZlcnRlcgorICogICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBi
ZSB1c2VkLgorICogQHJldHVybiBTaXplIG9mIGEgYnVmZmVyIHRoYXQgd2lsbCBiZSBsYXJnZSBl
bm91Z2ggdG8gaG9sZCB0aGUgb3V0cHV0IGJ5dGVzIG9mCisgKiAgICAgICAgIGNvbnZlcnRpbmcg
bGVuZ3RoIFVDaGFycyB3aXRoIHRoZSBjb252ZXJ0ZXIgdGhhdCByZXR1cm5lZCB0aGUgbWF4Q2hh
clNpemUuCisgKgorICogQHNlZSB1Y252X2dldE1heENoYXJTaXplCisgKiBAZHJhZnQgSUNVIDIu
OAorICovCisjZGVmaW5lIFVDTlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKGxlbmd0aCwgbWF4
Q2hhclNpemUpIFwKKyAgICAgKCgoaW50MzJfdCkobGVuZ3RoKSsxMCkqKGludDMyX3QpKG1heENo
YXJTaXplKSkKKworI2VuZGlmIC8qVV9ISURFX0RSQUZUX0FQSSovCisKKy8qKgorICogUmV0dXJu
cyB0aGUgbWluaW11bSBieXRlIGxlbmd0aCBmb3IgY2hhcmFjdGVycyBpbiB0aGlzIGNvZGVwYWdl
LiAKKyAqIFRoaXMgaXMgdXN1YWxseSBlaXRoZXIgMSBvciAyLgorICogQHBhcmFtIGNvbnZlcnRl
ciB0aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEByZXR1cm4gdGhlIG1pbmltdW0gbnVtYmVyIG9m
IGJ5dGVzIGFsbG93ZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIGNvbnZlcnRlcgorICogQHNlZSB1Y252
X2dldE1heENoYXJTaXplCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgaW50OF90
IFVfRVhQT1JUMgordWNudl9nZXRNaW5DaGFyU2l6ZShjb25zdCBVQ29udmVydGVyICpjb252ZXJ0
ZXIpOworCisvKioKKyAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29udmVydGVy
IHBhc3NlZCBpbiBiYXNlZCBvbiB0aGUgTG9jYWxlIAorICogcGFzc2VkIGluLiBJZiB0aGUgbG9j
YWxlIGNvbnRhaW5zIG5vIGRpc3BsYXkgbmFtZSwgdGhlIGludGVybmFsIEFTQ0lJCisgKiBuYW1l
IHdpbGwgYmUgZmlsbGVkIGluLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUg
Y29udmVydGVyLgorICogQHBhcmFtIGRpc3BsYXlMb2NhbGUgaXMgdGhlIHNwZWNpZmljIExvY2Fs
ZSB3ZSB3YW50IHRvIGxvY2FsaXNlZCBmb3IKKyAqIEBwYXJhbSBkaXNwbGF5TmFtZSB1c2VyIHBy
b3ZpZGVkIGJ1ZmZlciB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBkaXNwbGF5TmFtZUNhcGFj
aXR5IHNpemUgb2YgZGlzcGxheU5hbWUgQnVmZmVyCisgKiBAcGFyYW0gZXJyIGVycm9yIHN0YXR1
cyBjb2RlCisgKiBAcmV0dXJuIGRpc3BsYXlOYW1lTGVuZ3RoIG51bWJlciBvZiBVQ2hhciBuZWVk
ZWQgaW4gZGlzcGxheU5hbWUKKyAqIEBzZWUgdWNudl9nZXROYW1lCisgKiBAc3RhYmxlIElDVSAy
LjAKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfZ2V0RGlzcGxheU5hbWUo
Y29uc3QgVUNvbnZlcnRlciAqY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBj
aGFyICpkaXNwbGF5TG9jYWxlLAorICAgICAgICAgICAgICAgICAgICBVQ2hhciAqZGlzcGxheU5h
bWUsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcGxheU5hbWVDYXBhY2l0eSwKKyAg
ICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIHRoZSBp
bnRlcm5hbCwgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGNvbnZlcnRlciAoemVyby10ZXJtaW5hdGVk
KS4KKyAqIFRoZSBsaWZldGltZSBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgYmUgdGhhdCBv
ZiB0aGUgY29udmVydGVyIAorICogcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgKiBAcGFyYW0g
Y29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIGVyciBVRXJyb3JDb2Rl
IHN0YXR1cworICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY29udmVydGVyCisg
KiBAc2VlIHVjbnZfZ2V0RGlzcGxheU5hbWUKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NU
QUJMRSBjb25zdCBjaGFyICogVV9FWFBPUlQyIAordWNudl9nZXROYW1lKGNvbnN0IFVDb252ZXJ0
ZXIgKmNvbnZlcnRlciwgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIGEgY29kZXBh
Z2UgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udmVydGVyLiBUaGlzIGlzIG5vdCBndWFy
YW50ZWVkCisgKiB0byBiZSB0aGUgb25lIHVzZWQgdG8gY3JlYXRlIHRoZSBjb252ZXJ0ZXIuIFNv
bWUgY29udmVydGVycyBkbyBub3QgcmVwcmVzZW50CisgKiBwbGF0Zm9ybSByZWdpc3RlcmVkIGNv
ZGVwYWdlcyBhbmQgcmV0dXJuIHplcm8gZm9yIHRoZSBjb2RlcGFnZSBudW1iZXIuCisgKiBUaGUg
ZXJyb3IgY29kZSBmaWxsLWluIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIGNvZGVwYWdlIG51
bWJlcgorICogaXMgYXZhaWxhYmxlLgorICogRG9lcyBub3QgY2hlY2sgaWYgdGhlIGNvbnZlcnRl
ciBpcyA8VFQ+TlVMTDwvVFQ+IG9yIGlmIGNvbnZlcnRlcidzIGRhdGEKKyAqIHRhYmxlIGlzIDxU
VD5OVUxMPC9UVD4uCisgKgorICogSW1wb3J0YW50OiBUaGUgdXNlIG9mIENDU0lEcyBpcyBub3Qg
cmVjb21tZW5kZWQgYmVjYXVzZSBpdCBpcyBsaW1pdGVkCisgKiB0byBvbmx5IHR3byBwbGF0Zm9y
bXMgaW4gcHJpbmNpcGxlIGFuZCBvbmx5IG9uZSAoVUNOVl9JQk0pIGluIHRoZSBjdXJyZW50Cisg
KiBJQ1UgY29udmVydGVyIEFQSS4KKyAqIEFsc28sIENDU0lEcyBhcmUgaW5zdWZmaWNpZW50IHRv
IGlkZW50aWZ5IElCTSBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIHByZWNpc2VseS4KKyAqIEZv
ciBtb3JlIGRldGFpbHMgc2VlIHVjbnZfb3BlbkNDU0lEKCkuCisgKgorICogQHBhcmFtIGNvbnZl
cnRlciB0aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1
cyBjb2RlLgorICogQHJldHVybiBJZiBhbnkgZXJyb3Igb2NjdXJycywgLTEgd2lsbCBiZSByZXR1
cm5lZCBvdGhlcndpc2UsIHRoZSBjb2RlcGFnZSBudW1iZXIKKyAqIHdpbGwgYmUgcmV0dXJuZWQK
KyAqIEBzZWUgdWNudl9vcGVuQ0NTSUQKKyAqIEBzZWUgdWNudl9nZXRQbGF0Zm9ybQorICogQHN0
YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyCit1Y252X2dldEND
U0lEKGNvbnN0IFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAgICAgICAgVUVycm9yQ29k
ZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIGEgY29kZXBhZ2UgcGxhdGZvcm0gYXNzb2NpYXRlZCB3
aXRoIHRoZSBjb252ZXJ0ZXIuIEN1cnJlbnRseSwgCisgKiBvbmx5IDxUVD5VQ05WX0lCTTwvVFQ+
IHdpbGwgYmUgcmV0dXJuZWQuCisgKiBEb2VzIG5vdCB0ZXN0IGlmIHRoZSBjb252ZXJ0ZXIgaXMg
PFRUPk5VTEw8L1RUPiBvciBpZiBjb252ZXJ0ZXIncyBkYXRhIAorICogdGFibGUgaXMgPFRUPk5V
TEw8L1RUPi4gCisgKiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICog
QHBhcmFtIGVyciB0aGUgZXJyb3Igc3RhdHVzIGNvZGUuCisgKiBAcmV0dXJuIFRoZSBjb2RlcGFn
ZSBwbGF0Zm9ybQorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXJQ
bGF0Zm9ybSBVX0VYUE9SVDIKK3VjbnZfZ2V0UGxhdGZvcm0oY29uc3QgVUNvbnZlcnRlciAqY29u
dmVydGVyLAorICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIEdl
dHMgdGhlIHR5cGUgb2YgdGhlIGNvbnZlcnRlcgorICogZS5nLiBTQkNTLCBNQkNTLCBEQkNTLCBV
VEY4LCBVVEYxNl9CRSwgVVRGMTZfTEUsIElTT18yMDIyLCAKKyAqIEVCQ0RJQ19TVEFURUZVTCwg
TEFUSU5fMQorICogQHBhcmFtIGNvbnZlcnRlciBhIHZhbGlkLCBvcGVuZWQgY29udmVydGVyCisg
KiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBjb252ZXJ0ZXIKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSBVQ29udmVydGVyVHlwZSBVX0VYUE9SVDIKK3VjbnZfZ2V0VHlwZShjb25z
dCBVQ29udmVydGVyICogY29udmVydGVyKTsKKworLyoqCisgKiBHZXRzIHRoZSAic3RhcnRlciIg
KGxlYWQpIGJ5dGVzIGZvciBjb252ZXJ0ZXJzIG9mIHR5cGUgTUJDUy4KKyAqIFdpbGwgZmlsbCBp
biBhbiA8VFQ+VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SPC9UVD4gaWYgY29udmVydGVyIHBhc3Nl
ZCBpbgorICogaXMgbm90IE1CQ1MuIEZpbGxzIGluIGFuIGFycmF5IG9mIHR5cGUgVUJvb2wsIHdp
dGggdGhlIHZhbHVlIG9mIHRoZSBieXRlIAorICogYXMgb2Zmc2V0IHRvIHRoZSBhcnJheS4gRm9y
IGV4YW1wbGUsIGlmIChzdGFydGVyc1sweDIwXSA9PSBUUlVFKSBhdCByZXR1cm4sCisgKiBpdCBt
ZWFucyB0aGF0IHRoZSBieXRlIDB4MjAgaXMgYSBzdGFydGVyIGJ5dGUgaW4gdGhpcyBjb252ZXJ0
ZXIuCisgKiBDb250ZXh0IHBvaW50ZXJzIGFyZSBhbHdheXMgb3duZWQgYnkgdGhlIGNhbGxlci4K
KyAqIAorICogQHBhcmFtIGNvbnZlcnRlciBhIHZhbGlkLCBvcGVuZWQgY29udmVydGVyIG9mIHR5
cGUgTUJDUworICogQHBhcmFtIHN0YXJ0ZXJzIGFuIGFycmF5IG9mIHNpemUgMjU2IHRvIGJlIGZp
bGxlZCBpbgorICogQHBhcmFtIGVyciBlcnJvciBzdGF0dXMsIDxUVD5VX0lMTEVHQUxfQVJHVU1F
TlRfRVJST1I8L1RUPiBpZiB0aGUgCisgKiBjb252ZXJ0ZXIgaXMgbm90IGEgdHlwZSB3aGljaCBj
YW4gcmV0dXJuIHN0YXJ0ZXJzLgorICogQHNlZSB1Y252X2dldFR5cGUKKyAqIEBzdGFibGUgSUNV
IDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgordWNudl9nZXRTdGFydGVycyhjb25z
dCBVQ29udmVydGVyKiBjb252ZXJ0ZXIsIAorICAgICAgICAgICAgICAgICBVQm9vbCBzdGFydGVy
c1syNTZdLAorICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlKiBlcnIpOworCisKKy8qKgorICog
U2VsZWN0b3JzIGZvciBVbmljb2RlIHNldHMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdWNudl9n
ZXRVbmljb2RlU2V0KCkuCisgKiBAc2VlIHVjbnZfZ2V0VW5pY29kZVNldAorICogQHN0YWJsZSBJ
Q1UgMi42CisgKi8KK3R5cGVkZWYgZW51bSBVQ29udmVydGVyVW5pY29kZVNldCB7CisgICAgLyoq
IFNlbGVjdCB0aGUgc2V0IG9mIHJvdW5kdHJpcHBhYmxlIFVuaWNvZGUgY29kZSBwb2ludHMuIEBz
dGFibGUgSUNVIDIuNiAqLworICAgIFVDTlZfUk9VTkRUUklQX1NFVCwKKyAgICAvKiogTnVtYmVy
IG9mIFVDb252ZXJ0ZXJVbmljb2RlU2V0IHNlbGVjdG9ycy4gQHN0YWJsZSBJQ1UgMi42ICovCisg
ICAgVUNOVl9TRVRfQ09VTlQKK30gVUNvbnZlcnRlclVuaWNvZGVTZXQ7CisKKworLyoqCisgKiBS
ZXR1cm5zIHRoZSBzZXQgb2YgVW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSBjb252ZXJ0
ZWQgYnkgYW4gSUNVIGNvbnZlcnRlci4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlv
biByZXR1cm5zIG9ubHkgb25lIGtpbmQgb2Ygc2V0IChVQ05WX1JPVU5EVFJJUF9TRVQpOgorICog
VGhlIHNldCBvZiBhbGwgVW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSByb3VuZHRyaXAt
Y29udmVydGVkCisgKiAoY29udmVydGVkIHdpdGhvdXQgYW55IGRhdGEgbG9zcykgd2l0aCB0aGUg
Y29udmVydGVyLgorICogVGhpcyBzZXQgd2lsbCBub3QgaW5jbHVkZSBjb2RlIHBvaW50cyB0aGF0
IGhhdmUgZmFsbGJhY2sgbWFwcGluZ3MKKyAqIG9yIGFyZSBvbmx5IHRoZSByZXN1bHQgb2YgcmV2
ZXJzZSBmYWxsYmFjayBtYXBwaW5ncy4KKyAqIFNlZSBVVFIgIzIyICJDaGFyYWN0ZXIgTWFwcGlu
ZyBNYXJrdXAgTGFuZ3VhZ2UiCisgKiBhdCBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMv
dHIyMi8KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IKKyAqIC0gY2hlY2tp
bmcgdGhhdCBhIHN0cmluZyBvciBkb2N1bWVudCBjYW4gYmUgcm91bmR0cmlwLWNvbnZlcnRlZCB3
aXRoIGEgY29udmVydGVyLAorICogICB3aXRob3V0L2JlZm9yZSBhY3R1YWxseSBwZXJmb3JtaW5n
IHRoZSBjb252ZXJzaW9uCisgKiAtIHRlc3RpbmcgaWYgYSBjb252ZXJ0ZXIgY2FuIGJlIHVzZWQg
Zm9yIHRleHQgZm9yIHR5cGljYWwgdGV4dCBmb3IgYSBjZXJ0YWluIGxvY2FsZSwKKyAqICAgYnkg
Y29tcGFyaW5nIGl0cyByb3VuZHRyaXAgc2V0IHdpdGggdGhlIHNldCBvZiBFeGVtcGxhckNoYXJh
Y3RlcnMgZnJvbQorICogICBJQ1UncyBsb2NhbGUgZGF0YSBvciBvdGhlciBzb3VyY2VzCisgKgor
ICogSW4gdGhlIGZ1dHVyZSwgdGhlcmUgbWF5IGJlIG1vcmUgVUNvbnZlcnRlclVuaWNvZGVTZXQg
Y2hvaWNlcyB0byBzZWxlY3QKKyAqIHNldHMgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4KKyAq
CisgKiBAcGFyYW0gY252IFRoZSBjb252ZXJ0ZXIgZm9yIHdoaWNoIGEgc2V0IGlzIHJlcXVlc3Rl
ZC4KKyAqIEBwYXJhbSBzZXRGaWxsSW4gQSB2YWxpZCBVU2V0ICouIEl0IHdpbGwgYmUgY2xlYXJl
ZCBieSB0aGlzIGZ1bmN0aW9uIGJlZm9yZQorICogICAgICAgICAgICB0aGUgY29udmVydGVyJ3Mg
c3BlY2lmaWMgc2V0IGlzIGZpbGxlZCBpbnRvIHRoZSBVU2V0LgorICogQHBhcmFtIHdoaWNoU2V0
IEEgVUNvbnZlcnRlclVuaWNvZGVTZXQgc2VsZWN0b3I7CisgKiAgICAgICAgICAgICAgY3VycmVu
dGx5IFVDTlZfUk9VTkRUUklQX1NFVCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUuCisgKiBA
cGFyYW0gcEVycm9yQ29kZSBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICogICAg
ICAgICAgICAgICAgICAgTXVzdCBmdWxmaWxsIFVfU1VDQ0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9u
IGNhbGwuCisgKgorICogQHNlZSBVQ29udmVydGVyVW5pY29kZVNldAorICogQHNlZSB1c2V0X29w
ZW4KKyAqIEBzZWUgdXNldF9jbG9zZQorICogQHN0YWJsZSBJQ1UgMi42CisgKi8KK1VfU1RBQkxF
IHZvaWQgVV9FWFBPUlQyCit1Y252X2dldFVuaWNvZGVTZXQoY29uc3QgVUNvbnZlcnRlciAqY252
LAorICAgICAgICAgICAgICAgICAgIFVTZXQgKnNldEZpbGxJbiwKKyAgICAgICAgICAgICAgICAg
ICBVQ29udmVydGVyVW5pY29kZVNldCB3aGljaFNldCwKKyAgICAgICAgICAgICAgICAgICBVRXJy
b3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IGNhbGJhY2sg
ZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIHdoZW4gYW4gaWxsZWdhbAorICogIG9yIGlu
dmFsaWQgY29kZXBhZ2Ugc2VxdWVuY2UgaXMgZm91bmQuIAorICogQ29udGV4dCBwb2ludGVycyBh
cmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0
aGUgdW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBhY3Rpb24gZmlsbGluOiByZXR1cm5zIHRo
ZSBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgKiBAcGFyYW0gY29udGV4dCBmaWxsaW46IHJl
dHVybnMgdGhlIGNhbGxiYWNrJ3MgcHJpdmF0ZSB2b2lkKiBjb250ZXh0CisgKiBAc2VlIHVjbnZf
c2V0VG9VQ2FsbEJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVf
RVhQT1JUMgordWNudl9nZXRUb1VDYWxsQmFjayAoY29uc3QgVUNvbnZlcnRlciAqIGNvbnZlcnRl
ciwKKyAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1VDYWxsYmFjayAqYWN0aW9uLAor
ICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmNvbnRleHQpOworCisvKioKKyAqIEdl
dHMgdGhlIGN1cnJlbnQgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIHdo
ZW4gaWxsZWdhbCAKKyAqIG9yIGludmFsaWQgVW5pY29kZSBzZXF1ZW5jZSBpcyBmb3VuZC4KKyAq
IENvbnRleHQgcG9pbnRlcnMgYXJlIGFsd2F5cyBvd25lZCBieSB0aGUgY2FsbGVyLgorICoKKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgdGhlIHVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gYWN0aW9u
IGZpbGxpbjogcmV0dXJucyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICogQHBhcmFt
IGNvbnRleHQgZmlsbGluOiByZXR1cm5zIHRoZSBjYWxsYmFjaydzIHByaXZhdGUgdm9pZCogY29u
dGV4dAorICogQHNlZSB1Y252X3NldEZyb21VQ2FsbEJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgordWNudl9nZXRGcm9tVUNhbGxCYWNrIChjb25z
dCBVQ29udmVydGVyICogY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVy
dGVyRnJvbVVDYWxsYmFjayAqYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2
b2lkICoqY29udGV4dCk7CisKKy8qKgorICogQ2hhbmdlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24g
dXNlZCBieSB0aGUgY29udmVydGVyIHdoZW4KKyAqIGFuIGlsbGVnYWwgb3IgaW52YWxpZCBzZXF1
ZW5jZSBpcyBmb3VuZC4KKyAqIENvbnRleHQgcG9pbnRlcnMgYXJlIGFsd2F5cyBvd25lZCBieSB0
aGUgY2FsbGVyLgorICogUHJlZGVmaW5lZCBhY3Rpb25zIGFuZCBjb250ZXh0cyBjYW4gYmUgZm91
bmQgaW4gdGhlIHVjbnZfZXJyLmggaGVhZGVyLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhl
IHVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gbmV3QWN0aW9uIHRoZSBuZXcgY2FsbGJhY2sg
ZnVuY3Rpb24KKyAqIEBwYXJhbSBuZXdDb250ZXh0IHRoZSBuZXcgdG9Vbmljb2RlIGNhbGxiYWNr
IGNvbnRleHQgcG9pbnRlci4gVGhpcyBjYW4gYmUgTlVMTC4KKyAqIEBwYXJhbSBvbGRBY3Rpb24g
ZmlsbGluOiByZXR1cm5zIHRoZSBvbGQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlci4gVGhpcyBj
YW4gYmUgTlVMTC4KKyAqIEBwYXJhbSBvbGRDb250ZXh0IGZpbGxpbjogcmV0dXJucyB0aGUgb2xk
IGNhbGxiYWNrJ3MgcHJpdmF0ZSB2b2lkKiBjb250ZXh0LiBUaGlzIGNhbiBiZSBOVUxMLgorICog
QHBhcmFtIGVyciBUaGUgZXJyb3IgY29kZSBzdGF0dXMKKyAqIEBzZWUgdWNudl9nZXRUb1VDYWxs
QmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1
Y252X3NldFRvVUNhbGxCYWNrIChVQ29udmVydGVyICogY29udmVydGVyLAorICAgICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlclRvVUNhbGxiYWNrIG5ld0FjdGlvbiwKKyAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IHZvaWQqIG5ld0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBVQ29u
dmVydGVyVG9VQ2FsbGJhY2sgKm9sZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQqKiBvbGRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqIGVy
cik7CisKKy8qKgorICogQ2hhbmdlcyB0aGUgY3VycmVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2Vk
IGJ5IHRoZSBjb252ZXJ0ZXIgd2hlbgorICogYW4gaWxsZWdhbCBvciBpbnZhbGlkIHNlcXVlbmNl
IGlzIGZvdW5kLgorICogQ29udGV4dCBwb2ludGVycyBhcmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBj
YWxsZXIuCisgKiBQcmVkZWZpbmVkIGFjdGlvbnMgYW5kIGNvbnRleHRzIGNhbiBiZSBmb3VuZCBp
biB0aGUgdWNudl9lcnIuaCBoZWFkZXIuCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0aGUgdW5p
Y29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBuZXdBY3Rpb24gdGhlIG5ldyBjYWxsYmFjayBmdW5j
dGlvbgorICogQHBhcmFtIG5ld0NvbnRleHQgdGhlIG5ldyBmcm9tVW5pY29kZSBjYWxsYmFjayBj
b250ZXh0IHBvaW50ZXIuIFRoaXMgY2FuIGJlIE5VTEwuCisgKiBAcGFyYW0gb2xkQWN0aW9uIGZp
bGxpbjogcmV0dXJucyB0aGUgb2xkIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIuIFRoaXMgY2Fu
IGJlIE5VTEwuCisgKiBAcGFyYW0gb2xkQ29udGV4dCBmaWxsaW46IHJldHVybnMgdGhlIG9sZCBj
YWxsYmFjaydzIHByaXZhdGUgdm9pZCogY29udGV4dC4gVGhpcyBjYW4gYmUgTlVMTC4KKyAqIEBw
YXJhbSBlcnIgVGhlIGVycm9yIGNvZGUgc3RhdHVzCisgKiBAc2VlIHVjbnZfZ2V0RnJvbVVDYWxs
QmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1
Y252X3NldEZyb21VQ2FsbEJhY2sgKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIsCisgICAgICAgICAg
ICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIG5ld0FjdGlvbiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgVUNvbnZlcnRlckZyb21VQ2FsbGJhY2sgKm9sZEFjdGlvbiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3Qgdm9pZCAqKm9sZENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAg
IFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHVuaWNv
ZGUgY2hhcmFjdGVycyB0byBhbiBhcnJheSBvZiBjb2RlcGFnZQorICogY2hhcmFjdGVycy4gVGhp
cyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIGNvbnZlcnRpbmcgYSBjb250aW51b3VzCisgKiBz
dHJlYW0gb2YgZGF0YSBpbiBidWZmZXItc2l6ZWQgY2h1bmtzLCB3aGVyZSB0aGUgZW50aXJlIHNv
dXJjZSBhbmQKKyAqIHRhcmdldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIGJ1ZmZlcnMuCisg
KiAKKyAqIFRoZSBzb3VyY2UgcG9pbnRlciBpcyBhbiBpbi9vdXQgcGFyYW1ldGVyLiBJdCBzdGFy
dHMgb3V0IHBvaW50aW5nIHdoZXJlIHRoZSAKKyAqIGNvbnZlcnNpb24gaXMgdG8gYmVnaW4sIGFu
ZCBlbmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IFVDaGFyIGNvbnN1bWVkLiAKKyAqIAor
ICogVGFyZ2V0IHNpbWlsYXJseSBzdGFydHMgb3V0IHBvaW50ZXIgYXQgdGhlIGZpcnN0IGF2YWls
YWJsZSBieXRlIGluIHRoZSBvdXRwdXQKKyAqIGJ1ZmZlciwgYW5kIGVuZHMgdXAgcG9pbnRpbmcg
YWZ0ZXIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQuCisgKiAKKyAqIFRoZSBj
b252ZXJ0ZXIgYWx3YXlzIGF0dGVtcHRzIHRvIGNvbnN1bWUgdGhlIGVudGlyZSBzb3VyY2UgYnVm
ZmVyLCB1bmxlc3MgCisgKiAoMS4pIHRoZSB0YXJnZXQgYnVmZmVyIGlzIGZ1bGwsIG9yICgyLikg
YSBmYWlsaW5nIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlCisgKiBjdXJyZW50IGNhbGxiYWNr
IGZ1bmN0aW9uLiAgV2hlbiBhIHN1Y2Nlc3NmdWwgZXJyb3Igc3RhdHVzIGhhcyBiZWVuCisgKiBy
ZXR1cm5lZCwgaXQgbWVhbnMgdGhhdCBhbGwgb2YgdGhlIHNvdXJjZSBidWZmZXIgaGFzIGJlZW4K
KyAqICBjb25zdW1lZC4gQXQgdGhhdCBwb2ludCwgdGhlIGNhbGxlciBzaG91bGQgcmVzZXQgdGhl
IHNvdXJjZSBhbmQKKyAqICBzb3VyY2VMaW1pdCBwb2ludGVycyB0byBwb2ludCB0byB0aGUgbmV4
dCBjaHVuay4KKyAqIAorICogQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChmbHVzaD09VFJVRSks
IHRoZSBpbnB1dCBpcyBjb21wbGV0ZWx5IGNvbnN1bWVkCisgKiB3aGVuICpzb3VyY2U9PXNvdXJj
ZUxpbWl0IGFuZCBubyBlcnJvciBjb2RlIGlzIHNldC4KKyAqIFRoZSBjb252ZXJ0ZXIgb2JqZWN0
IGlzIHRoZW4gYXV0b21hdGljYWxseSByZXNldCBieSB0aGlzIGZ1bmN0aW9uLgorICogKFRoaXMg
bWVhbnMgdGhhdCBhIGNvbnZlcnRlciBuZWVkIG5vdCBiZSByZXNldCBleHBsaWNpdGx5IGJldHdl
ZW4gZGF0YQorICogc3RyZWFtcyBpZiBpdCBmaW5pc2hlcyB0aGUgcHJldmlvdXMgc3RyZWFtIHdp
dGhvdXQgZXJyb3JzLikKKyAqIAorICogVGhpcyBpcyBhIDxJPnN0YXRlZnVsPC9JPiBjb252ZXJz
aW9uLiBBZGRpdGlvbmFsbHksIGV2ZW4gd2hlbiBhbGwgc291cmNlIGRhdGEgaGFzCisgKiBiZWVu
IGNvbnN1bWVkLCBzb21lIGRhdGEgbWF5IGJlIGluIHRoZSBjb252ZXJ0ZXJzJyBpbnRlcm5hbCBz
dGF0ZS4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5LCB1cGRhdGluZyB0aGUgdGFy
Z2V0IHBvaW50ZXJzIHdpdGgKKyAqIHRoZSBuZXh0IGVtcHR5IGNodW5rIG9mIHRhcmdldCBpbiBj
YXNlIG9mIGEKKyAqIDxUVD5VX0JVRkZFUl9PVkVSRkxPV19FUlJPUjwvVFQ+LCBhbmQgdXBkYXRp
bmcgdGhlIHNvdXJjZSAgcG9pbnRlcnMKKyAqICB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIHNvdXJj
ZSB3aGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBzdGF0dXMgaXMKKyAqIHJldHVybmVkLCB1bnRpbCB0
aGVyZSBhcmUgbm8gbW9yZSBjaHVua3Mgb2Ygc291cmNlIGRhdGEuCisgKiBAcGFyYW0gY29udmVy
dGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIHRhcmdldCBJL08gcGFyYW1ldGVy
LiBJbnB1dCA6IFBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgdG8gY29weQor
ICogIGNvZGVwYWdlIGNoYXJhY3RlcnMgdG8uIE91dHB1dCA6IHBvaW50cyB0byBhZnRlciB0aGUg
bGFzdCBjb2RlcGFnZSBjaGFyYWN0ZXIgY29waWVkCisgKiAgdG8gPFRUPnRhcmdldDwvVFQ+Lgor
ICogQHBhcmFtIHRhcmdldExpbWl0IHRoZSBwb2ludGVyIGp1c3QgYWZ0ZXIgbGFzdCBvZiB0aGUg
PFRUPnRhcmdldDwvVFQ+IGJ1ZmZlcgorICogQHBhcmFtIHNvdXJjZSBJL08gcGFyYW1ldGVyLCBw
b2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBVbmljb2RlIGNoYXJhY3RlciBidWZmZXIu
IAorICogQHBhcmFtIHNvdXJjZUxpbWl0IHRoZSBwb2ludGVyIGp1c3QgYWZ0ZXIgdGhlIGxhc3Qg
b2YgdGhlIHNvdXJjZSBidWZmZXIKKyAqIEBwYXJhbSBvZmZzZXRzIGlmIE5VTEwgaXMgcGFzc2Vk
LCBub3RoaW5nIHdpbGwgaGFwcGVuIHRvIGl0LCBvdGhlcndpc2UgaXQgbmVlZHMgdG8gaGF2ZSB0
aGUgc2FtZSBudW1iZXIKKyAqIG9mIGFsbG9jYXRlZCBjZWxscyBhcyA8VFQ+dGFyZ2V0PC9UVD4u
IFdpbGwgZmlsbCBpbiBvZmZzZXRzIGZyb20gdGFyZ2V0IHRvIHNvdXJjZSBwb2ludGVyCisgKiBl
Lmc6IDxUVD5vZmZzZXRzWzNdPC9UVD4gaXMgZXF1YWwgdG8gNiwgaXQgbWVhbnMgdGhhdCB0aGUg
PFRUPnRhcmdldFszXTwvVFQ+IHdhcyBhIHJlc3VsdCBvZiB0cmFuc2NvZGluZyA8VFQ+c291cmNl
WzZdPC9UVD4KKyAqIEZvciBvdXRwdXQgZGF0YSBjYXJyaWVkIGFjcm9zcyBjYWxscywgYW5kIG90
aGVyIGRhdGEgd2l0aG91dCBhIHNwZWNpZmljIHNvdXJjZSBjaGFyYWN0ZXIKKyAqIChzdWNoIGFz
IGZyb20gZXNjYXBlIHNlcXVlbmNlcyBvciBjYWxsYmFja3MpICAtMSB3aWxsIGJlIHBsYWNlZCBm
b3Igb2Zmc2V0cy4gCisgKiBAcGFyYW0gZmx1c2ggc2V0IHRvIDxUVD5UUlVFPC9UVD4gaWYgdGhl
IGN1cnJlbnQgc291cmNlIGJ1ZmZlciBpcyB0aGUgbGFzdCBhdmFpbGFibGUKKyAqIGNodW5rIG9m
IHRoZSBzb3VyY2UsIDxUVD5GQUxTRTwvVFQ+IG90aGVyd2lzZS4gTm90ZSB0aGF0IGlmIGEgZmFp
bGluZyBzdGF0dXMgaXMgcmV0dXJuZWQsCisgKiB0aGlzIGZ1bmN0aW9uIG1heSBoYXZlIHRvIGJl
IGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGZsdXNoIHNldCB0byA8VFQ+VFJVRTwvVFQ+IHVu
dGlsCisgKiB0aGUgc291cmNlIGJ1ZmZlciBpcyBjb25zdW1lZC4KKyAqIEBwYXJhbSBlcnIgdGhl
IGVycm9yIHN0YXR1cy4gIDxUVD5VX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I8L1RUPiB3aWxsIGJl
IHNldCBpZiB0aGUKKyAqIGNvbnZlcnRlciBpcyA8VFQ+TlVMTDwvVFQ+LgorICogPGNvZGU+VV9C
VUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IHdpbGwgYmUgc2V0IGlmIHRoZSB0YXJnZXQgaXMg
ZnVsbCBhbmQgdGhlcmUgaXMgCisgKiBzdGlsbCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRh
cmdldC4KKyAqIEBzZWUgdWNudl9mcm9tVUNoYXJzCisgKiBAc2VlIHVjbnZfY29udmVydAorICog
QHNlZSB1Y252X2dldE1pbkNoYXJTaXplCisgKiBAc2VlIHVjbnZfc2V0VG9VQ2FsbEJhY2sKKyAq
IEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKK3VjbnZfZnJv
bVVuaWNvZGUgKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICBjaGFy
ICoqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFyZ2V0TGltaXQsCisg
ICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAqKiBzb3VyY2UsCisgICAgICAgICAgICAgICAg
ICBjb25zdCBVQ2hhciAqIHNvdXJjZUxpbWl0LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCog
b2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgIFVCb29sIGZsdXNoLAorICAgICAgICAgICAgICAg
ICAgVUVycm9yQ29kZSAqIGVycik7CisKKy8qKgorICogQ29udmVydHMgYSBidWZmZXIgb2YgY29k
ZXBhZ2UgYnl0ZXMgaW50byBhbiBhcnJheSBvZiB1bmljb2RlIFVDaGFycworICogY2hhcmFjdGVy
cy4gVGhpcyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIGNvbnZlcnRpbmcgYSBjb250aW51b3Vz
CisgKiBzdHJlYW0gb2YgZGF0YSBpbiBidWZmZXItc2l6ZWQgY2h1bmtzLCB3aGVyZSB0aGUgZW50
aXJlIHNvdXJjZSBhbmQKKyAqIHRhcmdldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIGJ1ZmZl
cnMuCisgKiAKKyAqIFRoZSBzb3VyY2UgcG9pbnRlciBpcyBhbiBpbi9vdXQgcGFyYW1ldGVyLiBJ
dCBzdGFydHMgb3V0IHBvaW50aW5nIHdoZXJlIHRoZSAKKyAqIGNvbnZlcnNpb24gaXMgdG8gYmVn
aW4sIGFuZCBlbmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IGJ5dGUgb2Ygc291cmNlIGNv
bnN1bWVkLiAKKyAqIAorICogVGFyZ2V0IHNpbWlsYXJseSBzdGFydHMgb3V0IHBvaW50ZXIgYXQg
dGhlIGZpcnN0IGF2YWlsYWJsZSBVQ2hhciBpbiB0aGUgb3V0cHV0CisgKiBidWZmZXIsIGFuZCBl
bmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IFVDaGFyIHdyaXR0ZW4gdG8gdGhlIG91dHB1
dC4gCisgKiBJdCBkb2VzIE5PVCBuZWNlc3NhcmlseSBrZWVwIFVDaGFyIHNlcXVlbmNlcyB0b2dl
dGhlci4KKyAqIAorICogVGhlIGNvbnZlcnRlciBhbHdheXMgYXR0ZW1wdHMgdG8gY29uc3VtZSB0
aGUgZW50aXJlIHNvdXJjZSBidWZmZXIsIHVubGVzcyAKKyAqICgxLikgdGhlIHRhcmdldCBidWZm
ZXIgaXMgZnVsbCwgb3IgKDIuKSBhIGZhaWxpbmcgZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUK
KyAqIGN1cnJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uICBXaGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBz
dGF0dXMgaGFzIGJlZW4KKyAqIHJldHVybmVkLCBpdCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgc291
cmNlIGJ1ZmZlciBoYXMgYmVlbgorICogIGNvbnN1bWVkLiBBdCB0aGF0IHBvaW50LCB0aGUgY2Fs
bGVyIHNob3VsZCByZXNldCB0aGUgc291cmNlIGFuZAorICogIHNvdXJjZUxpbWl0IHBvaW50ZXJz
IHRvIHBvaW50IHRvIHRoZSBuZXh0IGNodW5rLgorICoKKyAqIEF0IHRoZSBlbmQgb2YgdGhlIHN0
cmVhbSAoZmx1c2g9PVRSVUUpLCB0aGUgaW5wdXQgaXMgY29tcGxldGVseSBjb25zdW1lZAorICog
d2hlbiAqc291cmNlPT1zb3VyY2VMaW1pdCBhbmQgbm8gZXJyb3IgY29kZSBpcyBzZXQKKyAqIFRo
ZSBjb252ZXJ0ZXIgb2JqZWN0IGlzIHRoZW4gYXV0b21hdGljYWxseSByZXNldCBieSB0aGlzIGZ1
bmN0aW9uLgorICogKFRoaXMgbWVhbnMgdGhhdCBhIGNvbnZlcnRlciBuZWVkIG5vdCBiZSByZXNl
dCBleHBsaWNpdGx5IGJldHdlZW4gZGF0YQorICogc3RyZWFtcyBpZiBpdCBmaW5pc2hlcyB0aGUg
cHJldmlvdXMgc3RyZWFtIHdpdGhvdXQgZXJyb3JzLikKKyAqIAorICogVGhpcyBpcyBhIDxJPnN0
YXRlZnVsPC9JPiBjb252ZXJzaW9uLiBBZGRpdGlvbmFsbHksIGV2ZW4gd2hlbiBhbGwgc291cmNl
IGRhdGEgaGFzCisgKiBiZWVuIGNvbnN1bWVkLCBzb21lIGRhdGEgbWF5IGJlIGluIHRoZSBjb252
ZXJ0ZXJzJyBpbnRlcm5hbCBzdGF0ZS4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5
LCB1cGRhdGluZyB0aGUgdGFyZ2V0IHBvaW50ZXJzIHdpdGgKKyAqIHRoZSBuZXh0IGVtcHR5IGNo
dW5rIG9mIHRhcmdldCBpbiBjYXNlIG9mIGEKKyAqIDxUVD5VX0JVRkZFUl9PVkVSRkxPV19FUlJP
UjwvVFQ+LCBhbmQgdXBkYXRpbmcgdGhlIHNvdXJjZSAgcG9pbnRlcnMKKyAqICB3aXRoIHRoZSBu
ZXh0IGNodW5rIG9mIHNvdXJjZSB3aGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBzdGF0dXMgaXMKKyAq
IHJldHVybmVkLCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBjaHVua3Mgb2Ygc291cmNlIGRhdGEu
CisgKiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIHRh
cmdldCBJL08gcGFyYW1ldGVyLiBJbnB1dCA6IFBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRo
ZSBidWZmZXIgdG8gY29weQorICogIFVDaGFycyBpbnRvLiBPdXRwdXQgOiBwb2ludHMgdG8gYWZ0
ZXIgdGhlIGxhc3QgVUNoYXIgY29waWVkLgorICogQHBhcmFtIHRhcmdldExpbWl0IHRoZSBwb2lu
dGVyIGp1c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgPFRUPnRhcmdldDwvVFQ+IGJ1ZmZlcgorICog
QHBhcmFtIHNvdXJjZSBJL08gcGFyYW1ldGVyLCBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHNv
dXJjZSBjb2RlcGFnZSBidWZmZXIuIAorICogQHBhcmFtIHNvdXJjZUxpbWl0IHRoZSBwb2ludGVy
IHRvIHRoZSBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBidWZmZXIKKyAqIEBwYXJh
bSBvZmZzZXRzIGlmIE5VTEwgaXMgcGFzc2VkLCBub3RoaW5nIHdpbGwgaGFwcGVuIHRvIGl0LCBv
dGhlcndpc2UgaXQgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyAqIG9mIGFsbG9jYXRl
ZCBjZWxscyBhcyA8VFQ+dGFyZ2V0PC9UVD4uIFdpbGwgZmlsbCBpbiBvZmZzZXRzIGZyb20gdGFy
Z2V0IHRvIHNvdXJjZSBwb2ludGVyCisgKiBlLmc6IDxUVD5vZmZzZXRzWzNdPC9UVD4gaXMgZXF1
YWwgdG8gNiwgaXQgbWVhbnMgdGhhdCB0aGUgPFRUPnRhcmdldFszXTwvVFQ+IHdhcyBhIHJlc3Vs
dCBvZiB0cmFuc2NvZGluZyA8VFQ+c291cmNlWzZdPC9UVD4KKyAqIEZvciBvdXRwdXQgZGF0YSBj
YXJyaWVkIGFjcm9zcyBjYWxscywgYW5kIG90aGVyIGRhdGEgd2l0aG91dCBhIHNwZWNpZmljIHNv
dXJjZSBjaGFyYWN0ZXIKKyAqIChzdWNoIGFzIGZyb20gZXNjYXBlIHNlcXVlbmNlcyBvciBjYWxs
YmFja3MpICAtMSB3aWxsIGJlIHBsYWNlZCBmb3Igb2Zmc2V0cy4gCisgKiBAcGFyYW0gZmx1c2gg
c2V0IHRvIDxUVD5UUlVFPC9UVD4gaWYgdGhlIGN1cnJlbnQgc291cmNlIGJ1ZmZlciBpcyB0aGUg
bGFzdCBhdmFpbGFibGUKKyAqIGNodW5rIG9mIHRoZSBzb3VyY2UsIDxUVD5GQUxTRTwvVFQ+IG90
aGVyd2lzZS4gTm90ZSB0aGF0IGlmIGEgZmFpbGluZyBzdGF0dXMgaXMgcmV0dXJuZWQsCisgKiB0
aGlzIGZ1bmN0aW9uIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGZs
dXNoIHNldCB0byA8VFQ+VFJVRTwvVFQ+IHVudGlsCisgKiB0aGUgc291cmNlIGJ1ZmZlciBpcyBj
b25zdW1lZC4KKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1cy4gIDxUVD5VX0lMTEVHQUxf
QVJHVU1FTlRfRVJST1I8L1RUPiB3aWxsIGJlIHNldCBpZiB0aGUKKyAqIGNvbnZlcnRlciBpcyA8
VFQ+TlVMTDwvVFQ+LgorICogPGNvZGU+VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IHdp
bGwgYmUgc2V0IGlmIHRoZSB0YXJnZXQgaXMgZnVsbCBhbmQgdGhlcmUgaXMgCisgKiBzdGlsbCBk
YXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldC4gCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFy
cworICogQHNlZSB1Y252X2NvbnZlcnQKKyAqIEBzZWUgdWNudl9nZXRNaW5DaGFyU2l6ZQorICog
QHNlZSB1Y252X3NldEZyb21VQ2FsbEJhY2sKKyAqIEBzZWUgdWNudl9nZXROZXh0VUNoYXIKKyAq
IEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKK3VjbnZfdG9V
bmljb2RlKFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAgICAgICAgIFVDaGFyICoqdGFy
Z2V0LAorICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgKnRhcmdldExpbWl0LAorICAgICAgICAg
ICAgICAgY29uc3QgY2hhciAqKnNvdXJjZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNv
dXJjZUxpbWl0LAorICAgICAgICAgICAgICAgaW50MzJfdCAqb2Zmc2V0cywKKyAgICAgICAgICAg
ICAgIFVCb29sIGZsdXNoLAorICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoq
CisgKiBDb252ZXJ0IHRoZSBVbmljb2RlIHN0cmluZyBpbnRvIGEgY29kZXBhZ2Ugc3RyaW5nIHVz
aW5nIGFuIGV4aXN0aW5nIFVDb252ZXJ0ZXIuCisgKiBUaGUgb3V0cHV0IHN0cmluZyBpcyBOVUwt
dGVybWluYXRlZCBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbW9yZSBj
b252ZW5pZW50IGJ1dCBsZXNzIHBvd2VyZnVsIHZlcnNpb24gb2YgdWNudl9mcm9tVW5pY29kZSgp
LgorICogSXQgaXMgb25seSB1c2VmdWwgZm9yIHdob2xlIHN0cmluZ3MsIG5vdCBmb3Igc3RyZWFt
aW5nIGNvbnZlcnNpb24uCisgKgorICogVGhlIG1heGltdW0gb3V0cHV0IGJ1ZmZlciBjYXBhY2l0
eSByZXF1aXJlZCAoYmFycmluZyBvdXRwdXQgZnJvbSBjYWxsYmFja3MpIHdpbGwgYmUKKyAqIFVD
TlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKHNyY0xlbmd0aCwgdWNudl9nZXRNYXhDaGFyU2l6
ZShjbnYpKS4KKyAqCisgKiBAcGFyYW0gY252IHRoZSBjb252ZXJ0ZXIgb2JqZWN0IHRvIGJlIHVz
ZWQgKHVjbnZfcmVzZXRGcm9tVW5pY29kZSgpIHdpbGwgYmUgY2FsbGVkKQorICogQHBhcmFtIHNy
YyB0aGUgaW5wdXQgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbSBzcmNMZW5ndGggdGhlIGlucHV0
IHN0cmluZyBsZW5ndGgsIG9yIC0xIGlmIE5VTC10ZXJtaW5hdGVkCisgKiBAcGFyYW0gZGVzdCBk
ZXN0aW5hdGlvbiBzdHJpbmcgYnVmZmVyLCBjYW4gYmUgTlVMTCBpZiBkZXN0Q2FwYWNpdHk9PTAK
KyAqIEBwYXJhbSBkZXN0Q2FwYWNpdHkgdGhlIG51bWJlciBvZiBjaGFycyBhdmFpbGFibGUgYXQg
ZGVzdAorICogQHBhcmFtIHBFcnJvckNvZGUgbm9ybWFsIElDVSBlcnJvciBjb2RlOworICogICAg
ICAgICAgICAgICAgICBjb21tb24gZXJyb3IgY29kZXMgdGhhdCBtYXkgYmUgc2V0IGJ5IHRoaXMg
ZnVuY3Rpb24gaW5jbHVkZQorICogICAgICAgICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19F
UlJPUiwgVV9TVFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORywKKyAqICAgICAgICAgICAgICAg
ICAgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SLCBhbmQgY29udmVyc2lvbiBlcnJvcnMKKyAqIEBy
ZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IHN0cmluZywgbm90IGNvdW50aW5nIHRoZSB0
ZXJtaW5hdGluZyBOVUw7CisgKiAgICAgICAgIGlmIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFu
IGRlc3RDYXBhY2l0eSwgdGhlbiB0aGUgc3RyaW5nIHdpbGwgbm90IGZpdAorICogICAgICAgICBh
bmQgYSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBsZW5ndGggd291bGQgbmVlZCB0byBiZSBwYXNz
ZWQgaW4KKyAqIEBzZWUgdWNudl9mcm9tVW5pY29kZQorICogQHNlZSB1Y252X2NvbnZlcnQKKyAq
IEBzZWUgVUNOVl9HRVRfTUFYX0JZVEVTX0ZPUl9TVFJJTkcKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWNudl9mcm9tVUNoYXJzKFVDb252ZXJ0
ZXIgKmNudiwKKyAgICAgICAgICAgICAgICBjaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0
eSwKKyAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAqc3JjLCBpbnQzMl90IHNyY0xlbmd0aCwK
KyAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBDb252
ZXJ0IHRoZSBjb2RlcGFnZSBzdHJpbmcgaW50byBhIFVuaWNvZGUgc3RyaW5nIHVzaW5nIGFuIGV4
aXN0aW5nIFVDb252ZXJ0ZXIuCisgKiBUaGUgb3V0cHV0IHN0cmluZyBpcyBOVUwtdGVybWluYXRl
ZCBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbW9yZSBjb252ZW5pZW50
IGJ1dCBsZXNzIHBvd2VyZnVsIHZlcnNpb24gb2YgdWNudl90b1VuaWNvZGUoKS4KKyAqIEl0IGlz
IG9ubHkgdXNlZnVsIGZvciB3aG9sZSBzdHJpbmdzLCBub3QgZm9yIHN0cmVhbWluZyBjb252ZXJz
aW9uLgorICoKKyAqIFRoZSBtYXhpbXVtIG91dHB1dCBidWZmZXIgY2FwYWNpdHkgcmVxdWlyZWQg
KGJhcnJpbmcgb3V0cHV0IGZyb20gY2FsbGJhY2tzKSB3aWxsIGJlCisgKiAyKnNyY0xlbmd0aCAo
ZWFjaCBjaGFyIG1heSBiZSBjb252ZXJ0ZWQgaW50byBhIHN1cnJvZ2F0ZSBwYWlyKS4KKyAqCisg
KiBAcGFyYW0gY252IHRoZSBjb252ZXJ0ZXIgb2JqZWN0IHRvIGJlIHVzZWQgKHVjbnZfcmVzZXRU
b1VuaWNvZGUoKSB3aWxsIGJlIGNhbGxlZCkKKyAqIEBwYXJhbSBzcmMgdGhlIGlucHV0IGNvZGVw
YWdlIHN0cmluZworICogQHBhcmFtIHNyY0xlbmd0aCB0aGUgaW5wdXQgc3RyaW5nIGxlbmd0aCwg
b3IgLTEgaWYgTlVMLXRlcm1pbmF0ZWQKKyAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIHN0cmlu
ZyBidWZmZXIsIGNhbiBiZSBOVUxMIGlmIGRlc3RDYXBhY2l0eT09MAorICogQHBhcmFtIGRlc3RD
YXBhY2l0eSB0aGUgbnVtYmVyIG9mIFVDaGFycyBhdmFpbGFibGUgYXQgZGVzdAorICogQHBhcmFt
IHBFcnJvckNvZGUgbm9ybWFsIElDVSBlcnJvciBjb2RlOworICogICAgICAgICAgICAgICAgICBj
b21tb24gZXJyb3IgY29kZXMgdGhhdCBtYXkgYmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gaW5jbHVk
ZQorICogICAgICAgICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiwgVV9TVFJJTkdf
Tk9UX1RFUk1JTkFURURfV0FSTklORywKKyAqICAgICAgICAgICAgICAgICAgVV9JTExFR0FMX0FS
R1VNRU5UX0VSUk9SLCBhbmQgY29udmVyc2lvbiBlcnJvcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0
aCBvZiB0aGUgb3V0cHV0IHN0cmluZywgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBOVUw7
CisgKiAgICAgICAgIGlmIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGRlc3RDYXBhY2l0eSwg
dGhlbiB0aGUgc3RyaW5nIHdpbGwgbm90IGZpdAorICogICAgICAgICBhbmQgYSBidWZmZXIgb2Yg
dGhlIGluZGljYXRlZCBsZW5ndGggd291bGQgbmVlZCB0byBiZSBwYXNzZWQgaW4KKyAqIEBzZWUg
dWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl9jb252ZXJ0CisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfdG9VQ2hhcnMoVUNvbnZlcnRl
ciAqY252LAorICAgICAgICAgICAgICBVQ2hhciAqZGVzdCwgaW50MzJfdCBkZXN0Q2FwYWNpdHks
CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyYywgaW50MzJfdCBzcmNMZW5ndGgsCisgICAg
ICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCisvKioKKyAqIENvbnZlcnQgYSBj
b2RlcGFnZSBidWZmZXIgaW50byBVbmljb2RlIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgorICog
VGhlIGlucHV0IGlzIGNvbXBsZXRlbHkgY29uc3VtZWQgd2hlbiB0aGUgVV9JTkRFWF9PVVRPRkJP
VU5EU19FUlJPUiBpcyBzZXQuCisgKgorICogQWR2YW50YWdlIGNvbXBhcmVkIHRvIHVjbnZfdG9V
bmljb2RlKCkgb3IgdWNudl90b1VDaGFycygpOgorICogLSBGYXN0ZXIgZm9yIHNtYWxsIGFtb3Vu
dHMgb2YgZGF0YSwgZm9yIG1vc3QgY29udmVydGVycywgZS5nLiwKKyAqICAgVVMtQVNDSUksIElT
Ty04ODU5LTEsIFVURi04LzE2LzMyLCBhbmQgbW9zdCAibm9ybWFsIiBjaGFyc2V0cy4KKyAqICAg
KEZvciBjb21wbGV4IGNvbnZlcnRlcnMsIGUuZy4sIFNDU1UsIFVURi03IGFuZCBJU08gMjAyMiB2
YXJpYW50cywKKyAqICAgIGl0IHVzZXMgdWNudl90b1VuaWNvZGUoKSBpbnRlcm5hbGx5LikKKyAq
IC0gQ29udmVuaWVudC4KKyAqCisgKiBMaW1pdGF0aW9ucyBjb21wYXJlZCB0byB1Y252X3RvVW5p
Y29kZSgpOgorICogLSBBbHdheXMgYXNzdW1lcyBmbHVzaD1UUlVFLgorICogICBUaGlzIG1ha2Vz
IHVjbnZfZ2V0TmV4dFVDaGFyKCkgdW5zdWl0YWJsZSBmb3IgInN0cmVhbWluZyIgY29udmVyc2lv
biwKKyAqICAgdGhhdCBpcywgZm9yIHdoZXJlIHRoZSBpbnB1dCBpcyBzdXBwbGllZCBpbiBtdWx0
aXBsZSBidWZmZXJzLAorICogICBiZWNhdXNlIHVjbnZfZ2V0TmV4dFVDaGFyKCkgd2lsbCBhc3N1
bWUgdGhlIGVuZCBvZiB0aGUgaW5wdXQgYXQgdGhlIGVuZAorICogICBvZiB0aGUgZmlyc3QgYnVm
ZmVyLgorICogLSBEb2VzIG5vdCBwcm92aWRlIG9mZnNldCBvdXRwdXQuCisgKgorICogSXQgaXMg
cG9zc2libGUgdG8gIm1peCIgdWNudl9nZXROZXh0VUNoYXIoKSBhbmQgdWNudl90b1VuaWNvZGUo
KSBiZWNhdXNlCisgKiB1Y252X2dldE5leHRVQ2hhcigpIHVzZXMgdGhlIGN1cnJlbnQgc3RhdGUg
b2YgdGhlIGNvbnZlcnRlcgorICogKHVubGlrZSB1Y252X3RvVUNoYXJzKCkgd2hpY2ggYWx3YXlz
IHJlc2V0cyBmaXJzdCkuCisgKiBIb3dldmVyLCBpZiB1Y252X2dldE5leHRVQ2hhcigpIGlzIGNh
bGxlZCBhZnRlciB1Y252X3RvVW5pY29kZSgpCisgKiBzdG9wcGVkIGluIHRoZSBtaWRkbGUgb2Yg
YSBjaGFyYWN0ZXIgc2VxdWVuY2UgKHdpdGggZmx1c2g9RkFMU0UpLAorICogdGhlbiB1Y252X2dl
dE5leHRVQ2hhcigpIHdpbGwgYWx3YXlzIHVzZSB0aGUgc2xvd2VyIHVjbnZfdG9Vbmljb2RlKCkK
KyAqIGludGVybmFsbHkgdW50aWwgdGhlIG5leHQgY2hhcmFjdGVyIGJvdW5kYXJ5LgorICogKFRo
aXMgaXMgbmV3IGluIElDVSAyLjYuIEluIGVhcmxpZXIgcmVsZWFzZXMsIHVjbnZfZ2V0TmV4dFVD
aGFyKCkgaGFkIHRvCisgKiBzdGFydCBhdCBhIGNoYXJhY3RlciBib3VuZGFyeS4pCisgKgorICog
SW5zdGVhZCBvZiB1c2luZyB1Y252X2dldE5leHRVQ2hhcigpLCBpdCBpcyByZWNvbW1lbmRlZAor
ICogdG8gY29udmVydCB1c2luZyB1Y252X3RvVW5pY29kZSgpIG9yIHVjbnZfdG9VQ2hhcnMoKQor
ICogYW5kIHRoZW4gaXRlcmF0ZSBvdmVyIHRoZSB0ZXh0IHVzaW5nIFUxNl9ORVhUKCkgb3IgYSBV
Q2hhckl0ZXJhdG9yICh1aXRlci5oKQorICogb3IgYSBDKysgQ2hhcmFjdGVySXRlcmF0b3Igb3Ig
c2ltaWxhci4KKyAqIFRoaXMgYWxsb3dzIHN0cmVhbWluZyBjb252ZXJzaW9uIGFuZCBvZmZzZXQg
b3V0cHV0LCBmb3IgZXhhbXBsZS4KKyAqCisgKiA8cD5IYW5kbGluZyBvZiBzdXJyb2dhdGUgcGFp
cnMgYW5kIHN1cHBsZW1lbnRhcnktcGxhbmUgY29kZSBwb2ludHM6PGJyPgorICogVGhlcmUgYXJl
IHR3byBkaWZmZXJlbnQga2luZHMgb2YgY29kZXBhZ2VzIHRoYXQgcHJvdmlkZSBtYXBwaW5ncyBm
b3Igc3Vycm9nYXRlIGNoYXJhY3RlcnM6CisgKiA8dWw+CisgKiAgIDxsaT5Db2RlcGFnZXMgbGlr
ZSBVVEYtOCwgVVRGLTMyLCBhbmQgR0IgMTgwMzAgcHJvdmlkZSBkaXJlY3QgcmVwcmVzZW50YXRp
b25zIGZvciBVbmljb2RlCisgKiAgICAgICBjb2RlIHBvaW50cyBVKzEwMDAwLVUrMTBmZmZmIGFz
IHdlbGwgYXMgZm9yIHNpbmdsZSBzdXJyb2dhdGVzIFUrZDgwMC1VK2RmZmYuCisgKiAgICAgICBF
YWNoIHZhbGlkIHNlcXVlbmNlIHdpbGwgcmVzdWx0IGluIGV4YWN0bHkgb25lIHJldHVybmVkIGNv
ZGUgcG9pbnQuCisgKiAgICAgICBJZiBhIHNlcXVlbmNlIHJlc3VsdHMgaW4gYSBzaW5nbGUgc3Vy
cm9nYXRlLCB0aGVuIHRoYXQgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgYnkgaXRzZWxmLCBl
dmVuIGlmIGEgbmVpZ2hib3Jpbmcgc2VxdWVuY2UgZW5jb2RlcyB0aGUgbWF0Y2hpbmcgc3Vycm9n
YXRlLjwvbGk+CisgKiAgIDxsaT5Db2RlcGFnZXMgbGlrZSBTQ1NVIGFuZCBMTUJDUyAoYW5kIFVU
Ri0xNikgcHJvdmlkZSBkaXJlY3QgcmVwcmVzZW50YXRpb25zIG9ubHkgZm9yIEJNUCBjb2RlIHBv
aW50cworICogICAgICAgaW5jbHVkaW5nIHN1cnJvZ2F0ZXMuIENvZGUgcG9pbnRzIGluIHN1cHBs
ZW1lbnRhcnkgcGxhbmVzIGFyZSByZXByZXNlbnRlZCB3aXRoCisgKiAgICAgICB0d28gc2VxdWVu
Y2VzLCBlYWNoIGVuY29kaW5nIGEgc3Vycm9nYXRlLgorICogICAgICAgRm9yIHRoZXNlIGNvZGVw
YWdlcywgbWF0Y2hpbmcgcGFpcnMgb2Ygc3Vycm9nYXRlcyB3aWxsIGJlIGNvbWJpbmVkIGludG8g
c2luZ2xlCisgKiAgICAgICBjb2RlIHBvaW50cyBmb3IgcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5j
dGlvbi4KKyAqICAgICAgIChOb3RlIHRoYXQgU0NTVSBpcyBhY3R1YWxseSBhIG1peCBvZiB0aGVz
ZSBjb2RlcGFnZSB0eXBlcy4pPC9saT4KKyAqIDwvdWw+PC9wPgorICoKKyAqIEBwYXJhbSBjb252
ZXJ0ZXIgYW4gb3BlbiBVQ29udmVydGVyCisgKiBAcGFyYW0gc291cmNlIHRoZSBhZGRyZXNzIG9m
IGEgcG9pbnRlciB0byB0aGUgY29kZXBhZ2UgYnVmZmVyLCB3aWxsIGJlCisgKiAgdXBkYXRlZCB0
byBwb2ludCBhZnRlciB0aGUgYnl0ZXMgY29uc3VtZWQgaW4gdGhlIGNvbnZlcnNpb24gY2FsbC4K
KyAqIEBwYXJhbSBzb3VyY2VMaW1pdCBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVm
ZmVyCisgKiBAcGFyYW0gZXJyIGZpbGxzIGluIGVycm9yIHN0YXR1cyAoc2VlIHVjbnZfdG9Vbmlj
b2RlKQorICogPGNvZGU+VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUjwvY29kZT4gd2lsbCBiZSBz
ZXQgaWYgdGhlIGlucHV0IAorICogaXMgZW1wdHkgb3IgZG9lcyBub3QgY29udmVydCB0byBhbnkg
b3V0cHV0IChlLmcuOiBwdXJlIHN0YXRlLWNoYW5nZSAKKyAqIGNvZGVzIFNJL1NPLCBlc2NhcGUg
c2VxdWVuY2VzIGZvciBJU08gMjAyMiwKKyAqIG9yIGlmIHRoZSBjYWxsYmFjayBkaWQgbm90IG91
dHB1dCBhbnl0aGluZywgLi4uKS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2V0IGEgPGNv
ZGU+VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IGJlY2F1c2UKKyAqICB0aGUgImJ1ZmZl
ciIgaXMgdGhlIHJldHVybiBjb2RlLiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBzdWJzZXF1ZW50
IG91dHB1dAorICogIHN0b3JlZCBpbiB0aGUgY29udmVydGVyIG9iamVjdAorICogdGhhdCB3aWxs
IGJlIHJldHVybmVkIGluIGZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICogQHJl
dHVybiBhIFVDaGFyMzIgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnRpYWwgY29udmVyc2lvbiBvZiBz
b3VyY2UKKyAqIEBzZWUgdWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl90b1VDaGFycworICog
QHNlZSB1Y252X2NvbnZlcnQKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBVQ2hh
cjMyIFVfRVhQT1JUMgordWNudl9nZXROZXh0VUNoYXIoVUNvbnZlcnRlciAqIGNvbnZlcnRlciwK
KyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzb3VyY2UsCisgICAgICAgICAgICAgICAg
ICBjb25zdCBjaGFyICogc291cmNlTGltaXQsCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2Rl
ICogZXJyKTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gb25lIGV4dGVybmFsIGNoYXJzZXQgdG8g
YW5vdGhlciB1c2luZyB0d28gZXhpc3RpbmcgVUNvbnZlcnRlcnMuCisgKiBJbnRlcm5hbGx5LCB0
d28gY29udmVyc2lvbnMgLSB1Y252X3RvVW5pY29kZSgpIGFuZCB1Y252X2Zyb21Vbmljb2RlKCkg
LQorICogYXJlIHVzZWQsICJwaXZvdGluZyIgdGhyb3VnaCAxNi1iaXQgVW5pY29kZS4KKyAqCisg
KiBUaGVyZSBpcyBhIHNpbWlsYXIgZnVuY3Rpb24sIHVjbnZfY29udmVydCgpLAorICogd2hpY2gg
aGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6CisgKiAtIGl0IHRha2VzIGNoYXJzZXQgbmFt
ZXMsIG5vdCBjb252ZXJ0ZXIgb2JqZWN0cywgc28gdGhhdAorICogICAtIHR3byBjb252ZXJ0ZXJz
IGFyZSBvcGVuZWQgZm9yIGVhY2ggY2FsbAorICogICAtIG9ubHkgc2luZ2xlLXN0cmluZyBjb252
ZXJzaW9uIGlzIHBvc3NpYmxlLCBub3Qgc3RyZWFtaW5nIG9wZXJhdGlvbgorICogLSBpdCBkb2Vz
IG5vdCBwcm92aWRlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIG91dCwKKyAqICAgaW4gY2Fz
ZSBvZiBmYWlsdXJlLCB3aGV0aGVyIHRoZSB0b1VuaWNvZGUgb3IKKyAqICAgdGhlIGZyb21Vbmlj
b2RlIGNvbnZlcnNpb24gZmFpbGVkCisgKgorICogQnkgY29udHJhc3QsIHVjbnZfY29udmVydEV4
KCkKKyAqIC0gdGFrZXMgVUNvbnZlcnRlciBwYXJhbWV0ZXJzIGluc3RlYWQgb2YgY2hhcnNldCBu
YW1lcworICogLSBmdWxseSBleHBvc2VzIHRoZSBwaXZvdCBidWZmZXIgZm9yIGNvbXBsZXRlIGVy
cm9yIGhhbmRsaW5nCisgKgorICogdWNudl9jb252ZXJ0RXgoKSBhbHNvIHByb3ZpZGVzIGZ1cnRo
ZXIgY29udmVuaWVuY2U6CisgKiAtIGFuIG9wdGlvbiB0byByZXNldCB0aGUgY29udmVydGVycyBh
dCB0aGUgYmVnaW5uaW5nCisgKiAgIChpZiByZXNldD09VFJVRSwgc2VlIHBhcmFtZXRlcnM7Cisg
KiAgICBhbHNvIHNldHMgKnBpdm90VGFyZ2V0PSpwaXZvdFNvdXJjZT1waXZvdFN0YXJ0KQorICog
LSBhbGxvdyBOVUwtdGVybWluYXRlZCBpbnB1dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0
ZSwgd2lsbCBub3Qgd29yayBmb3IgY2hhcnNldHMgd2l0aCBtdWx0aS1ieXRlIE5VTHMpCisgKiAg
IChpZiBzb3VyY2VMaW1pdD09TlVMTCwgc2VlIHBhcmFtZXRlcnMpCisgKiAtIHRlcm1pbmF0ZSB3
aXRoIGEgTlVMIG9uIG91dHB1dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0ZSwgbm90IHVz
ZWZ1bCBmb3IgY2hhcnNldHMgd2l0aCBtdWx0aS1ieXRlIE5VTHMpLAorICogICBvciBzZXQgVV9T
VFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORyBpZiB0aGUgb3V0cHV0IGV4YWN0bHkgZmlsbHMK
KyAqICAgdGhlIHRhcmdldCBidWZmZXIKKyAqIC0gdGhlIHBpdm90IGJ1ZmZlciBjYW4gYmUgcHJv
dmlkZWQgaW50ZXJuYWxseTsKKyAqICAgaW4gdGhpcyBjYXNlLCB0aGUgY2FsbGVyIHdpbGwgbm90
IGJlIGFibGUgdG8gZ2V0IGRldGFpbHMgYWJvdXQgd2hlcmUgYW4KKyAqICAgZXJyb3Igb2NjdXJy
ZWQKKyAqICAgKGlmIHBpdm90U3RhcnQ9PU5VTEwsIHNlZSBiZWxvdykKKyAqCisgKiBUaGUgZnVu
Y3Rpb24gcmV0dXJucyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgKiAtIHRo
ZSBlbnRpcmUgc291cmNlIHRleHQgaGFzIGJlZW4gY29udmVydGVkIHN1Y2Nlc3NmdWxseSB0byB0
aGUgdGFyZ2V0IGJ1ZmZlcgorICogLSBhIHRhcmdldCBidWZmZXIgb3ZlcmZsb3cgb2NjdXJyZWQg
KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKQorICogLSBhIGNvbnZlcnNpb24gZXJyb3Igb2NjdXJy
ZWQKKyAqICAgKG90aGVyIFVfRkFJTFVSRSgpLCBzZWUgZGVzY3JpcHRpb24gb2YgcEVycm9yQ29k
ZSkKKyAqCisgKiBMaW1pdGF0aW9uIGNvbXBhcmVkIHRvIHRoZSBkaXJlY3QgdXNlIG9mCisgKiB1
Y252X2Zyb21Vbmljb2RlKCkgYW5kIHVjbnZfdG9Vbmljb2RlKCk6CisgKiB1Y252X2NvbnZlcnRF
eCgpIGRvZXMgbm90IHByb3ZpZGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICoKKyAqIExpbWl0YXRp
b24gY29tcGFyZWQgdG8gdWNudl9mcm9tVUNoYXJzKCkgYW5kIHVjbnZfdG9VQ2hhcnMoKToKKyAq
IHVjbnZfY29udmVydEV4KCkgZG9lcyBub3Qgc3VwcG9ydCBwcmVmbGlnaHRpbmcgZGlyZWN0bHku
CisgKgorICogU2FtcGxlIGNvZGUgZm9yIGNvbnZlcnRpbmcgYSBzaW5nbGUgc3RyaW5nIGZyb20K
KyAqIG9uZSBleHRlcm5hbCBjaGFyc2V0IHRvIFVURi04LCBpZ25vcmluZyB0aGUgbG9jYXRpb24g
b2YgZXJyb3JzOgorICoKKyAqIFxjb2RlCisgKiBpbnQzMl90CisgKiBteVRvVVRGOChVQ29udmVy
dGVyICpjbnYsCisgKiAgICAgICAgICBjb25zdCBjaGFyICpzLCBpbnQzMl90IGxlbmd0aCwKKyAq
ICAgICAgICAgIGNoYXIgKnU4LCBpbnQzMl90IGNhcGFjaXR5LAorICogICAgICAgICAgVUVycm9y
Q29kZSAqcEVycm9yQ29kZSkgeworICogICAgIFVDb252ZXJ0ZXIgKnV0ZjhDbnY7CisgKiAgICAg
Y2hhciAqdGFyZ2V0OworICoKKyAqICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7Cisg
KiAgICAgICAgIHJldHVybiAwOworICogICAgIH0KKyAqCisgKiAgICAgdXRmOENudj1teUdldENh
Y2hlZFVURjhDb252ZXJ0ZXIocEVycm9yQ29kZSk7CisgKiAgICAgaWYoVV9GQUlMVVJFKCpwRXJy
b3JDb2RlKSkgeworICogICAgICAgICByZXR1cm4gMDsKKyAqICAgICB9CisgKgorICogICAgIHRh
cmdldD11ODsKKyAqICAgICB1Y252X2NvbnZlcnRFeChjbnYsIHV0ZjhDbnYsCisgKiAgICAgICAg
ICAgICAgICAgICAgJnRhcmdldCwgdTgrY2FwYWNpdHksCisgKiAgICAgICAgICAgICAgICAgICAg
JnMsIGxlbmd0aD49MCA/IHMrbGVuZ3RoIDogTlVMTCwKKyAqICAgICAgICAgICAgICAgICAgICBO
VUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICogICAgICAgICAgICAgICAgICAgIFRSVUUsIFRSVUUs
CisgKiAgICAgICAgICAgICAgICAgICAgcEVycm9yQ29kZSk7CisgKiAKKyAqICAgICBteVJlbGVh
c2VDYWNoZWRVVEY4Q29udmVydGVyKHV0ZjhDbnYpOworICoKKyAqICAgICAvLyByZXR1cm4gdGhl
IG91dHB1dCBzdHJpbmcgbGVuZ3RoLCBidXQgd2l0aG91dCBwcmVmbGlnaHRpbmcKKyAqICAgICBy
ZXR1cm4gKGludDMyX3QpKHRhcmdldC11OCk7CisgKiB9CisgKiBcZW5kY29kZQorICoKKyAqIEBw
YXJhbSB0YXJnZXRDbnYgICAgIE91dHB1dCBjb252ZXJ0ZXIsIHVzZWQgdG8gY29udmVydCBmcm9t
IHRoZSBVVEYtMTYgcGl2b3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQg
dXNpbmcgdWNudl9mcm9tVW5pY29kZSgpLgorICogQHBhcmFtIHNvdXJjZUNudiAgICAgSW5wdXQg
Y29udmVydGVyLCB1c2VkIHRvIGNvbnZlcnQgZnJvbSB0aGUgc291cmNlIHRvCisgKiAgICAgICAg
ICAgICAgICAgICAgICB0aGUgVVRGLTE2IHBpdm90IHVzaW5nIHVjbnZfdG9Vbmljb2RlKCkuCisg
KiBAcGFyYW0gdGFyZ2V0ICAgICAgICBJL08gcGFyYW1ldGVyLCBzYW1lIGFzIGZvciB1Y252X2Zy
b21VQ2hhcnMoKS4KKyAqICAgICAgICAgICAgICAgICAgICAgIElucHV0OiAqdGFyZ2V0IHBvaW50
cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgYnVmZmVyLgorICogICAgICAgICAgICAg
ICAgICAgICAgT3V0cHV0OiAqdGFyZ2V0IHBvaW50cyB0byB0aGUgZmlyc3QgdW5pdCBhZnRlciB0
aGUgbGFzdCBjaGFyIHdyaXR0ZW4uCisgKiBAcGFyYW0gdGFyZ2V0TGltaXQgICBQb2ludGVyIHRv
IHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSB0YXJnZXQgYnVmZmVyLgorICogQHBhcmFtIHNvdXJj
ZSAgICAgICAgSS9PIHBhcmFtZXRlciwgc2FtZSBhcyBmb3IgdWNudl90b1VDaGFycygpLgorICog
ICAgICAgICAgICAgICAgICAgICAgSW5wdXQ6ICpzb3VyY2UgcG9pbnRzIHRvIHRoZSBiZWdpbm5p
bmcgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQ6
ICpzb3VyY2UgcG9pbnRzIHRvIHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSBsYXN0IGNoYXIgcmVh
ZC4KKyAqIEBwYXJhbSBzb3VyY2VMaW1pdCAgIFBvaW50ZXIgdG8gdGhlIGZpcnN0IHVuaXQgYWZ0
ZXIgdGhlIHNvdXJjZSBidWZmZXIuCisgKiBAcGFyYW0gcGl2b3RTdGFydCAgICBQb2ludGVyIHRv
IHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyLiBJZiBwaXZvdFN0YXJ0PT1OVUxMLAorICogICAgICAg
ICAgICAgICAgICAgICAgdGhlbiBhbiBpbnRlcm5hbCBidWZmZXIgaXMgdXNlZCBhbmQgdGhlIG90
aGVyIHBpdm90CisgKiAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGlnbm9yZWQg
YW5kIGNhbiBiZSBOVUxMIGFzIHdlbGwuCisgKiBAcGFyYW0gcGl2b3RTb3VyY2UgICBJL08gcGFy
YW1ldGVyLCBzYW1lIGFzIHNvdXJjZSBpbiB1Y252X2Zyb21VQ2hhcnMoKSBmb3IKKyAqICAgICAg
ICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gZnJvbSB0aGUgcGl2b3QgYnVmZmVyIHRvIHRoZSB0
YXJnZXQgYnVmZmVyLgorICogQHBhcmFtIHBpdm90VGFyZ2V0ICAgSS9PIHBhcmFtZXRlciwgc2Ft
ZSBhcyB0YXJnZXQgaW4gdWNudl90b1VDaGFycygpIGZvcgorICogICAgICAgICAgICAgICAgICAg
ICAgY29udmVyc2lvbiBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIHRvIHRoZSBwaXZvdCBidWZmZXIu
CisgKiAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHBpdm90U3RhcnQ8PSpwaXZvdFNv
dXJjZTw9KnBpdm90VGFyZ2V0PD1waXZvdExpbWl0CisgKiAgICAgICAgICAgICAgICAgICAgICBh
bmQgcGl2b3RTdGFydDxwaXZvdExpbWl0ICh1bmxlc3MgcGl2b3RTdGFydD09TlVMTCkuCisgKiBA
cGFyYW0gcGl2b3RMaW1pdCAgICBQb2ludGVyIHRvIHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSBw
aXZvdCBidWZmZXIuCisgKiBAcGFyYW0gcmVzZXQgICAgICAgICBJZiBUUlVFLCB0aGVuIHVjbnZf
cmVzZXRUb1VuaWNvZGUoc291cmNlQ252KSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIHVj
bnZfcmVzZXRGcm9tVW5pY29kZSh0YXJnZXRDbnYpIGFyZSBjYWxsZWQsIGFuZCB0aGUKKyAqICAg
ICAgICAgICAgICAgICAgICAgIHBpdm90IHBvaW50ZXJzIGFyZSByZXNldCAoKnBpdm90VGFyZ2V0
PSpwaXZvdFNvdXJjZT1waXZvdFN0YXJ0KS4KKyAqIEBwYXJhbSBmbHVzaCAgICAgICAgIElmIHRy
dWUsIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dC4KKyAqICAgICAgICAgICAgICAgICAg
ICAgIFBhc3NlZCBkaXJlY3RseSB0byB1Y252X3RvVW5pY29kZSgpLCBhbmQgY2FycmllZCBvdmVy
IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICB1Y252X2Zyb21Vbmljb2RlKCkgd2hlbiB0aGUg
c291cmNlIGlzIGVtcHR5IGFzIHdlbGwuCisgKiBAcGFyYW0gcEVycm9yQ29kZSAgICBJQ1UgZXJy
b3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBm
dWxmaWxsIFVfU1VDQ0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCisgKiAgICAgICAgICAg
ICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiBhbHdheXMgcmVmZXJzIHRvIHRoZSB0
YXJnZXQgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG92ZXJmbG93cyBp
bnRvIHRoZSBwaXZvdCBidWZmZXIgYXJlIGhhbmRsZWQgaW50ZXJuYWxseS4KKyAqICAgICAgICAg
ICAgICAgICAgICAgIE90aGVyIGNvbnZlcnNpb24gZXJyb3JzIGFyZSBmcm9tIHRoZSBzb3VyY2Ut
dG8tcGl2b3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgKnBpdm90U291
cmNlPT1waXZvdFN0YXJ0LCBvdGhlcndpc2UgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAg
dGhlIHBpdm90LXRvLXRhcmdldCBjb252ZXJzaW9uLgorICoKKyAqIEBzZWUgdWNudl9jb252ZXJ0
CisgKiBAc2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfdG9BbGdvcml0aG1p
YworICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZfdG9Vbmljb2RlCisgKiBA
c2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJzCisgKiBAc3RhYmxlIElD
VSAyLjYKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKK3VjbnZfY29udmVydEV4KFVDb252
ZXJ0ZXIgKnRhcmdldENudiwgVUNvbnZlcnRlciAqc291cmNlQ252LAorICAgICAgICAgICAgICAg
Y2hhciAqKnRhcmdldCwgY29uc3QgY2hhciAqdGFyZ2V0TGltaXQsCisgICAgICAgICAgICAgICBj
b25zdCBjaGFyICoqc291cmNlLCBjb25zdCBjaGFyICpzb3VyY2VMaW1pdCwKKyAgICAgICAgICAg
ICAgIFVDaGFyICpwaXZvdFN0YXJ0LCBVQ2hhciAqKnBpdm90U291cmNlLAorICAgICAgICAgICAg
ICAgVUNoYXIgKipwaXZvdFRhcmdldCwgY29uc3QgVUNoYXIgKnBpdm90TGltaXQsCisgICAgICAg
ICAgICAgICBVQm9vbCByZXNldCwgVUJvb2wgZmx1c2gsCisgICAgICAgICAgICAgICBVRXJyb3JD
b2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gb25lIGV4dGVybmFsIGNo
YXJzZXQgdG8gYW5vdGhlci4KKyAqIEludGVybmFsbHksIHR3byBjb252ZXJ0ZXJzIGFyZSBvcGVu
ZWQgYWNjb3JkaW5nIHRvIHRoZSBuYW1lIGFyZ3VtZW50cywKKyAqIHRoZW4gdGhlIHRleHQgaXMg
Y29udmVydGVkIHRvIGFuZCBmcm9tIHRoZSAxNi1iaXQgVW5pY29kZSAicGl2b3QiCisgKiB1c2lu
ZyB1Y252X2NvbnZlcnRFeCgpLCB0aGVuIHRoZSBjb252ZXJ0ZXJzIGFyZSBjbG9zZWQgYWdhaW4u
CisgKgorICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBub3QgYW4gZWZmaWNpZW50
IHdheSB0byBjb252ZXJ0IGEgbG90IG9mIHRleHQ6CisgKiB1Y252X2NvbnZlcnQoKQorICogLSB0
YWtlcyBjaGFyc2V0IG5hbWVzLCBub3QgY29udmVydGVyIG9iamVjdHMsIHNvIHRoYXQKKyAqICAg
LSB0d28gY29udmVydGVycyBhcmUgb3BlbmVkIGZvciBlYWNoIGNhbGwKKyAqICAgLSBvbmx5IHNp
bmdsZS1zdHJpbmcgY29udmVyc2lvbiBpcyBwb3NzaWJsZSwgbm90IHN0cmVhbWluZyBvcGVyYXRp
b24KKyAqIC0gZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZmluZCBvdXQs
CisgKiAgIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2hldGhlciB0aGUgdG9Vbmljb2RlIG9yCisgKiAg
IHRoZSBmcm9tVW5pY29kZSBjb252ZXJzaW9uIGZhaWxlZAorICogLSBhbGxvd3MgTlVMLXRlcm1p
bmF0ZWQgaW5wdXQKKyAqICAgKG9ubHkgYSBzaW5nbGUgTlVMIGJ5dGUsIHdpbGwgbm90IHdvcmsg
Zm9yIGNoYXJzZXRzIHdpdGggbXVsdGktYnl0ZSBOVUxzKQorICogICAoaWYgc291cmNlTGVuZ3Ro
PT0tMSwgc2VlIHBhcmFtZXRlcnMpCisgKiAtIHRlcm1pbmF0ZSB3aXRoIGEgTlVMIG9uIG91dHB1
dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0ZSwgbm90IHVzZWZ1bCBmb3IgY2hhcnNldHMg
d2l0aCBtdWx0aS1ieXRlIE5VTHMpLAorICogICBvciBzZXQgVV9TVFJJTkdfTk9UX1RFUk1JTkFU
RURfV0FSTklORyBpZiB0aGUgb3V0cHV0IGV4YWN0bHkgZmlsbHMKKyAqICAgdGhlIHRhcmdldCBi
dWZmZXIKKyAqIC0gYSBwaXZvdCBidWZmZXIgaXMgcHJvdmlkZWQgaW50ZXJuYWxseQorICoKKyAq
IFRoZSBmdW5jdGlvbiByZXR1cm5zIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToK
KyAqIC0gdGhlIGVudGlyZSBzb3VyY2UgdGV4dCBoYXMgYmVlbiBjb252ZXJ0ZWQgc3VjY2Vzc2Z1
bGx5IHRvIHRoZSB0YXJnZXQgYnVmZmVyCisgKiAgIGFuZCBlaXRoZXIgdGhlIHRhcmdldCBidWZm
ZXIgaXMgdGVybWluYXRlZCB3aXRoIGEgc2luZ2xlIE5VTCBieXRlCisgKiAgIG9yIHRoZSBlcnJv
ciBjb2RlIGlzIHNldCB0byBVX1NUUklOR19OT1RfVEVSTUlOQVRFRF9XQVJOSU5HCisgKiAtIGEg
dGFyZ2V0IGJ1ZmZlciBvdmVyZmxvdyBvY2N1cnJlZCAoVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1Ip
CisgKiAgIGFuZCB0aGUgZnVsbCBvdXRwdXQgc3RyaW5nIGxlbmd0aCBpcyByZXR1cm5lZCAoInBy
ZWZsaWdodGluZyIpCisgKiAtIGEgY29udmVyc2lvbiBlcnJvciBvY2N1cnJlZAorICogICAob3Ro
ZXIgVV9GQUlMVVJFKCksIHNlZSBkZXNjcmlwdGlvbiBvZiBwRXJyb3JDb2RlKQorICoKKyAqIEBw
YXJhbSB0b0NvbnZlcnRlck5hbWUgICBUaGUgbmFtZSBvZiB0aGUgY29udmVydGVyIHRoYXQgaXMg
dXNlZCB0byBjb252ZXJ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgVVRG
LTE2IHBpdm90IGJ1ZmZlciB0byB0aGUgdGFyZ2V0LgorICogQHBhcmFtIGZyb21Db252ZXJ0ZXJO
YW1lIFRoZSBuYW1lIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAq
ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIFVURi0xNiBw
aXZvdCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUg
b3V0cHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSB0YXJnZXRDYXBhY2l0eSAgICBDYXBhY2l0eSBvZiB0
aGUgdGFyZ2V0LCBpbiBieXRlcy4KKyAqIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICBQb2ludGVy
IHRvIHRoZSBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gc291cmNlTGVuZ3RoICAgICAgTGVuZ3Ro
IG9mIHRoZSBpbnB1dCB0ZXh0LCBpbiBieXRlcywgb3IgLTEgZm9yIE5VTC10ZXJtaW5hdGVkIGlu
cHV0LgorICogQHBhcmFtIHBFcnJvckNvZGUgICAgICAgIElDVSBlcnJvciBjb2RlIGluL291dCBw
YXJhbWV0ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBmdWxmaWxsIFVfU1VD
Q0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCisgKiBAcmV0dXJuIExlbmd0aCBvZiB0aGUg
Y29tcGxldGUgb3V0cHV0IHRleHQgaW4gYnl0ZXMsIGV2ZW4gaWYgaXQgZXhjZWVkcyB0aGUgdGFy
Z2V0Q2FwYWNpdHkKKyAqICAgICAgICAgYW5kIGEgVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IgaXMg
c2V0LgorICoKKyAqIEBzZWUgdWNudl9jb252ZXJ0RXgKKyAqIEBzZWUgdWNudl9mcm9tQWxnb3Jp
dGhtaWMKKyAqIEBzZWUgdWNudl90b0FsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfZnJvbVVuaWNv
ZGUKKyAqIEBzZWUgdWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl9mcm9tVUNoYXJzCisgKiBA
c2VlIHVjbnZfdG9VQ2hhcnMKKyAqIEBzZWUgdWNudl9nZXROZXh0VUNoYXIKKyAqIEBzdGFibGUg
SUNVIDIuMAorICovCitVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWNudl9jb252ZXJ0KGNv
bnN0IGNoYXIgKnRvQ29udmVydGVyTmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9t
Q29udmVydGVyTmFtZSwKKyAgICAgICAgICAgICBjaGFyICp0YXJnZXQsCisgICAgICAgICAgICAg
aW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2Us
CisgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgVUVycm9y
Q29kZSAqcEVycm9yQ29kZSk7CisKKy8qKgorICogQ29udmVydCBmcm9tIG9uZSBleHRlcm5hbCBj
aGFyc2V0IHRvIGFub3RoZXIuCisgKiBJbnRlcm5hbGx5LCB0aGUgdGV4dCBpcyBjb252ZXJ0ZWQg
dG8gYW5kIGZyb20gdGhlIDE2LWJpdCBVbmljb2RlICJwaXZvdCIKKyAqIHVzaW5nIHVjbnZfY29u
dmVydEV4KCkuIHVjbnZfdG9BbGdvcml0aG1pYygpIHdvcmtzIGV4YWN0bHkgbGlrZSB1Y252X2Nv
bnZlcnQoKQorICogZXhjZXB0IHRoYXQgdGhlIHR3byBjb252ZXJ0ZXJzIG5lZWQgbm90IGJlIGxv
b2tlZCB1cCBhbmQgb3BlbmVkIGNvbXBsZXRlbHkuCisgKgorICogVGhlIHNvdXJjZS10by1waXZv
dCBjb252ZXJzaW9uIHVzZXMgdGhlIGNudiBjb252ZXJ0ZXIgcGFyYW1ldGVyLgorICogVGhlIHBp
dm90LXRvLXRhcmdldCBjb252ZXJzaW9uIHVzZXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMgY29udmVy
dGVyCisgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCBlLmcuLCBVQ05WX1VURjgg
Zm9yIGEgVVRGLTggY29udmVydGVyLgorICoKKyAqIEludGVybmFsbHksIHRoZSBhbGdvcml0aG1p
YyBjb252ZXJ0ZXIgaXMgb3BlbmVkIGFuZCBjbG9zZWQgZm9yIGVhY2gKKyAqIGZ1bmN0aW9uIGNh
bGwsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgdGhlIHB1YmxpYyB1Y252X29w
ZW4oKQorICogYnV0IHNvbWV3aGF0IGxlc3MgZWZmaWNpZW50IHRoYW4gb25seSByZXNldHRpbmcg
YW4gZXhpc3RpbmcgY29udmVydGVyCisgKiBhbmQgdXNpbmcgdWNudl9jb252ZXJ0RXgoKS4KKyAq
CisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIHVjbnZfY29udmVydEV4
KCkgZm9yIHNpbmdsZS1zdHJpbmcKKyAqIGNvbnZlcnNpb25zLCBlc3BlY2lhbGx5IHdoZW4gInBy
ZWZsaWdodGluZyIgaXMgZGVzaXJlZCAocmV0dXJuaW5nIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBj
b21wbGV0ZSBvdXRwdXQgZXZlbiBpZiBpdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgdGFyZ2V0IGJ1
ZmZlcjsKKyAqIHNlZSB0aGUgVXNlciBHdWlkZSBTdHJpbmdzIGNoYXB0ZXIpLiBTZWUgdWNudl9j
b252ZXJ0KCkgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIGFsZ29yaXRobWljVHlwZSAgIFVD
b252ZXJ0ZXJUeXBlIGNvbnN0YW50IGlkZW50aWZ5aW5nIHRoZSBkZXNpcmVkIHRhcmdldAorICog
ICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgYXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMg
Y29udmVydGVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRob3NlIGFyZSBjb252ZXJ0
ZXJzIGZvciBVbmljb2RlIGNoYXJzZXRzIGxpa2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAg
ICBVVEYtOCwgQk9DVS0xLCBTQ1NVLCBVVEYtNywgSU1BUC1tYWlsYm94LW5hbWUsIGV0Yy4sCisg
KiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbCBhcyBVUy1BU0NJSSBhbmQgSVNPLTg4
NTktMS4KKyAqIEBwYXJhbSBjbnYgICAgICAgICAgICAgICBUaGUgY29udmVydGVyIHRoYXQgaXMg
dXNlZCB0byBjb252ZXJ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgc291
cmNlIHRvIHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyLgorICogQHBhcmFtIHRhcmdldCAgICAgICAg
ICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0Q2FwYWNp
dHkgICAgQ2FwYWNpdHkgb2YgdGhlIHRhcmdldCwgaW4gYnl0ZXMuCisgKiBAcGFyYW0gc291cmNl
ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIHNvdXJj
ZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dCwgaW4gYnl0ZXMKKyAqIEBwYXJh
bSBwRXJyb3JDb2RlICAgICAgICBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICog
ICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgZnVsZmlsbCBVX1NVQ0NFU1MgYmVmb3JlIHRo
ZSBmdW5jdGlvbiBjYWxsLgorICogQHJldHVybiBMZW5ndGggb2YgdGhlIGNvbXBsZXRlIG91dHB1
dCB0ZXh0IGluIGJ5dGVzLCBldmVuIGlmIGl0IGV4Y2VlZHMgdGhlIHRhcmdldENhcGFjaXR5Cisg
KiAgICAgICAgIGFuZCBhIFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SIGlzIHNldC4KKyAqCisgKiBA
c2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfY29udmVydAorICogQHNlZSB1
Y252X2NvbnZlcnRFeAorICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZfdG9V
bmljb2RlCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJzCisg
KiBAc3RhYmxlIElDVSAyLjYKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZf
dG9BbGdvcml0aG1pYyhVQ29udmVydGVyVHlwZSBhbGdvcml0aG1pY1R5cGUsCisgICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlciAqY252LAorICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhcmdl
dCwgaW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy
ICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIFVFcnJv
ckNvZGUgKnBFcnJvckNvZGUpOworCisvKioKKyAqIENvbnZlcnQgZnJvbSBvbmUgZXh0ZXJuYWwg
Y2hhcnNldCB0byBhbm90aGVyLgorICogSW50ZXJuYWxseSwgdGhlIHRleHQgaXMgY29udmVydGVk
IHRvIGFuZCBmcm9tIHRoZSAxNi1iaXQgVW5pY29kZSAicGl2b3QiCisgKiB1c2luZyB1Y252X2Nv
bnZlcnRFeCgpLiB1Y252X2Zyb21BbGdvcml0aG1pYygpIHdvcmtzIGV4YWN0bHkgbGlrZSB1Y252
X2NvbnZlcnQoKQorICogZXhjZXB0IHRoYXQgdGhlIHR3byBjb252ZXJ0ZXJzIG5lZWQgbm90IGJl
IGxvb2tlZCB1cCBhbmQgb3BlbmVkIGNvbXBsZXRlbHkuCisgKgorICogVGhlIHNvdXJjZS10by1w
aXZvdCBjb252ZXJzaW9uIHVzZXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMgY29udmVydGVyCisgKiBh
Y2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCBlLmcuLCBVQ05WX1VURjggZm9yIGEgVVRG
LTggY29udmVydGVyLgorICogVGhlIHBpdm90LXRvLXRhcmdldCBjb252ZXJzaW9uIHVzZXMgdGhl
IGNudiBjb252ZXJ0ZXIgcGFyYW1ldGVyLgorICoKKyAqIEludGVybmFsbHksIHRoZSBhbGdvcml0
aG1pYyBjb252ZXJ0ZXIgaXMgb3BlbmVkIGFuZCBjbG9zZWQgZm9yIGVhY2gKKyAqIGZ1bmN0aW9u
IGNhbGwsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgdGhlIHB1YmxpYyB1Y252
X29wZW4oKQorICogYnV0IHNvbWV3aGF0IGxlc3MgZWZmaWNpZW50IHRoYW4gb25seSByZXNldHRp
bmcgYW4gZXhpc3RpbmcgY29udmVydGVyCisgKiBhbmQgdXNpbmcgdWNudl9jb252ZXJ0RXgoKS4K
KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIHVjbnZfY29udmVy
dEV4KCkgZm9yIHNpbmdsZS1zdHJpbmcKKyAqIGNvbnZlcnNpb25zLCBlc3BlY2lhbGx5IHdoZW4g
InByZWZsaWdodGluZyIgaXMgZGVzaXJlZCAocmV0dXJuaW5nIHRoZSBsZW5ndGgKKyAqIG9mIHRo
ZSBjb21wbGV0ZSBvdXRwdXQgZXZlbiBpZiBpdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgdGFyZ2V0
IGJ1ZmZlcjsKKyAqIHNlZSB0aGUgVXNlciBHdWlkZSBTdHJpbmdzIGNoYXB0ZXIpLiBTZWUgdWNu
dl9jb252ZXJ0KCkgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIGNudiAgICAgICAgICAgICAg
IFRoZSBjb252ZXJ0ZXIgdGhhdCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAqICAgICAgICAgICAgICAg
ICAgICAgICAgICBmcm9tIHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyIHRvIHRoZSB0YXJnZXQuCisg
KiBAcGFyYW0gYWxnb3JpdGhtaWNUeXBlICAgVUNvbnZlcnRlclR5cGUgY29uc3RhbnQgaWRlbnRp
ZnlpbmcgdGhlIGRlc2lyZWQgc291cmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hh
cnNldCBhcyBhIHB1cmVseSBhbGdvcml0aG1pYyBjb252ZXJ0ZXIuCisgKiAgICAgICAgICAgICAg
ICAgICAgICAgICAgVGhvc2UgYXJlIGNvbnZlcnRlcnMgZm9yIFVuaWNvZGUgY2hhcnNldHMgbGlr
ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04LCBCT0NVLTEsIFNDU1UsIFVURi03
LCBJTUFQLW1haWxib3gtbmFtZSwgZXRjLiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBh
cyB3ZWxsIGFzIFVTLUFTQ0lJIGFuZCBJU08tODg1OS0xLgorICogQHBhcmFtIHRhcmdldCAgICAg
ICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0Q2Fw
YWNpdHkgICAgQ2FwYWNpdHkgb2YgdGhlIHRhcmdldCwgaW4gYnl0ZXMuCisgKiBAcGFyYW0gc291
cmNlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIHNv
dXJjZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dCwgaW4gYnl0ZXMKKyAqIEBw
YXJhbSBwRXJyb3JDb2RlICAgICAgICBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgor
ICogICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgZnVsZmlsbCBVX1NVQ0NFU1MgYmVmb3Jl
IHRoZSBmdW5jdGlvbiBjYWxsLgorICogQHJldHVybiBMZW5ndGggb2YgdGhlIGNvbXBsZXRlIG91
dHB1dCB0ZXh0IGluIGJ5dGVzLCBldmVuIGlmIGl0IGV4Y2VlZHMgdGhlIHRhcmdldENhcGFjaXR5
CisgKiAgICAgICAgIGFuZCBhIFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SIGlzIHNldC4KKyAqCisg
KiBAc2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfY29udmVydAorICogQHNl
ZSB1Y252X2NvbnZlcnRFeAorICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZf
dG9Vbmljb2RlCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJz
CisgKiBAc3RhYmxlIElDVSAyLjYKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3Vj
bnZfZnJvbUFsZ29yaXRobWljKFVDb252ZXJ0ZXIgKmNudiwKKyAgICAgICAgICAgICAgICAgICAg
IFVDb252ZXJ0ZXJUeXBlIGFsZ29yaXRobWljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNo
YXIgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAg
ICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBGcmVlcyB1cCBtZW1v
cnkgb2NjdXBpZWQgYnkgdW51c2VkLCBjYWNoZWQgY29udmVydGVyIHNoYXJlZCBkYXRhLgorICoK
KyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjYWNoZWQgY29udmVydGVycyBzdWNjZXNzZnVsbHkg
ZGVsZXRlZAorICogQHNlZSB1Y252X2Nsb3NlCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9T
VEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfZmx1c2hDYWNoZSh2b2lkKTsKKworLyoqCisg
KiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbnZlcnRlcnMsIGFzIHBlciB0aGUg
YWxpYXMgZmlsZS4KKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbnZl
cnRlcnMKKyAqIEBzZWUgdWNudl9nZXRBdmFpbGFibGVOYW1lCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfY291bnRBdmFpbGFibGUodm9p
ZCk7CisKKy8qKgorICogR2V0cyB0aGUgY2Fub25pY2FsIGNvbnZlcnRlciBuYW1lIG9mIHRoZSBz
cGVjaWZpZWQgY29udmVydGVyIGZyb20gYSBsaXN0IG9mCisgKiBhbGwgYXZhaWxhYmxlIGNvbnZl
cnRlcnMgY29udGFpZWQgaW4gdGhlIGFsaWFzIGZpbGUuIEFsbCBjb252ZXJ0ZXJzCisgKiBpbiB0
aGlzIGxpc3QgY2FuIGJlIG9wZW5lZC4KKyAqCisgKiBAcGFyYW0gbiB0aGUgaW5kZXggdG8gYSBj
b252ZXJ0ZXIgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gKGluIHRoZSByYW5nZSA8VFQ+WzAuLnVj
bnZfY291bnRBdmFpYWJsZSgpXTwvVFQ+KQorICogQHJldHVybiBhIHBvaW50ZXIgYSBzdHJpbmcg
KGxpYnJhcnkgb3duZWQpLCBvciA8VFQ+TlVMTDwvVFQ+IGlmIHRoZSBpbmRleCBpcyBvdXQgb2Yg
Ym91bmRzLgorICogQHNlZSB1Y252X2NvdW50QXZhaWxhYmxlCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgY29uc3QgY2hhciogVV9FWFBPUlQyCit1Y252X2dldEF2YWlsYWJsZU5h
bWUoaW50MzJfdCBuKTsKKworLyoqCisgKiBSZXR1cm5zIGEgVUVudW1lcmF0aW9uIHRvIGVudW1l
cmF0ZSBhbGwgb2YgdGhlIGNhbm9uaWNhbCBjb252ZXJ0ZXIKKyAqIG5hbWVzLCBhcyBwZXIgdGhl
IGFsaWFzIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFiaWxpdHkgdG8gb3BlbiBlYWNoCisgKiBj
b252ZXJ0ZXIuCisgKgorICogQHJldHVybiBBIFVFbnVtZXJhdGlvbiBvYmplY3QgZm9yIGdldHRp
bmcgYWxsIHRoZSByZWNvZ25pemVkIGNhbm9uaWNhbAorICogICBjb252ZXJ0ZXIgbmFtZXMuCisg
KiBAc2VlIHVjbnZfZ2V0QXZhaWxhYmxlTmFtZQorICogQHNlZSB1ZW51bV9jbG9zZQorICogQHNl
ZSB1ZW51bV9uZXh0CisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworVV9TVEFCTEUgVUVudW1lcmF0
aW9uICogVV9FWFBPUlQyCit1Y252X29wZW5BbGxOYW1lcyhVRXJyb3JDb2RlICpwRXJyb3JDb2Rl
KTsKKworLyoqCisgKiBHaXZlcyB0aGUgbnVtYmVyIG9mIGFsaWFzZXMgZm9yIGEgZ2l2ZW4gY29u
dmVydGVyIG9yIGFsaWFzIG5hbWUuCisgKiBJZiB0aGUgYWxpYXMgaXMgYW1iaWd1b3VzLCB0aGVu
IHRoZSBwcmVmZXJyZWQgY29udmVydGVyIGlzIHVzZWQKKyAqIGFuZCB0aGUgc3RhdHVzIGlzIHNl
dCB0byBVX0FNQklHVU9VU19BTElBU19XQVJOSU5HLgorICogVGhpcyBtZXRob2Qgb25seSBlbnVt
ZXJhdGVzIHRoZSBsaXN0ZWQgZW50cmllcyBpbiB0aGUgYWxpYXMgZmlsZS4KKyAqIEBwYXJhbSBh
bGlhcyBhbGlhcyBuYW1lCisgKiBAcGFyYW0gcEVycm9yQ29kZSBlcnJvciBzdGF0dXMKKyAqIEBy
ZXR1cm4gbnVtYmVyIG9mIG5hbWVzIG9uIGFsaWFzIGxpc3QgZm9yIGdpdmVuIGFsaWFzCisgKiBA
c3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdWludDE2X3QgVV9FWFBPUlQyIAordWNudl9j
b3VudEFsaWFzZXMoY29uc3QgY2hhciAqYWxpYXMsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOwor
CisvKioKKyAqIEdpdmVzIHRoZSBuYW1lIG9mIHRoZSBhbGlhcyBhdCBnaXZlbiBpbmRleCBvZiBh
bGlhcyBsaXN0LgorICogVGhpcyBtZXRob2Qgb25seSBlbnVtZXJhdGVzIHRoZSBsaXN0ZWQgZW50
cmllcyBpbiB0aGUgYWxpYXMgZmlsZS4KKyAqIElmIHRoZSBhbGlhcyBpcyBhbWJpZ3VvdXMsIHRo
ZW4gdGhlIHByZWZlcnJlZCBjb252ZXJ0ZXIgaXMgdXNlZAorICogYW5kIHRoZSBzdGF0dXMgaXMg
c2V0IHRvIFVfQU1CSUdVT1VTX0FMSUFTX1dBUk5JTkcuCisgKiBAcGFyYW0gYWxpYXMgYWxpYXMg
bmFtZQorICogQHBhcmFtIG4gaW5kZXggaW4gYWxpYXMgbGlzdAorICogQHBhcmFtIHBFcnJvckNv
ZGUgcmVzdWx0IG9mIG9wZXJhdGlvbgorICogQHJldHVybiByZXR1cm5zIHRoZSBuYW1lIG9mIHRo
ZSBhbGlhcyBhdCBnaXZlbiBpbmRleAorICogQHNlZSB1Y252X2NvdW50QWxpYXNlcworICogQHN0
YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIgCit1Y252
X2dldEFsaWFzKGNvbnN0IGNoYXIgKmFsaWFzLCB1aW50MTZfdCBuLCBVRXJyb3JDb2RlICpwRXJy
b3JDb2RlKTsKKworLyoqCisgKiBGaWxsLXVwIHRoZSBsaXN0IG9mIGFsaWFzIG5hbWVzIGZvciB0
aGUgZ2l2ZW4gYWxpYXMuCisgKiBUaGlzIG1ldGhvZCBvbmx5IGVudW1lcmF0ZXMgdGhlIGxpc3Rl
ZCBlbnRyaWVzIGluIHRoZSBhbGlhcyBmaWxlLgorICogSWYgdGhlIGFsaWFzIGlzIGFtYmlndW91
cywgdGhlbiB0aGUgcHJlZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1
cyBpcyBzZXQgdG8gVV9BTUJJR1VPVVNfQUxJQVNfV0FSTklORy4KKyAqIEBwYXJhbSBhbGlhcyBh
bGlhcyBuYW1lCisgKiBAcGFyYW0gYWxpYXNlcyBmaWxsLWluIGxpc3QsIGFsaWFzZXMgaXMgYSBw
b2ludGVyIHRvIGFuIGFycmF5IG9mCisgKiAgICAgICAgPGNvZGU+dWNudl9jb3VudEFsaWFzZXMo
KTwvY29kZT4gc3RyaW5nLXBvaW50ZXJzCisgKiAgICAgICAgKDxjb2RlPmNvbnN0IGNoYXIgKjwv
Y29kZT4pIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4uCisgKiAgICAgICAgVGhlIHN0cmluZ3MgdGhl
bXNlbHZlcyBhcmUgb3duZWQgYnkgdGhlIGxpYnJhcnkuCisgKiBAcGFyYW0gcEVycm9yQ29kZSBy
ZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9p
ZCBVX0VYUE9SVDIgCit1Y252X2dldEFsaWFzZXMoY29uc3QgY2hhciAqYWxpYXMsIGNvbnN0IGNo
YXIgKiphbGlhc2VzLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBSZXR1cm4g
YSBuZXcgVUVudW1lcmF0aW9uIG9iamVjdCBmb3IgZW51bWVyYXRpbmcgYWxsIHRoZQorICogYWxp
YXMgbmFtZXMgZm9yIGEgZ2l2ZW4gY29udmVydGVyIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgYSBz
dGFuZGFyZC4KKyAqIFRoaXMgbWV0aG9kIG9ubHkgZW51bWVyYXRlcyB0aGUgbGlzdGVkIGVudHJp
ZXMgaW4gdGhlIGFsaWFzIGZpbGUuCisgKiBUaGUgY29udnJ0cnMudHh0IGZpbGUgY2FuIGJlIG1v
ZGlmaWVkIHRvIGNoYW5nZSB0aGUgcmVzdWx0cyBvZgorICogdGhpcyBmdW5jdGlvbi4KKyAqIFRo
ZSBmaXJzdCByZXN1bHQgaW4gdGhpcyBsaXN0IGlzIHRoZSBzYW1lIHJlc3VsdCBnaXZlbiBieQor
ICogPGNvZGU+dWNudl9nZXRTdGFuZGFyZE5hbWU8L2NvZGU+LCB3aGljaCBpcyB0aGUgZGVmYXVs
dCBhbGlhcyBmb3IKKyAqIHRoZSBzcGVjaWZpZWQgc3RhbmRhcmQgbmFtZS4gVGhlIHJldHVybmVk
IG9iamVjdCBtdXN0IGJlIGNsb3NlZCB3aXRoCisgKiA8Y29kZT51ZW51bV9jbG9zZTwvY29kZT4g
d2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjb252TmFt
ZSBvcmlnaW5hbCBjb252ZXJ0ZXIgbmFtZQorICogQHBhcmFtIHN0YW5kYXJkIG5hbWUgb2YgdGhl
IHN0YW5kYXJkIGdvdmVybmluZyB0aGUgbmFtZXM7IE1JTUUgYW5kIElBTkEKKyAqICAgICAgYXJl
IHN1Y2ggc3RhbmRhcmRzCisgKiBAcGFyYW0gcEVycm9yQ29kZSBUaGUgZXJyb3IgY29kZQorICog
QHJldHVybiBBIFVFbnVtZXJhdGlvbiBvYmplY3QgZm9yIGdldHRpbmcgYWxsIGFsaWFzZXMgdGhh
dCBhcmUgcmVjb2duaXplZAorICogICAgICBieSBhIHN0YW5kYXJkLiBJZiBhbnkgb2YgdGhlIHBh
cmFtZXRlcnMgYXJlIGludmFsaWQsIE5VTEwKKyAqICAgICAgaXMgcmV0dXJuZWQuCisgKiBAc2Vl
IHVjbnZfZ2V0U3RhbmRhcmROYW1lCisgKiBAc2VlIHVlbnVtX2Nsb3NlCisgKiBAc2VlIHVlbnVt
X25leHQKKyAqIEBzdGFibGUgSUNVIDIuMgorICovCitVX1NUQUJMRSBVRW51bWVyYXRpb24gKiBV
X0VYUE9SVDIKK3VjbnZfb3BlblN0YW5kYXJkTmFtZXMoY29uc3QgY2hhciAqY29udk5hbWUsCisg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YW5kYXJkLAorICAgICAgICAgICAg
ICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBHaXZlcyB0aGUg
bnVtYmVyIG9mIHN0YW5kYXJkcyBhc3NvY2lhdGVkIHRvIGNvbnZlcnRlciBuYW1lcy4KKyAqIEBy
ZXR1cm4gbnVtYmVyIG9mIHN0YW5kYXJkcworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RB
QkxFIHVpbnQxNl90IFVfRVhQT1JUMgordWNudl9jb3VudFN0YW5kYXJkcyh2b2lkKTsKKworLyoq
CisgKiBHaXZlcyB0aGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgYXQgZ2l2ZW4gaW5kZXggb2Ygc3Rh
bmRhcmQgbGlzdC4KKyAqIEBwYXJhbSBuIGluZGV4IGluIHN0YW5kYXJkIGxpc3QKKyAqIEBwYXJh
bSBwRXJyb3JDb2RlIHJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIEByZXR1cm4gcmV0dXJucyB0aGUg
bmFtZSBvZiB0aGUgc3RhbmRhcmQgYXQgZ2l2ZW4gaW5kZXguIE93bmVkIGJ5IHRoZSBsaWJyYXJ5
LgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9S
VDIKK3VjbnZfZ2V0U3RhbmRhcmQodWludDE2X3QgbiwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7
CisKKy8qKgorICogUmV0dXJucyBhIHN0YW5kYXJkIG5hbWUgZm9yIGEgZ2l2ZW4gY29udmVydGVy
IG5hbWUuCisgKiA8cD4KKyAqIEV4YW1wbGUgYWxpYXMgdGFibGU6PGJyPgorICogY29udiBhbGlh
czEgeyBTVEFOREFSRDEgfSBhbGlhczIgeyBTVEFOREFSRDEqIH0KKyAqIDxwPgorICogUmVzdWx0
IG9mIHVjbnZfZ2V0U3RhbmRhcmROYW1lKCJjb252IiwgIlNUQU5EQVJEMSIpIGZyb20gZXhhbXBs
ZQorICogYWxpYXMgdGFibGU6PGJyPgorICogPGI+ImFsaWFzMiI8L2I+CisgKgorICogQHBhcmFt
IG5hbWUgb3JpZ2luYWwgY29udmVydGVyIG5hbWUKKyAqIEBwYXJhbSBzdGFuZGFyZCBuYW1lIG9m
IHRoZSBzdGFuZGFyZCBnb3Zlcm5pbmcgdGhlIG5hbWVzOyBNSU1FIGFuZCBJQU5BCisgKiAgICAg
ICAgYXJlIHN1Y2ggc3RhbmRhcmRzCisgKiBAcGFyYW0gcEVycm9yQ29kZSByZXN1bHQgb2Ygb3Bl
cmF0aW9uCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIHN0YW5kYXJkIGNvbnZlcnRlciBuYW1lOwor
ICogICAgICAgICBpZiBhIHN0YW5kYXJkIGNvbnZlcnRlciBuYW1lIGNhbm5vdCBiZSBkZXRlcm1p
bmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVybmVkLiBPd25l
ZCBieSB0aGUgbGlicmFyeS4KKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBjb25z
dCBjaGFyICogVV9FWFBPUlQyCit1Y252X2dldFN0YW5kYXJkTmFtZShjb25zdCBjaGFyICpuYW1l
LCBjb25zdCBjaGFyICpzdGFuZGFyZCwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKy8qKgor
ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaW50ZXJuYWwgY2Fub25pY2FsIGNvbnZl
cnRlciBuYW1lIG9mIHRoZQorICogdGFnZ2VkIGFsaWFzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBv
ZiB1Y252X29wZW5TdGFuZGFyZE5hbWVzLCB3aGljaAorICogcmV0dXJucyB0aGUgdGFnZ2VkIGFs
aWFzIGdpdmVuIHRoZSBjYW5vbmljYWwgbmFtZS4KKyAqIDxwPgorICogRXhhbXBsZSBhbGlhcyB0
YWJsZTo8YnI+CisgKiBjb252IGFsaWFzMSB7IFNUQU5EQVJEMSB9IGFsaWFzMiB7IFNUQU5EQVJE
MSogfQorICogPHA+CisgKiBSZXN1bHQgb2YgdWNudl9nZXRTdGFuZGFyZE5hbWUoImFsaWFzMSIs
ICJTVEFOREFSRDEiKSBmcm9tIGV4YW1wbGUKKyAqIGFsaWFzIHRhYmxlOjxicj4KKyAqIDxiPiJj
b252IjwvYj4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNhbm9uaWNhbCBjb252ZXJ0ZXIg
bmFtZTsKKyAqICAgICAgICAgaWYgYSBzdGFuZGFyZCBvciBhbGlhcyBuYW1lIGNhbm5vdCBiZSBk
ZXRlcm1pbmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVybmVk
LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzCisgKiAgICAgICAgIG93bmVkIGJ5IHRoZSBsaWJyYXJ5
LgorICogQHNlZSB1Y252X2dldFN0YW5kYXJkTmFtZQorICogQHN0YWJsZSBJQ1UgMi40CisgKi8K
K1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIKK3VjbnZfZ2V0Q2Fub25pY2FsTmFtZShj
b25zdCBjaGFyICphbGlhcywgY29uc3QgY2hhciAqc3RhbmRhcmQsIFVFcnJvckNvZGUgKnBFcnJv
ckNvZGUpOworCisvKioKKyAqIHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0ZXIg
bmFtZS4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0
ZXIgbmFtZTsKKyAqICAgICAgICAgaWYgYSBkZWZhdWx0IGNvbnZlcnRlciBuYW1lIGNhbm5vdCBi
ZSBkZXRlcm1pbmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVy
bmVkLgorICogICAgICAgICBTdG9yYWdlIG93bmVkIGJ5IHRoZSBsaWJyYXJ5CisgKiBAc2VlIHVj
bnZfc2V0RGVmYXVsdE5hbWUKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBjb25z
dCBjaGFyICogVV9FWFBPUlQyCit1Y252X2dldERlZmF1bHROYW1lKHZvaWQpOworCisvKioKKyAq
IHNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0ZXIgbmFtZS4gQ2FsbGVyIG11c3Qgb3du
IHRoZSBzdG9yYWdlIGZvciAnbmFtZScKKyAqIGFuZCBwcmVzZXJ2ZSBpdCBpbmRlZmluaXRlbHku
IAorICogQHBhcmFtIG5hbWUgdGhlIGNvbnZlcnRlciBuYW1lIHRvIGJlIHRoZSBkZWZhdWx0ICht
dXN0IGV4aXN0KS4KKyAqIEBzZWUgdWNudl9nZXREZWZhdWx0TmFtZQorICogQHN5c3RlbSBTWVNU
RU0gQVBJCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIK
K3VjbnZfc2V0RGVmYXVsdE5hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogRml4ZXMg
dGhlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgbWlzbWFwcGluZy4gIEZvciBleGFtcGxlLCBpbiBTSklT
LCB0aGUgYmFja3NsYXNoIAorICogY2hhcmFjdGVyIGluIHRoZSBBU0NJSSBwb3J0aW9uIGlzIGFs
c28gdXNlZCB0byByZXByZXNlbnQgdGhlIHllbiBjdXJyZW5jeSBzaWduLiAgCisgKiBXaGVuIG1h
cHBpbmcgZnJvbSBVbmljb2RlIGNoYXJhY3RlciAweDAwNUMsIGl0J3MgdW5jbGVhciB3aGV0aGVy
IHRvIG1hcCB0aGUgCisgKiBjaGFyYWN0ZXIgYmFjayB0byB5ZW4gb3IgYmFja3NsYXNoIGluIFNK
SVMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBhbmQgcmVw
bGFjZSBhbGwgdGhlIHllbiBzaWduIGNoYXJhY3RlcnMgd2l0aCBiYWNrc2xhc2guICBUaGlzIGlz
IG5lY2Vzc2FyeQorICogd2hlbiB0aGUgdXNlciB0cmllcyB0byBvcGVuIGEgZmlsZSB3aXRoIHRo
ZSBpbnB1dCBidWZmZXIgb24gV2luZG93cy4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0ZXN0IHRo
ZSBjb252ZXJ0ZXIgdG8gc2VlIHdoZXRoZXIgc3VjaCBtYXBwaW5nIGlzCisgKiByZXF1aXJlZC4g
IFlvdSBjYW4gc29tZXRpbWVzIGF2b2lkIHVzaW5nIHRoaXMgZnVuY3Rpb24gYnkgdXNpbmcgdGhl
IGNvcnJlY3QgdmVyc2lvbgorICogb2YgU2hpZnQtSklTLgorICoKKyAqIEBwYXJhbSBjbnYgVGhl
IGNvbnZlcnRlciByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBjb2RlcGFnZS4KKyAqIEBwYXJhbSBz
b3VyY2UgdGhlIGlucHV0IGJ1ZmZlciB0byBiZSBmaXhlZAorICogQHBhcmFtIHNvdXJjZUxlbiB0
aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBzZWUgdWNudl9pc0FtYmlndW91cwor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X2Zp
eEZpbGVTZXBhcmF0b3IoY29uc3QgVUNvbnZlcnRlciAqY252LCBVQ2hhciAqc291cmNlLCBpbnQz
Ml90IHNvdXJjZUxlbik7CisKKy8qKgorICogRGV0ZXJtaW5lcyBpZiB0aGUgY29udmVydGVyIGNv
bnRhaW5zIGFtYmlndW91cyBtYXBwaW5ncyBvZiB0aGUgc2FtZQorICogY2hhcmFjdGVyIG9yIG5v
dC4KKyAqIEBwYXJhbSBjbnYgdGhlIGNvbnZlcnRlciB0byBiZSB0ZXN0ZWQKKyAqIEByZXR1cm4g
VFJVRSBpZiB0aGUgY29udmVydGVyIGNvbnRhaW5zIGFtYmlndW91cyBtYXBwaW5nIG9mIHRoZSBz
YW1lIAorICogY2hhcmFjdGVyLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyCit1Y252X2lzQW1iaWd1b3VzKGNvbnN0IFVD
b252ZXJ0ZXIgKmNudik7CisKKy8qKgorICogU2V0cyB0aGUgY29udmVydGVyIHRvIHVzZSBmYWxs
YmFjayBtYXBwaW5nIG9yIG5vdC4KKyAqIEBwYXJhbSBjbnYgVGhlIGNvbnZlcnRlciB0byBzZXQg
dGhlIGZhbGxiYWNrIG1hcHBpbmcgdXNhZ2Ugb24uCisgKiBAcGFyYW0gdXNlc0ZhbGxiYWNrIFRS
VUUgaWYgdGhlIHVzZXIgd2FudHMgdGhlIGNvbnZlcnRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0
aGUgZmFsbGJhY2sgCisgKiBtYXBwaW5nLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCit1Y252X3NldEZhbGxiYWNrKFVD
b252ZXJ0ZXIgKmNudiwgVUJvb2wgdXNlc0ZhbGxiYWNrKTsKKworLyoqCisgKiBEZXRlcm1pbmVz
IGlmIHRoZSBjb252ZXJ0ZXIgdXNlcyBmYWxsYmFjayBtYXBwaW5ncyBvciBub3QuCisgKiBAcGFy
YW0gY252IFRoZSBjb252ZXJ0ZXIgdG8gYmUgdGVzdGVkCisgKiBAcmV0dXJuIFRSVUUgaWYgdGhl
IGNvbnZlcnRlciB1c2VzIGZhbGxiYWNrLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyIAordWNudl91c2VzRmFsbGJhY2so
Y29uc3QgVUNvbnZlcnRlciAqY252KTsKKworLyoqCisgKiBEZXRlY3RzIFVuaWNvZGUgc2lnbmF0
dXJlIGJ5dGUgc2VxdWVuY2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgYnl0ZSBzdHJlYW0KKyAqIGFu
ZCByZXR1cm5zIHRoZSBjaGFyc2V0IG5hbWUgb2YgdGhlIGluZGljYXRlZCBVbmljb2RlIGNoYXJz
ZXQuCisgKiBOVUxMIGlzIHJldHVybmVkIHdoZW4gbm8gVW5pY29kZSBzaWduYXR1cmUgaXMgcmVj
b2duaXplZC4KKyAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNpZ25hdHVyZSBpcyBvdXRw
dXQgYXMgd2VsbC4KKyAqCisgKiBUaGUgY2FsbGVyIGNhbiB1Y252X29wZW4oKSBhIGNvbnZlcnRl
ciB1c2luZyB0aGUgY2hhcnNldCBuYW1lLgorICogVGhlIGZpcnN0IGNvZGUgdW5pdCAoVUNoYXIp
IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0gd2lsbCBiZSBVK0ZFRkYKKyAqICh0aGUgVW5p
Y29kZSBCT00vc2lnbmF0dXJlIGNoYXJhY3RlcikgYW5kIGNhbiB1c3VhbGx5IGJlIGlnbm9yZWQu
CisgKgorICogRm9yIG1vc3QgVW5pY29kZSBjaGFyc2V0cyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRv
IGlnbm9yZSB0aGUgaW5kaWNhdGVkCisgKiBudW1iZXIgb2YgaW5pdGlhbCBzdHJlYW0gYnl0ZXMg
YW5kIHN0YXJ0IGNvbnZlcnRpbmcgYWZ0ZXIgdGhlbS4KKyAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBz
dGF0ZWZ1bCBVbmljb2RlIGNoYXJzZXRzIChVVEYtNyBhbmQgQk9DVS0xKSBmb3Igd2hpY2gKKyAq
IHRoaXMgd2lsbCBub3Qgd29yay4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGlnbm9yZSB0aGUg
Zmlyc3Qgb3V0cHV0IFVDaGFyCisgKiBpbnN0ZWFkIG9mIHRoZSBpbnB1dCBzaWduYXR1cmUgYnl0
ZXMuCisgKiA8cD4KKyAqIFVzYWdlOgorICogQGNvZGUgICAgIAorICogICAgICBVRXJyb3JDb2Rl
IGVyciA9IFVfWkVST19FUlJPUjsKKyAqICAgICAgY2hhciBpbnB1dFtdID0geyAnXHhFRicsJ1x4
QkInLCAnXHhCRicsJ1x4NDEnLCdceDQyJywnXHg0MycgfTsKKyAqICAgICAgaW50MzJfdCBzaWdu
YXR1cmVMZW5ndGggPSAwOworICogICAgICBjaGFyICplbmNvZGluZyA9IHVjbnZfZGV0ZWN0VW5p
Y29kZVNpZ25hdHVyZXMoaW5wdXQsc2l6ZW9mKGlucHV0KSwmc2lnbmF0dXJlTGVuZ3RoLCZlcnIp
OworICogICAgICBVQ29udmVydGVyICpjb252ID0gTlVMTDsKKyAqICAgICAgVUNoYXIgb3V0cHV0
WzEwMF07CisgKiAgICAgIFVDaGFyICp0YXJnZXQgPSBvdXRwdXQsICpvdXQ7CisgKiAgICAgIGNo
YXIgKnNvdXJjZSA9IGlucHV0OworICogICAgICBpZihlbmNvZGluZyE9TlVMTCAmJiBVX1NVQ0NF
U1MoZXJyKSl7CisgKiAgICAgICAgICAvLyBzaG91bGQgc2lnbmF0dXJlIGJlIGRpc2NhcmRlZCA/
CisgKiAgICAgICAgICBjb252ID0gdWNudl9vcGVuKGVuY29kaW5nLCAmZXJyKTsKKyAqICAgICAg
ICAgIC8vIGRvIHRoZSBjb252ZXJzaW9uCisgKiAgICAgICAgICB1Y252X3RvVW5pY29kZShjb252
LAorICogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBvdXRwdXQgKyBzaXplb2Yob3V0
cHV0KS9VX1NJWkVPRl9VQ0hBUiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwg
aW5wdXQgKyBzaXplb2YoaW5wdXQpLAorICogICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwg
VFJVRSwgJmVycik7CisgKiAgICAgICAgICBvdXQgPSBvdXRwdXQ7CisgKiAgICAgICAgICBpZiAo
ZGlzY2FyZFNpZ25hdHVyZSl7CisgKiAgICAgICAgICAgICAgKytvdXQ7IC8vIGlnbm9yZSBpbml0
aWFsIFUrRkVGRgorICogICAgICAgICAgfQorICogICAgICAgICAgd2hpbGUob3V0ICE9IHRhcmdl
dCkgeworICogICAgICAgICAgICAgIHByaW50ZigiJTA0eCAiLCAqb3V0KyspOworICogICAgICAg
ICAgfQorICogICAgICAgICAgcHV0cygiIik7CisgKiAgICAgIH0KKyAqICAgICAKKyAqIEBlbmRj
b2RlCisgKgorICogQHBhcmFtIHNvdXJjZSAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nIGlu
IHdoaWNoIHRoZSBzaWduYXR1cmUgc2hvdWxkIGJlIGRldGVjdGVkLgorICogQHBhcmFtIHNvdXJj
ZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nLCBvciAtMSBpZiB0ZXJtaW5h
dGVkIHdpdGggYSBOVUwgYnl0ZS4KKyAqIEBwYXJhbSBzaWduYXR1cmVMZW5ndGggICBBIHBvaW50
ZXIgdG8gaW50MzJfdCB0byByZWNlaXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYWtlIHVw
IHRoZSBzaWduYXR1cmUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGRldGVj
dGVkIFVURi4gMCBpZiBub3QgZGV0ZWN0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg
Q2FuIGJlIGEgTlVMTCBwb2ludGVyLgorICogQHBhcmFtIHBFcnJvckNvZGUgICAgICAgIEEgcG9p
bnRlciB0byByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IGFueSBlcnJvcnMgdGhhdCBtYXkgb2Nj
dXIgZHVyaW5nIGRldGVjdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJl
IGEgdmFsaWQgcG9pbnRlciB0byBhbiBlcnJvciBjb2RlIHZhbHVlLCB3aGljaCBtdXN0IG5vdCBp
bmRpY2F0ZSBhIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhl
IGZ1bmN0aW9uIGNhbGwuCisgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyBkZXRl
Y3RlZC4gTlVMTCBpZiBlbmNvZGluZyBpcyBub3QgZGV0ZWN0ZWQuIAorICogQHN0YWJsZSBJQ1Ug
Mi40CisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIqIFVfRVhQT1JUMgordWNudl9kZXRlY3RVbmlj
b2RlU2lnbmF0dXJlKGNvbnN0IGNoYXIqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQzMl90IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnQzMl90ICpzaWduYXR1cmVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVy
cm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKyNlbmRpZgorCisjZW5kaWYKKy8qX1VDTlYqLwpJbmRl
eDogSmF2YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWNudl9lcnIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9pY3UvdW5pY29kZS91Y252X2Vyci5oCShyZXZpc2lvbiAwKQorKysgSmF2
YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWNudl9lcnIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw0NTYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQs
IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3Ro
ZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogICB1
Y252X2Vyci5oOgorICovCisKKy8qKgorICogXGZpbGUKKyAqIFxicmllZiBDIFVDb252ZXJ0ZXIg
cHJlZGVmaW5lZCBlcnJvciBjYWxsYmFja3MKKyAqCisgKiAgPGgyPkVycm9yIEJlaGF2aW91ciBG
dW5jdGlvbnM8L2gyPgorICogIERlZmluZXMgc29tZSBlcnJvciBiZWhhdmlvdXIgZnVuY3Rpb25z
IGNhbGxlZCBieSB1Y252X3tmcm9tLHRvfVVuaWNvZGUKKyAqICBUaGVzZSBhcmUgcHJvdmlkZWQg
YXMgcGFydCBvZiBJQ1UgYW5kIG1hbnkgYXJlIHN0YWJsZSwgYnV0IHRoZXkKKyAqICBjYW4gYWxz
byBiZSBjb25zaWRlcmVkIG9ubHkgYXMgYW4gZXhhbXBsZSBvZiB3aGF0IGNhbiBiZSBkb25lIHdp
dGgKKyAqICBjYWxsYmFja3MuICBZb3UgbWF5IG9mIGNvdXJzZSB3cml0ZSB5b3VyIG93bi4KKyAq
CisgKiAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24sIHlvdSBtYXkgYWxzbyBmaW5kIHRo
ZSBmdW5jdGlvbnMgZnJvbQorICogIHVjbnZfY2IuaCB1c2VmdWwgd2hlbiB3cml0aW5nIHlvdXIg
b3duIGNhbGxiYWNrcy4KKyAqCisgKiAgVGhlc2UgZnVuY3Rpb25zLCBhbHRob3VnaCBwdWJsaWMs
IHNob3VsZCBORVZFUiBiZSBjYWxsZWQgZGlyZWN0bHkuCisgKiAgVGhleSBzaG91bGQgYmUgdXNl
ZCBhcyBwYXJhbWV0ZXJzIHRvIHRoZSB1Y252X3NldEZyb21VQ2FsbGJhY2sKKyAqICBhbmQgdWNu
dl9zZXRUb1VDYWxsYmFjayBmdW5jdGlvbnMsIHRvIHNldCB0aGUgYmVoYXZpb3VyIG9mIGEgY29u
dmVydGVyCisgKiAgd2hlbiBpdCBlbmNvdW50ZXJzIElMTEVHQUwvVU5NQVBQRUQvSU5WQUxJRCBz
ZXF1ZW5jZXMuCisgKgorICogIHVzYWdlIGV4YW1wbGU6ICAnU1RPUCcgZG9lc24ndCBuZWVkIGFu
eSBjb250ZXh0LCBidXQgbmV3Q29udGV4dAorICogICAgY291bGQgYmUgc2V0IHRvIHNvbWV0aGlu
ZyBvdGhlciB0aGFuICdOVUxMJyBpZiBuZWVkZWQuIFRoZSBhdmFpbGFibGUKKyAqICAgIGNvbnRl
eHRzIGluIHRoaXMgaGVhZGVyIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhl
IGNhbGxiYWNrLgorICoKKyAqICBcY29kZQorICogIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VS
Uk9SOworICogIFVDb252ZXJ0ZXIgKm15Q29udmVydGVyID0gdWNudl9vcGVuKCJpYm0tOTQ5Iiwg
JmVycik7CisgKiAgY29uc3Qgdm9pZCAqb2xkQ29udGV4dDsKKyAqICBVQ29udmVydGVyRnJvbVVD
YWxsYmFjayBvbGRBY3Rpb247CisgKgorICoKKyAqICBpZiAoVV9TVUNDRVNTKGVycikpCisgKiAg
eworICogICAgICB1Y252X3NldEZyb21VQ2FsbEJhY2sobXlDb252ZXJ0ZXIsCisgKiAgICAgICAg
ICAgICAgICAgICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1RPUCwKKyAqICAgICAgICAgICAg
ICAgICAgICAgICBOVUxMLAorICogICAgICAgICAgICAgICAgICAgICAgICZvbGRBY3Rpb24sCisg
KiAgICAgICAgICAgICAgICAgICAgICAgJm9sZENvbnRleHQsCisgKiAgICAgICAgICAgICAgICAg
ICAgICAgJnN0YXR1cyk7CisgKiAgfQorICogIFxlbmRjb2RlCisgKgorICogIFRoZSBjb2RlIGFi
b3ZlIHRlbGxzICJteUNvbnZlcnRlciIgdG8gc3RvcCB3aGVuIGl0IGVuY291bnRlcnMgYW4KKyAq
ICBJTExFR0FML1RSVU5DQVRFRC9JTlZBTElEIHNlcXVlbmNlcyB3aGVuIGl0IGlzIHVzZWQgdG8g
Y29udmVydCBmcm9tCisgKiAgVW5pY29kZSAtPiBDb2RlcGFnZS4gVGhlIGJlaGF2aW9yIGZyb20g
Q29kZXBhZ2UgdG8gVW5pY29kZSBpcyBub3QgY2hhbmdlZCwKKyAqICBhbmQgdWNudl9zZXRUb1VD
YWxsQmFjayB3b3VsZCBuZWVkIHRvIGJlIGNhbGxlZCBpbiBvcmRlciB0byBjaGFuZ2UKKyAqICB0
aGF0IGJlaGF2aW9yIHRvby4KKyAqCisgKiAgSGVyZSBpcyBhbiBleGFtcGxlIHdpdGggYSBjb250
ZXh0OgorICoKKyAqICBcY29kZQorICogIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwor
ICogIFVDb252ZXJ0ZXIgKm15Q29udmVydGVyID0gdWNudl9vcGVuKCJpYm0tOTQ5IiwgJmVycik7
CisgKiAgY29uc3Qgdm9pZCAqb2xkQ29udGV4dDsKKyAqICBVQ29udmVydGVyRnJvbVVDYWxsYmFj
ayBvbGRBY3Rpb247CisgKgorICoKKyAqICBpZiAoVV9TVUNDRVNTKGVycikpCisgKiAgeworICog
ICAgICB1Y252X3NldFRvVUNhbGxCYWNrKG15Q29udmVydGVyLAorICogICAgICAgICAgICAgICAg
ICAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TVUJTVElUVVRFLAorICogICAgICAgICAgICAgICAg
ICAgICAgIFVDTlZfU1VCX1NUT1BfT05fSUxMRUdBTCwKKyAqICAgICAgICAgICAgICAgICAgICAg
ICAmb2xkQWN0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICZvbGRDb250ZXh0LAorICog
ICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICogIH0KKyAqICBcZW5kY29kZQorICoK
KyAqICBUaGUgY29kZSBhYm92ZSB0ZWxscyAibXlDb252ZXJ0ZXIiIHRvIHN0b3Agd2hlbiBpdCBl
bmNvdW50ZXJzIGFuCisgKiAgSUxMRUdBTC9UUlVOQ0FURUQvSU5WQUxJRCBzZXF1ZW5jZXMgd2hl
biBpdCBpcyB1c2VkIHRvIGNvbnZlcnQgZnJvbQorICogIENvZGVwYWdlIC0+IFVuaWNvZGUuIEFu
eSB1bm1hcHBlZCBhbmQgbGVnYWwgY2hhcmFjdGVycyB3aWxsIGJlCisgKiAgc3Vic3RpdHV0ZWQg
dG8gYmUgdGhlIGRlZmF1bHQgc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKyAqLworCisjaWZuZGVm
IFVDTlZfRVJSX0gKKyNkZWZpbmUgVUNOVl9FUlJfSAorCisjaW5jbHVkZSAidW5pY29kZS91dHlw
ZXMuaCIKKworI2lmICFVQ09ORklHX05PX0NPTlZFUlNJT04KKworLyoqIEZvcndhcmQgZGVjbGFy
aW5nIHRoZSBVQ29udmVydGVyIHN0cnVjdHVyZS4gQHN0YWJsZSBJQ1UgMi4wICovCitzdHJ1Y3Qg
VUNvbnZlcnRlcjsKKworLyoqIEBzdGFibGUgSUNVIDIuMCAqLwordHlwZWRlZiBzdHJ1Y3QgVUNv
bnZlcnRlciBVQ29udmVydGVyOworCisvKioKKyAqIEZST01fVSwgVE9fVSBjb250ZXh0IG9wdGlv
bnMgZm9yIHN1YiBjYWxsYmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KKyNkZWZpbmUgVUNO
Vl9TVUJfU1RPUF9PTl9JTExFR0FMICJpIgorCisvKioKKyAqIEZST01fVSwgVE9fVSBjb250ZXh0
IG9wdGlvbnMgZm9yIHNraXAgY2FsbGJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVm
aW5lIFVDTlZfU0tJUF9TVE9QX09OX0lMTEVHQUwgImkiCisKKy8qKgorICogRlJPTV9VX0NBTExC
QUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRp
bmcgdG8gSUNVICglVVhYWFgpIAorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KKyNkZWZpbmUgVUNO
Vl9FU0NBUEVfSUNVICAgICAgIE5VTEwKKy8qKgorICogRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSBj
b250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRpbmcgdG8gSkFWQSAo
XFx1WFhYWCkKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfRVNDQVBFX0pB
VkEgICAgICAiSiIKKy8qKgorICogRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlv
biB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRpbmcgdG8gQyAoXFx1WFhYWCBcXFVYWFhY
WFhYWCkKKyAqIFRPX1VfQ0FMTEJBQ0tfRVNDQVBFIG9wdGlvbiB0byBlc2NhcGUgdGhlIGNoYXJh
Y3RlciB2YWx1ZSBhY2NvZGluZyB0byBDIChcXHhYWFhYKQorICogQHN0YWJsZSBJQ1UgMi4wCisg
Ki8KKyNkZWZpbmUgVUNOVl9FU0NBUEVfQyAgICAgICAgICJDIgorLyoqCisgKiBGUk9NX1VfQ0FM
TEJBQ0tfRVNDQVBFIGNvbnRleHQgb3B0aW9uIHRvIGVzY2FwZSB0aGUgY29kZSB1bml0IGFjY29y
ZGluZyB0byBYTUwgRGVjaW1hbCBlc2NhcGUgKCZhbXA7I0REREQ7KQorICogVE9fVV9DQUxMQkFD
S19FU0NBUEUgY29udGV4dCBvcHRpb24gdG8gZXNjYXBlIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYWNj
b2RpbmcgdG8gWE1MIERlY2ltYWwgZXNjYXBlICgmYW1wOyNEREREOykKKyAqIEBzdGFibGUgSUNV
IDIuMAorICovCisjZGVmaW5lIFVDTlZfRVNDQVBFX1hNTF9ERUMgICAiRCIKKy8qKgorICogRlJP
TV9VX0NBTExCQUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5p
dCBhY2NvcmRpbmcgdG8gWE1MIEhleCBlc2NhcGUgKCZhbXA7I3hYWFhYOykKKyAqIFRPX1VfQ0FM
TEJBQ0tfRVNDQVBFIGNvbnRleHQgb3B0aW9uIHRvIGVzY2FwZSB0aGUgY2hhcmFjdGVyIHZhbHVl
IGFjY29kaW5nIHRvIFhNTCBIZXggZXNjYXBlICgmYW1wOyN4WFhYWDspCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworI2RlZmluZSBVQ05WX0VTQ0FQRV9YTUxfSEVYICAgIlgiCisvKioKKyAqIEZS
T01fVV9DQUxMQkFDS19FU0NBUEUgY29udGV4dCBvcHRpb24gdG8gZXNjYXBlIHRlaCBjb2RlIHVu
aXQgYWNjb3JkaW5nIHRvIFVuaWNvZGUgKFUrWFhYWFgpCisgKiBAc3RhYmxlIElDVSAyLjAKKyAq
LworI2RlZmluZSBVQ05WX0VTQ0FQRV9VTklDT0RFICAgIlUiCisKKy8qKiAKKyAqIFRoZSBwcm9j
ZXNzIGNvbmRpdGlvbiBjb2RlIHRvIGJlIHVzZWQgd2l0aCB0aGUgY2FsbGJhY2tzLiAgCisgKiBD
b2RlcyB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIFVDTlZfSVJSRUdVTEFSIHNob3VsZCBiZSAKKyAq
IHBhc3NlZCBvbiB0byBhbnkgY2hhaW5lZCBjYWxsYmFja3MuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBVQ05WX1VOQVNTSUdORUQgPSAwLCAgLyoqPCBUaGUg
Y29kZSBwb2ludCBpcyB1bmFzc2lnbmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU
aGUgZXJyb3IgY29kZSBVX0lOVkFMSURfQ0hBUl9GT1VORCB3aWxsIGJlIHNldC4gKi8KKyAgICBV
Q05WX0lMTEVHQUwgPSAxLCAgICAgLyoqPCBUaGUgY29kZSBwb2ludCBpcyBpbGxlZ2FsLiBGb3Ig
ZXhhbXBsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxceDgxXFx4MkUgaXMgaWxs
ZWdhbCBpbiBTSklTIGJlY2F1c2UgXFx4MkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aXMgbm90IGEgdmFsaWQgdHJhaWwgYnl0ZSBmb3IgdGhlIFxceDgxIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBsZWFkIGJ5dGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFs
c28sIHN0YXJ0aW5nIHdpdGggVW5pY29kZSAzLjAuMSwgbm9uLXNob3J0ZXN0IGJ5dGUgc2VxdWVu
Y2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFVURi04IChsaWtlIFxceEMxXFx4
QTEgaW5zdGVhZCBvZiBcXHg2MSBmb3IgVSswMDYxKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhcmUgYWxzbyBpbGxlZ2FsLCBub3QganVzdCBpcnJlZ3VsYXIuCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFRoZSBlcnJvciBjb2RlIFVfSUxMRUdBTF9DSEFSX0ZPVU5EIHdpbGwg
YmUgc2V0LiAqLworICAgIFVDTlZfSVJSRUdVTEFSID0gMiwgICAvKio8IFRoZSBjb2RlcG9pbnQg
aXMgbm90IGEgcmVndWxhciBzZXF1ZW5jZSBpbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhlIGVuY29kaW5nLiBGb3IgZXhhbXBsZSwgXFx4RURcXHhBMFxceDgwLi5cXHhFRFxceEJG
XFx4QkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGlycmVndWxhciBVVEYtOCBi
eXRlIHNlcXVlbmNlcyBmb3Igc2luZ2xlIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb2RlIHBvaW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVy
cm9yIGNvZGUgVV9JTlZBTElEX0NIQVJfRk9VTkQgd2lsbCBiZSBzZXQuICovCisgICAgVUNOVl9S
RVNFVCA9IDMsICAgICAgIC8qKjwgVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoaXMgcmVh
c29uIHdoZW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZXQnIGhhcyBvY2N1
cmVkLiBDYWxsYmFjayBzaG91bGQgcmVzZXQgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlLiAqLworICAgIFVDTlZfQ0xPU0UgPSA0LCAgICAgICAgLyoqPCBDYWxsZWQgd2hl
biB0aGUgY29udmVydGVyIGlzIGNsb3NlZC4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNhbGxiYWNrIHNob3VsZCByZWxlYXNlIGFueSBhbGxvY2F0ZWQgbWVtb3J5LiovCisgICAg
VUNOVl9DTE9ORSA9IDUgICAgICAgICAvKio8IENhbGxlZCB3aGVuIHVjbnZfc2FmZUNsb25lKCkg
aXMgY2FsbGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVy
LiB0aGUgcG9pbnRlciBhdmFpbGFibGUgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnY29udGV4dCcgaXMgYW4gYWxpYXMgdG8gdGhlIG9yaWdpbmFsIGNvbnZlcnRlcnMnCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0IHBvaW50ZXIuIElmIHRoZSBjb250
ZXh0IG11c3QgYmUgb3duZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBu
ZXcgY29udmVydGVyLCB0aGUgY2FsbGJhY2sgbXVzdCBjbG9uZSAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRoZSBkYXRhIGFuZCBjYWxsIHVjbnZfc2V0RnJvbVVDYWxsYmFjayAKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBzZXRUb1VDYWxsYmFjaykgd2l0aCB0aGUg
Y29ycmVjdCBwb2ludGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YWJsZSBJ
Q1UgMi4yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBVQ29udmVydGVyQ2FsbGJh
Y2tSZWFzb247CisKKworLyoqCisgKiBUaGUgc3RydWN0dXJlIGZvciB0aGUgZnJvbVVuaWNvZGUg
Y2FsbGJhY2sgZnVuY3Rpb24gcGFyYW1ldGVyLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK3R5
cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBUaGUg
c2l6ZSBvZiB0aGlzIHN0cnVjdC4gQHN0YWJsZSBJQ1UgMi4wICovCisgICAgVUJvb2wgZmx1c2g7
ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGludGVybmFsIHN0YXRlIG9mIGNvbnZlcnRlciB3aWxs
IGJlIHJlc2V0IGFuZCBkYXRhIGZsdXNoZWQgaWYgc2V0IHRvIFRSVUUuIEBzdGFibGUgSUNVIDIu
MCAgICAqLworICAgIFVDb252ZXJ0ZXIgKmNvbnZlcnRlcjsgICAgICAvKio8IFBvaW50ZXIgdG8g
dGhlIGNvbnZlcnRlciB0aGF0IGlzIG9wZW5lZCBhbmQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3QgaXMg
cGFzc2VkIGFzIGFuIGFyZ3VtZW50LiBAc3RhYmxlIElDVSAyLjAgICovCisgICAgY29uc3QgVUNo
YXIgKnNvdXJjZTsgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgc291cmNlIHNvdXJjZSBidWZm
ZXIuIEBzdGFibGUgSUNVIDIuMCAgICAqLworICAgIGNvbnN0IFVDaGFyICpzb3VyY2VMaW1pdDsg
ICAvKio8IFBvaW50ZXIgdG8gdGhlIGxpbWl0IChlbmQgKyAxKSBvZiBzb3VyY2UgYnVmZmVyLiBA
c3RhYmxlIElDVSAyLjAgICAgKi8KKyAgICBjaGFyICp0YXJnZXQ7ICAgICAgICAgICAgICAgLyoq
PCBQb2ludGVyIHRvIHRoZSB0YXJnZXQgYnVmZmVyLiBAc3RhYmxlIElDVSAyLjAgICAgKi8KKyAg
ICBjb25zdCBjaGFyICp0YXJnZXRMaW1pdDsgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBsaW1pdCAo
ZW5kICsgMSkgb2YgdGFyZ2V0IGJ1ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICAqLworICAgIGlu
dDMyX3QgKm9mZnNldHM7ICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0
IHJlY2lldmVzIHRoZSBvZmZzZXRzLiAqb2Zmc2V0ID0gYmxhaCA7IG9mZnNldCsrOy4gQHN0YWJs
ZSBJQ1UgMi4wICAqLworfSBVQ29udmVydGVyRnJvbVVuaWNvZGVBcmdzOworCisKKy8qKgorICog
VGhlIHN0cnVjdHVyZSBmb3IgdGhlIHRvVW5pY29kZSBjYWxsYmFjayBmdW5jdGlvbiBwYXJhbWV0
ZXIuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQx
Nl90IHNpemU7ICAgICAgICAgICAgICAvKio8IFRoZSBzaXplIG9mIHRoaXMgc3RydWN0ICAgQHN0
YWJsZSBJQ1UgMi4wICovCisgICAgVUJvb2wgZmx1c2g7ICAgICAgICAgICAgICAgIC8qKjwgVGhl
IGludGVybmFsIHN0YXRlIG9mIGNvbnZlcnRlciB3aWxsIGJlIHJlc2V0IGFuZCBkYXRhIGZsdXNo
ZWQgaWYgc2V0IHRvIFRSVUUuIEBzdGFibGUgSUNVIDIuMCAgICovCisgICAgVUNvbnZlcnRlciAq
Y29udmVydGVyOyAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgY29udmVydGVyIHRoYXQgaXMgb3Bl
bmVkIGFuZCB0byB3aGljaCB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIEBz
dGFibGUgSUNVIDIuMCAqLworICAgIGNvbnN0IGNoYXIgKnNvdXJjZTsgICAgICAgICAvKio8IFBv
aW50ZXIgdG8gdGhlIHNvdXJjZSBzb3VyY2UgYnVmZmVyLiBAc3RhYmxlIElDVSAyLjAgICAgKi8K
KyAgICBjb25zdCBjaGFyICpzb3VyY2VMaW1pdDsgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBsaW1p
dCAoZW5kICsgMSkgb2Ygc291cmNlIGJ1ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICovCisgICAg
VUNoYXIgKnRhcmdldDsgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1
ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICovCisgICAgY29uc3QgVUNoYXIgKnRhcmdldExpbWl0
OyAgIC8qKjwgUG9pbnRlciB0byB0aGUgbGltaXQgKGVuZCArIDEpIG9mIHRhcmdldCBidWZmZXIu
IEBzdGFibGUgSUNVIDIuMCAgICAgKi8KKyAgICBpbnQzMl90ICpvZmZzZXRzOyAgICAgICAgICAg
LyoqPCBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCByZWNpZXZlcyB0aGUgb2Zmc2V0cy4gKm9m
ZnNldCA9IGJsYWggOyBvZmZzZXQrKzsuIEBzdGFibGUgSUNVIDIuMCAgKi8KK30gVUNvbnZlcnRl
clRvVW5pY29kZUFyZ3M7CisKKworLyoqCisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJ
UkVDVExZIQorICogVGhpcyBGcm9tIFVuaWNvZGUgY2FsbGJhY2sgU1RPUFMgYXQgdGhlIElMTEVH
QUxfU0VRVUVOQ0UsCisgKiByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYmFjayB0byB0aGUgY2Fs
bGVyIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFBvaW50ZXIgdG8gdGhlIGNh
bGxiYWNrJ3MgcHJpdmF0ZSBkYXRhCisgKiBAcGFyYW0gZnJvbVVBcmdzIEluZm9ybWF0aW9uIGFi
b3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29kZVVuaXRzIFBvaW50
cyB0byAnbGVuZ3RoJyBVQ2hhcnMgb2YgdGhlIGNvbmNlcm5lZCBVbmljb2RlIHNlcXVlbmNlCisg
KiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdl
IHNlcXVlbmNlCisgKiBAcGFyYW0gY29kZVBvaW50IFNpbmdsZSBVQ2hhcjMyIChVVEYtMzIpIGNv
bnRhaW5pbmcgdGhlIGNvbmNlcmVuZCBVbmljb2RlIGNvZGVwb2ludC4KKyAqIEBwYXJhbSByZWFz
b24gRGVmaW5lcyB0aGUgcmVhc29uIHRoZSBjYWxsYmFjayB3YXMgaW52b2tlZAorICogQHBhcmFt
IGVyciBUaGlzIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIGEgZmFpbHVyZSBzdGF0dXMgcHJpb3Ig
dG8gY2FsbGluZy4KKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQ
T1JUMiBVQ05WX0ZST01fVV9DQUxMQkFDS19TVE9QICgKKyAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVyRnJvbVVuaWNvZGVB
cmdzICpmcm9tVUFyZ3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY29kZVVuaXRz
LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBV
Q2hhcjMyIGNvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworCisK
Ky8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSEKKyAqIFRoaXMgVG8g
VW5pY29kZSBjYWxsYmFjayBTVE9QUyBhdCB0aGUgSUxMRUdBTF9TRVFVRU5DRSwKKyAqIHJldHVy
bmluZyB0aGUgZXJyb3IgY29kZSBiYWNrIHRvIHRoZSBjYWxsZXIgaW1tZWRpYXRlbHkuCisgKgor
ICogQHBhcmFtIGNvbnRleHQgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sncyBwcml2YXRlIGRhdGEK
KyAqIEBwYXJhbSB0b1VBcmdzIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHBy
b2dyZXNzCisgKiBAcGFyYW0gY29kZVVuaXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0
aGUgY29uY2VybmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGlu
IGJ5dGVzKSBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVh
c29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJh
bSBlcnIgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzIHByaW9y
IHRvIGNhbGxpbmcuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VY
UE9SVDIgVUNOVl9UT19VX0NBTExCQUNLX1NUT1AgKAorICAgICAgICAgICAgICAgICAgY29uc3Qg
dm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1VuaWNvZGVBcmdz
ICp0b1VBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29kZVVuaXRzLAorICAg
ICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBVQ29udmVy
dGVyQ2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAq
IGVycik7CisKKy8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSEKKyAq
IFRoaXMgRnJvbSBVbmljb2RlIGNhbGxiYWNrIHNraXBzIGFueSBJTExFR0FMX1NFUVVFTkNFLCBv
cgorICogc2tpcHMgb25seSBVTkFTU0lOR0VEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiB0aGUgY29u
dGV4dCBwYXJhbWV0ZXIKKyAqIHNpbXBseSBpZ25vcmluZyB0aG9zZSBjaGFyYWN0ZXJzLiAKKyAq
CisgKiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25pemVzIHRo
ZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAgIFVDTlZfU0tJUF9TVE9QX09O
X0lMTEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FMX1NFUVVFTkNFLAorICogICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1l
ZGlhdGVseS4KKyAqICAgICAgICAgICAgICAgICBOVUxMOiBTa2lwcyBhbnkgSUxMRUdBTF9TRVFV
RU5DRQorICogQHBhcmFtIGZyb21VQXJncyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lv
biBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNo
YXJzIG9mIHRoZSBjb25jZXJuZWQgVW5pY29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBT
aXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBh
cmFtIGNvZGVQb2ludCBTaW5nbGUgVUNoYXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25j
ZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQuCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJl
YXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVl
IHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICog
ICAgICBvdGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVz
LgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIFVDTlZf
RlJPTV9VX0NBTExCQUNLX1NLSVAgKAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29u
dGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVW5pY29kZUFyZ3MgKmZyb21V
QXJncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBjb2RlVW5pdHMsCisgICAgICAg
ICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDaGFyMzIgY29k
ZVBvaW50LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNv
biwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIERPIE5P
VCBDQUxMIFRISVMgRlVOQ1RJT04gRElSRUNUTFkhCisgKiBUaGlzIEZyb20gVW5pY29kZSBjYWxs
YmFjayB3aWxsIFN1YnN0aXR1dGUgdGhlIElMTEVHQUwgU0VRVUVOQ0UsIG9yIAorICogVU5BU1NJ
R05FRF9TRVFVRU5DRSBkZXBlbmRpbmcgb24gY29udGV4dCBwYXJhbWV0ZXIsIHdpdGggdGhlCisg
KiBjdXJyZW50IHN1YnN0aXR1dGlvbiBzdHJpbmcgZm9yIHRoZSBjb252ZXJ0ZXIuIFRoaXMgaXMg
dGhlIGRlZmF1bHQKKyAqIGNhbGxiYWNrLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBmdW5j
dGlvbiBjdXJyZW50bHkgcmVjb2duaXplcyB0aGUgY2FsbGJhY2sgb3B0aW9uczoKKyAqICAgICAg
ICAgICAgICAgICBVQ05WX1NVQl9TVE9QX09OX0lMTEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FM
X1NFUVVFTkNFLAorICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBj
b2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1lZGlhdGVseS4KKyAqICAgICAgICAgICAgICAgICBO
VUxMOiBTdWJzdGl0dXRlcyBhbnkgSUxMRUdBTF9TRVFVRU5DRQorICogQHBhcmFtIGZyb21VQXJn
cyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFt
IGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQgVW5p
Y29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNv
bmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUgVUNo
YXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQu
CisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGlu
dm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3Mg
aWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICogICAgICBvdGhlcndpc2UgdGhpcyB2YWx1
ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzLgorICogQHNlZSB1Y252X3NldFN1YnN0
Q2hhcnMKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiBV
Q05WX0ZST01fVV9DQUxMQkFDS19TVUJTVElUVVRFICgKKyAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVyRnJvbVVuaWNvZGVB
cmdzICpmcm9tVUFyZ3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY29kZVVuaXRz
LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBV
Q2hhcjMyIGNvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworLyoq
CisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICogVGhpcyBGcm9tIFVu
aWNvZGUgY2FsbGJhY2sgd2lsbCBTdWJzdGl0dXRlIHRoZSBJTExFR0FMIFNFUVVFTkNFIHdpdGgg
dGhlCisgKiBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWxsZWdhbCBjb2RlcG9p
bnRzCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25p
emVzIHRoZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgIDx1bD4KKyAqICAgICAgICA8bGk+
VUNOVl9FU0NBUEVfSUNVOiBTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRo
ZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmb3JtYXQg
ICVVWFhYWCwgZS5nLiAiJXVGRkZFJXUwMEFDJXVDOEZFIikuIAorICogICAgICAgICAgSW4gdGhl
IEV2ZW50IHRoZSBjb252ZXJ0ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBjaGFyYWN0ZXJzIHslLFV9
W0EtRl1bMC05XSwgCisgKiAgICAgICAgICBpdCB3aWxsICBzdWJzdGl0dXRlICB0aGUgaWxsZWdh
bCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJzdGl0dXRpb24gY2hhcmFjdGVycy4KKyAqICAgICAgICAg
IE5vdGUgdGhhdCAgY29kZVVuaXQoMzJiaXQgaW50IGVnOiB1bml0IG9mIGEgc3Vycm9nYXRlIHBh
aXIpIGlzIHJlcHJlc2VudGVkIGFzCisgKiAgICAgICAgICAlVUQ4NEQlVURDNTY8L2xpPgorICog
ICAgICAgIDxsaT5VQ05WX0VTQ0FQRV9KQVZBOiBTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFV
RU5DRSB3aXRoIHRoZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGlu
IHRoZSBmb3JtYXQgIFxcdVhYWFgsIGUuZy4gIlxcdUZGRkVcXHUwMEFDXFx1QzhGRSIpLiAKKyAq
ICAgICAgICAgIEluIHRoZSBFdmVudCB0aGUgY29udmVydGVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUg
Y2hhcmFjdGVycyB7XCx1fVtBLUZdWzAtOV0sIAorICogICAgICAgICAgaXQgd2lsbCAgc3Vic3Rp
dHV0ZSAgdGhlIGlsbGVnYWwgc2VxdWVuY2Ugd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3Rl
cnMuCisgKiAgICAgICAgICBOb3RlIHRoYXQgIGNvZGVVbml0KDMyYml0IGludCBlZzogdW5pdCBv
ZiBhIHN1cnJvZ2F0ZSBwYWlyKSBpcyByZXByZXNlbnRlZCBhcworICogICAgICAgICAgXFx1RDg0
RFxcdURDNTY8L2xpPgorICogICAgICAgIDxsaT5VQ05WX0VTQ0FQRV9DOiBTdWJzdGl0dWVzIHRo
ZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJl
cHJlc2VudGF0aW9uIGluIHRoZSBmb3JtYXQgIFxcdVhYWFgsIGUuZy4gIlxcdUZGRkVcXHUwMEFD
XFx1QzhGRSIpLiAKKyAqICAgICAgICAgIEluIHRoZSBFdmVudCB0aGUgY29udmVydGVyIGRvZXNu
J3Qgc3VwcG9ydCB0aGUgY2hhcmFjdGVycyB7XCx1LFV9W0EtRl1bMC05XSwgCisgKiAgICAgICAg
ICBpdCB3aWxsICBzdWJzdGl0dXRlICB0aGUgaWxsZWdhbCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJz
dGl0dXRpb24gY2hhcmFjdGVycy4KKyAqICAgICAgICAgIE5vdGUgdGhhdCAgY29kZVVuaXQoMzJi
aXQgaW50IGVnOiB1bml0IG9mIGEgc3Vycm9nYXRlIHBhaXIpIGlzIHJlcHJlc2VudGVkIGFzCisg
KiAgICAgICAgICBcXFUwMDAyMzQ1NjwvbGk+CisgKiAgICAgICAgPGxpPlVDTlZfRVNDQVBFX1hN
TF9ERUM6IFN1YnN0aXR1ZXMgdGhlICBJTExFR0FMIFNFUVVFTkNFIHdpdGggdGhlIGRlY2ltYWwg
CisgKiAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiB0aGUgZm9ybWF0ICAmYW1wOyNERERERERE
RDssIGUuZy4gIiZhbXA7IzY1NTM0OyZhbXA7IzE3MjsmYW1wOyM1MTQ1NDsiKS4gCisgKiAgICAg
ICAgICBJbiB0aGUgRXZlbnQgdGhlIGNvbnZlcnRlciBkb2Vzbid0IHN1cHBvcnQgdGhlIGNoYXJh
Y3RlcnMgeyZhbXA7LCN9WzAtOV0sIAorICogICAgICAgICAgaXQgd2lsbCAgc3Vic3RpdHV0ZSAg
dGhlIGlsbGVnYWwgc2VxdWVuY2Ugd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMuCisg
KiAgICAgICAgICBOb3RlIHRoYXQgIGNvZGVVbml0KDMyYml0IGludCBlZzogdW5pdCBvZiBhIHN1
cnJvZ2F0ZSBwYWlyKSBpcyByZXByZXNlbnRlZCBhcworICogICAgICAgICAgJmFtcDsjMTQ0NDcw
OyBhbmQgWmVybyBwYWRkaW5nIGlzIGlnbm9yZWQuPC9saT4KKyAqICAgICAgICA8bGk+VUNOVl9F
U0NBUEVfWE1MX0hFWDpTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZSBk
ZWNpbWFsIAorICogICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gdGhlIGZvcm1hdCAgJiN4WFhY
WCwgZS5nLiAiJmFtcDsjeEZGRkU7JmFtcDsjeDAwQUM7JmFtcDsjeEM4RkU7IikuIAorICogICAg
ICAgICAgSW4gdGhlIEV2ZW50IHRoZSBjb252ZXJ0ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBjaGFy
YWN0ZXJzIHsmLCMseH1bMC05XSwgCisgKiAgICAgICAgICBpdCB3aWxsICBzdWJzdGl0dXRlICB0
aGUgaWxsZWdhbCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJzdGl0dXRpb24gY2hhcmFjdGVycy4KKyAq
ICAgICAgICAgIE5vdGUgdGhhdCAgY29kZVVuaXQoMzJiaXQgaW50IGVnOiB1bml0IG9mIGEgc3Vy
cm9nYXRlIHBhaXIpIGlzIHJlcHJlc2VudGVkIGFzCisgKiAgICAgICAgICAmYW1wOyN4MjM0NTY7
PC9saT4KKyAqICAgICAgICA8L3VsPgorICogQHBhcmFtIGZyb21VQXJncyBJbmZvcm1hdGlvbiBh
Ym91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQb2lu
dHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQgVW5pY29kZSBzZXF1ZW5jZQor
ICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFn
ZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUgVUNoYXIzMiAoVVRGLTMyKSBj
b250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQuCisgKiBAcGFyYW0gcmVh
c29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJh
bSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNr
IHdhcyBoYW5kbGVkLAorICogICAgICBvdGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0
byBhIGZhaWx1cmUgc3RhdHVzLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZv
aWQgVV9FWFBPUlQyIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSAoCisgICAgICAgICAgICAg
ICAgICBjb25zdCB2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlckZy
b21Vbmljb2RlQXJncyAqZnJvbVVBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIq
IGNvZGVVbml0cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgVUNoYXIzMiBjb2RlUG9pbnQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVy
Q2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqIGVy
cik7CisKKworLyoqCisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICog
VGhpcyBUbyBVbmljb2RlIGNhbGxiYWNrIHNraXBzIGFueSBJTExFR0FMX1NFUVVFTkNFLCBvcgor
ICogc2tpcHMgb25seSBVTkFTU0lOR0VEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiB0aGUgY29udGV4
dCBwYXJhbWV0ZXIKKyAqIHNpbXBseSBpZ25vcmluZyB0aG9zZSBjaGFyYWN0ZXJzLiAKKyAqCisg
KiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25pemVzIHRoZSBj
YWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAgIFVDTlZfU0tJUF9TVE9QX09OX0lM
TEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FMX1NFUVVFTkNFLAorICogICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1lZGlh
dGVseS4KKyAqICAgICAgICAgICAgICAgICBOVUxMOiBTa2lwcyBhbnkgSUxMRUdBTF9TRVFVRU5D
RQorICogQHBhcmFtIHRvVUFyZ3MgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnZlcnNpb24gaW4g
cHJvZ3Jlc3MKKyAqIEBwYXJhbSBjb2RlVW5pdHMgUG9pbnRzIHRvICdsZW5ndGgnIGJ5dGVzIG9m
IHRoZSBjb25jZXJuZWQgY29kZXBhZ2Ugc2VxdWVuY2UKKyAqIEBwYXJhbSBsZW5ndGggU2l6ZSAo
aW4gYnl0ZXMpIG9mIHRoZSBjb25jZXJuZWQgY29kZXBhZ2Ugc2VxdWVuY2UKKyAqIEBwYXJhbSBy
ZWFzb24gRGVmaW5lcyB0aGUgcmVhc29uIHRoZSBjYWxsYmFjayB3YXMgaW52b2tlZAorICogQHBh
cmFtIGVyciBSZXR1cm4gdmFsdWUgd2lsbCBiZSBzZXQgdG8gc3VjY2VzcyBpZiB0aGUgY2FsbGJh
Y2sgd2FzIGhhbmRsZWQsCisgKiAgICAgIG90aGVyd2lzZSB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0
IHRvIGEgZmFpbHVyZSBzdGF0dXMuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUg
dm9pZCBVX0VYUE9SVDIgVUNOVl9UT19VX0NBTExCQUNLX1NLSVAgKAorICAgICAgICAgICAgICAg
ICAgY29uc3Qgdm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1Vu
aWNvZGVBcmdzICp0b1VBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29kZVVu
aXRzLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAg
ICBVQ29udmVydGVyQ2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVy
cm9yQ29kZSAqIGVycik7CisKKy8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJF
Q1RMWSEKKyAqIFRoaXMgVG8gVW5pY29kZSBjYWxsYmFjayB3aWxsIFN1YnN0aXR1dGUgdGhlIElM
TEVHQUwgU0VRVUVOQ0Usb3IgCisgKiBVTkFTU0lHTkVEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiBj
b250ZXh0IHBhcmFtZXRlciwgIHdpdGggdGhlCisgKiBVbmljb2RlIHN1YnN0aXR1dGlvbiBjaGFy
YWN0ZXIsIFUrRkZGRC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJl
bnRseSByZWNvZ25pemVzIHRoZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAg
IFVDTlZfU1VCX1NUT1BfT05fSUxMRUdBTDogU1RPUFMgYXQgdGhlIElMTEVHQUxfU0VRVUVOQ0Us
CisgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYmFjayB0
byB0aGUgY2FsbGVyIGltbWVkaWF0ZWx5LgorICogICAgICAgICAgICAgICAgIE5VTEw6IFN1YnN0
aXR1dGVzIGFueSBJTExFR0FMX1NFUVVFTkNFCisgKiBAcGFyYW0gdG9VQXJncyBJbmZvcm1hdGlv
biBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQ
b2ludHMgdG8gJ2xlbmd0aCcgYnl0ZXMgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5j
ZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2Rl
cGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIHJlYXNvbiBEZWZpbmVzIHRoZSByZWFzb24gdGhlIGNh
bGxiYWNrIHdhcyBpbnZva2VkCisgKiBAcGFyYW0gZXJyIFJldHVybiB2YWx1ZSB3aWxsIGJlIHNl
dCB0byBzdWNjZXNzIGlmIHRoZSBjYWxsYmFjayB3YXMgaGFuZGxlZCwKKyAqICAgICAgb3RoZXJ3
aXNlIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYSBmYWlsdXJlIHN0YXR1cy4KKyAqIEBzdGFi
bGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiBVQ05WX1RPX1VfQ0FMTEJB
Q0tfU1VCU1RJVFVURSAoCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb250ZXh0LAor
ICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlclRvVW5pY29kZUFyZ3MgKnRvVUFyZ3MsCisgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAgICBp
bnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1JlYXNv
biByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworLyoqCisg
KiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICogVGhpcyBUbyBVbmljb2Rl
IGNhbGxiYWNrIHdpbGwgU3Vic3RpdHV0ZSB0aGUgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZQor
ICogaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlsbGVnYWwgYnl0ZXMKKyAqICAo
aW4gdGhlIGZvcm1hdCAgJVhOTiwgZS5nLiAiJVhGRiVYMEElWEM4JVgwMyIpLgorICoKKyAqIEBw
YXJhbSBjb250ZXh0IFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IHJlY29nbml6ZXMgdGhlIGNhbGxi
YWNrIG9wdGlvbnM6CisgKiAgICAgIFVDTlZfRVNDQVBFX0lDVSwgVUNOVl9FU0NBUEVfSkFWQSwg
VUNOVl9FU0NBUEVfQywgVUNOVl9FU0NBUEVfWE1MX0RFQywKKyAqICAgICAgVUNOVl9FU0NBUEVf
WE1MX0hFWCBhbmQgVUNOVl9FU0NBUEVfVU5JQ09ERS4KKyAqIEBwYXJhbSB0b1VBcmdzIEluZm9y
bWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29kZVVu
aXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdlIHNl
cXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2VybmVk
IGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0
aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwg
YmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICogICAgICBv
dGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzLgorICog
QHN0YWJsZSBJQ1UgMi4wCisgKi8KKworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgVUNOVl9UT19V
X0NBTExCQUNLX0VTQ0FQRSAoCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb250ZXh0
LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlclRvVW5pY29kZUFyZ3MgKnRvVUFyZ3MsCisg
ICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAg
ICBpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworI2Vu
ZGlmCisKKyNlbmRpZgorCisvKlVDTlZfRVJSX0gqLyAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2Jp
bmRpbmdzL2MvY191dGlsaXR5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9iaW5k
aW5ncy9jL2NfdXRpbGl0eS5jcHAJKHJldmlzaW9uIDEzMTE2KQorKysgSmF2YVNjcmlwdENvcmUv
YmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBA
CiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJjX3V0aWxpdHkuaCIKKyNpbmNsdWRl
IDx1bmljb2RlL3VjbnYuaD4KIAogI2luY2x1ZGUgIkpTVHlwZS5oIgogI2luY2x1ZGUgIk5QX2pz
b2JqZWN0LmgiCkBAIC00NSwyNyArNDYsNTMgQEAgdm9pZCBjb252ZXJ0TlBTdHJpbmdUb1VURjE2
KGNvbnN0IE5QU3RyaQogdm9pZCBjb252ZXJ0VVRGOFRvVVRGMTYoY29uc3QgTlBVVEY4ICpVVEY4
Q2hhcnMsIGludCBVVEY4TGVuZ3RoLCBOUFVURjE2ICoqVVRGMTZDaGFycywgdW5zaWduZWQgaW50
ICpVVEYxNkxlbmd0aCkKIHsKICAgICBhc3NlcnQoVVRGOENoYXJzIHx8IFVURjhMZW5ndGggPT0g
MCk7CisgICAgYXNzZXJ0KFVURjE2Q2hhcnMpOwogICAgIAogICAgIGlmIChVVEY4TGVuZ3RoID09
IC0xKQogICAgICAgICBVVEY4TGVuZ3RoID0gc3RybGVuKFVURjhDaGFycyk7Ci0KLSAgICBDRlN0
cmluZ1JlZiBzdHJpbmdSZWYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyhOVUxMLCAoY29uc3Qg
VUludDgqKVVURjhDaGFycywgKENGSW5kZXgpVVRGOExlbmd0aCwga0NGU3RyaW5nRW5jb2RpbmdV
VEY4LCBmYWxzZSk7CisgICAgICAgIAorICAgIC8vIFVURjE2TGVuZ3RoIG1heGltdW0gbGVuZ3Ro
IGlzIHRoZSBsZW5ndGggb2YgdGhlIFVURjggc3RyaW5nLCBwbHVzIG9uZSB0byBpbmNsdWRlIHRl
cm1pbmF0b3IKKyAgICAvLyBXaXRob3V0IHRoZSBwbHVzIG9uZSwgaXQgd2lsbCBjb252ZXJ0IG9r
LCBidXQgYSB3YXJuaW5nIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBjb252ZXJ0ZXIgYXMKKyAgICAv
LyB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIGEgdGVybWluYXRpbmcgY2hhcmFjdGVyLgor
ICAgICpVVEYxNkxlbmd0aCA9IFVURjhMZW5ndGgrMTsgCisgICAgICAgIAorICAgICpVVEYxNkNo
YXJzID0gTlVMTDsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBV
Q29udmVydGVyKiBjb252ID0gdWNudl9vcGVuKCAidXRmOCIsICZzdGF0dXMpOworICAgIGlmIChV
X1NVQ0NFU1Moc3RhdHVzKSkgeyAKKyAgICAgICAgKlVURjE2Q2hhcnMgPSAoTlBVVEYxNiAqKW1h
bGxvYyhzaXplb2YoTlBVVEYxNikgKiAoKlVURjE2TGVuZ3RoKSk7CisgICAgICAgIHVjbnZfdG9V
Q2hhcnMoY29udiwgKlVURjE2Q2hhcnMsICpVVEYxNkxlbmd0aCwgVVRGOENoYXJzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGOExlbmd0aCwgJnN0YXR1cyk7IAorICAgICAg
ICB1Y252X2Nsb3NlKGNvbnYpOworICAgICAgICAKKyAgICAgICAgLy8gSUNVIGNvbnZlcnRlciBm
b3IgVVRGLTggY29udmVydHMgaW52YWxpZCBzZXF1ZW5jZXMgaW50byByZXBsYWNlbWVudCBjaGFy
YWN0ZXJzLAorICAgICAgICAvLyBzZWUgYWxzbyBTdHJlYW1pbmdUZXh0RGVjb2Rlci5jcHAgdW53
YW50ZWQoKQorICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgaW50IGk9MDsgaTwqVVRGMTZMZW5ndGggJiYgVV9TVUNDRVNTKHN0YXR1cyk7
IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoKlVURjE2Q2hhcnMpW2ldID09IDB4RkZGRCkg
eworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBVX0lOVkFMSURfQ0hBUl9GT1VORDsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAogICAgIAor
ICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bAogICAg
IC8vIFNvbWUgcGx1Z2lucyByZXR1cm4gaW52YWxpZCBVVEYtOCBpbiBOUFZhcmlhbnRUeXBlX1N0
cmluZywgc2VlIDxodHRwOi8vYnVnemlsbGEub3BlbmRhcndpbi5vcmcvc2hvd19idWcuY2dpP2lk
PTUxNjM+Ci0gICAgaWYgKCFzdHJpbmdSZWYpCi0gICAgICAgIHN0cmluZ1JlZiA9IENGU3RyaW5n
Q3JlYXRlV2l0aEJ5dGVzKE5VTEwsIChjb25zdCBVSW50OCopVVRGOENoYXJzLCAoQ0ZJbmRleClV
VEY4TGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwgZmFsc2UpOwotCi0gICAgLy8g
VGhlcmUgaXMgbm8gImJhZCBkYXRhIiBmb3Iga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEuIEl0
IGlzIHVubGlrZWx5IHRoYXQgdGhlIHBsdWdpbiB3YXMgcmVhbGx5IHNlbmRpbmcgdGV4dCBpbiB0
aGlzIGVuY29kaW5nLAorICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgc3Rh
dHVzID0gVV9aRVJPX0VSUk9SOyAgLy8gcmVzZXQgdGhlIHN0YXR1cyBhcyB0aGUgY29udmVydGVy
IGRvZXNuJ3QuCisgICAgICAgIGNvbnYgPSB1Y252X29wZW4oICJsYXRpbjEiLCAmc3RhdHVzKTsK
KyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBpZiAoISpVVEYx
NkNoYXJzKSB7ICAvLyBJZiB0aGUgbWVtb3J5IHdhc24ndCBhbGxvY2F0ZWQsIGFsbG9jYXRlIGl0
LgorICAgICAgICAgICAgICAgICpVVEYxNkNoYXJzID0gKE5QVVRGMTYgKiltYWxsb2Moc2l6ZW9m
KE5QVVRGMTYpICogKCpVVEYxNkxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
dWNudl90b1VDaGFycyhjb252LCAqVVRGMTZDaGFycywgKlVURjE2TGVuZ3RoLCBVVEY4Q2hhcnMs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEY4TGVuZ3RoLCAmc3RhdHVzKTsg
CisgICAgICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOworICAgICAgICB9IAorICAgIH0KKyAgICAv
LyBUaGVyZSBpcyBubyAiYmFkIGRhdGEiIGZvciBsYXRpbjEuIEl0IGlzIHVubGlrZWx5IHRoYXQg
dGhlIHBsdWdpbiB3YXMgcmVhbGx5IHNlbmRpbmcgdGV4dCBpbiB0aGlzIGVuY29kaW5nLAogICAg
IC8vIGJ1dCBpdCBzaG91bGQgaGF2ZSB1c2VkIFVURi04LCBhbmQgbm93IHdlIGFyZSBzaW1wbHkg
YXZvaWRpbmcgYSBjcmFzaC4KLSAgICBhc3NlcnQoc3RyaW5nUmVmKTsKLQotICAgICpVVEYxNkxl
bmd0aCA9ICh1bnNpZ25lZCBpbnQpQ0ZTdHJpbmdHZXRMZW5ndGgoc3RyaW5nUmVmKTsKLSAgICAq
VVRGMTZDaGFycyA9IChOUFVURjE2ICopbWFsbG9jKHNpemVvZihOUFVURjE2KSAqICgqVVRGMTZM
ZW5ndGgpKTsKLQotICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBVVEYxNi4KLSAgICBDRlJh
bmdlIHJhbmdlID0geyAwLCAqVVRGMTZMZW5ndGggfTsKLSAgICBDRlN0cmluZ0dldENoYXJhY3Rl
cnMoc3RyaW5nUmVmLCByYW5nZSwgKFVuaUNoYXIgKikqVVRGMTZDaGFycyk7Ci0gICAgQ0ZSZWxl
YXNlKHN0cmluZ1JlZik7CisgICAgYXNzZXJ0KFVfU1VDQ0VTUyhzdGF0dXMpKTsKIH0KIAogLy8g
VmFyaWFudCB2YWx1ZSBtdXN0IGJlIHJlbGVhc2VkIHdpdGggTlBSZWxlYXNlVmFyaWFudFZhbHVl
KCkK
</data>
<flag name="review"
          id="1757"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6886</attachid>
            <date>2006-03-05 19:47:08 -0800</date>
            <delta_ts>2006-03-05 21:19:23 -0800</delta_ts>
            <desc>new patch with changes and ChangeLog</desc>
            <filename>toicu.txt</filename>
            <type>text/plain</type>
            <size>108231</size>
            <attacher name="David Carson">dacarson</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL2ljdS91bmljb2RlL3VlbnVtLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWVudW0uaAkocmV2aXNpb24gMCkKKysrIEphdmFT
Y3JpcHRDb3JlL2ljdS91bmljb2RlL3VlbnVtLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTI5
IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAw
Mi0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24g
YW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqCisqICAgZmlsZSBuYW1lOiAgdWVudW0uaAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisq
ICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246MgorKgorKiAgIGNy
ZWF0ZWQgb246IDIwMDJqdWwwOAorKiAgIGNyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbgor
Ki8KKworI2lmbmRlZiBfX1VFTlVNX0gKKyNkZWZpbmUgX19VRU5VTV9ICisKKyNpbmNsdWRlICJ1
bmljb2RlL3V0eXBlcy5oIgorCisvKioKKyAqIEFuIGVudW1lcmF0aW9uIG9iamVjdC4KKyAqIEZv
ciB1c2FnZSBpbiBDIHByb2dyYW1zLgorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK3N0cnVjdCBV
RW51bWVyYXRpb247CisvKiogc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBlbnVtZXJhdGlvbiBv
YmplY3QgaW5zdGFuY2UgQHN0YWJsZSBJQ1UgMi4yICovCit0eXBlZGVmIHN0cnVjdCBVRW51bWVy
YXRpb24gVUVudW1lcmF0aW9uOworCisvKioKKyAqIERpc3Bvc2VzIG9mIHJlc291cmNlcyBpbiB1
c2UgYnkgdGhlIGl0ZXJhdG9yLiAgSWYgZW4gaXMgTlVMTCwKKyAqIGRvZXMgbm90aGluZy4gIEFm
dGVyIHRoaXMgY2FsbCwgYW55IGNoYXIqIG9yIFVDaGFyKiBwb2ludGVyCisgKiByZXR1cm5lZCBi
eSB1ZW51bV91bmV4dCgpIG9yIHVlbnVtX25leHQoKSBpcyBpbnZhbGlkLgorICogQHBhcmFtIGVu
IFVFbnVtZXJhdGlvbiBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8K
K1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1ZW51bV9jbG9zZShVRW51bWVyYXRpb24qIGVuKTsK
KworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgaXRlcmF0
b3IgdHJhdmVyc2VzLiAgSWYKKyAqIHRoZSBpdGVyYXRvciBpcyBvdXQtb2Ytc3luYyB3aXRoIGl0
cyBzZXJ2aWNlLCBzdGF0dXMgaXMgc2V0IHRvCisgKiBVX0VOVU1fT1VUX09GX1NZTkNfRVJST1Iu
CisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24uIEl0IGNhbiBlbmQgdXAgYmVpbmcg
dmVyeQorICogZXhwZW5zaXZlIGFzIGFsbCB0aGUgaXRlbXMgbWlnaHQgaGF2ZSB0byBiZSBwcmUt
ZmV0Y2hlZCAoZGVwZW5kaW5nCisgKiBvbiB0aGUgdHlwZSBvZiBkYXRhIGJlaW5nIHRyYXZlcnNl
ZCkuIFVzZSB3aXRoIGNhdXRpb24gYW5kIG9ubHkgCisgKiB3aGVuIG5lY2Vzc2FyeS4KKyAqIEBw
YXJhbSBlbiBVRW51bWVyYXRpb24gc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBwYXJhbSBzdGF0dXMg
ZXJyb3IgY29kZSwgY2FuIGJlIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBpZiB0aGUKKyAqICAg
ICAgICAgICAgICAgaXRlcmF0b3IgaXMgb3V0IG9mIHN5bmMuCisgKiBAcmV0dXJuIG51bWJlciBv
ZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IKKyAqIEBzdGFibGUgSUNVIDIuMgorICovCitVX1NU
QUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWVudW1fY291bnQoVUVudW1lcmF0aW9uKiBlbiwgVUVy
cm9yQ29kZSogc3RhdHVzKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4g
dGhlIGl0ZXJhdG9yJ3MgbGlzdC4gIElmIHRoZXJlIGFyZQorICogbm8gbW9yZSBlbGVtZW50cywg
cmV0dXJucyBOVUxMLiAgSWYgdGhlIGl0ZXJhdG9yIGlzIG91dC1vZi1zeW5jCisgKiB3aXRoIGl0
cyBzZXJ2aWNlLCBzdGF0dXMgaXMgc2V0IHRvIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBhbmQK
KyAqIE5VTEwgaXMgcmV0dXJuZWQuICBJZiB0aGUgbmF0aXZlIHNlcnZpY2Ugc3RyaW5nIGlzIGEg
Y2hhciogc3RyaW5nLAorICogaXQgaXMgY29udmVydGVkIHRvIFVDaGFyKiB3aXRoIHRoZSBpbnZh
cmlhbnQgY29udmVydGVyLgorICogVGhlIHJlc3VsdCBpcyB0ZXJtaW5hdGVkIGJ5IChVQ2hhcikw
LgorICogQHBhcmFtIGVuIHRoZSBpdGVyYXRvciBvYmplY3QKKyAqIEBwYXJhbSByZXN1bHRMZW5n
dGggcG9pbnRlciB0byByZWNlaXZlIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdAorICogICAgICAg
ICAgICAgICAgICAgICAobm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgXFwwKS4KKyAqICAg
ICAgICAgICAgICAgICAgICAgSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCBpdCBpcyBpZ25vcmVkLgor
ICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSwgc2V0IHRvIFVfRU5VTV9PVVRfT0ZfU1lO
Q19FUlJPUiBpZgorICogICAgICAgICAgICAgICB0aGUgaXRlcmF0b3IgaXMgb3V0IG9mIHN5bmMg
d2l0aCBpdHMgc2VydmljZS4KKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcuICBU
aGUgc3RyaW5nIHdpbGwgYmUKKyAqICAgICAgICAgemVyby10ZXJtaW5hdGVkLiAgVGhlIHJldHVy
biBwb2ludGVyIGlzIG93bmVkIGJ5IHRoaXMgaXRlcmF0b3IKKyAqICAgICAgICAgYW5kIG11c3Qg
bm90IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBwb2ludGVyIGlzIHZhbGlkCisgKiAg
ICAgICAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYW55IHVlbnVtXy4uLiBtZXRob2QsIGluY2x1
ZGluZworICogICAgICAgICB1ZW51bV9uZXh0KCkgb3IgdWVudW1fdW5leHQoKS4gIFdoZW4gYWxs
IHN0cmluZ3MgaGF2ZSBiZWVuCisgKiAgICAgICAgIHRyYXZlcnNlZCwgcmV0dXJucyBOVUxMLgor
ICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIGNvbnN0IFVDaGFyKiBVX0VYUE9SVDIK
K3VlbnVtX3VuZXh0KFVFbnVtZXJhdGlvbiogZW4sCisgICAgICAgICAgICBpbnQzMl90KiByZXN1
bHRMZW5ndGgsCisgICAgICAgICAgICBVRXJyb3JDb2RlKiBzdGF0dXMpOworCisvKioKKyAqIFJl
dHVybnMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IncyBsaXN0LiAgSWYgdGhlcmUg
YXJlCisgKiBubyBtb3JlIGVsZW1lbnRzLCByZXR1cm5zIE5VTEwuICBJZiB0aGUgaXRlcmF0b3Ig
aXMgb3V0LW9mLXN5bmMKKyAqIHdpdGggaXRzIHNlcnZpY2UsIHN0YXR1cyBpcyBzZXQgdG8gVV9F
TlVNX09VVF9PRl9TWU5DX0VSUk9SIGFuZAorICogTlVMTCBpcyByZXR1cm5lZC4gIElmIHRoZSBu
YXRpdmUgc2VydmljZSBzdHJpbmcgaXMgYSBVQ2hhcioKKyAqIHN0cmluZywgaXQgaXMgY29udmVy
dGVkIHRvIGNoYXIqIHdpdGggdGhlIGludmFyaWFudCBjb252ZXJ0ZXIuCisgKiBUaGUgcmVzdWx0
IGlzIHRlcm1pbmF0ZWQgYnkgKGNoYXIpMC4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzCisgKiAo
YmVjYXVzZSBhIGNoYXJhY3RlciBjYW5ub3QgYmUgY29udmVydGVkKSB0aGVuIHN0YXR1cyBpcyBz
ZXQgdG8KKyAqIFVfSU5WQVJJQU5UX0NPTlZFUlNJT05fRVJST1IgYW5kIHRoZSByZXR1cm4gdmFs
dWUgaXMgdW5kZWZpbmVkCisgKiAoYnV0IG5vbi1OVUxMKS4KKyAqIEBwYXJhbSBlbiB0aGUgaXRl
cmF0b3Igb2JqZWN0CisgKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIHBvaW50ZXIgdG8gcmVjZWl2ZSB0
aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQKKyAqICAgICAgICAgICAgICAgICAgICAgKG5vdCBpbmNs
dWRpbmcgdGhlIHRlcm1pbmF0aW5nIFxcMCkuCisgKiAgICAgICAgICAgICAgICAgICAgIElmIHRo
ZSBwb2ludGVyIGlzIE5VTEwgaXQgaXMgaWdub3JlZC4KKyAqIEBwYXJhbSBzdGF0dXMgdGhlIGVy
cm9yIGNvZGUsIHNldCB0byBVX0VOVU1fT1VUX09GX1NZTkNfRVJST1IgaWYKKyAqICAgICAgICAg
ICAgICAgdGhlIGl0ZXJhdG9yIGlzIG91dCBvZiBzeW5jIHdpdGggaXRzIHNlcnZpY2UuICBTZXQg
dG8KKyAqICAgICAgICAgICAgICAgVV9JTlZBUklBTlRfQ09OVkVSU0lPTl9FUlJPUiBpZiB0aGUg
dW5kZXJseWluZyBuYXRpdmUgc3RyaW5nIGlzCisgKiAgICAgICAgICAgICAgIFVDaGFyKiBhbmQg
Y29udmVyc2lvbiB0byBjaGFyKiB3aXRoIHRoZSBpbnZhcmlhbnQgY29udmVydGVyCisgKiAgICAg
ICAgICAgICAgIGZhaWxzLiBUaGlzIGVycm9yIHBlcnRhaW5zIG9ubHkgdG8gY3VycmVudCBzdHJp
bmcsIHNvIGl0ZXJhdGlvbgorICogICAgICAgICAgICAgICBtaWdodCBiZSBhYmxlIHRvIGNvbnRp
bnVlIHN1Y2Nlc3NmdWxseS4KKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcuICBU
aGUgc3RyaW5nIHdpbGwgYmUKKyAqICAgICAgICAgemVyby10ZXJtaW5hdGVkLiAgVGhlIHJldHVy
biBwb2ludGVyIGlzIG93bmVkIGJ5IHRoaXMgaXRlcmF0b3IKKyAqICAgICAgICAgYW5kIG11c3Qg
bm90IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBwb2ludGVyIGlzIHZhbGlkCisgKiAg
ICAgICAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYW55IHVlbnVtXy4uLiBtZXRob2QsIGluY2x1
ZGluZworICogICAgICAgICB1ZW51bV9uZXh0KCkgb3IgdWVudW1fdW5leHQoKS4gIFdoZW4gYWxs
IHN0cmluZ3MgaGF2ZSBiZWVuCisgKiAgICAgICAgIHRyYXZlcnNlZCwgcmV0dXJucyBOVUxMLgor
ICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIqIFVfRVhQT1JUMgor
dWVudW1fbmV4dChVRW51bWVyYXRpb24qIGVuLAorICAgICAgICAgICBpbnQzMl90KiByZXN1bHRM
ZW5ndGgsCisgICAgICAgICAgIFVFcnJvckNvZGUqIHN0YXR1cyk7CisKKy8qKgorICogUmVzZXRz
IHRoZSBpdGVyYXRvciB0byB0aGUgY3VycmVudCBsaXN0IG9mIHNlcnZpY2UgSURzLiAgVGhpcwor
ICogcmUtZXN0YWJsaXNoZXMgc3luYyB3aXRoIHRoZSBzZXJ2aWNlIGFuZCByZXdpbmRzIHRoZSBp
dGVyYXRvcgorICogdG8gc3RhcnQgYXQgdGhlIGZpcnN0IGVsZW1lbnQuCisgKiBAcGFyYW0gZW4g
dGhlIGl0ZXJhdG9yIG9iamVjdAorICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSwgc2V0
IHRvIFVfRU5VTV9PVVRfT0ZfU1lOQ19FUlJPUiBpZgorICogICAgICAgICAgICAgICB0aGUgaXRl
cmF0b3IgaXMgb3V0IG9mIHN5bmMgd2l0aCBpdHMgc2VydmljZS4gIAorICogQHN0YWJsZSBJQ1Ug
Mi4yCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1ZW51bV9yZXNldChVRW51bWVyYXRp
b24qIGVuLCBVRXJyb3JDb2RlKiBzdGF0dXMpOworCisjZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2ljdS91bmljb2RlL3VjbnYuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pY3Uv
dW5pY29kZS91Y252LmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0Q29yZS9pY3UvdW5pY29k
ZS91Y252LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTgxNyBAQAorLyoKKyoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBN
YWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVk
LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKgorICogIHVjbnYuaDoKKyAqICBFeHRlcm5hbCBBUElzIGZvciB0aGUg
SUNVJ3MgY29kZXNldCBjb252ZXJzaW9uIGxpYnJhcnkKKyAqICBCZXJ0cmFuZCBBLiBEYW1pYmEK
KyAqCisgKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyAqCisgKiAgIERhdGUgICAgICAgIE5hbWUg
ICAgICAgIERlc2NyaXB0aW9uCisgKiAgIDA0LzA0Lzk5ICAgIGhlbGVuYSAgICAgIEZpeGVkIGlu
dGVybmFsIGhlYWRlciBpbmNsdXNpb24uCisgKiAgIDA1LzExLzAwICAgIGhlbGVuYSAgICAgIEFk
ZGVkIHNldEZhbGxiYWNrIGFuZCB1c2VzRmFsbGJhY2sgQVBJcy4KKyAqICAgMDYvMjkvMjAwMCAg
aGVsZW5hICAgICAgTWFqb3IgcmV3cml0ZSBvZiB0aGUgY2FsbGJhY2sgQVBJcy4KKyAqICAgMTIv
MDcvMjAwMCAgc3JsICAgICAgICAgVXBkYXRlIG9mIGRvY3VtZW50YXRpb24KKyAqLworCisvKioK
KyAqIFxmaWxlCisgKiBcYnJpZWYgQyBBUEk6IENoYXJhY3RlciBjb252ZXJzaW9uIAorICoKKyAq
IDxoMj5DaGFyYWN0ZXIgQ29udmVyc2lvbiBDIEFQSTwvaDI+CisgKgorICogPHA+VGhpcyBBUEkg
aXMgdXNlZCB0byBjb252ZXJ0IGNvZGVwYWdlIG9yIGNoYXJhY3RlciBlbmNvZGVkIGRhdGEgdG8g
YW5kCisgKiBmcm9tIFVURi0xNi4gWW91IGNhbiBvcGVuIGEgY29udmVydGVyIHdpdGgge0BsaW5r
IHVjbnZfb3BlbigpIH0uIFdpdGggdGhhdAorICogY29udmVydGVyLCB5b3UgY2FuIGdldCBpdHMg
cHJvcGVydGllcywgc2V0IG9wdGlvbnMsIGNvbnZlcnQgeW91ciBkYXRhIGFuZAorICogY2xvc2Ug
dGhlIGNvbnZlcnRlci48L3A+CisgKgorICogPHA+U2luY2UgbWFueSBzb2Z0d2FyZSBwcm9ncmFt
cyByZWNvZ2l6ZSBkaWZmZXJlbnQgY29udmVydGVyIG5hbWVzIGZvcgorICogZGlmZmVyZW50IHR5
cGVzIG9mIGNvbnZlcnRlcnMsIHRoZXJlIGFyZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBBUEkg
dG8KKyAqIGl0ZXJhdGUgb3ZlciB0aGUgY29udmVydGVyIGFsaWFzZXMuIFRoZSBmdW5jdGlvbnMg
e0BsaW5rIHVjbnZfZ2V0QXZhaWxhYmxlTmFtZSgpIH0sCisgKiB7QGxpbmsgdWNudl9nZXRBbGlh
cygpIH0gYW5kIHtAbGluayB1Y252X2dldFN0YW5kYXJkTmFtZSgpIH0gYXJlIHNvbWUgb2YgdGhl
CisgKiBtb3JlIGZyZXF1ZW50bHkgdXNlZCBhbGlhcyBmdW5jdGlvbnMgdG8gZ2V0IHRoaXMgaW5m
b3JtYXRpb24uPC9wPgorICoKKyAqIDxwPldoZW4gYSBjb252ZXJ0ZXIgZW5jb3VudGVycyBhbiBp
bGxlZ2FsLCBpcnJlZ3VsYXIsIGludmFsaWQgb3IgdW5tYXBwYWJsZSBjaGFyYWN0ZXIKKyAqIGl0
cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSBhIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgdG8g
cmVwbGFjZSB0aGUKKyAqIGJhZCBieXRlIHNlcXVlbmNlLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBj
aGFuZ2VkIGJ5IHVzaW5nIHtAbGluayB1Y252X2dldEZyb21VQ2FsbEJhY2soKSB9CisgKiBvciB7
QGxpbmsgdWNudl9nZXRUb1VDYWxsQmFjaygpIH0gb24gdGhlIGNvbnZlcnRlci4gVGhlIGhlYWRl
ciB1Y252X2Vyci5oIGRlZmluZXMKKyAqIG1hbnkgb3RoZXIgY2FsbGJhY2sgYWN0aW9ucyB0aGF0
IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9uLjwvcD4KKyAq
CisgKiA8cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQVBJIGNhbiBiZSBmb3VuZCBpbiBv
dXIgCisgKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlk
ZS9jb252ZXJzaW9uLmh0bWwiPlVzZXIncworICogR3VpZGU8L2E+LjwvcD4KKyAqLworCisjaWZu
ZGVmIFVDTlZfSAorI2RlZmluZSBVQ05WX0gKKworI2luY2x1ZGUgInVuaWNvZGUvdWNudl9lcnIu
aCIKKyNpbmNsdWRlICJ1bmljb2RlL3VlbnVtLmgiCisKKyNpZm5kZWYgX19VU0VUX0hfXworCisv
KioKKyAqIFVTZXQgaXMgdGhlIEMgQVBJIHR5cGUgZm9yIFVuaWNvZGUgc2V0cy4KKyAqIEl0IGlz
IGZvcndhcmQtZGVjbGFyZWQgaGVyZSB0byBhdm9pZCBpbmNsdWRpbmcgdGhlIGhlYWRlciBmaWxl
IGlmIHJlbGF0ZWQKKyAqIGNvbnZlcnNpb24gQVBJcyBhcmUgbm90IHVzZWQuCisgKiBTZWUgdW5p
Y29kZS91c2V0LmgKKyAqCisgKiBAc2VlIHVjbnZfZ2V0VW5pY29kZVNldAorICogQHN0YWJsZSBJ
Q1UgMi42CisgKi8KK3N0cnVjdCBVU2V0OworLyoqIEBzdGFibGUgSUNVIDIuNiAqLwordHlwZWRl
ZiBzdHJ1Y3QgVVNldCBVU2V0OworCisjZW5kaWYKKworI2lmICFVQ09ORklHX05PX0NPTlZFUlNJ
T04KKworVV9DREVDTF9CRUdJTgorCisvKiogTWF4aW11bSBsZW5ndGggb2YgYSBjb252ZXJ0ZXIg
bmFtZSBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTEwgQHN0YWJsZSBJQ1UgMi4wICovCisj
ZGVmaW5lIFVDTlZfTUFYX0NPTlZFUlRFUl9OQU1FX0xFTkdUSCA2MAorLyoqIE1heGltdW0gbGVu
Z3RoIG9mIGEgY29udmVydGVyIG5hbWUgaW5jbHVkaW5nIHBhdGggYW5kIHRlcm1pbmF0aW5nIE5V
TEwgQHN0YWJsZSBJQ1UgMi4wICovCisjZGVmaW5lIFVDTlZfTUFYX0ZVTExfRklMRV9OQU1FX0xF
TkdUSCAoNjAwK1VDTlZfTUFYX0NPTlZFUlRFUl9OQU1FX0xFTkdUSCkKKworLyoqIFNoaWZ0IGlu
IGZvciBFQkRDRElDX1NUQVRFRlVMIGFuZCBpc28yMDIyIHN0YXRlcyBAc3RhYmxlIElDVSAyLjAg
Ki8KKyNkZWZpbmUgIFVDTlZfU0kgMHgwRgorLyoqIFNoaWZ0IG91dCBmb3IgRUJEQ0RJQ19TVEFU
RUZVTCBhbmQgaXNvMjAyMiBzdGF0ZXMgQHN0YWJsZSBJQ1UgMi4wICovCisjZGVmaW5lICBVQ05W
X1NPIDB4MEUKKworLyoqCisgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIGJhc2ljIHR5cGVzIG9mIGNv
bnZlcnRlcnMKKyAqIEBzZWUgdWNudl9nZXRUeXBlCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwor
dHlwZWRlZiBlbnVtIHsKKyAgICBVQ05WX1VOU1VQUE9SVEVEX0NPTlZFUlRFUiA9IC0xLAorICAg
IFVDTlZfU0JDUyA9IDAsCisgICAgVUNOVl9EQkNTID0gMSwKKyAgICBVQ05WX01CQ1MgPSAyLAor
ICAgIFVDTlZfTEFUSU5fMSA9IDMsCisgICAgVUNOVl9VVEY4ID0gNCwKKyAgICBVQ05WX1VURjE2
X0JpZ0VuZGlhbiA9IDUsCisgICAgVUNOVl9VVEYxNl9MaXR0bGVFbmRpYW4gPSA2LAorICAgIFVD
TlZfVVRGMzJfQmlnRW5kaWFuID0gNywKKyAgICBVQ05WX1VURjMyX0xpdHRsZUVuZGlhbiA9IDgs
CisgICAgVUNOVl9FQkNESUNfU1RBVEVGVUwgPSA5LAorICAgIFVDTlZfSVNPXzIwMjIgPSAxMCwK
KworICAgIFVDTlZfTE1CQ1NfMSA9IDExLAorICAgIFVDTlZfTE1CQ1NfMiwgCisgICAgVUNOVl9M
TUJDU18zLAorICAgIFVDTlZfTE1CQ1NfNCwKKyAgICBVQ05WX0xNQkNTXzUsCisgICAgVUNOVl9M
TUJDU182LAorICAgIFVDTlZfTE1CQ1NfOCwKKyAgICBVQ05WX0xNQkNTXzExLAorICAgIFVDTlZf
TE1CQ1NfMTYsCisgICAgVUNOVl9MTUJDU18xNywKKyAgICBVQ05WX0xNQkNTXzE4LAorICAgIFVD
TlZfTE1CQ1NfMTksCisgICAgVUNOVl9MTUJDU19MQVNUID0gVUNOVl9MTUJDU18xOSwKKyAgICBV
Q05WX0haLAorICAgIFVDTlZfU0NTVSwKKyAgICBVQ05WX0lTQ0lJLAorICAgIFVDTlZfVVNfQVND
SUksCisgICAgVUNOVl9VVEY3LAorICAgIFVDTlZfQk9DVTEsCisgICAgVUNOVl9VVEYxNiwKKyAg
ICBVQ05WX1VURjMyLAorICAgIFVDTlZfQ0VTVTgsCisgICAgVUNOVl9JTUFQX01BSUxCT1gsCisK
KyAgICAvKiBOdW1iZXIgb2YgY29udmVydGVyIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlIGNvbnZl
cnNpb24gcm91dGluZXMuICovCisgICAgVUNOVl9OVU1CRVJfT0ZfU1VQUE9SVEVEX0NPTlZFUlRF
Ul9UWVBFUworCit9IFVDb252ZXJ0ZXJUeXBlOworCisvKioKKyAqIEVudW0gZm9yIHNwZWNpZnlp
bmcgd2hpY2ggcGxhdGZvcm0gYSBjb252ZXJ0ZXIgSUQgcmVmZXJzIHRvLgorICogVGhlIHVzZSBv
ZiBwbGF0Zm9ybS9DQ1NJRCBpcyBub3QgcmVjb21tZW5kZWQuIFNlZSB1Y252X29wZW5DQ1NJRCgp
LgorICoKKyAqIEBzZWUgdWNudl9nZXRQbGF0Zm9ybQorICogQHNlZSB1Y252X29wZW5DQ1NJRAor
ICogQHNlZSB1Y252X2dldENDU0lECisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwordHlwZWRlZiBl
bnVtIHsKKyAgICBVQ05WX1VOS05PV04gPSAtMSwKKyAgICBVQ05WX0lCTSA9IDAKK30gVUNvbnZl
cnRlclBsYXRmb3JtOworCisvKioKKyAqIEZ1bmN0aW9uIHBvaW50ZXIgZm9yIGVycm9yIGNhbGxi
YWNrIGluIHRoZSBjb2RlcGFnZSB0byB1bmljb2RlIGRpcmVjdGlvbi4KKyAqIENhbGxlZCB3aGVu
IGFuIGVycm9yIGhhcyBvY2N1cmVkIGluIGNvbnZlcnNpb24gdG8gdW5pY29kZSwgb3Igb24gb3Bl
bi9jbG9zZSBvZiB0aGUgY2FsbGJhY2sgKHNlZSByZWFzb24pLgorICogQHBhcmFtIGNvbnRleHQg
UG9pbnRlciB0byB0aGUgY2FsbGJhY2sncyBwcml2YXRlIGRhdGEKKyAqIEBwYXJhbSBhcmdzIElu
Zm9ybWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29k
ZVVuaXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdl
IHNlcXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2Vy
bmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNv
biB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBzZWUgdWNudl9zZXRUb1VDYWxsQmFjawor
ICogQHNlZSBVQ29udmVydGVyVG9Vbmljb2RlQXJncworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8K
K3R5cGVkZWYgdm9pZCAoVV9FWFBPUlQyICpVQ29udmVydGVyVG9VQ2FsbGJhY2spICgKKyAgICAg
ICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29u
dmVydGVyVG9Vbmljb2RlQXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIg
KmNvZGVVbml0cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNvbiwKKyAgICAgICAgICAgICAg
ICAgIFVFcnJvckNvZGUgKik7CisKKy8qKgorICogRnVuY3Rpb24gcG9pbnRlciBmb3IgZXJyb3Ig
Y2FsbGJhY2sgaW4gdGhlIHVuaWNvZGUgdG8gY29kZXBhZ2UgZGlyZWN0aW9uLgorICogQ2FsbGVk
IHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQgaW4gY29udmVyc2lvbiBmcm9tIHVuaWNvZGUsIG9y
IG9uIG9wZW4vY2xvc2Ugb2YgdGhlIGNhbGxiYWNrIChzZWUgcmVhc29uKS4KKyAqIEBwYXJhbSBj
b250ZXh0IFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrJ3MgcHJpdmF0ZSBkYXRhCisgKiBAcGFyYW0g
YXJncyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBh
cmFtIGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQg
VW5pY29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhl
IGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUg
VUNoYXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9p
bnQuCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2Fz
IGludm9rZWQKKyAqIEBzZWUgdWNudl9zZXRGcm9tVUNhbGxCYWNrCisgKiBAc3RhYmxlIElDVSAy
LjAKKyAqLwordHlwZWRlZiB2b2lkIChVX0VYUE9SVDIgKlVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNr
KSAoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRleHQsCisgICAgICAgICAg
ICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVW5pY29kZUFyZ3MgKmFyZ3MsCisgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFVDaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAgICAgIGludDMy
X3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBVQ2hhcjMyIGNvZGVQb2ludCwKKyAgICAg
ICAgICAgICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNvbiwKKyAgICAgICAg
ICAgICAgICAgICAgVUVycm9yQ29kZSAqKTsKKworVV9DREVDTF9FTkQKKworLyoqCisgKiBDaGFy
YWN0ZXIgdGhhdCBzZXBhcmF0ZXMgY29udmVydGVyIG5hbWVzIGZyb20gb3B0aW9ucyBhbmQgb3B0
aW9ucyBmcm9tIGVhY2ggb3RoZXIuCisgKiBAc2VlIHVjbnZfb3BlbgorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KKyNkZWZpbmUgVUNOVl9PUFRJT05fU0VQX0NIQVIgJywnCisKKy8qKgorICogU3Ry
aW5nIHZlcnNpb24gb2YgVUNOVl9PUFRJT05fU0VQX0NIQVIuIAorICogQHNlZSB1Y252X29wZW4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfT1BUSU9OX1NFUF9TVFJJTkcg
IiwiCisKKy8qKgorICogQ2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIGEgY29udmVydGVyIG9wdGlv
biBmcm9tIGl0cyB2YWx1ZS4KKyAqIEBzZWUgdWNudl9vcGVuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworI2RlZmluZSBVQ05WX1ZBTFVFX1NFUF9DSEFSICc9JworCisvKioKKyAqIFN0cmluZyB2
ZXJzaW9uIG9mIFVDTlZfVkFMVUVfU0VQX0NIQVIuIAorICogQHNlZSB1Y252X29wZW4KKyAqIEBz
dGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfVkFMVUVfU0VQX1NUUklORyAiPSIKKwor
LyoqCisgKiBDb252ZXJ0ZXIgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIGEgbG9jYWxlLgorICogRm9y
IGV4YW1wbGUsIHVjbnZfb3BlbigiU0NTVSxsb2NhbGU9amEiLCAmZXJyb3JDb2RlKTsKKyAqIFNl
ZSBjb252cnRycy50eHQuCisgKgorICogQHNlZSB1Y252X29wZW4KKyAqIEBzdGFibGUgSUNVIDIu
MAorICovCisjZGVmaW5lIFVDTlZfTE9DQUxFX09QVElPTl9TVFJJTkcgIixsb2NhbGU9IgorCisv
KioKKyAqIENvbnZlcnRlciBvcHRpb24gZm9yIHNwZWNpZnlpbmcgYSB2ZXJzaW9uIHNlbGVjdG9y
ICgwLi45KSBmb3Igc29tZSBjb252ZXJ0ZXJzLgorICogRm9yIGV4YW1wbGUsIHVjbnZfb3Blbigi
VVRGLTcsdmVyc2lvbj0xIiwgJmVycm9yQ29kZSk7CisgKiBTZWUgY29udnJ0cnMudHh0LgorICoK
KyAqIEBzZWUgdWNudl9vcGVuCisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworI2RlZmluZSBVQ05W
X1ZFUlNJT05fT1BUSU9OX1NUUklORyAiLHZlcnNpb249IgorCisvKioKKyAqIENvbnZlcnRlciBv
cHRpb24gZm9yIEVCQ0RJQyBTQkNTIG9yIG1peGVkLVNCQ1MvREJDUyAoc3RhdGVmdWwpIGNvZGVw
YWdlcy4KKyAqIFN3YXBzIFVuaWNvZGUgbWFwcGluZ3MgZm9yIEVCQ0RJQyBMRiBhbmQgTkwgY29k
ZXMsIGFzIHVzZWQgb24KKyAqIFMvMzkwICh6L09TKSBVbml4IFN5c3RlbSBTZXJ2aWNlcyAoT3Bl
biBFZGl0aW9uKS4KKyAqIEZvciBleGFtcGxlLCB1Y252X29wZW4oImlibS0xMDQ3LHN3YXBsZm5s
IiwgJmVycm9yQ29kZSk7CisgKiBTZWUgY29udnJ0cnMudHh0LgorICoKKyAqIEBzZWUgdWNudl9v
cGVuCisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworI2RlZmluZSBVQ05WX1NXQVBfTEZOTF9PUFRJ
T05fU1RSSU5HICIsc3dhcGxmbmwiCisKKy8qKgorICogRG8gYSBmdXp6eSBjb21wYXJlIG9mIGEg
dHdvIGNvbnZlcnRlci9hbGlhcyBuYW1lcy4gIFRoZSBjb21wYXJpc29uCisgKiBpcyBjYXNlLWlu
c2Vuc2l0aXZlLiAgSXQgYWxzbyBpZ25vcmVzIHRoZSBjaGFyYWN0ZXJzICctJywgJ18nLCBhbmQK
KyAqICcgJyAoZGFzaCwgdW5kZXJzY29yZSwgYW5kIHNwYWNlKS4gIFRodXMgdGhlIHN0cmluZ3Mg
IlVURi04IiwKKyAqICJ1dGZfOCIsIGFuZCAiVXRmIDgiIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQu
CisgKiAKKyAqIEBwYXJhbSBuYW1lMSBhIGNvbnZlcnRlciBuYW1lIG9yIGFsaWFzLCB6ZXJvLXRl
cm1pbmF0ZWQKKyAqIEBwYXJhbSBuYW1lMiBhIGNvbnZlcnRlciBuYW1lIG9yIGFsaWFzLCB6ZXJv
LXRlcm1pbmF0ZWQKKyAqIEByZXR1cm4gMCBpZiB0aGUgbmFtZXMgbWF0Y2gsIG9yIGEgbmVnYXRp
dmUgdmFsdWUgaWYgdGhlIG5hbWUxCisgKiBsZXhpY2FsbHkgcHJlY2VkZXMgbmFtZTIsIG9yIGEg
cG9zaXRpdmUgdmFsdWUgaWYgdGhlIG5hbWUxCisgKiBsZXhpY2FsbHkgZm9sbG93cyBuYW1lMi4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBpbnQgVV9FWFBPUlQyCit1Y252X2Nv
bXBhcmVOYW1lcyhjb25zdCBjaGFyICpuYW1lMSwgY29uc3QgY2hhciAqbmFtZTIpOworCisKKy8q
KgorICogQ3JlYXRlcyBhIFVDb252ZXJ0ZXIgb2JqZWN0IHdpdGggdGhlIG5hbWVzIHNwZWNpZmll
ZCBhcyBhIEMgc3RyaW5nLgorICogVGhlIGFjdHVhbCBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQgd2l0
aCB0aGUgYWxpYXMgZmlsZQorICogdXNpbmcgYSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21w
YXJpc29uIHRoYXQgaWdub3JlcworICogdGhlIGRlbGltaXRlcnMgJy0nLCAnXycsIGFuZCAnICcg
KGRhc2gsIHVuZGVyc2NvcmUsIGFuZCBzcGFjZSkuCisgKiBFLmcuLCB0aGUgbmFtZXMgIlVURjgi
LCAidXRmLTgiLCBhbmQgIlV0ZiA4IiBhcmUgYWxsIGVxdWl2YWxlbnQuCisgKiBJZiA8Y29kZT5O
VUxMPC9jb2RlPiBpcyBwYXNzZWQgZm9yIHRoZSBjb252ZXJ0ZXIgbmFtZSwgaXQgd2lsbCBjcmVh
dGUgb25lIHdpdGggdGhlCisgKiBnZXREZWZhdWx0TmFtZSByZXR1cm4gdmFsdWUuCisgKgorICog
PHA+QSBjb252ZXJ0ZXIgbmFtZSBmb3IgSUNVIDEuNSBhbmQgYWJvdmUgbWF5IGNvbnRhaW4gb3B0
aW9ucworICogbGlrZSBhIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIHNwZWNp
ZmljIGJlaGF2aW9yIG9mCisgKiB0aGUgbmV3bHkgaW5zdGFudGlhdGVkIGNvbnZlcnRlci4KKyAq
IFRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb25zIGRlcGVuZHMgb24gdGhlIHBhcnRpY3VsYXIgY29u
dmVydGVyLgorICogSWYgYW4gb3B0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciBvciByZWNvZ25pemVk
IGJ5IGEgZ2l2ZW4gY29udmVydGVyLCB0aGVuIGl0IGlzIGlnbm9yZWQuPC9wPgorICoKKyAqIDxw
Pk9wdGlvbnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBjb252ZXJ0ZXIgbmFtZSBzdHJpbmcsIHdpdGgg
YQorICogPGNvZGU+VUNOVl9PUFRJT05fU0VQX0NIQVI8L2NvZGU+IGJldHdlZW4gdGhlIG5hbWUg
YW5kIHRoZSBmaXJzdCBvcHRpb24gYW5kCisgKiBhbHNvIGJldHdlZW4gYWRqYWNlbnQgb3B0aW9u
cy48L3A+CisgKgorICogPHA+SWYgdGhlIGFsaWFzIGlzIGFtYmlndW91cywgdGhlbiB0aGUgcHJl
ZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gVV9B
TUJJR1VPVVNfQUxJQVNfV0FSTklORy48L3A+CisgKgorICogPHA+VGhlIGNvbnZlcnNpb24gYmVo
YXZpb3IgYW5kIG5hbWVzIGNhbiB2YXJ5IGJldHdlZW4gcGxhdGZvcm1zLiBJQ1UgbWF5CisgKiBj
b252ZXJ0IHNvbWUgY2hhcmFjdGVycyBkaWZmZXJlbnRseSBmcm9tIG90aGVyIHBsYXRmb3Jtcy4g
RGV0YWlscyBvbiB0aGlzIHRvcGljCisgKiBhcmUgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9vc3Mu
c29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL2NvbnZlcnNpb24uaHRtbCI+VXNlcidzCisg
KiBHdWlkZTwvYT4uPC9wPgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXJOYW1lIE5hbWUgb2YgdGhl
IHVjb252IHRhYmxlLCBtYXkgaGF2ZSBvcHRpb25zIGFwcGVuZGVkCisgKiBAcGFyYW0gZXJyIG91
dGdvaW5nIGVycm9yIHN0YXR1cyA8VFQ+VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUiwgVV9GSUxF
X0FDQ0VTU19FUlJPUjwvVFQ+CisgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFVuaWNvZGUgY29udmVy
dGVyIG9iamVjdCwgb3IgPFRUPk5VTEw8L1RUPiBpZiBhbiBlcnJvciBvY2N1cmVkCisgKiBAc2Vl
IHVjbnZfb3BlblUKKyAqIEBzZWUgdWNudl9vcGVuQ0NTSUQKKyAqIEBzZWUgdWNudl9jbG9zZQor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIqIFVfRVhQT1JUMiAK
K3VjbnZfb3Blbihjb25zdCBjaGFyICpjb252ZXJ0ZXJOYW1lLCBVRXJyb3JDb2RlICplcnIpOwor
CisKKy8qKgorICogQ3JlYXRlcyBhIFVuaWNvZGUgY29udmVydGVyIHdpdGggdGhlIG5hbWVzIHNw
ZWNpZmllZCBhcyB1bmljb2RlIHN0cmluZy4gCisgKiBUaGUgbmFtZSBzaG91bGQgYmUgbGltaXRl
ZCB0byB0aGUgQVNDSUktNyBhbHBoYW51bWVyaWNzIHJhbmdlLgorICogVGhlIGFjdHVhbCBuYW1l
IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgYWxpYXMgZmlsZQorICogdXNpbmcgYSBjYXNlLWlu
c2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIHRoYXQgaWdub3JlcworICogdGhlIGRlbGltaXRl
cnMgJy0nLCAnXycsIGFuZCAnICcgKGRhc2gsIHVuZGVyc2NvcmUsIGFuZCBzcGFjZSkuCisgKiBF
LmcuLCB0aGUgbmFtZXMgIlVURjgiLCAidXRmLTgiLCBhbmQgIlV0ZiA4IiBhcmUgYWxsIGVxdWl2
YWxlbnQuCisgKiBJZiA8VFQ+TlVMTDwvVFQ+IGlzIHBhc3NlZCBmb3IgdGhlIGNvbnZlcnRlciBu
YW1lLCBpdCB3aWxsIGNyZWF0ZSAKKyAqIG9uZSB3aXRoIHRoZSB1Y252X2dldERlZmF1bHROYW1l
KCkgcmV0dXJuIHZhbHVlLgorICogSWYgdGhlIGFsaWFzIGlzIGFtYmlndW91cywgdGhlbiB0aGUg
cHJlZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1cyBpcyBzZXQgdG8g
VV9BTUJJR1VPVVNfQUxJQVNfV0FSTklORy4KKyAqIEBwYXJhbSBuYW1lIDogbmFtZSBvZiB0aGUg
dWNvbnYgdGFibGUgaW4gYSB6ZXJvIHRlcm1pbmF0ZWQgCisgKiAgICAgICAgVW5pY29kZSBzdHJp
bmcKKyAqIEBwYXJhbSBlcnIgb3V0Z29pbmcgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExP
Q0FUSU9OX0VSUk9SLCAKKyAqICAgICAgICBVX0ZJTEVfQUNDRVNTX0VSUk9SPC9UVD4KKyAqIEBy
ZXR1cm4gdGhlIGNyZWF0ZWQgVW5pY29kZSBjb252ZXJ0ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwv
VFQ+IGlmIGFuIAorICogICAgICAgIGVycm9yIG9jY3VyZWQKKyAqIEBzZWUgdWNudl9vcGVuCisg
KiBAc2VlIHVjbnZfb3BlbkNDU0lECisgKiBAc2VlIHVjbnZfY2xvc2UKKyAqIEBzZWUgdWNudl9n
ZXREZWZhdWx0TmFtZQorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0
ZXIqIFVfRVhQT1JUMiAKK3VjbnZfb3BlblUoY29uc3QgVUNoYXIgKm5hbWUsCisgICAgICAgICAg
IFVFcnJvckNvZGUgKmVycik7CisKKy8qKgorICogQ3JlYXRlcyBhIFVDb252ZXJ0ZXIgb2JqZWN0
IGZyb20gYSBDQ1NJRCBudW1iZXIgYW5kIHBsYXRmb3JtIHBhaXIuCisgKiBOb3RlIHRoYXQgdGhl
IHVzZWZ1bG5lc3Mgb2YgdGhpcyBmdW5jdGlvbiBpcyBsaW1pdGVkIHRvIHBsYXRmb3JtcyB3aXRo
IG51bWVyaWMKKyAqIGVuY29kaW5nIElEcy4gT25seSBJQk0gYW5kIE1pY3Jvc29mdCBwbGF0Zm9y
bXMgdXNlIG51bWVyaWMgKDE2LWJpdCkgaWRlbnRpZmllcnMgZm9yCisgKiBlbmNvZGluZ3MuCisg
KgorICogSW4gYWRkaXRpb24sIElCTSBDQ1NJRHMgYW5kIFVuaWNvZGUgY29udmVyc2lvbiB0YWJs
ZXMgYXJlIG5vdCAxOjEgcmVsYXRlZC4KKyAqIEZvciBtYW55IElCTSBDQ1NJRHMgdGhlcmUgYXJl
IG11bHRpcGxlICh1cCB0byBzaXgpIFVuaWNvZGUgY29udmVyc2lvbiB0YWJsZXMsIGFuZAorICog
Zm9yIHNvbWUgVW5pY29kZSBjb252ZXJzaW9uIHRhYmxlcyB0aGVyZSBhcmUgbXVsdGlwbGUgQ0NT
SURzLgorICogU29tZSAiYWx0ZXJuYXRlIiBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIGFyZSBw
cm92aWRlZCBieSB0aGUKKyAqIElCTSBDRFJBIGNvbnZlcnNpb24gdGFibGUgcmVnaXN0cnkuCisg
KiBUaGUgbW9zdCBwcm9taW5lbnQgZXhhbXBsZSBvZiBhIHN5c3RlbWF0aWMgbW9kaWZpY2F0aW9u
IG9mIGNvbnZlcnNpb24gdGFibGVzIHRoYXQgaXMKKyAqIG5vdCBwcm92aWRlZCBpbiB0aGUgZm9y
bSBvZiBjb252ZXJzaW9uIHRhYmxlIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IGlzCisgKiB0aGF0
IFMvMzkwIFVuaXggU3lzdGVtIFNlcnZpY2VzIHN3YXBzIHRoZSBjb2RlcyBmb3IgTGluZSBGZWVk
IGFuZCBOZXcgTGluZSBpbiBhbGwKKyAqIEVCQ0RJQyBjb2RlcGFnZXMsIHdoaWNoIHJlcXVpcmVz
IHN1Y2ggYSBzd2FwIGluIHRoZSBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIGFzIHdlbGwuCisg
KgorICogT25seSBJQk0gZGVmYXVsdCBjb252ZXJzaW9uIHRhYmxlcyBhcmUgYWNjZXNzaWJsZSB3
aXRoIHVjbnZfb3BlbkNDU0lEKCkuCisgKiB1Y252X2dldENDU0lEKCkgd2lsbCByZXR1cm4gdGhl
IHNhbWUgQ0NTSUQgZm9yIGFsbCBjb252ZXJzaW9uIHRhYmxlcyB0aGF0IGFyZSBhc3NvY2lhdGVk
CisgKiB3aXRoIHRoYXQgQ0NTSUQuCisgKgorICogQ3VycmVudGx5LCB0aGUgb25seSAicGxhdGZv
cm0iIHN1cHBvcnRlZCBpbiB0aGUgSUNVIGNvbnZlcnRlciBBUEkgaXMgVUNOVl9JQk0uCisgKgor
ICogSW4gc3VtbWFyeSwgdGhlIHVzZSBvZiBDQ1NJRHMgYW5kIHRoZSBhc3NvY2lhdGVkIEFQSSBm
dW5jdGlvbnMgaXMgbm90IHJlY29tbWVuZGVkLgorICoKKyAqIEluIG9yZGVyIHRvIG9wZW4gYSBj
b252ZXJ0ZXIgd2l0aCB0aGUgZGVmYXVsdCBJQk0gQ0RSQSBVbmljb2RlIGNvbnZlcnNpb24gdGFi
bGUsCisgKiB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIG9yIHVzZSB0aGUgcHJlZml4ICJpYm0t
IjoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBuYW1lWzIwXTsKKyAqICAgICBzcHJpbnRmKG5hbWUs
ICJpYm0tJWh1IiwgY2NzaWQpOworICogICAgIGNudj11Y252X29wZW4obmFtZSwgJmVycm9yQ29k
ZSk7CisgKiBcZW5kY29kZQorICoKKyAqIEluIG9yZGVyIHRvIG9wZW4gYSBjb252ZXJ0ZXIgd2l0
aCB0aGUgSUJNIFMvMzkwIFVuaXggU3lzdGVtIFNlcnZpY2VzIHZhcmlhbnQKKyAqIG9mIGEgVW5p
Y29kZS9FQkNESUMgY29udmVyc2lvbiB0YWJsZSwKKyAqIHlvdSBjYW4gdXNlIHRoZSBwcmVmaXgg
ImlibS0iIHRvZ2V0aGVyIHdpdGggdGhlIG9wdGlvbiBzdHJpbmcgVUNOVl9TV0FQX0xGTkxfT1BU
SU9OX1NUUklORzoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBuYW1lWzIwXTsKKyAqICAgICBzcHJp
bnRmKG5hbWUsICJpYm0tJWh1IiBVQ05WX1NXQVBfTEZOTF9PUFRJT05fU1RSSU5HLCBjY3NpZCk7
CisgKiAgICAgY252PXVjbnZfb3BlbihuYW1lLCAmZXJyb3JDb2RlKTsKKyAqIFxlbmRjb2RlCisg
KgorICogSW4gb3JkZXIgdG8gb3BlbiBhIGNvbnZlcnRlciBmcm9tIGEgTWljcm9zb2Z0IGNvZGVw
YWdlIG51bWJlciwgdXNlIHRoZSBwcmVmaXggImNwIjoKKyAqIFxjb2RlCisgKiAgICAgY2hhciBu
YW1lWzIwXTsKKyAqICAgICBzcHJpbnRmKG5hbWUsICJjcCVodSIsIGNvZGVwYWdlSUQpOworICog
ICAgIGNudj11Y252X29wZW4obmFtZSwgJmVycm9yQ29kZSk7CisgKiBcZW5kY29kZQorICoKKyAq
IElmIHRoZSBhbGlhcyBpcyBhbWJpZ3VvdXMsIHRoZW4gdGhlIHByZWZlcnJlZCBjb252ZXJ0ZXIg
aXMgdXNlZAorICogYW5kIHRoZSBzdGF0dXMgaXMgc2V0IHRvIFVfQU1CSUdVT1VTX0FMSUFTX1dB
Uk5JTkcuCisgKgorICogQHBhcmFtIGNvZGVwYWdlIGNvZGVwYWdlIG51bWJlciB0byBjcmVhdGUK
KyAqIEBwYXJhbSBwbGF0Zm9ybSB0aGUgcGxhdGZvcm0gaW4gd2hpY2ggdGhlIGNvZGVwYWdlIG51
bWJlciBleGlzdHMKKyAqIEBwYXJhbSBlcnIgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExP
Q0FUSU9OX0VSUk9SLCBVX0ZJTEVfQUNDRVNTX0VSUk9SPC9UVD4KKyAqIEByZXR1cm4gdGhlIGNy
ZWF0ZWQgVW5pY29kZSBjb252ZXJ0ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwvVFQ+IGlmIGFuIGVy
cm9yCisgKiAgIG9jY3VyZWQuCisgKiBAc2VlIHVjbnZfb3BlbgorICogQHNlZSB1Y252X29wZW5V
CisgKiBAc2VlIHVjbnZfY2xvc2UKKyAqIEBzZWUgdWNudl9nZXRDQ1NJRAorICogQHNlZSB1Y252
X2dldFBsYXRmb3JtCisgKiBAc2VlIFVDb252ZXJ0ZXJQbGF0Zm9ybQorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIqIFVfRVhQT1JUMgordWNudl9vcGVuQ0NTSUQo
aW50MzJfdCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJQbGF0Zm9ybSBwbGF0
Zm9ybSwKKyAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIDxwPkNy
ZWF0ZXMgYSBVQ29udmVydGVyIG9iamVjdCBzcGVjaWZpZWQgZnJvbSBhIHBhY2thZ2VOYW1lIGFu
ZCBhIGNvbnZlcnRlck5hbWUuPC9wPgorICogCisgKiA8cD5UaGUgcGFja2FnZU5hbWUgYW5kIGNv
bnZlcnRlck5hbWUgbXVzdCBwb2ludCB0byBhbiBJQ1UgdWRhdGEgb2JqZWN0LCBhcyBkZWZpbmVk
IGJ5CisgKiAgIDxjb2RlPiB1ZGF0YV9vcGVuKCBwYWNrYWdlTmFtZSwgImNudiIsIGNvbnZlcnRl
ck5hbWUsIGVycikgPC9jb2RlPiBvciBlcXVpdmFsZW50LgorICogVHlwaWNhbGx5LCBwYWNrYWdl
TmFtZSB3aWxsIHJlZmVyIHRvIGEgKC5kYXQpIGZpbGUsIG9yIHRvIGEgcGFja2FnZSByZWdpc3Rl
cmVkIHdpdGgKKyAqIHVkYXRhX3NldEFwcERhdGEoKS48L3A+CisgKiAKKyAqIDxwPlRoZSBuYW1l
IHdpbGwgTk9UIGJlIGxvb2tlZCB1cCBpbiB0aGUgYWxpYXMgbWVjaGFuaXNtLCBub3Igd2lsbCB0
aGUgY29udmVydGVyIGJlCisgKiBzdG9yZWQgaW4gdGhlIGNvbnZlcnRlciBjYWNoZSBvciB0aGUg
YWxpYXMgdGFibGUuIFRoZSBvbmx5IHdheSB0byBvcGVuIGZ1cnRoZXIgY29udmVydGVycworICog
aXMgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzLCBvciB1c2UgdGhlIHVjbnZfc2Fm
ZUNsb25lKCkgZnVuY3Rpb24gdG8gY2xvbmUgYSAKKyAqICdtYXN0ZXInIGNvbnZlcnRlci48L3A+
CisgKgorICogPHA+QSBmdXR1cmUgdmVyc2lvbiBvZiBJQ1UgbWF5IGFkZCBhbGlhcyB0YWJsZSBs
b29rdXBzIGFuZC9vciBjYWNoaW5nCisgKiB0byB0aGlzIGZ1bmN0aW9uLjwvcD4KKyAqIAorICog
PHA+RXhhbXBsZSBVc2U6CisgKiAgICAgIDxjb2RlPmNudiA9IHVjbnZfb3BlblBhY2thZ2UoIm15
YXBwIiwgIm15Y29udmVydGVyIiwgJmVycik7PC9jb2RlPgorICogPC9wPgorICoKKyAqIEBwYXJh
bSBwYWNrYWdlTmFtZSBuYW1lIG9mIHRoZSBwYWNrYWdlIChlcXVpdmFsZW50IHRvICdwYXRoJyBp
biB1ZGF0YV9vcGVuKCkgY2FsbCkKKyAqIEBwYXJhbSBjb252ZXJ0ZXJOYW1lIG5hbWUgb2YgdGhl
IGRhdGEgaXRlbSB0byBiZSB1c2VkLCB3aXRob3V0IHN1ZmZpeC4KKyAqIEBwYXJhbSBlcnIgb3V0
Z29pbmcgZXJyb3Igc3RhdHVzIDxUVD5VX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SLCBVX0ZJTEVf
QUNDRVNTX0VSUk9SPC9UVD4KKyAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgVW5pY29kZSBjb252ZXJ0
ZXIgb2JqZWN0LCBvciA8VFQ+TlVMTDwvVFQ+IGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqIEBzZWUg
dWRhdGFfb3BlbgorICogQHNlZSB1Y252X29wZW4KKyAqIEBzZWUgdWNudl9zYWZlQ2xvbmUKKyAq
IEBzZWUgdWNudl9jbG9zZQorICogQHN0YWJsZSBJQ1UgMi4yCisgKi8KK1VfU1RBQkxFIFVDb252
ZXJ0ZXIqIFVfRVhQT1JUMiAKK3VjbnZfb3BlblBhY2thZ2UoY29uc3QgY2hhciAqcGFja2FnZU5h
bWUsIGNvbnN0IGNoYXIgKmNvbnZlcnRlck5hbWUsIFVFcnJvckNvZGUgKmVycik7CisKKy8qKgor
ICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24KKyAqIEBwYXJhbSBjbnYgY29udmVydGVy
IHRvIGJlIGNsb25lZAorICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNl
IGZvciB0aGUgbmV3IGNsb25lLiBJZiBOVUxMIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQu
IAorICogIElmIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoLCBuZXcgbWVtb3J5IHdpbGwgYmUg
YWxsb2NhdGVkLgorICogIENsaWVudHMgY2FuIHVzZSB0aGUgVV9DTlZfU0FGRUNMT05FX0JVRkZF
UlNJWkUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSBlbm91Z2ggdG8gYXZvaWQgbWVtb3J5IGFsbG9j
YXRpb25zLgorICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0
ZWQgc3BhY2UuIAorICogIElmICpwQnVmZmVyU2l6ZSA9PSAwLCBhIHN1ZmZpY2llbnQgc2l6ZSBm
b3IgdXNlIGluIGNsb25pbmcgd2lsbCAKKyAqICBiZSByZXR1cm5lZCAoJ3ByZS1mbGlnaHRpbmcn
KQorICogIElmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNh
ZmUgY2xvbmUsIAorICogIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuCisgKiBAcGFyYW0g
c3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5
IG9yIHRoZXJlIHdlcmUgZXJyb3JzCisgKiAgQW4gaW5mb3JtYXRpb25hbCBzdGF0dXMgdmFsdWUs
IFVfU0FGRUNMT05FX0FMTE9DQVRFRF9FUlJPUiwgaXMgdXNlZCBpZiBhbnkgYWxsb2NhdGlvbnMg
d2VyZSBuZWNlc3NhcnkuCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5ldyBjbG9uZQorICog
QHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXIgKiBVX0VYUE9SVDIgCit1
Y252X3NhZmVDbG9uZShjb25zdCBVQ29udmVydGVyICpjbnYsIAorICAgICAgICAgICAgICAgdm9p
ZCAgICAgICAgICAgICAqc3RhY2tCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQzMl90ICAgICAg
ICAgICpwQnVmZmVyU2l6ZSwgCisgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICpzdGF0
dXMpOworCisvKioKKyAqIFxkZWYgVV9DTlZfU0FGRUNMT05FX0JVRkZFUlNJWkUKKyAqIERlZmlu
aXRpb24gb2YgYSBidWZmZXIgc2l6ZSB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIGxhcmdlIGVub3Vn
aCBmb3IKKyAqIGNvbnZlcnRlcnMgdG8gYmUgY2xvbmVkIHdpdGggdWNudl9zYWZlQ2xvbmUoKS4K
KyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVfQ05WX1NBRkVDTE9ORV9CVUZGRVJT
SVpFICAxMDI0CisKKy8qKgorICogRGVsZXRlcyB0aGUgdW5pY29kZSBjb252ZXJ0ZXIgYW5kIHJl
bGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkCisgKiB3aXRoIGp1c3QgdGhpcyBpbnN0YW5jZS4K
KyAqIERvZXMgbm90IGZyZWUgdXAgc2hhcmVkIGNvbnZlcnRlciB0YWJsZXMuCisgKgorICogQHBh
cmFtIGNvbnZlcnRlciB0aGUgY29udmVydGVyIG9iamVjdCB0byBiZSBkZWxldGVkCisgKiBAc2Vl
IHVjbnZfb3BlbgorICogQHNlZSB1Y252X29wZW5VCisgKiBAc2VlIHVjbnZfb3BlbkNDU0lECisg
KiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCAgVV9FWFBPUlQyCit1Y252X2Ns
b3NlKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIpOworCisvKioKKyAqIEZpbGxzIGluIHRoZSBvdXRw
dXQgcGFyYW1ldGVyLCBzdWJDaGFycywgd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMK
KyAqIGFzIG11bHRpcGxlIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNv
ZGUgY29udmVydGVyCisgKiBAcGFyYW0gc3ViQ2hhcnMgdGhlIHN1YnNpdHV0aW9uIGNoYXJhY3Rl
cnMKKyAqIEBwYXJhbSBsZW4gb24gaW5wdXQgdGhlIGNhcGFjaXR5IG9mIHN1YkNoYXJzLCBvbiBv
dXRwdXQgdGhlIG51bWJlciAKKyAqIG9mIGJ5dGVzIGNvcGllZCB0byBpdAorICogQHBhcmFtICBl
cnIgdGhlIG91dGdvaW5nIGVycm9yIHN0YXR1cyBjb2RlLgorICogSWYgdGhlIHN1YnN0aXR1dGlv
biBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNtYWxsLCBhbgorICogPFRUPlVfSU5ERVhfT1VUT0ZC
T1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJldHVybmVkLgorICogQHNlZSB1Y252X3NldFN1YnN0
Q2hhcnMKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgor
dWNudl9nZXRTdWJzdENoYXJzKGNvbnN0IFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAg
ICAgICAgICAgICBjaGFyICpzdWJDaGFycywKKyAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmxl
biwKKyAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIFNldHMg
dGhlIHN1YnN0aXR1dGlvbiBjaGFycyB3aGVuIGNvbnZlcnRpbmcgZnJvbSB1bmljb2RlIHRvIGEg
Y29kZXBhZ2UuIFRoZQorICogc3Vic3RpdHV0aW9uIGlzIHNwZWNpZmllZCBhcyBhIHN0cmluZyBv
ZiAxLTQgYnl0ZXMsIGFuZCBtYXkgY29udGFpbgorICogIDxUVD5OVUxMPC9UVD4gYnl0ZS4KKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gc3ViQ2hh
cnMgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYnl0ZSBzZXF1ZW5jZSB3ZSB3YW50IHNldAor
ICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHN1YkNoYXJzCisgKiBAcGFyYW0g
ZXJyIHRoZSBlcnJvciBzdGF0dXMgY29kZS4gIDxUVD5VX0lOREVYX09VVE9GQk9VTkRTX0VSUk9S
IDwvVFQ+IGlmCisgKiBsZW4gaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5
dGVzIGFsbG93ZWQgaW4gc3ViY2hhcnMKKyAqIEBzZWUgdWNudl9nZXRTdWJzdENoYXJzCisgKiBA
c3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKK3VjbnZfc2V0U3Vi
c3RDaGFycyhVQ29udmVydGVyICpjb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3Qg
Y2hhciAqc3ViQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgaW50OF90IGxlbiwKKyAgICAgICAg
ICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIEZpbGxzIGluIHRoZSBvdXRw
dXQgcGFyYW1ldGVyLCBlcnJCeXRlcywgd2l0aCB0aGUgZXJyb3IgY2hhcmFjdGVycyBmcm9tIHRo
ZQorICogbGFzdCBmYWlsaW5nIGNvbnZlcnNpb24uCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0
aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBlcnJCeXRlcyB0aGUgY29kZXBhZ2UgYnl0
ZXMgd2hpY2ggd2VyZSBpbiBlcnJvcgorICogQHBhcmFtIGxlbiBvbiBpbnB1dCB0aGUgY2FwYWNp
dHkgb2YgZXJyQnl0ZXMsIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mCisgKiAgYnl0ZXMgd2hpY2gg
d2VyZSBjb3BpZWQgdG8gaXQKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1cyBjb2RlLgor
ICogSWYgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNtYWxsLCBhbgor
ICogPFRUPlVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJldHVybmVkLgor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X2dl
dEludmFsaWRDaGFycyhjb25zdCBVQ29udmVydGVyICpjb252ZXJ0ZXIsCisgICAgICAgICAgICAg
ICAgICAgICBjaGFyICplcnJCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqbGVu
LAorICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBGaWxs
cyBpbiB0aGUgb3V0cHV0IHBhcmFtZXRlciwgZXJyQ2hhcnMsIHdpdGggdGhlIGVycm9yIGNoYXJh
Y3RlcnMgZnJvbSB0aGUKKyAqIGxhc3QgZmFpbGluZyBjb252ZXJzaW9uLgorICoKKyAqIEBwYXJh
bSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gZXJyVUNoYXJzIHRo
ZSBVQ2hhcnMgd2hpY2ggd2VyZSBpbiBlcnJvcgorICogQHBhcmFtIGxlbiBvbiBpbnB1dCB0aGUg
Y2FwYWNpdHkgb2YgZXJyVUNoYXJzLCBvbiBvdXRwdXQgdGhlIG51bWJlciBvZiAKKyAqICBVQ2hh
cnMgd2hpY2ggd2VyZSBjb3BpZWQgdG8gaXQKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1
cyBjb2RlLgorICogSWYgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgYXJyYXkgaXMgdG9vIHNt
YWxsLCBhbgorICogPFRUPlVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1I8L1RUPiB3aWxsIGJlIHJl
dHVybmVkLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQy
Cit1Y252X2dldEludmFsaWRVQ2hhcnMoY29uc3QgVUNvbnZlcnRlciAqY29udmVydGVyLAorICAg
ICAgICAgICAgICAgICAgICAgIFVDaGFyICplcnJVQ2hhcnMsCisgICAgICAgICAgICAgICAgICAg
ICAgaW50OF90ICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsK
KworLyoqCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIGEgY29udmVydGVyIHRvIHRoZSBkZWZhdWx0
IHN0YXRlLiBUaGlzIGlzIHVzZWQKKyAqIGluIHRoZSBjYXNlIG9mIGFuIGVycm9yLCB0byByZXN0
YXJ0IGEgY29udmVyc2lvbiBmcm9tIGEga25vd24gZGVmYXVsdCBzdGF0ZS4KKyAqIEl0IHdpbGwg
YWxzbyBlbXB0eSB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMuCisgKiBAcGFyYW0gY29udmVy
dGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RB
QkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X3Jlc2V0KFVDb252ZXJ0ZXIgKmNvbnZlcnRlcik7CisK
Ky8qKgorICogUmVzZXRzIHRoZSB0by1Vbmljb2RlIHBhcnQgb2YgYSBjb252ZXJ0ZXIgc3RhdGUg
dG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4g
ZXJyb3IgdG8gcmVzdGFydCBhIGNvbnZlcnNpb24gdG8KKyAqIFVuaWNvZGUgdG8gYSBrbm93biBk
ZWZhdWx0IHN0YXRlLiBJdCB3aWxsIGFsc28gZW1wdHkgdGhlIGludGVybmFsCisgKiBvdXRwdXQg
YnVmZmVycyB1c2VkIGZvciB0aGUgY29udmVyc2lvbiB0byBVbmljb2RlIGNvZGVwb2ludHMuCisg
KiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHN0YWJsZSBJQ1Ug
Mi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIAordWNudl9yZXNldFRvVW5pY29kZShV
Q29udmVydGVyICpjb252ZXJ0ZXIpOworCisvKioKKyAqIFJlc2V0cyB0aGUgZnJvbS1Vbmljb2Rl
IHBhcnQgb2YgYSBjb252ZXJ0ZXIgc3RhdGUgdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgKiBUaGlz
IGlzIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3IgdG8gcmVzdGFydCBhIGNvbnZlcnNpb24g
ZnJvbQorICogVW5pY29kZSB0byBhIGtub3duIGRlZmF1bHQgc3RhdGUuIEl0IHdpbGwgYWxzbyBl
bXB0eSB0aGUgaW50ZXJuYWwgb3V0cHV0CisgKiBidWZmZXJzIHVzZWQgZm9yIHRoZSBjb252ZXJz
aW9uIGZyb20gVW5pY29kZSBjb2RlcG9pbnRzLgorICogQHBhcmFtIGNvbnZlcnRlciB0aGUgVW5p
Y29kZSBjb252ZXJ0ZXIKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVf
RVhQT1JUMiAKK3VjbnZfcmVzZXRGcm9tVW5pY29kZShVQ29udmVydGVyICpjb252ZXJ0ZXIpOwor
CisvKioKKyAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIG91
dHB1dCBwZXIgVUNoYXIgaW4gY29udmVyc2lvbgorICogZnJvbSBVbmljb2RlIHVzaW5nIHRoaXMg
Y29udmVydGVyLgorICogVGhlIHJldHVybmVkIG51bWJlciBjYW4gYmUgdXNlZCB3aXRoIFVDTlZf
R0VUX01BWF9CWVRFU19GT1JfU1RSSU5HCisgKiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSB0
YXJnZXQgYnVmZmVyIGZvciBjb252ZXJzaW9uIGZyb20gVW5pY29kZS4KKyAqCisgKiBOb3RlOiBC
ZWZvcmUgSUNVIDIuOCwgdGhpcyBmdW5jdGlvbiBkaWQgbm90IHJldHVybiByZWxpYWJsZSBudW1i
ZXJzIGZvcgorICogc29tZSBzdGF0ZWZ1bCBjb252ZXJ0ZXJzIChFQkNESUNfU1RBVEVGVUwsIElT
Ty0yMDIyKSBhbmQgTE1CQ1MuCisgKgorICogVGhpcyBudW1iZXIgbWF5IG5vdCBiZSB0aGUgc2Ft
ZSBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyCisgKiAiY29udmVyc2lvbiB1bml0
Ii4gSW4gb3RoZXIgd29yZHMsIGl0IG1heSBub3QgYmUgdGhlIGludHVpdGl2ZWx5IGV4cGVjdGVk
CisgKiBudW1iZXIgb2YgYnl0ZXMgcGVyIGNoYXJhY3RlciB0aGF0IHdvdWxkIGJlIHB1Ymxpc2hl
ZCBmb3IgYSBjaGFyc2V0LAorICogYW5kIG1heSBub3QgZnVsZmlsbCBhbnkgb3RoZXIgcHVycG9z
ZSB0aGFuIHRoZSBhbGxvY2F0aW9uIG9mIGFuIG91dHB1dAorICogYnVmZmVyIG9mIGd1YXJhbnRl
ZWQgc3VmZmljaWVudCBzaXplIGZvciBhIGdpdmVuIGlucHV0IGxlbmd0aCBhbmQgY29udmVydGVy
LgorICoKKyAqIEV4YW1wbGVzIGZvciBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIHRha2VuIGludG8g
YWNjb3VudDoKKyAqIC0gU3VwcGxlbWVudGFyeSBjb2RlIHBvaW50cyBtYXkgY29udmVydCB0byBt
b3JlIGJ5dGVzIHRoYW4gQk1QIGNvZGUgcG9pbnRzLgorICogICBUaGlzIGZ1bmN0aW9uIHJldHVy
bnMgYnl0ZXMgcGVyIFVDaGFyIChVVEYtMTYgY29kZSB1bml0KSwgbm90IHBlcgorICogICBVbmlj
b2RlIGNvZGUgcG9pbnQsIGZvciBlZmZpY2llbnQgYnVmZmVyIGFsbG9jYXRpb24uCisgKiAtIFN0
YXRlLXNoaWZ0aW5nIG91dHB1dCAoU0kvU08sIGVzY2FwZXMsIGV0Yy4pIGZyb20gc3RhdGVmdWwg
Y29udmVydGVycy4KKyAqIC0gV2hlbiBtIGlucHV0IFVDaGFycyBhcmUgY29udmVydGVkIHRvIG4g
b3V0cHV0IGJ5dGVzLCB0aGVuIHRoZSBtYXhpbXVtIG0vbgorICogICBpcyB0YWtlbiBpbnRvIGFj
Y291bnQuCisgKgorICogVGhlIG51bWJlciByZXR1cm5lZCBoZXJlIGRvZXMgbm90IHRha2UgaW50
byBhY2NvdW50CisgKiAoc2VlIFVDTlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKToKKyAqIC0g
Y2FsbGJhY2tzIHdoaWNoIG91dHB1dCBtb3JlIHRoYW4gb25lIGNoYXJzZXQgY2hhcmFjdGVyIHNl
cXVlbmNlIHBlciBjYWxsLAorICogICBsaWtlIGVzY2FwZSBjYWxsYmFja3MKKyAqIC0gaW5pdGlh
bCBhbmQgZmluYWwgbm9uLWNoYXJhY3RlciBieXRlcyB0aGF0IGFyZSBvdXRwdXQgYnkgc29tZSBj
b252ZXJ0ZXJzCisgKiAgIChhdXRvbWF0aWMgQk9NcywgaW5pdGlhbCBlc2NhcGUgc2VxdWVuY2Us
IGZpbmFsIFNJLCBldGMuKQorICoKKyAqIEV4YW1wbGVzIGZvciByZXR1cm5lZCB2YWx1ZXM6Cisg
KiAtIFNCQ1MgY2hhcnNldHM6IDEKKyAqIC0gU2hpZnQtSklTOiAyCisgKiAtIFVURi0xNjogMiAo
MiBwZXIgQk1QLCA0IHBlciBzdXJyb2dhdGUgX3BhaXJfLCBCT00gbm90IGNvdW50ZWQpCisgKiAt
IFVURi04OiAzICgzIHBlciBCTVAsIDQgcGVyIHN1cnJvZ2F0ZSBfcGFpcl8pCisgKiAtIEVCQ0RJ
Q19TVEFURUZVTCAoRUJDRElDIG1peGVkIFNCQ1MvREJDUyk6IDMgKFNPICsgREJDUykKKyAqIC0g
SVNPLTIwMjI6IDMgKGFsd2F5cyBvdXRwdXRzIFVURi04KQorICogLSBJU08tMjAyMi1KUDogNiAo
NC1ieXRlIGVzY2FwZSBzZXF1ZW5jZXMgKyBEQkNTKQorICogLSBJU08tMjAyMi1DTjogOCAoNC1i
eXRlIGRlc2lnbmF0b3Igc2VxdWVuY2VzICsgMi1ieXRlIFNTMi9TUzMgKyBEQkNTKQorICoKKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgVGhlIFVuaWNvZGUgY29udmVydGVyLgorICogQHJldHVybiBUaGUg
bWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIFVDaGFyIHRoYXQgYXJlIG91dHB1dCBieSB1Y252
X2Zyb21Vbmljb2RlKCksCisgKiAgICAgICAgIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBVQ05W
X0dFVF9NQVhfQllURVNfRk9SX1NUUklORyBmb3IgYnVmZmVyIGFsbG9jYXRpb24uCisgKgorICog
QHNlZSBVQ05WX0dFVF9NQVhfQllURVNfRk9SX1NUUklORworICogQHNlZSB1Y252X2dldE1pbkNo
YXJTaXplCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgaW50OF90IFVfRVhQT1JU
MgordWNudl9nZXRNYXhDaGFyU2l6ZShjb25zdCBVQ29udmVydGVyICpjb252ZXJ0ZXIpOworCisj
aWZuZGVmIFVfSElERV9EUkFGVF9BUEkKKworLyoqCisgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9m
IGEgYnVmZmVyIGZvciBjb252ZXJzaW9uIGZyb20gVW5pY29kZSB0byBhIGNoYXJzZXQuCisgKiBU
aGUgY2FsY3VsYXRlZCBzaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VmZmljaWVudCBmb3IgdGhp
cyBjb252ZXJzaW9uLgorICoKKyAqIEl0IHRha2VzIGludG8gYWNjb3VudCBpbml0aWFsIGFuZCBm
aW5hbCBub24tY2hhcmFjdGVyIGJ5dGVzIHRoYXQgYXJlIG91dHB1dAorICogYnkgc29tZSBjb252
ZXJ0ZXJzLgorICogSXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgY2FsbGJhY2tzIHdoaWNo
IG91dHB1dCBtb3JlIHRoYW4gb25lIGNoYXJzZXQKKyAqIGNoYXJhY3RlciBzZXF1ZW5jZSBwZXIg
Y2FsbCwgbGlrZSBlc2NhcGUgY2FsbGJhY2tzLgorICogVGhlIGRlZmF1bHQgKHN1YnN0aXR1dGlv
bikgY2FsbGJhY2sgb25seSBvdXRwdXRzIG9uZSBjaGFyc2V0IGNoYXJhY3RlciBzZXF1ZW5jZS4K
KyAqCisgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBVQ2hhcnMgdG8gYmUgY29udmVydGVkLgor
ICogQHBhcmFtIG1heENoYXJTaXplIFJldHVybiB2YWx1ZSBmcm9tIHVjbnZfZ2V0TWF4Q2hhclNp
emUoKSBmb3IgdGhlIGNvbnZlcnRlcgorICogICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBi
ZSB1c2VkLgorICogQHJldHVybiBTaXplIG9mIGEgYnVmZmVyIHRoYXQgd2lsbCBiZSBsYXJnZSBl
bm91Z2ggdG8gaG9sZCB0aGUgb3V0cHV0IGJ5dGVzIG9mCisgKiAgICAgICAgIGNvbnZlcnRpbmcg
bGVuZ3RoIFVDaGFycyB3aXRoIHRoZSBjb252ZXJ0ZXIgdGhhdCByZXR1cm5lZCB0aGUgbWF4Q2hh
clNpemUuCisgKgorICogQHNlZSB1Y252X2dldE1heENoYXJTaXplCisgKiBAZHJhZnQgSUNVIDIu
OAorICovCisjZGVmaW5lIFVDTlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKGxlbmd0aCwgbWF4
Q2hhclNpemUpIFwKKyAgICAgKCgoaW50MzJfdCkobGVuZ3RoKSsxMCkqKGludDMyX3QpKG1heENo
YXJTaXplKSkKKworI2VuZGlmIC8qVV9ISURFX0RSQUZUX0FQSSovCisKKy8qKgorICogUmV0dXJu
cyB0aGUgbWluaW11bSBieXRlIGxlbmd0aCBmb3IgY2hhcmFjdGVycyBpbiB0aGlzIGNvZGVwYWdl
LiAKKyAqIFRoaXMgaXMgdXN1YWxseSBlaXRoZXIgMSBvciAyLgorICogQHBhcmFtIGNvbnZlcnRl
ciB0aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEByZXR1cm4gdGhlIG1pbmltdW0gbnVtYmVyIG9m
IGJ5dGVzIGFsbG93ZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIGNvbnZlcnRlcgorICogQHNlZSB1Y252
X2dldE1heENoYXJTaXplCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgaW50OF90
IFVfRVhQT1JUMgordWNudl9nZXRNaW5DaGFyU2l6ZShjb25zdCBVQ29udmVydGVyICpjb252ZXJ0
ZXIpOworCisvKioKKyAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29udmVydGVy
IHBhc3NlZCBpbiBiYXNlZCBvbiB0aGUgTG9jYWxlIAorICogcGFzc2VkIGluLiBJZiB0aGUgbG9j
YWxlIGNvbnRhaW5zIG5vIGRpc3BsYXkgbmFtZSwgdGhlIGludGVybmFsIEFTQ0lJCisgKiBuYW1l
IHdpbGwgYmUgZmlsbGVkIGluLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhlIFVuaWNvZGUg
Y29udmVydGVyLgorICogQHBhcmFtIGRpc3BsYXlMb2NhbGUgaXMgdGhlIHNwZWNpZmljIExvY2Fs
ZSB3ZSB3YW50IHRvIGxvY2FsaXNlZCBmb3IKKyAqIEBwYXJhbSBkaXNwbGF5TmFtZSB1c2VyIHBy
b3ZpZGVkIGJ1ZmZlciB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBkaXNwbGF5TmFtZUNhcGFj
aXR5IHNpemUgb2YgZGlzcGxheU5hbWUgQnVmZmVyCisgKiBAcGFyYW0gZXJyIGVycm9yIHN0YXR1
cyBjb2RlCisgKiBAcmV0dXJuIGRpc3BsYXlOYW1lTGVuZ3RoIG51bWJlciBvZiBVQ2hhciBuZWVk
ZWQgaW4gZGlzcGxheU5hbWUKKyAqIEBzZWUgdWNudl9nZXROYW1lCisgKiBAc3RhYmxlIElDVSAy
LjAKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfZ2V0RGlzcGxheU5hbWUo
Y29uc3QgVUNvbnZlcnRlciAqY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBj
aGFyICpkaXNwbGF5TG9jYWxlLAorICAgICAgICAgICAgICAgICAgICBVQ2hhciAqZGlzcGxheU5h
bWUsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcGxheU5hbWVDYXBhY2l0eSwKKyAg
ICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIHRoZSBp
bnRlcm5hbCwgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGNvbnZlcnRlciAoemVyby10ZXJtaW5hdGVk
KS4KKyAqIFRoZSBsaWZldGltZSBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgYmUgdGhhdCBv
ZiB0aGUgY29udmVydGVyIAorICogcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgKiBAcGFyYW0g
Y29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIGVyciBVRXJyb3JDb2Rl
IHN0YXR1cworICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY29udmVydGVyCisg
KiBAc2VlIHVjbnZfZ2V0RGlzcGxheU5hbWUKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NU
QUJMRSBjb25zdCBjaGFyICogVV9FWFBPUlQyIAordWNudl9nZXROYW1lKGNvbnN0IFVDb252ZXJ0
ZXIgKmNvbnZlcnRlciwgVUVycm9yQ29kZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIGEgY29kZXBh
Z2UgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udmVydGVyLiBUaGlzIGlzIG5vdCBndWFy
YW50ZWVkCisgKiB0byBiZSB0aGUgb25lIHVzZWQgdG8gY3JlYXRlIHRoZSBjb252ZXJ0ZXIuIFNv
bWUgY29udmVydGVycyBkbyBub3QgcmVwcmVzZW50CisgKiBwbGF0Zm9ybSByZWdpc3RlcmVkIGNv
ZGVwYWdlcyBhbmQgcmV0dXJuIHplcm8gZm9yIHRoZSBjb2RlcGFnZSBudW1iZXIuCisgKiBUaGUg
ZXJyb3IgY29kZSBmaWxsLWluIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIGNvZGVwYWdlIG51
bWJlcgorICogaXMgYXZhaWxhYmxlLgorICogRG9lcyBub3QgY2hlY2sgaWYgdGhlIGNvbnZlcnRl
ciBpcyA8VFQ+TlVMTDwvVFQ+IG9yIGlmIGNvbnZlcnRlcidzIGRhdGEKKyAqIHRhYmxlIGlzIDxU
VD5OVUxMPC9UVD4uCisgKgorICogSW1wb3J0YW50OiBUaGUgdXNlIG9mIENDU0lEcyBpcyBub3Qg
cmVjb21tZW5kZWQgYmVjYXVzZSBpdCBpcyBsaW1pdGVkCisgKiB0byBvbmx5IHR3byBwbGF0Zm9y
bXMgaW4gcHJpbmNpcGxlIGFuZCBvbmx5IG9uZSAoVUNOVl9JQk0pIGluIHRoZSBjdXJyZW50Cisg
KiBJQ1UgY29udmVydGVyIEFQSS4KKyAqIEFsc28sIENDU0lEcyBhcmUgaW5zdWZmaWNpZW50IHRv
IGlkZW50aWZ5IElCTSBVbmljb2RlIGNvbnZlcnNpb24gdGFibGVzIHByZWNpc2VseS4KKyAqIEZv
ciBtb3JlIGRldGFpbHMgc2VlIHVjbnZfb3BlbkNDU0lEKCkuCisgKgorICogQHBhcmFtIGNvbnZl
cnRlciB0aGUgVW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1
cyBjb2RlLgorICogQHJldHVybiBJZiBhbnkgZXJyb3Igb2NjdXJycywgLTEgd2lsbCBiZSByZXR1
cm5lZCBvdGhlcndpc2UsIHRoZSBjb2RlcGFnZSBudW1iZXIKKyAqIHdpbGwgYmUgcmV0dXJuZWQK
KyAqIEBzZWUgdWNudl9vcGVuQ0NTSUQKKyAqIEBzZWUgdWNudl9nZXRQbGF0Zm9ybQorICogQHN0
YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyCit1Y252X2dldEND
U0lEKGNvbnN0IFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAgICAgICAgVUVycm9yQ29k
ZSAqZXJyKTsKKworLyoqCisgKiBHZXRzIGEgY29kZXBhZ2UgcGxhdGZvcm0gYXNzb2NpYXRlZCB3
aXRoIHRoZSBjb252ZXJ0ZXIuIEN1cnJlbnRseSwgCisgKiBvbmx5IDxUVD5VQ05WX0lCTTwvVFQ+
IHdpbGwgYmUgcmV0dXJuZWQuCisgKiBEb2VzIG5vdCB0ZXN0IGlmIHRoZSBjb252ZXJ0ZXIgaXMg
PFRUPk5VTEw8L1RUPiBvciBpZiBjb252ZXJ0ZXIncyBkYXRhIAorICogdGFibGUgaXMgPFRUPk5V
TEw8L1RUPi4gCisgKiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICog
QHBhcmFtIGVyciB0aGUgZXJyb3Igc3RhdHVzIGNvZGUuCisgKiBAcmV0dXJuIFRoZSBjb2RlcGFn
ZSBwbGF0Zm9ybQorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIFVDb252ZXJ0ZXJQ
bGF0Zm9ybSBVX0VYUE9SVDIKK3VjbnZfZ2V0UGxhdGZvcm0oY29uc3QgVUNvbnZlcnRlciAqY29u
dmVydGVyLAorICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICplcnIpOworCisvKioKKyAqIEdl
dHMgdGhlIHR5cGUgb2YgdGhlIGNvbnZlcnRlcgorICogZS5nLiBTQkNTLCBNQkNTLCBEQkNTLCBV
VEY4LCBVVEYxNl9CRSwgVVRGMTZfTEUsIElTT18yMDIyLCAKKyAqIEVCQ0RJQ19TVEFURUZVTCwg
TEFUSU5fMQorICogQHBhcmFtIGNvbnZlcnRlciBhIHZhbGlkLCBvcGVuZWQgY29udmVydGVyCisg
KiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBjb252ZXJ0ZXIKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSBVQ29udmVydGVyVHlwZSBVX0VYUE9SVDIKK3VjbnZfZ2V0VHlwZShjb25z
dCBVQ29udmVydGVyICogY29udmVydGVyKTsKKworLyoqCisgKiBHZXRzIHRoZSAic3RhcnRlciIg
KGxlYWQpIGJ5dGVzIGZvciBjb252ZXJ0ZXJzIG9mIHR5cGUgTUJDUy4KKyAqIFdpbGwgZmlsbCBp
biBhbiA8VFQ+VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SPC9UVD4gaWYgY29udmVydGVyIHBhc3Nl
ZCBpbgorICogaXMgbm90IE1CQ1MuIEZpbGxzIGluIGFuIGFycmF5IG9mIHR5cGUgVUJvb2wsIHdp
dGggdGhlIHZhbHVlIG9mIHRoZSBieXRlIAorICogYXMgb2Zmc2V0IHRvIHRoZSBhcnJheS4gRm9y
IGV4YW1wbGUsIGlmIChzdGFydGVyc1sweDIwXSA9PSBUUlVFKSBhdCByZXR1cm4sCisgKiBpdCBt
ZWFucyB0aGF0IHRoZSBieXRlIDB4MjAgaXMgYSBzdGFydGVyIGJ5dGUgaW4gdGhpcyBjb252ZXJ0
ZXIuCisgKiBDb250ZXh0IHBvaW50ZXJzIGFyZSBhbHdheXMgb3duZWQgYnkgdGhlIGNhbGxlci4K
KyAqIAorICogQHBhcmFtIGNvbnZlcnRlciBhIHZhbGlkLCBvcGVuZWQgY29udmVydGVyIG9mIHR5
cGUgTUJDUworICogQHBhcmFtIHN0YXJ0ZXJzIGFuIGFycmF5IG9mIHNpemUgMjU2IHRvIGJlIGZp
bGxlZCBpbgorICogQHBhcmFtIGVyciBlcnJvciBzdGF0dXMsIDxUVD5VX0lMTEVHQUxfQVJHVU1F
TlRfRVJST1I8L1RUPiBpZiB0aGUgCisgKiBjb252ZXJ0ZXIgaXMgbm90IGEgdHlwZSB3aGljaCBj
YW4gcmV0dXJuIHN0YXJ0ZXJzLgorICogQHNlZSB1Y252X2dldFR5cGUKKyAqIEBzdGFibGUgSUNV
IDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgordWNudl9nZXRTdGFydGVycyhjb25z
dCBVQ29udmVydGVyKiBjb252ZXJ0ZXIsIAorICAgICAgICAgICAgICAgICBVQm9vbCBzdGFydGVy
c1syNTZdLAorICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlKiBlcnIpOworCisKKy8qKgorICog
U2VsZWN0b3JzIGZvciBVbmljb2RlIHNldHMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdWNudl9n
ZXRVbmljb2RlU2V0KCkuCisgKiBAc2VlIHVjbnZfZ2V0VW5pY29kZVNldAorICogQHN0YWJsZSBJ
Q1UgMi42CisgKi8KK3R5cGVkZWYgZW51bSBVQ29udmVydGVyVW5pY29kZVNldCB7CisgICAgLyoq
IFNlbGVjdCB0aGUgc2V0IG9mIHJvdW5kdHJpcHBhYmxlIFVuaWNvZGUgY29kZSBwb2ludHMuIEBz
dGFibGUgSUNVIDIuNiAqLworICAgIFVDTlZfUk9VTkRUUklQX1NFVCwKKyAgICAvKiogTnVtYmVy
IG9mIFVDb252ZXJ0ZXJVbmljb2RlU2V0IHNlbGVjdG9ycy4gQHN0YWJsZSBJQ1UgMi42ICovCisg
ICAgVUNOVl9TRVRfQ09VTlQKK30gVUNvbnZlcnRlclVuaWNvZGVTZXQ7CisKKworLyoqCisgKiBS
ZXR1cm5zIHRoZSBzZXQgb2YgVW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSBjb252ZXJ0
ZWQgYnkgYW4gSUNVIGNvbnZlcnRlci4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlv
biByZXR1cm5zIG9ubHkgb25lIGtpbmQgb2Ygc2V0IChVQ05WX1JPVU5EVFJJUF9TRVQpOgorICog
VGhlIHNldCBvZiBhbGwgVW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSByb3VuZHRyaXAt
Y29udmVydGVkCisgKiAoY29udmVydGVkIHdpdGhvdXQgYW55IGRhdGEgbG9zcykgd2l0aCB0aGUg
Y29udmVydGVyLgorICogVGhpcyBzZXQgd2lsbCBub3QgaW5jbHVkZSBjb2RlIHBvaW50cyB0aGF0
IGhhdmUgZmFsbGJhY2sgbWFwcGluZ3MKKyAqIG9yIGFyZSBvbmx5IHRoZSByZXN1bHQgb2YgcmV2
ZXJzZSBmYWxsYmFjayBtYXBwaW5ncy4KKyAqIFNlZSBVVFIgIzIyICJDaGFyYWN0ZXIgTWFwcGlu
ZyBNYXJrdXAgTGFuZ3VhZ2UiCisgKiBhdCBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMv
dHIyMi8KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IKKyAqIC0gY2hlY2tp
bmcgdGhhdCBhIHN0cmluZyBvciBkb2N1bWVudCBjYW4gYmUgcm91bmR0cmlwLWNvbnZlcnRlZCB3
aXRoIGEgY29udmVydGVyLAorICogICB3aXRob3V0L2JlZm9yZSBhY3R1YWxseSBwZXJmb3JtaW5n
IHRoZSBjb252ZXJzaW9uCisgKiAtIHRlc3RpbmcgaWYgYSBjb252ZXJ0ZXIgY2FuIGJlIHVzZWQg
Zm9yIHRleHQgZm9yIHR5cGljYWwgdGV4dCBmb3IgYSBjZXJ0YWluIGxvY2FsZSwKKyAqICAgYnkg
Y29tcGFyaW5nIGl0cyByb3VuZHRyaXAgc2V0IHdpdGggdGhlIHNldCBvZiBFeGVtcGxhckNoYXJh
Y3RlcnMgZnJvbQorICogICBJQ1UncyBsb2NhbGUgZGF0YSBvciBvdGhlciBzb3VyY2VzCisgKgor
ICogSW4gdGhlIGZ1dHVyZSwgdGhlcmUgbWF5IGJlIG1vcmUgVUNvbnZlcnRlclVuaWNvZGVTZXQg
Y2hvaWNlcyB0byBzZWxlY3QKKyAqIHNldHMgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4KKyAq
CisgKiBAcGFyYW0gY252IFRoZSBjb252ZXJ0ZXIgZm9yIHdoaWNoIGEgc2V0IGlzIHJlcXVlc3Rl
ZC4KKyAqIEBwYXJhbSBzZXRGaWxsSW4gQSB2YWxpZCBVU2V0ICouIEl0IHdpbGwgYmUgY2xlYXJl
ZCBieSB0aGlzIGZ1bmN0aW9uIGJlZm9yZQorICogICAgICAgICAgICB0aGUgY29udmVydGVyJ3Mg
c3BlY2lmaWMgc2V0IGlzIGZpbGxlZCBpbnRvIHRoZSBVU2V0LgorICogQHBhcmFtIHdoaWNoU2V0
IEEgVUNvbnZlcnRlclVuaWNvZGVTZXQgc2VsZWN0b3I7CisgKiAgICAgICAgICAgICAgY3VycmVu
dGx5IFVDTlZfUk9VTkRUUklQX1NFVCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUuCisgKiBA
cGFyYW0gcEVycm9yQ29kZSBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICogICAg
ICAgICAgICAgICAgICAgTXVzdCBmdWxmaWxsIFVfU1VDQ0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9u
IGNhbGwuCisgKgorICogQHNlZSBVQ29udmVydGVyVW5pY29kZVNldAorICogQHNlZSB1c2V0X29w
ZW4KKyAqIEBzZWUgdXNldF9jbG9zZQorICogQHN0YWJsZSBJQ1UgMi42CisgKi8KK1VfU1RBQkxF
IHZvaWQgVV9FWFBPUlQyCit1Y252X2dldFVuaWNvZGVTZXQoY29uc3QgVUNvbnZlcnRlciAqY252
LAorICAgICAgICAgICAgICAgICAgIFVTZXQgKnNldEZpbGxJbiwKKyAgICAgICAgICAgICAgICAg
ICBVQ29udmVydGVyVW5pY29kZVNldCB3aGljaFNldCwKKyAgICAgICAgICAgICAgICAgICBVRXJy
b3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IGNhbGJhY2sg
ZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIHdoZW4gYW4gaWxsZWdhbAorICogIG9yIGlu
dmFsaWQgY29kZXBhZ2Ugc2VxdWVuY2UgaXMgZm91bmQuIAorICogQ29udGV4dCBwb2ludGVycyBh
cmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0
aGUgdW5pY29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBhY3Rpb24gZmlsbGluOiByZXR1cm5zIHRo
ZSBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgKiBAcGFyYW0gY29udGV4dCBmaWxsaW46IHJl
dHVybnMgdGhlIGNhbGxiYWNrJ3MgcHJpdmF0ZSB2b2lkKiBjb250ZXh0CisgKiBAc2VlIHVjbnZf
c2V0VG9VQ2FsbEJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVf
RVhQT1JUMgordWNudl9nZXRUb1VDYWxsQmFjayAoY29uc3QgVUNvbnZlcnRlciAqIGNvbnZlcnRl
ciwKKyAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1VDYWxsYmFjayAqYWN0aW9uLAor
ICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmNvbnRleHQpOworCisvKioKKyAqIEdl
dHMgdGhlIGN1cnJlbnQgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIHdo
ZW4gaWxsZWdhbCAKKyAqIG9yIGludmFsaWQgVW5pY29kZSBzZXF1ZW5jZSBpcyBmb3VuZC4KKyAq
IENvbnRleHQgcG9pbnRlcnMgYXJlIGFsd2F5cyBvd25lZCBieSB0aGUgY2FsbGVyLgorICoKKyAq
IEBwYXJhbSBjb252ZXJ0ZXIgdGhlIHVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gYWN0aW9u
IGZpbGxpbjogcmV0dXJucyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICogQHBhcmFt
IGNvbnRleHQgZmlsbGluOiByZXR1cm5zIHRoZSBjYWxsYmFjaydzIHByaXZhdGUgdm9pZCogY29u
dGV4dAorICogQHNlZSB1Y252X3NldEZyb21VQ2FsbEJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgordWNudl9nZXRGcm9tVUNhbGxCYWNrIChjb25z
dCBVQ29udmVydGVyICogY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVy
dGVyRnJvbVVDYWxsYmFjayAqYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2
b2lkICoqY29udGV4dCk7CisKKy8qKgorICogQ2hhbmdlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24g
dXNlZCBieSB0aGUgY29udmVydGVyIHdoZW4KKyAqIGFuIGlsbGVnYWwgb3IgaW52YWxpZCBzZXF1
ZW5jZSBpcyBmb3VuZC4KKyAqIENvbnRleHQgcG9pbnRlcnMgYXJlIGFsd2F5cyBvd25lZCBieSB0
aGUgY2FsbGVyLgorICogUHJlZGVmaW5lZCBhY3Rpb25zIGFuZCBjb250ZXh0cyBjYW4gYmUgZm91
bmQgaW4gdGhlIHVjbnZfZXJyLmggaGVhZGVyLgorICoKKyAqIEBwYXJhbSBjb252ZXJ0ZXIgdGhl
IHVuaWNvZGUgY29udmVydGVyCisgKiBAcGFyYW0gbmV3QWN0aW9uIHRoZSBuZXcgY2FsbGJhY2sg
ZnVuY3Rpb24KKyAqIEBwYXJhbSBuZXdDb250ZXh0IHRoZSBuZXcgdG9Vbmljb2RlIGNhbGxiYWNr
IGNvbnRleHQgcG9pbnRlci4gVGhpcyBjYW4gYmUgTlVMTC4KKyAqIEBwYXJhbSBvbGRBY3Rpb24g
ZmlsbGluOiByZXR1cm5zIHRoZSBvbGQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlci4gVGhpcyBj
YW4gYmUgTlVMTC4KKyAqIEBwYXJhbSBvbGRDb250ZXh0IGZpbGxpbjogcmV0dXJucyB0aGUgb2xk
IGNhbGxiYWNrJ3MgcHJpdmF0ZSB2b2lkKiBjb250ZXh0LiBUaGlzIGNhbiBiZSBOVUxMLgorICog
QHBhcmFtIGVyciBUaGUgZXJyb3IgY29kZSBzdGF0dXMKKyAqIEBzZWUgdWNudl9nZXRUb1VDYWxs
QmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1
Y252X3NldFRvVUNhbGxCYWNrIChVQ29udmVydGVyICogY29udmVydGVyLAorICAgICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlclRvVUNhbGxiYWNrIG5ld0FjdGlvbiwKKyAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IHZvaWQqIG5ld0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBVQ29u
dmVydGVyVG9VQ2FsbGJhY2sgKm9sZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQqKiBvbGRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqIGVy
cik7CisKKy8qKgorICogQ2hhbmdlcyB0aGUgY3VycmVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2Vk
IGJ5IHRoZSBjb252ZXJ0ZXIgd2hlbgorICogYW4gaWxsZWdhbCBvciBpbnZhbGlkIHNlcXVlbmNl
IGlzIGZvdW5kLgorICogQ29udGV4dCBwb2ludGVycyBhcmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBj
YWxsZXIuCisgKiBQcmVkZWZpbmVkIGFjdGlvbnMgYW5kIGNvbnRleHRzIGNhbiBiZSBmb3VuZCBp
biB0aGUgdWNudl9lcnIuaCBoZWFkZXIuCisgKgorICogQHBhcmFtIGNvbnZlcnRlciB0aGUgdW5p
Y29kZSBjb252ZXJ0ZXIKKyAqIEBwYXJhbSBuZXdBY3Rpb24gdGhlIG5ldyBjYWxsYmFjayBmdW5j
dGlvbgorICogQHBhcmFtIG5ld0NvbnRleHQgdGhlIG5ldyBmcm9tVW5pY29kZSBjYWxsYmFjayBj
b250ZXh0IHBvaW50ZXIuIFRoaXMgY2FuIGJlIE5VTEwuCisgKiBAcGFyYW0gb2xkQWN0aW9uIGZp
bGxpbjogcmV0dXJucyB0aGUgb2xkIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIuIFRoaXMgY2Fu
IGJlIE5VTEwuCisgKiBAcGFyYW0gb2xkQ29udGV4dCBmaWxsaW46IHJldHVybnMgdGhlIG9sZCBj
YWxsYmFjaydzIHByaXZhdGUgdm9pZCogY29udGV4dC4gVGhpcyBjYW4gYmUgTlVMTC4KKyAqIEBw
YXJhbSBlcnIgVGhlIGVycm9yIGNvZGUgc3RhdHVzCisgKiBAc2VlIHVjbnZfZ2V0RnJvbVVDYWxs
QmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1
Y252X3NldEZyb21VQ2FsbEJhY2sgKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIsCisgICAgICAgICAg
ICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIG5ld0FjdGlvbiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgVUNvbnZlcnRlckZyb21VQ2FsbGJhY2sgKm9sZEFjdGlvbiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3Qgdm9pZCAqKm9sZENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAg
IFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHVuaWNv
ZGUgY2hhcmFjdGVycyB0byBhbiBhcnJheSBvZiBjb2RlcGFnZQorICogY2hhcmFjdGVycy4gVGhp
cyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIGNvbnZlcnRpbmcgYSBjb250aW51b3VzCisgKiBz
dHJlYW0gb2YgZGF0YSBpbiBidWZmZXItc2l6ZWQgY2h1bmtzLCB3aGVyZSB0aGUgZW50aXJlIHNv
dXJjZSBhbmQKKyAqIHRhcmdldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIGJ1ZmZlcnMuCisg
KiAKKyAqIFRoZSBzb3VyY2UgcG9pbnRlciBpcyBhbiBpbi9vdXQgcGFyYW1ldGVyLiBJdCBzdGFy
dHMgb3V0IHBvaW50aW5nIHdoZXJlIHRoZSAKKyAqIGNvbnZlcnNpb24gaXMgdG8gYmVnaW4sIGFu
ZCBlbmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IFVDaGFyIGNvbnN1bWVkLiAKKyAqIAor
ICogVGFyZ2V0IHNpbWlsYXJseSBzdGFydHMgb3V0IHBvaW50ZXIgYXQgdGhlIGZpcnN0IGF2YWls
YWJsZSBieXRlIGluIHRoZSBvdXRwdXQKKyAqIGJ1ZmZlciwgYW5kIGVuZHMgdXAgcG9pbnRpbmcg
YWZ0ZXIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQuCisgKiAKKyAqIFRoZSBj
b252ZXJ0ZXIgYWx3YXlzIGF0dGVtcHRzIHRvIGNvbnN1bWUgdGhlIGVudGlyZSBzb3VyY2UgYnVm
ZmVyLCB1bmxlc3MgCisgKiAoMS4pIHRoZSB0YXJnZXQgYnVmZmVyIGlzIGZ1bGwsIG9yICgyLikg
YSBmYWlsaW5nIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlCisgKiBjdXJyZW50IGNhbGxiYWNr
IGZ1bmN0aW9uLiAgV2hlbiBhIHN1Y2Nlc3NmdWwgZXJyb3Igc3RhdHVzIGhhcyBiZWVuCisgKiBy
ZXR1cm5lZCwgaXQgbWVhbnMgdGhhdCBhbGwgb2YgdGhlIHNvdXJjZSBidWZmZXIgaGFzIGJlZW4K
KyAqICBjb25zdW1lZC4gQXQgdGhhdCBwb2ludCwgdGhlIGNhbGxlciBzaG91bGQgcmVzZXQgdGhl
IHNvdXJjZSBhbmQKKyAqICBzb3VyY2VMaW1pdCBwb2ludGVycyB0byBwb2ludCB0byB0aGUgbmV4
dCBjaHVuay4KKyAqIAorICogQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChmbHVzaD09VFJVRSks
IHRoZSBpbnB1dCBpcyBjb21wbGV0ZWx5IGNvbnN1bWVkCisgKiB3aGVuICpzb3VyY2U9PXNvdXJj
ZUxpbWl0IGFuZCBubyBlcnJvciBjb2RlIGlzIHNldC4KKyAqIFRoZSBjb252ZXJ0ZXIgb2JqZWN0
IGlzIHRoZW4gYXV0b21hdGljYWxseSByZXNldCBieSB0aGlzIGZ1bmN0aW9uLgorICogKFRoaXMg
bWVhbnMgdGhhdCBhIGNvbnZlcnRlciBuZWVkIG5vdCBiZSByZXNldCBleHBsaWNpdGx5IGJldHdl
ZW4gZGF0YQorICogc3RyZWFtcyBpZiBpdCBmaW5pc2hlcyB0aGUgcHJldmlvdXMgc3RyZWFtIHdp
dGhvdXQgZXJyb3JzLikKKyAqIAorICogVGhpcyBpcyBhIDxJPnN0YXRlZnVsPC9JPiBjb252ZXJz
aW9uLiBBZGRpdGlvbmFsbHksIGV2ZW4gd2hlbiBhbGwgc291cmNlIGRhdGEgaGFzCisgKiBiZWVu
IGNvbnN1bWVkLCBzb21lIGRhdGEgbWF5IGJlIGluIHRoZSBjb252ZXJ0ZXJzJyBpbnRlcm5hbCBz
dGF0ZS4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5LCB1cGRhdGluZyB0aGUgdGFy
Z2V0IHBvaW50ZXJzIHdpdGgKKyAqIHRoZSBuZXh0IGVtcHR5IGNodW5rIG9mIHRhcmdldCBpbiBj
YXNlIG9mIGEKKyAqIDxUVD5VX0JVRkZFUl9PVkVSRkxPV19FUlJPUjwvVFQ+LCBhbmQgdXBkYXRp
bmcgdGhlIHNvdXJjZSAgcG9pbnRlcnMKKyAqICB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIHNvdXJj
ZSB3aGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBzdGF0dXMgaXMKKyAqIHJldHVybmVkLCB1bnRpbCB0
aGVyZSBhcmUgbm8gbW9yZSBjaHVua3Mgb2Ygc291cmNlIGRhdGEuCisgKiBAcGFyYW0gY29udmVy
dGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIHRhcmdldCBJL08gcGFyYW1ldGVy
LiBJbnB1dCA6IFBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgdG8gY29weQor
ICogIGNvZGVwYWdlIGNoYXJhY3RlcnMgdG8uIE91dHB1dCA6IHBvaW50cyB0byBhZnRlciB0aGUg
bGFzdCBjb2RlcGFnZSBjaGFyYWN0ZXIgY29waWVkCisgKiAgdG8gPFRUPnRhcmdldDwvVFQ+Lgor
ICogQHBhcmFtIHRhcmdldExpbWl0IHRoZSBwb2ludGVyIGp1c3QgYWZ0ZXIgbGFzdCBvZiB0aGUg
PFRUPnRhcmdldDwvVFQ+IGJ1ZmZlcgorICogQHBhcmFtIHNvdXJjZSBJL08gcGFyYW1ldGVyLCBw
b2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBVbmljb2RlIGNoYXJhY3RlciBidWZmZXIu
IAorICogQHBhcmFtIHNvdXJjZUxpbWl0IHRoZSBwb2ludGVyIGp1c3QgYWZ0ZXIgdGhlIGxhc3Qg
b2YgdGhlIHNvdXJjZSBidWZmZXIKKyAqIEBwYXJhbSBvZmZzZXRzIGlmIE5VTEwgaXMgcGFzc2Vk
LCBub3RoaW5nIHdpbGwgaGFwcGVuIHRvIGl0LCBvdGhlcndpc2UgaXQgbmVlZHMgdG8gaGF2ZSB0
aGUgc2FtZSBudW1iZXIKKyAqIG9mIGFsbG9jYXRlZCBjZWxscyBhcyA8VFQ+dGFyZ2V0PC9UVD4u
IFdpbGwgZmlsbCBpbiBvZmZzZXRzIGZyb20gdGFyZ2V0IHRvIHNvdXJjZSBwb2ludGVyCisgKiBl
Lmc6IDxUVD5vZmZzZXRzWzNdPC9UVD4gaXMgZXF1YWwgdG8gNiwgaXQgbWVhbnMgdGhhdCB0aGUg
PFRUPnRhcmdldFszXTwvVFQ+IHdhcyBhIHJlc3VsdCBvZiB0cmFuc2NvZGluZyA8VFQ+c291cmNl
WzZdPC9UVD4KKyAqIEZvciBvdXRwdXQgZGF0YSBjYXJyaWVkIGFjcm9zcyBjYWxscywgYW5kIG90
aGVyIGRhdGEgd2l0aG91dCBhIHNwZWNpZmljIHNvdXJjZSBjaGFyYWN0ZXIKKyAqIChzdWNoIGFz
IGZyb20gZXNjYXBlIHNlcXVlbmNlcyBvciBjYWxsYmFja3MpICAtMSB3aWxsIGJlIHBsYWNlZCBm
b3Igb2Zmc2V0cy4gCisgKiBAcGFyYW0gZmx1c2ggc2V0IHRvIDxUVD5UUlVFPC9UVD4gaWYgdGhl
IGN1cnJlbnQgc291cmNlIGJ1ZmZlciBpcyB0aGUgbGFzdCBhdmFpbGFibGUKKyAqIGNodW5rIG9m
IHRoZSBzb3VyY2UsIDxUVD5GQUxTRTwvVFQ+IG90aGVyd2lzZS4gTm90ZSB0aGF0IGlmIGEgZmFp
bGluZyBzdGF0dXMgaXMgcmV0dXJuZWQsCisgKiB0aGlzIGZ1bmN0aW9uIG1heSBoYXZlIHRvIGJl
IGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGZsdXNoIHNldCB0byA8VFQ+VFJVRTwvVFQ+IHVu
dGlsCisgKiB0aGUgc291cmNlIGJ1ZmZlciBpcyBjb25zdW1lZC4KKyAqIEBwYXJhbSBlcnIgdGhl
IGVycm9yIHN0YXR1cy4gIDxUVD5VX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I8L1RUPiB3aWxsIGJl
IHNldCBpZiB0aGUKKyAqIGNvbnZlcnRlciBpcyA8VFQ+TlVMTDwvVFQ+LgorICogPGNvZGU+VV9C
VUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IHdpbGwgYmUgc2V0IGlmIHRoZSB0YXJnZXQgaXMg
ZnVsbCBhbmQgdGhlcmUgaXMgCisgKiBzdGlsbCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRh
cmdldC4KKyAqIEBzZWUgdWNudl9mcm9tVUNoYXJzCisgKiBAc2VlIHVjbnZfY29udmVydAorICog
QHNlZSB1Y252X2dldE1pbkNoYXJTaXplCisgKiBAc2VlIHVjbnZfc2V0VG9VQ2FsbEJhY2sKKyAq
IEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKK3VjbnZfZnJv
bVVuaWNvZGUgKFVDb252ZXJ0ZXIgKiBjb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICBjaGFy
ICoqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFyZ2V0TGltaXQsCisg
ICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAqKiBzb3VyY2UsCisgICAgICAgICAgICAgICAg
ICBjb25zdCBVQ2hhciAqIHNvdXJjZUxpbWl0LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCog
b2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgIFVCb29sIGZsdXNoLAorICAgICAgICAgICAgICAg
ICAgVUVycm9yQ29kZSAqIGVycik7CisKKy8qKgorICogQ29udmVydHMgYSBidWZmZXIgb2YgY29k
ZXBhZ2UgYnl0ZXMgaW50byBhbiBhcnJheSBvZiB1bmljb2RlIFVDaGFycworICogY2hhcmFjdGVy
cy4gVGhpcyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIGNvbnZlcnRpbmcgYSBjb250aW51b3Vz
CisgKiBzdHJlYW0gb2YgZGF0YSBpbiBidWZmZXItc2l6ZWQgY2h1bmtzLCB3aGVyZSB0aGUgZW50
aXJlIHNvdXJjZSBhbmQKKyAqIHRhcmdldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIGJ1ZmZl
cnMuCisgKiAKKyAqIFRoZSBzb3VyY2UgcG9pbnRlciBpcyBhbiBpbi9vdXQgcGFyYW1ldGVyLiBJ
dCBzdGFydHMgb3V0IHBvaW50aW5nIHdoZXJlIHRoZSAKKyAqIGNvbnZlcnNpb24gaXMgdG8gYmVn
aW4sIGFuZCBlbmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IGJ5dGUgb2Ygc291cmNlIGNv
bnN1bWVkLiAKKyAqIAorICogVGFyZ2V0IHNpbWlsYXJseSBzdGFydHMgb3V0IHBvaW50ZXIgYXQg
dGhlIGZpcnN0IGF2YWlsYWJsZSBVQ2hhciBpbiB0aGUgb3V0cHV0CisgKiBidWZmZXIsIGFuZCBl
bmRzIHVwIHBvaW50aW5nIGFmdGVyIHRoZSBsYXN0IFVDaGFyIHdyaXR0ZW4gdG8gdGhlIG91dHB1
dC4gCisgKiBJdCBkb2VzIE5PVCBuZWNlc3NhcmlseSBrZWVwIFVDaGFyIHNlcXVlbmNlcyB0b2dl
dGhlci4KKyAqIAorICogVGhlIGNvbnZlcnRlciBhbHdheXMgYXR0ZW1wdHMgdG8gY29uc3VtZSB0
aGUgZW50aXJlIHNvdXJjZSBidWZmZXIsIHVubGVzcyAKKyAqICgxLikgdGhlIHRhcmdldCBidWZm
ZXIgaXMgZnVsbCwgb3IgKDIuKSBhIGZhaWxpbmcgZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUK
KyAqIGN1cnJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uICBXaGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBz
dGF0dXMgaGFzIGJlZW4KKyAqIHJldHVybmVkLCBpdCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgc291
cmNlIGJ1ZmZlciBoYXMgYmVlbgorICogIGNvbnN1bWVkLiBBdCB0aGF0IHBvaW50LCB0aGUgY2Fs
bGVyIHNob3VsZCByZXNldCB0aGUgc291cmNlIGFuZAorICogIHNvdXJjZUxpbWl0IHBvaW50ZXJz
IHRvIHBvaW50IHRvIHRoZSBuZXh0IGNodW5rLgorICoKKyAqIEF0IHRoZSBlbmQgb2YgdGhlIHN0
cmVhbSAoZmx1c2g9PVRSVUUpLCB0aGUgaW5wdXQgaXMgY29tcGxldGVseSBjb25zdW1lZAorICog
d2hlbiAqc291cmNlPT1zb3VyY2VMaW1pdCBhbmQgbm8gZXJyb3IgY29kZSBpcyBzZXQKKyAqIFRo
ZSBjb252ZXJ0ZXIgb2JqZWN0IGlzIHRoZW4gYXV0b21hdGljYWxseSByZXNldCBieSB0aGlzIGZ1
bmN0aW9uLgorICogKFRoaXMgbWVhbnMgdGhhdCBhIGNvbnZlcnRlciBuZWVkIG5vdCBiZSByZXNl
dCBleHBsaWNpdGx5IGJldHdlZW4gZGF0YQorICogc3RyZWFtcyBpZiBpdCBmaW5pc2hlcyB0aGUg
cHJldmlvdXMgc3RyZWFtIHdpdGhvdXQgZXJyb3JzLikKKyAqIAorICogVGhpcyBpcyBhIDxJPnN0
YXRlZnVsPC9JPiBjb252ZXJzaW9uLiBBZGRpdGlvbmFsbHksIGV2ZW4gd2hlbiBhbGwgc291cmNl
IGRhdGEgaGFzCisgKiBiZWVuIGNvbnN1bWVkLCBzb21lIGRhdGEgbWF5IGJlIGluIHRoZSBjb252
ZXJ0ZXJzJyBpbnRlcm5hbCBzdGF0ZS4KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5
LCB1cGRhdGluZyB0aGUgdGFyZ2V0IHBvaW50ZXJzIHdpdGgKKyAqIHRoZSBuZXh0IGVtcHR5IGNo
dW5rIG9mIHRhcmdldCBpbiBjYXNlIG9mIGEKKyAqIDxUVD5VX0JVRkZFUl9PVkVSRkxPV19FUlJP
UjwvVFQ+LCBhbmQgdXBkYXRpbmcgdGhlIHNvdXJjZSAgcG9pbnRlcnMKKyAqICB3aXRoIHRoZSBu
ZXh0IGNodW5rIG9mIHNvdXJjZSB3aGVuIGEgc3VjY2Vzc2Z1bCBlcnJvciBzdGF0dXMgaXMKKyAq
IHJldHVybmVkLCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBjaHVua3Mgb2Ygc291cmNlIGRhdGEu
CisgKiBAcGFyYW0gY29udmVydGVyIHRoZSBVbmljb2RlIGNvbnZlcnRlcgorICogQHBhcmFtIHRh
cmdldCBJL08gcGFyYW1ldGVyLiBJbnB1dCA6IFBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRo
ZSBidWZmZXIgdG8gY29weQorICogIFVDaGFycyBpbnRvLiBPdXRwdXQgOiBwb2ludHMgdG8gYWZ0
ZXIgdGhlIGxhc3QgVUNoYXIgY29waWVkLgorICogQHBhcmFtIHRhcmdldExpbWl0IHRoZSBwb2lu
dGVyIGp1c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgPFRUPnRhcmdldDwvVFQ+IGJ1ZmZlcgorICog
QHBhcmFtIHNvdXJjZSBJL08gcGFyYW1ldGVyLCBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHNv
dXJjZSBjb2RlcGFnZSBidWZmZXIuIAorICogQHBhcmFtIHNvdXJjZUxpbWl0IHRoZSBwb2ludGVy
IHRvIHRoZSBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBidWZmZXIKKyAqIEBwYXJh
bSBvZmZzZXRzIGlmIE5VTEwgaXMgcGFzc2VkLCBub3RoaW5nIHdpbGwgaGFwcGVuIHRvIGl0LCBv
dGhlcndpc2UgaXQgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyAqIG9mIGFsbG9jYXRl
ZCBjZWxscyBhcyA8VFQ+dGFyZ2V0PC9UVD4uIFdpbGwgZmlsbCBpbiBvZmZzZXRzIGZyb20gdGFy
Z2V0IHRvIHNvdXJjZSBwb2ludGVyCisgKiBlLmc6IDxUVD5vZmZzZXRzWzNdPC9UVD4gaXMgZXF1
YWwgdG8gNiwgaXQgbWVhbnMgdGhhdCB0aGUgPFRUPnRhcmdldFszXTwvVFQ+IHdhcyBhIHJlc3Vs
dCBvZiB0cmFuc2NvZGluZyA8VFQ+c291cmNlWzZdPC9UVD4KKyAqIEZvciBvdXRwdXQgZGF0YSBj
YXJyaWVkIGFjcm9zcyBjYWxscywgYW5kIG90aGVyIGRhdGEgd2l0aG91dCBhIHNwZWNpZmljIHNv
dXJjZSBjaGFyYWN0ZXIKKyAqIChzdWNoIGFzIGZyb20gZXNjYXBlIHNlcXVlbmNlcyBvciBjYWxs
YmFja3MpICAtMSB3aWxsIGJlIHBsYWNlZCBmb3Igb2Zmc2V0cy4gCisgKiBAcGFyYW0gZmx1c2gg
c2V0IHRvIDxUVD5UUlVFPC9UVD4gaWYgdGhlIGN1cnJlbnQgc291cmNlIGJ1ZmZlciBpcyB0aGUg
bGFzdCBhdmFpbGFibGUKKyAqIGNodW5rIG9mIHRoZSBzb3VyY2UsIDxUVD5GQUxTRTwvVFQ+IG90
aGVyd2lzZS4gTm90ZSB0aGF0IGlmIGEgZmFpbGluZyBzdGF0dXMgaXMgcmV0dXJuZWQsCisgKiB0
aGlzIGZ1bmN0aW9uIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGZs
dXNoIHNldCB0byA8VFQ+VFJVRTwvVFQ+IHVudGlsCisgKiB0aGUgc291cmNlIGJ1ZmZlciBpcyBj
b25zdW1lZC4KKyAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0YXR1cy4gIDxUVD5VX0lMTEVHQUxf
QVJHVU1FTlRfRVJST1I8L1RUPiB3aWxsIGJlIHNldCBpZiB0aGUKKyAqIGNvbnZlcnRlciBpcyA8
VFQ+TlVMTDwvVFQ+LgorICogPGNvZGU+VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IHdp
bGwgYmUgc2V0IGlmIHRoZSB0YXJnZXQgaXMgZnVsbCBhbmQgdGhlcmUgaXMgCisgKiBzdGlsbCBk
YXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldC4gCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFy
cworICogQHNlZSB1Y252X2NvbnZlcnQKKyAqIEBzZWUgdWNudl9nZXRNaW5DaGFyU2l6ZQorICog
QHNlZSB1Y252X3NldEZyb21VQ2FsbEJhY2sKKyAqIEBzZWUgdWNudl9nZXROZXh0VUNoYXIKKyAq
IEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKK3VjbnZfdG9V
bmljb2RlKFVDb252ZXJ0ZXIgKmNvbnZlcnRlciwKKyAgICAgICAgICAgICAgIFVDaGFyICoqdGFy
Z2V0LAorICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgKnRhcmdldExpbWl0LAorICAgICAgICAg
ICAgICAgY29uc3QgY2hhciAqKnNvdXJjZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNv
dXJjZUxpbWl0LAorICAgICAgICAgICAgICAgaW50MzJfdCAqb2Zmc2V0cywKKyAgICAgICAgICAg
ICAgIFVCb29sIGZsdXNoLAorICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqZXJyKTsKKworLyoq
CisgKiBDb252ZXJ0IHRoZSBVbmljb2RlIHN0cmluZyBpbnRvIGEgY29kZXBhZ2Ugc3RyaW5nIHVz
aW5nIGFuIGV4aXN0aW5nIFVDb252ZXJ0ZXIuCisgKiBUaGUgb3V0cHV0IHN0cmluZyBpcyBOVUwt
dGVybWluYXRlZCBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbW9yZSBj
b252ZW5pZW50IGJ1dCBsZXNzIHBvd2VyZnVsIHZlcnNpb24gb2YgdWNudl9mcm9tVW5pY29kZSgp
LgorICogSXQgaXMgb25seSB1c2VmdWwgZm9yIHdob2xlIHN0cmluZ3MsIG5vdCBmb3Igc3RyZWFt
aW5nIGNvbnZlcnNpb24uCisgKgorICogVGhlIG1heGltdW0gb3V0cHV0IGJ1ZmZlciBjYXBhY2l0
eSByZXF1aXJlZCAoYmFycmluZyBvdXRwdXQgZnJvbSBjYWxsYmFja3MpIHdpbGwgYmUKKyAqIFVD
TlZfR0VUX01BWF9CWVRFU19GT1JfU1RSSU5HKHNyY0xlbmd0aCwgdWNudl9nZXRNYXhDaGFyU2l6
ZShjbnYpKS4KKyAqCisgKiBAcGFyYW0gY252IHRoZSBjb252ZXJ0ZXIgb2JqZWN0IHRvIGJlIHVz
ZWQgKHVjbnZfcmVzZXRGcm9tVW5pY29kZSgpIHdpbGwgYmUgY2FsbGVkKQorICogQHBhcmFtIHNy
YyB0aGUgaW5wdXQgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbSBzcmNMZW5ndGggdGhlIGlucHV0
IHN0cmluZyBsZW5ndGgsIG9yIC0xIGlmIE5VTC10ZXJtaW5hdGVkCisgKiBAcGFyYW0gZGVzdCBk
ZXN0aW5hdGlvbiBzdHJpbmcgYnVmZmVyLCBjYW4gYmUgTlVMTCBpZiBkZXN0Q2FwYWNpdHk9PTAK
KyAqIEBwYXJhbSBkZXN0Q2FwYWNpdHkgdGhlIG51bWJlciBvZiBjaGFycyBhdmFpbGFibGUgYXQg
ZGVzdAorICogQHBhcmFtIHBFcnJvckNvZGUgbm9ybWFsIElDVSBlcnJvciBjb2RlOworICogICAg
ICAgICAgICAgICAgICBjb21tb24gZXJyb3IgY29kZXMgdGhhdCBtYXkgYmUgc2V0IGJ5IHRoaXMg
ZnVuY3Rpb24gaW5jbHVkZQorICogICAgICAgICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19F
UlJPUiwgVV9TVFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORywKKyAqICAgICAgICAgICAgICAg
ICAgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SLCBhbmQgY29udmVyc2lvbiBlcnJvcnMKKyAqIEBy
ZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IHN0cmluZywgbm90IGNvdW50aW5nIHRoZSB0
ZXJtaW5hdGluZyBOVUw7CisgKiAgICAgICAgIGlmIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFu
IGRlc3RDYXBhY2l0eSwgdGhlbiB0aGUgc3RyaW5nIHdpbGwgbm90IGZpdAorICogICAgICAgICBh
bmQgYSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBsZW5ndGggd291bGQgbmVlZCB0byBiZSBwYXNz
ZWQgaW4KKyAqIEBzZWUgdWNudl9mcm9tVW5pY29kZQorICogQHNlZSB1Y252X2NvbnZlcnQKKyAq
IEBzZWUgVUNOVl9HRVRfTUFYX0JZVEVTX0ZPUl9TVFJJTkcKKyAqIEBzdGFibGUgSUNVIDIuMAor
ICovCitVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWNudl9mcm9tVUNoYXJzKFVDb252ZXJ0
ZXIgKmNudiwKKyAgICAgICAgICAgICAgICBjaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0
eSwKKyAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAqc3JjLCBpbnQzMl90IHNyY0xlbmd0aCwK
KyAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBDb252
ZXJ0IHRoZSBjb2RlcGFnZSBzdHJpbmcgaW50byBhIFVuaWNvZGUgc3RyaW5nIHVzaW5nIGFuIGV4
aXN0aW5nIFVDb252ZXJ0ZXIuCisgKiBUaGUgb3V0cHV0IHN0cmluZyBpcyBOVUwtdGVybWluYXRl
ZCBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbW9yZSBjb252ZW5pZW50
IGJ1dCBsZXNzIHBvd2VyZnVsIHZlcnNpb24gb2YgdWNudl90b1VuaWNvZGUoKS4KKyAqIEl0IGlz
IG9ubHkgdXNlZnVsIGZvciB3aG9sZSBzdHJpbmdzLCBub3QgZm9yIHN0cmVhbWluZyBjb252ZXJz
aW9uLgorICoKKyAqIFRoZSBtYXhpbXVtIG91dHB1dCBidWZmZXIgY2FwYWNpdHkgcmVxdWlyZWQg
KGJhcnJpbmcgb3V0cHV0IGZyb20gY2FsbGJhY2tzKSB3aWxsIGJlCisgKiAyKnNyY0xlbmd0aCAo
ZWFjaCBjaGFyIG1heSBiZSBjb252ZXJ0ZWQgaW50byBhIHN1cnJvZ2F0ZSBwYWlyKS4KKyAqCisg
KiBAcGFyYW0gY252IHRoZSBjb252ZXJ0ZXIgb2JqZWN0IHRvIGJlIHVzZWQgKHVjbnZfcmVzZXRU
b1VuaWNvZGUoKSB3aWxsIGJlIGNhbGxlZCkKKyAqIEBwYXJhbSBzcmMgdGhlIGlucHV0IGNvZGVw
YWdlIHN0cmluZworICogQHBhcmFtIHNyY0xlbmd0aCB0aGUgaW5wdXQgc3RyaW5nIGxlbmd0aCwg
b3IgLTEgaWYgTlVMLXRlcm1pbmF0ZWQKKyAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIHN0cmlu
ZyBidWZmZXIsIGNhbiBiZSBOVUxMIGlmIGRlc3RDYXBhY2l0eT09MAorICogQHBhcmFtIGRlc3RD
YXBhY2l0eSB0aGUgbnVtYmVyIG9mIFVDaGFycyBhdmFpbGFibGUgYXQgZGVzdAorICogQHBhcmFt
IHBFcnJvckNvZGUgbm9ybWFsIElDVSBlcnJvciBjb2RlOworICogICAgICAgICAgICAgICAgICBj
b21tb24gZXJyb3IgY29kZXMgdGhhdCBtYXkgYmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gaW5jbHVk
ZQorICogICAgICAgICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiwgVV9TVFJJTkdf
Tk9UX1RFUk1JTkFURURfV0FSTklORywKKyAqICAgICAgICAgICAgICAgICAgVV9JTExFR0FMX0FS
R1VNRU5UX0VSUk9SLCBhbmQgY29udmVyc2lvbiBlcnJvcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0
aCBvZiB0aGUgb3V0cHV0IHN0cmluZywgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBOVUw7
CisgKiAgICAgICAgIGlmIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGRlc3RDYXBhY2l0eSwg
dGhlbiB0aGUgc3RyaW5nIHdpbGwgbm90IGZpdAorICogICAgICAgICBhbmQgYSBidWZmZXIgb2Yg
dGhlIGluZGljYXRlZCBsZW5ndGggd291bGQgbmVlZCB0byBiZSBwYXNzZWQgaW4KKyAqIEBzZWUg
dWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl9jb252ZXJ0CisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfdG9VQ2hhcnMoVUNvbnZlcnRl
ciAqY252LAorICAgICAgICAgICAgICBVQ2hhciAqZGVzdCwgaW50MzJfdCBkZXN0Q2FwYWNpdHks
CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyYywgaW50MzJfdCBzcmNMZW5ndGgsCisgICAg
ICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCisvKioKKyAqIENvbnZlcnQgYSBj
b2RlcGFnZSBidWZmZXIgaW50byBVbmljb2RlIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgorICog
VGhlIGlucHV0IGlzIGNvbXBsZXRlbHkgY29uc3VtZWQgd2hlbiB0aGUgVV9JTkRFWF9PVVRPRkJP
VU5EU19FUlJPUiBpcyBzZXQuCisgKgorICogQWR2YW50YWdlIGNvbXBhcmVkIHRvIHVjbnZfdG9V
bmljb2RlKCkgb3IgdWNudl90b1VDaGFycygpOgorICogLSBGYXN0ZXIgZm9yIHNtYWxsIGFtb3Vu
dHMgb2YgZGF0YSwgZm9yIG1vc3QgY29udmVydGVycywgZS5nLiwKKyAqICAgVVMtQVNDSUksIElT
Ty04ODU5LTEsIFVURi04LzE2LzMyLCBhbmQgbW9zdCAibm9ybWFsIiBjaGFyc2V0cy4KKyAqICAg
KEZvciBjb21wbGV4IGNvbnZlcnRlcnMsIGUuZy4sIFNDU1UsIFVURi03IGFuZCBJU08gMjAyMiB2
YXJpYW50cywKKyAqICAgIGl0IHVzZXMgdWNudl90b1VuaWNvZGUoKSBpbnRlcm5hbGx5LikKKyAq
IC0gQ29udmVuaWVudC4KKyAqCisgKiBMaW1pdGF0aW9ucyBjb21wYXJlZCB0byB1Y252X3RvVW5p
Y29kZSgpOgorICogLSBBbHdheXMgYXNzdW1lcyBmbHVzaD1UUlVFLgorICogICBUaGlzIG1ha2Vz
IHVjbnZfZ2V0TmV4dFVDaGFyKCkgdW5zdWl0YWJsZSBmb3IgInN0cmVhbWluZyIgY29udmVyc2lv
biwKKyAqICAgdGhhdCBpcywgZm9yIHdoZXJlIHRoZSBpbnB1dCBpcyBzdXBwbGllZCBpbiBtdWx0
aXBsZSBidWZmZXJzLAorICogICBiZWNhdXNlIHVjbnZfZ2V0TmV4dFVDaGFyKCkgd2lsbCBhc3N1
bWUgdGhlIGVuZCBvZiB0aGUgaW5wdXQgYXQgdGhlIGVuZAorICogICBvZiB0aGUgZmlyc3QgYnVm
ZmVyLgorICogLSBEb2VzIG5vdCBwcm92aWRlIG9mZnNldCBvdXRwdXQuCisgKgorICogSXQgaXMg
cG9zc2libGUgdG8gIm1peCIgdWNudl9nZXROZXh0VUNoYXIoKSBhbmQgdWNudl90b1VuaWNvZGUo
KSBiZWNhdXNlCisgKiB1Y252X2dldE5leHRVQ2hhcigpIHVzZXMgdGhlIGN1cnJlbnQgc3RhdGUg
b2YgdGhlIGNvbnZlcnRlcgorICogKHVubGlrZSB1Y252X3RvVUNoYXJzKCkgd2hpY2ggYWx3YXlz
IHJlc2V0cyBmaXJzdCkuCisgKiBIb3dldmVyLCBpZiB1Y252X2dldE5leHRVQ2hhcigpIGlzIGNh
bGxlZCBhZnRlciB1Y252X3RvVW5pY29kZSgpCisgKiBzdG9wcGVkIGluIHRoZSBtaWRkbGUgb2Yg
YSBjaGFyYWN0ZXIgc2VxdWVuY2UgKHdpdGggZmx1c2g9RkFMU0UpLAorICogdGhlbiB1Y252X2dl
dE5leHRVQ2hhcigpIHdpbGwgYWx3YXlzIHVzZSB0aGUgc2xvd2VyIHVjbnZfdG9Vbmljb2RlKCkK
KyAqIGludGVybmFsbHkgdW50aWwgdGhlIG5leHQgY2hhcmFjdGVyIGJvdW5kYXJ5LgorICogKFRo
aXMgaXMgbmV3IGluIElDVSAyLjYuIEluIGVhcmxpZXIgcmVsZWFzZXMsIHVjbnZfZ2V0TmV4dFVD
aGFyKCkgaGFkIHRvCisgKiBzdGFydCBhdCBhIGNoYXJhY3RlciBib3VuZGFyeS4pCisgKgorICog
SW5zdGVhZCBvZiB1c2luZyB1Y252X2dldE5leHRVQ2hhcigpLCBpdCBpcyByZWNvbW1lbmRlZAor
ICogdG8gY29udmVydCB1c2luZyB1Y252X3RvVW5pY29kZSgpIG9yIHVjbnZfdG9VQ2hhcnMoKQor
ICogYW5kIHRoZW4gaXRlcmF0ZSBvdmVyIHRoZSB0ZXh0IHVzaW5nIFUxNl9ORVhUKCkgb3IgYSBV
Q2hhckl0ZXJhdG9yICh1aXRlci5oKQorICogb3IgYSBDKysgQ2hhcmFjdGVySXRlcmF0b3Igb3Ig
c2ltaWxhci4KKyAqIFRoaXMgYWxsb3dzIHN0cmVhbWluZyBjb252ZXJzaW9uIGFuZCBvZmZzZXQg
b3V0cHV0LCBmb3IgZXhhbXBsZS4KKyAqCisgKiA8cD5IYW5kbGluZyBvZiBzdXJyb2dhdGUgcGFp
cnMgYW5kIHN1cHBsZW1lbnRhcnktcGxhbmUgY29kZSBwb2ludHM6PGJyPgorICogVGhlcmUgYXJl
IHR3byBkaWZmZXJlbnQga2luZHMgb2YgY29kZXBhZ2VzIHRoYXQgcHJvdmlkZSBtYXBwaW5ncyBm
b3Igc3Vycm9nYXRlIGNoYXJhY3RlcnM6CisgKiA8dWw+CisgKiAgIDxsaT5Db2RlcGFnZXMgbGlr
ZSBVVEYtOCwgVVRGLTMyLCBhbmQgR0IgMTgwMzAgcHJvdmlkZSBkaXJlY3QgcmVwcmVzZW50YXRp
b25zIGZvciBVbmljb2RlCisgKiAgICAgICBjb2RlIHBvaW50cyBVKzEwMDAwLVUrMTBmZmZmIGFz
IHdlbGwgYXMgZm9yIHNpbmdsZSBzdXJyb2dhdGVzIFUrZDgwMC1VK2RmZmYuCisgKiAgICAgICBF
YWNoIHZhbGlkIHNlcXVlbmNlIHdpbGwgcmVzdWx0IGluIGV4YWN0bHkgb25lIHJldHVybmVkIGNv
ZGUgcG9pbnQuCisgKiAgICAgICBJZiBhIHNlcXVlbmNlIHJlc3VsdHMgaW4gYSBzaW5nbGUgc3Vy
cm9nYXRlLCB0aGVuIHRoYXQgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgYnkgaXRzZWxmLCBl
dmVuIGlmIGEgbmVpZ2hib3Jpbmcgc2VxdWVuY2UgZW5jb2RlcyB0aGUgbWF0Y2hpbmcgc3Vycm9n
YXRlLjwvbGk+CisgKiAgIDxsaT5Db2RlcGFnZXMgbGlrZSBTQ1NVIGFuZCBMTUJDUyAoYW5kIFVU
Ri0xNikgcHJvdmlkZSBkaXJlY3QgcmVwcmVzZW50YXRpb25zIG9ubHkgZm9yIEJNUCBjb2RlIHBv
aW50cworICogICAgICAgaW5jbHVkaW5nIHN1cnJvZ2F0ZXMuIENvZGUgcG9pbnRzIGluIHN1cHBs
ZW1lbnRhcnkgcGxhbmVzIGFyZSByZXByZXNlbnRlZCB3aXRoCisgKiAgICAgICB0d28gc2VxdWVu
Y2VzLCBlYWNoIGVuY29kaW5nIGEgc3Vycm9nYXRlLgorICogICAgICAgRm9yIHRoZXNlIGNvZGVw
YWdlcywgbWF0Y2hpbmcgcGFpcnMgb2Ygc3Vycm9nYXRlcyB3aWxsIGJlIGNvbWJpbmVkIGludG8g
c2luZ2xlCisgKiAgICAgICBjb2RlIHBvaW50cyBmb3IgcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5j
dGlvbi4KKyAqICAgICAgIChOb3RlIHRoYXQgU0NTVSBpcyBhY3R1YWxseSBhIG1peCBvZiB0aGVz
ZSBjb2RlcGFnZSB0eXBlcy4pPC9saT4KKyAqIDwvdWw+PC9wPgorICoKKyAqIEBwYXJhbSBjb252
ZXJ0ZXIgYW4gb3BlbiBVQ29udmVydGVyCisgKiBAcGFyYW0gc291cmNlIHRoZSBhZGRyZXNzIG9m
IGEgcG9pbnRlciB0byB0aGUgY29kZXBhZ2UgYnVmZmVyLCB3aWxsIGJlCisgKiAgdXBkYXRlZCB0
byBwb2ludCBhZnRlciB0aGUgYnl0ZXMgY29uc3VtZWQgaW4gdGhlIGNvbnZlcnNpb24gY2FsbC4K
KyAqIEBwYXJhbSBzb3VyY2VMaW1pdCBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVm
ZmVyCisgKiBAcGFyYW0gZXJyIGZpbGxzIGluIGVycm9yIHN0YXR1cyAoc2VlIHVjbnZfdG9Vbmlj
b2RlKQorICogPGNvZGU+VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUjwvY29kZT4gd2lsbCBiZSBz
ZXQgaWYgdGhlIGlucHV0IAorICogaXMgZW1wdHkgb3IgZG9lcyBub3QgY29udmVydCB0byBhbnkg
b3V0cHV0IChlLmcuOiBwdXJlIHN0YXRlLWNoYW5nZSAKKyAqIGNvZGVzIFNJL1NPLCBlc2NhcGUg
c2VxdWVuY2VzIGZvciBJU08gMjAyMiwKKyAqIG9yIGlmIHRoZSBjYWxsYmFjayBkaWQgbm90IG91
dHB1dCBhbnl0aGluZywgLi4uKS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2V0IGEgPGNv
ZGU+VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I8L2NvZGU+IGJlY2F1c2UKKyAqICB0aGUgImJ1ZmZl
ciIgaXMgdGhlIHJldHVybiBjb2RlLiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBzdWJzZXF1ZW50
IG91dHB1dAorICogIHN0b3JlZCBpbiB0aGUgY29udmVydGVyIG9iamVjdAorICogdGhhdCB3aWxs
IGJlIHJldHVybmVkIGluIGZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICogQHJl
dHVybiBhIFVDaGFyMzIgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnRpYWwgY29udmVyc2lvbiBvZiBz
b3VyY2UKKyAqIEBzZWUgdWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl90b1VDaGFycworICog
QHNlZSB1Y252X2NvbnZlcnQKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBVQ2hh
cjMyIFVfRVhQT1JUMgordWNudl9nZXROZXh0VUNoYXIoVUNvbnZlcnRlciAqIGNvbnZlcnRlciwK
KyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzb3VyY2UsCisgICAgICAgICAgICAgICAg
ICBjb25zdCBjaGFyICogc291cmNlTGltaXQsCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2Rl
ICogZXJyKTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gb25lIGV4dGVybmFsIGNoYXJzZXQgdG8g
YW5vdGhlciB1c2luZyB0d28gZXhpc3RpbmcgVUNvbnZlcnRlcnMuCisgKiBJbnRlcm5hbGx5LCB0
d28gY29udmVyc2lvbnMgLSB1Y252X3RvVW5pY29kZSgpIGFuZCB1Y252X2Zyb21Vbmljb2RlKCkg
LQorICogYXJlIHVzZWQsICJwaXZvdGluZyIgdGhyb3VnaCAxNi1iaXQgVW5pY29kZS4KKyAqCisg
KiBUaGVyZSBpcyBhIHNpbWlsYXIgZnVuY3Rpb24sIHVjbnZfY29udmVydCgpLAorICogd2hpY2gg
aGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6CisgKiAtIGl0IHRha2VzIGNoYXJzZXQgbmFt
ZXMsIG5vdCBjb252ZXJ0ZXIgb2JqZWN0cywgc28gdGhhdAorICogICAtIHR3byBjb252ZXJ0ZXJz
IGFyZSBvcGVuZWQgZm9yIGVhY2ggY2FsbAorICogICAtIG9ubHkgc2luZ2xlLXN0cmluZyBjb252
ZXJzaW9uIGlzIHBvc3NpYmxlLCBub3Qgc3RyZWFtaW5nIG9wZXJhdGlvbgorICogLSBpdCBkb2Vz
IG5vdCBwcm92aWRlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIG91dCwKKyAqICAgaW4gY2Fz
ZSBvZiBmYWlsdXJlLCB3aGV0aGVyIHRoZSB0b1VuaWNvZGUgb3IKKyAqICAgdGhlIGZyb21Vbmlj
b2RlIGNvbnZlcnNpb24gZmFpbGVkCisgKgorICogQnkgY29udHJhc3QsIHVjbnZfY29udmVydEV4
KCkKKyAqIC0gdGFrZXMgVUNvbnZlcnRlciBwYXJhbWV0ZXJzIGluc3RlYWQgb2YgY2hhcnNldCBu
YW1lcworICogLSBmdWxseSBleHBvc2VzIHRoZSBwaXZvdCBidWZmZXIgZm9yIGNvbXBsZXRlIGVy
cm9yIGhhbmRsaW5nCisgKgorICogdWNudl9jb252ZXJ0RXgoKSBhbHNvIHByb3ZpZGVzIGZ1cnRo
ZXIgY29udmVuaWVuY2U6CisgKiAtIGFuIG9wdGlvbiB0byByZXNldCB0aGUgY29udmVydGVycyBh
dCB0aGUgYmVnaW5uaW5nCisgKiAgIChpZiByZXNldD09VFJVRSwgc2VlIHBhcmFtZXRlcnM7Cisg
KiAgICBhbHNvIHNldHMgKnBpdm90VGFyZ2V0PSpwaXZvdFNvdXJjZT1waXZvdFN0YXJ0KQorICog
LSBhbGxvdyBOVUwtdGVybWluYXRlZCBpbnB1dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0
ZSwgd2lsbCBub3Qgd29yayBmb3IgY2hhcnNldHMgd2l0aCBtdWx0aS1ieXRlIE5VTHMpCisgKiAg
IChpZiBzb3VyY2VMaW1pdD09TlVMTCwgc2VlIHBhcmFtZXRlcnMpCisgKiAtIHRlcm1pbmF0ZSB3
aXRoIGEgTlVMIG9uIG91dHB1dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0ZSwgbm90IHVz
ZWZ1bCBmb3IgY2hhcnNldHMgd2l0aCBtdWx0aS1ieXRlIE5VTHMpLAorICogICBvciBzZXQgVV9T
VFJJTkdfTk9UX1RFUk1JTkFURURfV0FSTklORyBpZiB0aGUgb3V0cHV0IGV4YWN0bHkgZmlsbHMK
KyAqICAgdGhlIHRhcmdldCBidWZmZXIKKyAqIC0gdGhlIHBpdm90IGJ1ZmZlciBjYW4gYmUgcHJv
dmlkZWQgaW50ZXJuYWxseTsKKyAqICAgaW4gdGhpcyBjYXNlLCB0aGUgY2FsbGVyIHdpbGwgbm90
IGJlIGFibGUgdG8gZ2V0IGRldGFpbHMgYWJvdXQgd2hlcmUgYW4KKyAqICAgZXJyb3Igb2NjdXJy
ZWQKKyAqICAgKGlmIHBpdm90U3RhcnQ9PU5VTEwsIHNlZSBiZWxvdykKKyAqCisgKiBUaGUgZnVu
Y3Rpb24gcmV0dXJucyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgKiAtIHRo
ZSBlbnRpcmUgc291cmNlIHRleHQgaGFzIGJlZW4gY29udmVydGVkIHN1Y2Nlc3NmdWxseSB0byB0
aGUgdGFyZ2V0IGJ1ZmZlcgorICogLSBhIHRhcmdldCBidWZmZXIgb3ZlcmZsb3cgb2NjdXJyZWQg
KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKQorICogLSBhIGNvbnZlcnNpb24gZXJyb3Igb2NjdXJy
ZWQKKyAqICAgKG90aGVyIFVfRkFJTFVSRSgpLCBzZWUgZGVzY3JpcHRpb24gb2YgcEVycm9yQ29k
ZSkKKyAqCisgKiBMaW1pdGF0aW9uIGNvbXBhcmVkIHRvIHRoZSBkaXJlY3QgdXNlIG9mCisgKiB1
Y252X2Zyb21Vbmljb2RlKCkgYW5kIHVjbnZfdG9Vbmljb2RlKCk6CisgKiB1Y252X2NvbnZlcnRF
eCgpIGRvZXMgbm90IHByb3ZpZGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICoKKyAqIExpbWl0YXRp
b24gY29tcGFyZWQgdG8gdWNudl9mcm9tVUNoYXJzKCkgYW5kIHVjbnZfdG9VQ2hhcnMoKToKKyAq
IHVjbnZfY29udmVydEV4KCkgZG9lcyBub3Qgc3VwcG9ydCBwcmVmbGlnaHRpbmcgZGlyZWN0bHku
CisgKgorICogU2FtcGxlIGNvZGUgZm9yIGNvbnZlcnRpbmcgYSBzaW5nbGUgc3RyaW5nIGZyb20K
KyAqIG9uZSBleHRlcm5hbCBjaGFyc2V0IHRvIFVURi04LCBpZ25vcmluZyB0aGUgbG9jYXRpb24g
b2YgZXJyb3JzOgorICoKKyAqIFxjb2RlCisgKiBpbnQzMl90CisgKiBteVRvVVRGOChVQ29udmVy
dGVyICpjbnYsCisgKiAgICAgICAgICBjb25zdCBjaGFyICpzLCBpbnQzMl90IGxlbmd0aCwKKyAq
ICAgICAgICAgIGNoYXIgKnU4LCBpbnQzMl90IGNhcGFjaXR5LAorICogICAgICAgICAgVUVycm9y
Q29kZSAqcEVycm9yQ29kZSkgeworICogICAgIFVDb252ZXJ0ZXIgKnV0ZjhDbnY7CisgKiAgICAg
Y2hhciAqdGFyZ2V0OworICoKKyAqICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7Cisg
KiAgICAgICAgIHJldHVybiAwOworICogICAgIH0KKyAqCisgKiAgICAgdXRmOENudj1teUdldENh
Y2hlZFVURjhDb252ZXJ0ZXIocEVycm9yQ29kZSk7CisgKiAgICAgaWYoVV9GQUlMVVJFKCpwRXJy
b3JDb2RlKSkgeworICogICAgICAgICByZXR1cm4gMDsKKyAqICAgICB9CisgKgorICogICAgIHRh
cmdldD11ODsKKyAqICAgICB1Y252X2NvbnZlcnRFeChjbnYsIHV0ZjhDbnYsCisgKiAgICAgICAg
ICAgICAgICAgICAgJnRhcmdldCwgdTgrY2FwYWNpdHksCisgKiAgICAgICAgICAgICAgICAgICAg
JnMsIGxlbmd0aD49MCA/IHMrbGVuZ3RoIDogTlVMTCwKKyAqICAgICAgICAgICAgICAgICAgICBO
VUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICogICAgICAgICAgICAgICAgICAgIFRSVUUsIFRSVUUs
CisgKiAgICAgICAgICAgICAgICAgICAgcEVycm9yQ29kZSk7CisgKiAKKyAqICAgICBteVJlbGVh
c2VDYWNoZWRVVEY4Q29udmVydGVyKHV0ZjhDbnYpOworICoKKyAqICAgICAvLyByZXR1cm4gdGhl
IG91dHB1dCBzdHJpbmcgbGVuZ3RoLCBidXQgd2l0aG91dCBwcmVmbGlnaHRpbmcKKyAqICAgICBy
ZXR1cm4gKGludDMyX3QpKHRhcmdldC11OCk7CisgKiB9CisgKiBcZW5kY29kZQorICoKKyAqIEBw
YXJhbSB0YXJnZXRDbnYgICAgIE91dHB1dCBjb252ZXJ0ZXIsIHVzZWQgdG8gY29udmVydCBmcm9t
IHRoZSBVVEYtMTYgcGl2b3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQg
dXNpbmcgdWNudl9mcm9tVW5pY29kZSgpLgorICogQHBhcmFtIHNvdXJjZUNudiAgICAgSW5wdXQg
Y29udmVydGVyLCB1c2VkIHRvIGNvbnZlcnQgZnJvbSB0aGUgc291cmNlIHRvCisgKiAgICAgICAg
ICAgICAgICAgICAgICB0aGUgVVRGLTE2IHBpdm90IHVzaW5nIHVjbnZfdG9Vbmljb2RlKCkuCisg
KiBAcGFyYW0gdGFyZ2V0ICAgICAgICBJL08gcGFyYW1ldGVyLCBzYW1lIGFzIGZvciB1Y252X2Zy
b21VQ2hhcnMoKS4KKyAqICAgICAgICAgICAgICAgICAgICAgIElucHV0OiAqdGFyZ2V0IHBvaW50
cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgYnVmZmVyLgorICogICAgICAgICAgICAg
ICAgICAgICAgT3V0cHV0OiAqdGFyZ2V0IHBvaW50cyB0byB0aGUgZmlyc3QgdW5pdCBhZnRlciB0
aGUgbGFzdCBjaGFyIHdyaXR0ZW4uCisgKiBAcGFyYW0gdGFyZ2V0TGltaXQgICBQb2ludGVyIHRv
IHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSB0YXJnZXQgYnVmZmVyLgorICogQHBhcmFtIHNvdXJj
ZSAgICAgICAgSS9PIHBhcmFtZXRlciwgc2FtZSBhcyBmb3IgdWNudl90b1VDaGFycygpLgorICog
ICAgICAgICAgICAgICAgICAgICAgSW5wdXQ6ICpzb3VyY2UgcG9pbnRzIHRvIHRoZSBiZWdpbm5p
bmcgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQ6
ICpzb3VyY2UgcG9pbnRzIHRvIHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSBsYXN0IGNoYXIgcmVh
ZC4KKyAqIEBwYXJhbSBzb3VyY2VMaW1pdCAgIFBvaW50ZXIgdG8gdGhlIGZpcnN0IHVuaXQgYWZ0
ZXIgdGhlIHNvdXJjZSBidWZmZXIuCisgKiBAcGFyYW0gcGl2b3RTdGFydCAgICBQb2ludGVyIHRv
IHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyLiBJZiBwaXZvdFN0YXJ0PT1OVUxMLAorICogICAgICAg
ICAgICAgICAgICAgICAgdGhlbiBhbiBpbnRlcm5hbCBidWZmZXIgaXMgdXNlZCBhbmQgdGhlIG90
aGVyIHBpdm90CisgKiAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGlnbm9yZWQg
YW5kIGNhbiBiZSBOVUxMIGFzIHdlbGwuCisgKiBAcGFyYW0gcGl2b3RTb3VyY2UgICBJL08gcGFy
YW1ldGVyLCBzYW1lIGFzIHNvdXJjZSBpbiB1Y252X2Zyb21VQ2hhcnMoKSBmb3IKKyAqICAgICAg
ICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gZnJvbSB0aGUgcGl2b3QgYnVmZmVyIHRvIHRoZSB0
YXJnZXQgYnVmZmVyLgorICogQHBhcmFtIHBpdm90VGFyZ2V0ICAgSS9PIHBhcmFtZXRlciwgc2Ft
ZSBhcyB0YXJnZXQgaW4gdWNudl90b1VDaGFycygpIGZvcgorICogICAgICAgICAgICAgICAgICAg
ICAgY29udmVyc2lvbiBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIHRvIHRoZSBwaXZvdCBidWZmZXIu
CisgKiAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHBpdm90U3RhcnQ8PSpwaXZvdFNv
dXJjZTw9KnBpdm90VGFyZ2V0PD1waXZvdExpbWl0CisgKiAgICAgICAgICAgICAgICAgICAgICBh
bmQgcGl2b3RTdGFydDxwaXZvdExpbWl0ICh1bmxlc3MgcGl2b3RTdGFydD09TlVMTCkuCisgKiBA
cGFyYW0gcGl2b3RMaW1pdCAgICBQb2ludGVyIHRvIHRoZSBmaXJzdCB1bml0IGFmdGVyIHRoZSBw
aXZvdCBidWZmZXIuCisgKiBAcGFyYW0gcmVzZXQgICAgICAgICBJZiBUUlVFLCB0aGVuIHVjbnZf
cmVzZXRUb1VuaWNvZGUoc291cmNlQ252KSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIHVj
bnZfcmVzZXRGcm9tVW5pY29kZSh0YXJnZXRDbnYpIGFyZSBjYWxsZWQsIGFuZCB0aGUKKyAqICAg
ICAgICAgICAgICAgICAgICAgIHBpdm90IHBvaW50ZXJzIGFyZSByZXNldCAoKnBpdm90VGFyZ2V0
PSpwaXZvdFNvdXJjZT1waXZvdFN0YXJ0KS4KKyAqIEBwYXJhbSBmbHVzaCAgICAgICAgIElmIHRy
dWUsIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dC4KKyAqICAgICAgICAgICAgICAgICAg
ICAgIFBhc3NlZCBkaXJlY3RseSB0byB1Y252X3RvVW5pY29kZSgpLCBhbmQgY2FycmllZCBvdmVy
IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICB1Y252X2Zyb21Vbmljb2RlKCkgd2hlbiB0aGUg
c291cmNlIGlzIGVtcHR5IGFzIHdlbGwuCisgKiBAcGFyYW0gcEVycm9yQ29kZSAgICBJQ1UgZXJy
b3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBm
dWxmaWxsIFVfU1VDQ0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCisgKiAgICAgICAgICAg
ICAgICAgICAgICBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiBhbHdheXMgcmVmZXJzIHRvIHRoZSB0
YXJnZXQgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG92ZXJmbG93cyBp
bnRvIHRoZSBwaXZvdCBidWZmZXIgYXJlIGhhbmRsZWQgaW50ZXJuYWxseS4KKyAqICAgICAgICAg
ICAgICAgICAgICAgIE90aGVyIGNvbnZlcnNpb24gZXJyb3JzIGFyZSBmcm9tIHRoZSBzb3VyY2Ut
dG8tcGl2b3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgKnBpdm90U291
cmNlPT1waXZvdFN0YXJ0LCBvdGhlcndpc2UgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAg
dGhlIHBpdm90LXRvLXRhcmdldCBjb252ZXJzaW9uLgorICoKKyAqIEBzZWUgdWNudl9jb252ZXJ0
CisgKiBAc2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfdG9BbGdvcml0aG1p
YworICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZfdG9Vbmljb2RlCisgKiBA
c2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJzCisgKiBAc3RhYmxlIElD
VSAyLjYKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKK3VjbnZfY29udmVydEV4KFVDb252
ZXJ0ZXIgKnRhcmdldENudiwgVUNvbnZlcnRlciAqc291cmNlQ252LAorICAgICAgICAgICAgICAg
Y2hhciAqKnRhcmdldCwgY29uc3QgY2hhciAqdGFyZ2V0TGltaXQsCisgICAgICAgICAgICAgICBj
b25zdCBjaGFyICoqc291cmNlLCBjb25zdCBjaGFyICpzb3VyY2VMaW1pdCwKKyAgICAgICAgICAg
ICAgIFVDaGFyICpwaXZvdFN0YXJ0LCBVQ2hhciAqKnBpdm90U291cmNlLAorICAgICAgICAgICAg
ICAgVUNoYXIgKipwaXZvdFRhcmdldCwgY29uc3QgVUNoYXIgKnBpdm90TGltaXQsCisgICAgICAg
ICAgICAgICBVQm9vbCByZXNldCwgVUJvb2wgZmx1c2gsCisgICAgICAgICAgICAgICBVRXJyb3JD
b2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gb25lIGV4dGVybmFsIGNo
YXJzZXQgdG8gYW5vdGhlci4KKyAqIEludGVybmFsbHksIHR3byBjb252ZXJ0ZXJzIGFyZSBvcGVu
ZWQgYWNjb3JkaW5nIHRvIHRoZSBuYW1lIGFyZ3VtZW50cywKKyAqIHRoZW4gdGhlIHRleHQgaXMg
Y29udmVydGVkIHRvIGFuZCBmcm9tIHRoZSAxNi1iaXQgVW5pY29kZSAicGl2b3QiCisgKiB1c2lu
ZyB1Y252X2NvbnZlcnRFeCgpLCB0aGVuIHRoZSBjb252ZXJ0ZXJzIGFyZSBjbG9zZWQgYWdhaW4u
CisgKgorICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBub3QgYW4gZWZmaWNpZW50
IHdheSB0byBjb252ZXJ0IGEgbG90IG9mIHRleHQ6CisgKiB1Y252X2NvbnZlcnQoKQorICogLSB0
YWtlcyBjaGFyc2V0IG5hbWVzLCBub3QgY29udmVydGVyIG9iamVjdHMsIHNvIHRoYXQKKyAqICAg
LSB0d28gY29udmVydGVycyBhcmUgb3BlbmVkIGZvciBlYWNoIGNhbGwKKyAqICAgLSBvbmx5IHNp
bmdsZS1zdHJpbmcgY29udmVyc2lvbiBpcyBwb3NzaWJsZSwgbm90IHN0cmVhbWluZyBvcGVyYXRp
b24KKyAqIC0gZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZmluZCBvdXQs
CisgKiAgIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2hldGhlciB0aGUgdG9Vbmljb2RlIG9yCisgKiAg
IHRoZSBmcm9tVW5pY29kZSBjb252ZXJzaW9uIGZhaWxlZAorICogLSBhbGxvd3MgTlVMLXRlcm1p
bmF0ZWQgaW5wdXQKKyAqICAgKG9ubHkgYSBzaW5nbGUgTlVMIGJ5dGUsIHdpbGwgbm90IHdvcmsg
Zm9yIGNoYXJzZXRzIHdpdGggbXVsdGktYnl0ZSBOVUxzKQorICogICAoaWYgc291cmNlTGVuZ3Ro
PT0tMSwgc2VlIHBhcmFtZXRlcnMpCisgKiAtIHRlcm1pbmF0ZSB3aXRoIGEgTlVMIG9uIG91dHB1
dAorICogICAob25seSBhIHNpbmdsZSBOVUwgYnl0ZSwgbm90IHVzZWZ1bCBmb3IgY2hhcnNldHMg
d2l0aCBtdWx0aS1ieXRlIE5VTHMpLAorICogICBvciBzZXQgVV9TVFJJTkdfTk9UX1RFUk1JTkFU
RURfV0FSTklORyBpZiB0aGUgb3V0cHV0IGV4YWN0bHkgZmlsbHMKKyAqICAgdGhlIHRhcmdldCBi
dWZmZXIKKyAqIC0gYSBwaXZvdCBidWZmZXIgaXMgcHJvdmlkZWQgaW50ZXJuYWxseQorICoKKyAq
IFRoZSBmdW5jdGlvbiByZXR1cm5zIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToK
KyAqIC0gdGhlIGVudGlyZSBzb3VyY2UgdGV4dCBoYXMgYmVlbiBjb252ZXJ0ZWQgc3VjY2Vzc2Z1
bGx5IHRvIHRoZSB0YXJnZXQgYnVmZmVyCisgKiAgIGFuZCBlaXRoZXIgdGhlIHRhcmdldCBidWZm
ZXIgaXMgdGVybWluYXRlZCB3aXRoIGEgc2luZ2xlIE5VTCBieXRlCisgKiAgIG9yIHRoZSBlcnJv
ciBjb2RlIGlzIHNldCB0byBVX1NUUklOR19OT1RfVEVSTUlOQVRFRF9XQVJOSU5HCisgKiAtIGEg
dGFyZ2V0IGJ1ZmZlciBvdmVyZmxvdyBvY2N1cnJlZCAoVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1Ip
CisgKiAgIGFuZCB0aGUgZnVsbCBvdXRwdXQgc3RyaW5nIGxlbmd0aCBpcyByZXR1cm5lZCAoInBy
ZWZsaWdodGluZyIpCisgKiAtIGEgY29udmVyc2lvbiBlcnJvciBvY2N1cnJlZAorICogICAob3Ro
ZXIgVV9GQUlMVVJFKCksIHNlZSBkZXNjcmlwdGlvbiBvZiBwRXJyb3JDb2RlKQorICoKKyAqIEBw
YXJhbSB0b0NvbnZlcnRlck5hbWUgICBUaGUgbmFtZSBvZiB0aGUgY29udmVydGVyIHRoYXQgaXMg
dXNlZCB0byBjb252ZXJ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgVVRG
LTE2IHBpdm90IGJ1ZmZlciB0byB0aGUgdGFyZ2V0LgorICogQHBhcmFtIGZyb21Db252ZXJ0ZXJO
YW1lIFRoZSBuYW1lIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAq
ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIFVURi0xNiBw
aXZvdCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUg
b3V0cHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSB0YXJnZXRDYXBhY2l0eSAgICBDYXBhY2l0eSBvZiB0
aGUgdGFyZ2V0LCBpbiBieXRlcy4KKyAqIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICBQb2ludGVy
IHRvIHRoZSBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gc291cmNlTGVuZ3RoICAgICAgTGVuZ3Ro
IG9mIHRoZSBpbnB1dCB0ZXh0LCBpbiBieXRlcywgb3IgLTEgZm9yIE5VTC10ZXJtaW5hdGVkIGlu
cHV0LgorICogQHBhcmFtIHBFcnJvckNvZGUgICAgICAgIElDVSBlcnJvciBjb2RlIGluL291dCBw
YXJhbWV0ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBmdWxmaWxsIFVfU1VD
Q0VTUyBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCisgKiBAcmV0dXJuIExlbmd0aCBvZiB0aGUg
Y29tcGxldGUgb3V0cHV0IHRleHQgaW4gYnl0ZXMsIGV2ZW4gaWYgaXQgZXhjZWVkcyB0aGUgdGFy
Z2V0Q2FwYWNpdHkKKyAqICAgICAgICAgYW5kIGEgVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IgaXMg
c2V0LgorICoKKyAqIEBzZWUgdWNudl9jb252ZXJ0RXgKKyAqIEBzZWUgdWNudl9mcm9tQWxnb3Jp
dGhtaWMKKyAqIEBzZWUgdWNudl90b0FsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfZnJvbVVuaWNv
ZGUKKyAqIEBzZWUgdWNudl90b1VuaWNvZGUKKyAqIEBzZWUgdWNudl9mcm9tVUNoYXJzCisgKiBA
c2VlIHVjbnZfdG9VQ2hhcnMKKyAqIEBzZWUgdWNudl9nZXROZXh0VUNoYXIKKyAqIEBzdGFibGUg
SUNVIDIuMAorICovCitVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMgordWNudl9jb252ZXJ0KGNv
bnN0IGNoYXIgKnRvQ29udmVydGVyTmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9t
Q29udmVydGVyTmFtZSwKKyAgICAgICAgICAgICBjaGFyICp0YXJnZXQsCisgICAgICAgICAgICAg
aW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2Us
CisgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgVUVycm9y
Q29kZSAqcEVycm9yQ29kZSk7CisKKy8qKgorICogQ29udmVydCBmcm9tIG9uZSBleHRlcm5hbCBj
aGFyc2V0IHRvIGFub3RoZXIuCisgKiBJbnRlcm5hbGx5LCB0aGUgdGV4dCBpcyBjb252ZXJ0ZWQg
dG8gYW5kIGZyb20gdGhlIDE2LWJpdCBVbmljb2RlICJwaXZvdCIKKyAqIHVzaW5nIHVjbnZfY29u
dmVydEV4KCkuIHVjbnZfdG9BbGdvcml0aG1pYygpIHdvcmtzIGV4YWN0bHkgbGlrZSB1Y252X2Nv
bnZlcnQoKQorICogZXhjZXB0IHRoYXQgdGhlIHR3byBjb252ZXJ0ZXJzIG5lZWQgbm90IGJlIGxv
b2tlZCB1cCBhbmQgb3BlbmVkIGNvbXBsZXRlbHkuCisgKgorICogVGhlIHNvdXJjZS10by1waXZv
dCBjb252ZXJzaW9uIHVzZXMgdGhlIGNudiBjb252ZXJ0ZXIgcGFyYW1ldGVyLgorICogVGhlIHBp
dm90LXRvLXRhcmdldCBjb252ZXJzaW9uIHVzZXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMgY29udmVy
dGVyCisgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCBlLmcuLCBVQ05WX1VURjgg
Zm9yIGEgVVRGLTggY29udmVydGVyLgorICoKKyAqIEludGVybmFsbHksIHRoZSBhbGdvcml0aG1p
YyBjb252ZXJ0ZXIgaXMgb3BlbmVkIGFuZCBjbG9zZWQgZm9yIGVhY2gKKyAqIGZ1bmN0aW9uIGNh
bGwsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgdGhlIHB1YmxpYyB1Y252X29w
ZW4oKQorICogYnV0IHNvbWV3aGF0IGxlc3MgZWZmaWNpZW50IHRoYW4gb25seSByZXNldHRpbmcg
YW4gZXhpc3RpbmcgY29udmVydGVyCisgKiBhbmQgdXNpbmcgdWNudl9jb252ZXJ0RXgoKS4KKyAq
CisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIHVjbnZfY29udmVydEV4
KCkgZm9yIHNpbmdsZS1zdHJpbmcKKyAqIGNvbnZlcnNpb25zLCBlc3BlY2lhbGx5IHdoZW4gInBy
ZWZsaWdodGluZyIgaXMgZGVzaXJlZCAocmV0dXJuaW5nIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBj
b21wbGV0ZSBvdXRwdXQgZXZlbiBpZiBpdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgdGFyZ2V0IGJ1
ZmZlcjsKKyAqIHNlZSB0aGUgVXNlciBHdWlkZSBTdHJpbmdzIGNoYXB0ZXIpLiBTZWUgdWNudl9j
b252ZXJ0KCkgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIGFsZ29yaXRobWljVHlwZSAgIFVD
b252ZXJ0ZXJUeXBlIGNvbnN0YW50IGlkZW50aWZ5aW5nIHRoZSBkZXNpcmVkIHRhcmdldAorICog
ICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgYXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMg
Y29udmVydGVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRob3NlIGFyZSBjb252ZXJ0
ZXJzIGZvciBVbmljb2RlIGNoYXJzZXRzIGxpa2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAg
ICBVVEYtOCwgQk9DVS0xLCBTQ1NVLCBVVEYtNywgSU1BUC1tYWlsYm94LW5hbWUsIGV0Yy4sCisg
KiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbCBhcyBVUy1BU0NJSSBhbmQgSVNPLTg4
NTktMS4KKyAqIEBwYXJhbSBjbnYgICAgICAgICAgICAgICBUaGUgY29udmVydGVyIHRoYXQgaXMg
dXNlZCB0byBjb252ZXJ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgc291
cmNlIHRvIHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyLgorICogQHBhcmFtIHRhcmdldCAgICAgICAg
ICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0Q2FwYWNp
dHkgICAgQ2FwYWNpdHkgb2YgdGhlIHRhcmdldCwgaW4gYnl0ZXMuCisgKiBAcGFyYW0gc291cmNl
ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIHNvdXJj
ZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dCwgaW4gYnl0ZXMKKyAqIEBwYXJh
bSBwRXJyb3JDb2RlICAgICAgICBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgorICog
ICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgZnVsZmlsbCBVX1NVQ0NFU1MgYmVmb3JlIHRo
ZSBmdW5jdGlvbiBjYWxsLgorICogQHJldHVybiBMZW5ndGggb2YgdGhlIGNvbXBsZXRlIG91dHB1
dCB0ZXh0IGluIGJ5dGVzLCBldmVuIGlmIGl0IGV4Y2VlZHMgdGhlIHRhcmdldENhcGFjaXR5Cisg
KiAgICAgICAgIGFuZCBhIFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SIGlzIHNldC4KKyAqCisgKiBA
c2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfY29udmVydAorICogQHNlZSB1
Y252X2NvbnZlcnRFeAorICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZfdG9V
bmljb2RlCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJzCisg
KiBAc3RhYmxlIElDVSAyLjYKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZf
dG9BbGdvcml0aG1pYyhVQ29udmVydGVyVHlwZSBhbGdvcml0aG1pY1R5cGUsCisgICAgICAgICAg
ICAgICAgICAgVUNvbnZlcnRlciAqY252LAorICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhcmdl
dCwgaW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy
ICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIFVFcnJv
ckNvZGUgKnBFcnJvckNvZGUpOworCisvKioKKyAqIENvbnZlcnQgZnJvbSBvbmUgZXh0ZXJuYWwg
Y2hhcnNldCB0byBhbm90aGVyLgorICogSW50ZXJuYWxseSwgdGhlIHRleHQgaXMgY29udmVydGVk
IHRvIGFuZCBmcm9tIHRoZSAxNi1iaXQgVW5pY29kZSAicGl2b3QiCisgKiB1c2luZyB1Y252X2Nv
bnZlcnRFeCgpLiB1Y252X2Zyb21BbGdvcml0aG1pYygpIHdvcmtzIGV4YWN0bHkgbGlrZSB1Y252
X2NvbnZlcnQoKQorICogZXhjZXB0IHRoYXQgdGhlIHR3byBjb252ZXJ0ZXJzIG5lZWQgbm90IGJl
IGxvb2tlZCB1cCBhbmQgb3BlbmVkIGNvbXBsZXRlbHkuCisgKgorICogVGhlIHNvdXJjZS10by1w
aXZvdCBjb252ZXJzaW9uIHVzZXMgYSBwdXJlbHkgYWxnb3JpdGhtaWMgY29udmVydGVyCisgKiBh
Y2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCBlLmcuLCBVQ05WX1VURjggZm9yIGEgVVRG
LTggY29udmVydGVyLgorICogVGhlIHBpdm90LXRvLXRhcmdldCBjb252ZXJzaW9uIHVzZXMgdGhl
IGNudiBjb252ZXJ0ZXIgcGFyYW1ldGVyLgorICoKKyAqIEludGVybmFsbHksIHRoZSBhbGdvcml0
aG1pYyBjb252ZXJ0ZXIgaXMgb3BlbmVkIGFuZCBjbG9zZWQgZm9yIGVhY2gKKyAqIGZ1bmN0aW9u
IGNhbGwsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgdGhlIHB1YmxpYyB1Y252
X29wZW4oKQorICogYnV0IHNvbWV3aGF0IGxlc3MgZWZmaWNpZW50IHRoYW4gb25seSByZXNldHRp
bmcgYW4gZXhpc3RpbmcgY29udmVydGVyCisgKiBhbmQgdXNpbmcgdWNudl9jb252ZXJ0RXgoKS4K
KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIHVjbnZfY29udmVy
dEV4KCkgZm9yIHNpbmdsZS1zdHJpbmcKKyAqIGNvbnZlcnNpb25zLCBlc3BlY2lhbGx5IHdoZW4g
InByZWZsaWdodGluZyIgaXMgZGVzaXJlZCAocmV0dXJuaW5nIHRoZSBsZW5ndGgKKyAqIG9mIHRo
ZSBjb21wbGV0ZSBvdXRwdXQgZXZlbiBpZiBpdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgdGFyZ2V0
IGJ1ZmZlcjsKKyAqIHNlZSB0aGUgVXNlciBHdWlkZSBTdHJpbmdzIGNoYXB0ZXIpLiBTZWUgdWNu
dl9jb252ZXJ0KCkgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIGNudiAgICAgICAgICAgICAg
IFRoZSBjb252ZXJ0ZXIgdGhhdCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAqICAgICAgICAgICAgICAg
ICAgICAgICAgICBmcm9tIHRoZSBVVEYtMTYgcGl2b3QgYnVmZmVyIHRvIHRoZSB0YXJnZXQuCisg
KiBAcGFyYW0gYWxnb3JpdGhtaWNUeXBlICAgVUNvbnZlcnRlclR5cGUgY29uc3RhbnQgaWRlbnRp
ZnlpbmcgdGhlIGRlc2lyZWQgc291cmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hh
cnNldCBhcyBhIHB1cmVseSBhbGdvcml0aG1pYyBjb252ZXJ0ZXIuCisgKiAgICAgICAgICAgICAg
ICAgICAgICAgICAgVGhvc2UgYXJlIGNvbnZlcnRlcnMgZm9yIFVuaWNvZGUgY2hhcnNldHMgbGlr
ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04LCBCT0NVLTEsIFNDU1UsIFVURi03
LCBJTUFQLW1haWxib3gtbmFtZSwgZXRjLiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBh
cyB3ZWxsIGFzIFVTLUFTQ0lJIGFuZCBJU08tODg1OS0xLgorICogQHBhcmFtIHRhcmdldCAgICAg
ICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gdGFyZ2V0Q2Fw
YWNpdHkgICAgQ2FwYWNpdHkgb2YgdGhlIHRhcmdldCwgaW4gYnl0ZXMuCisgKiBAcGFyYW0gc291
cmNlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIHNv
dXJjZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dCwgaW4gYnl0ZXMKKyAqIEBw
YXJhbSBwRXJyb3JDb2RlICAgICAgICBJQ1UgZXJyb3IgY29kZSBpbi9vdXQgcGFyYW1ldGVyLgor
ICogICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgZnVsZmlsbCBVX1NVQ0NFU1MgYmVmb3Jl
IHRoZSBmdW5jdGlvbiBjYWxsLgorICogQHJldHVybiBMZW5ndGggb2YgdGhlIGNvbXBsZXRlIG91
dHB1dCB0ZXh0IGluIGJ5dGVzLCBldmVuIGlmIGl0IGV4Y2VlZHMgdGhlIHRhcmdldENhcGFjaXR5
CisgKiAgICAgICAgIGFuZCBhIFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SIGlzIHNldC4KKyAqCisg
KiBAc2VlIHVjbnZfZnJvbUFsZ29yaXRobWljCisgKiBAc2VlIHVjbnZfY29udmVydAorICogQHNl
ZSB1Y252X2NvbnZlcnRFeAorICogQHNlZSB1Y252X2Zyb21Vbmljb2RlCisgKiBAc2VlIHVjbnZf
dG9Vbmljb2RlCisgKiBAc2VlIHVjbnZfZnJvbVVDaGFycworICogQHNlZSB1Y252X3RvVUNoYXJz
CisgKiBAc3RhYmxlIElDVSAyLjYKKyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3Vj
bnZfZnJvbUFsZ29yaXRobWljKFVDb252ZXJ0ZXIgKmNudiwKKyAgICAgICAgICAgICAgICAgICAg
IFVDb252ZXJ0ZXJUeXBlIGFsZ29yaXRobWljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNo
YXIgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAg
ICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBGcmVlcyB1cCBtZW1v
cnkgb2NjdXBpZWQgYnkgdW51c2VkLCBjYWNoZWQgY29udmVydGVyIHNoYXJlZCBkYXRhLgorICoK
KyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjYWNoZWQgY29udmVydGVycyBzdWNjZXNzZnVsbHkg
ZGVsZXRlZAorICogQHNlZSB1Y252X2Nsb3NlCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9T
VEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfZmx1c2hDYWNoZSh2b2lkKTsKKworLyoqCisg
KiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbnZlcnRlcnMsIGFzIHBlciB0aGUg
YWxpYXMgZmlsZS4KKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbnZl
cnRlcnMKKyAqIEBzZWUgdWNudl9nZXRBdmFpbGFibGVOYW1lCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIKK3VjbnZfY291bnRBdmFpbGFibGUodm9p
ZCk7CisKKy8qKgorICogR2V0cyB0aGUgY2Fub25pY2FsIGNvbnZlcnRlciBuYW1lIG9mIHRoZSBz
cGVjaWZpZWQgY29udmVydGVyIGZyb20gYSBsaXN0IG9mCisgKiBhbGwgYXZhaWxhYmxlIGNvbnZl
cnRlcnMgY29udGFpZWQgaW4gdGhlIGFsaWFzIGZpbGUuIEFsbCBjb252ZXJ0ZXJzCisgKiBpbiB0
aGlzIGxpc3QgY2FuIGJlIG9wZW5lZC4KKyAqCisgKiBAcGFyYW0gbiB0aGUgaW5kZXggdG8gYSBj
b252ZXJ0ZXIgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gKGluIHRoZSByYW5nZSA8VFQ+WzAuLnVj
bnZfY291bnRBdmFpYWJsZSgpXTwvVFQ+KQorICogQHJldHVybiBhIHBvaW50ZXIgYSBzdHJpbmcg
KGxpYnJhcnkgb3duZWQpLCBvciA8VFQ+TlVMTDwvVFQ+IGlmIHRoZSBpbmRleCBpcyBvdXQgb2Yg
Ym91bmRzLgorICogQHNlZSB1Y252X2NvdW50QXZhaWxhYmxlCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgY29uc3QgY2hhciogVV9FWFBPUlQyCit1Y252X2dldEF2YWlsYWJsZU5h
bWUoaW50MzJfdCBuKTsKKworLyoqCisgKiBSZXR1cm5zIGEgVUVudW1lcmF0aW9uIHRvIGVudW1l
cmF0ZSBhbGwgb2YgdGhlIGNhbm9uaWNhbCBjb252ZXJ0ZXIKKyAqIG5hbWVzLCBhcyBwZXIgdGhl
IGFsaWFzIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFiaWxpdHkgdG8gb3BlbiBlYWNoCisgKiBj
b252ZXJ0ZXIuCisgKgorICogQHJldHVybiBBIFVFbnVtZXJhdGlvbiBvYmplY3QgZm9yIGdldHRp
bmcgYWxsIHRoZSByZWNvZ25pemVkIGNhbm9uaWNhbAorICogICBjb252ZXJ0ZXIgbmFtZXMuCisg
KiBAc2VlIHVjbnZfZ2V0QXZhaWxhYmxlTmFtZQorICogQHNlZSB1ZW51bV9jbG9zZQorICogQHNl
ZSB1ZW51bV9uZXh0CisgKiBAc3RhYmxlIElDVSAyLjQKKyAqLworVV9TVEFCTEUgVUVudW1lcmF0
aW9uICogVV9FWFBPUlQyCit1Y252X29wZW5BbGxOYW1lcyhVRXJyb3JDb2RlICpwRXJyb3JDb2Rl
KTsKKworLyoqCisgKiBHaXZlcyB0aGUgbnVtYmVyIG9mIGFsaWFzZXMgZm9yIGEgZ2l2ZW4gY29u
dmVydGVyIG9yIGFsaWFzIG5hbWUuCisgKiBJZiB0aGUgYWxpYXMgaXMgYW1iaWd1b3VzLCB0aGVu
IHRoZSBwcmVmZXJyZWQgY29udmVydGVyIGlzIHVzZWQKKyAqIGFuZCB0aGUgc3RhdHVzIGlzIHNl
dCB0byBVX0FNQklHVU9VU19BTElBU19XQVJOSU5HLgorICogVGhpcyBtZXRob2Qgb25seSBlbnVt
ZXJhdGVzIHRoZSBsaXN0ZWQgZW50cmllcyBpbiB0aGUgYWxpYXMgZmlsZS4KKyAqIEBwYXJhbSBh
bGlhcyBhbGlhcyBuYW1lCisgKiBAcGFyYW0gcEVycm9yQ29kZSBlcnJvciBzdGF0dXMKKyAqIEBy
ZXR1cm4gbnVtYmVyIG9mIG5hbWVzIG9uIGFsaWFzIGxpc3QgZm9yIGdpdmVuIGFsaWFzCisgKiBA
c3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdWludDE2X3QgVV9FWFBPUlQyIAordWNudl9j
b3VudEFsaWFzZXMoY29uc3QgY2hhciAqYWxpYXMsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOwor
CisvKioKKyAqIEdpdmVzIHRoZSBuYW1lIG9mIHRoZSBhbGlhcyBhdCBnaXZlbiBpbmRleCBvZiBh
bGlhcyBsaXN0LgorICogVGhpcyBtZXRob2Qgb25seSBlbnVtZXJhdGVzIHRoZSBsaXN0ZWQgZW50
cmllcyBpbiB0aGUgYWxpYXMgZmlsZS4KKyAqIElmIHRoZSBhbGlhcyBpcyBhbWJpZ3VvdXMsIHRo
ZW4gdGhlIHByZWZlcnJlZCBjb252ZXJ0ZXIgaXMgdXNlZAorICogYW5kIHRoZSBzdGF0dXMgaXMg
c2V0IHRvIFVfQU1CSUdVT1VTX0FMSUFTX1dBUk5JTkcuCisgKiBAcGFyYW0gYWxpYXMgYWxpYXMg
bmFtZQorICogQHBhcmFtIG4gaW5kZXggaW4gYWxpYXMgbGlzdAorICogQHBhcmFtIHBFcnJvckNv
ZGUgcmVzdWx0IG9mIG9wZXJhdGlvbgorICogQHJldHVybiByZXR1cm5zIHRoZSBuYW1lIG9mIHRo
ZSBhbGlhcyBhdCBnaXZlbiBpbmRleAorICogQHNlZSB1Y252X2NvdW50QWxpYXNlcworICogQHN0
YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIgCit1Y252
X2dldEFsaWFzKGNvbnN0IGNoYXIgKmFsaWFzLCB1aW50MTZfdCBuLCBVRXJyb3JDb2RlICpwRXJy
b3JDb2RlKTsKKworLyoqCisgKiBGaWxsLXVwIHRoZSBsaXN0IG9mIGFsaWFzIG5hbWVzIGZvciB0
aGUgZ2l2ZW4gYWxpYXMuCisgKiBUaGlzIG1ldGhvZCBvbmx5IGVudW1lcmF0ZXMgdGhlIGxpc3Rl
ZCBlbnRyaWVzIGluIHRoZSBhbGlhcyBmaWxlLgorICogSWYgdGhlIGFsaWFzIGlzIGFtYmlndW91
cywgdGhlbiB0aGUgcHJlZmVycmVkIGNvbnZlcnRlciBpcyB1c2VkCisgKiBhbmQgdGhlIHN0YXR1
cyBpcyBzZXQgdG8gVV9BTUJJR1VPVVNfQUxJQVNfV0FSTklORy4KKyAqIEBwYXJhbSBhbGlhcyBh
bGlhcyBuYW1lCisgKiBAcGFyYW0gYWxpYXNlcyBmaWxsLWluIGxpc3QsIGFsaWFzZXMgaXMgYSBw
b2ludGVyIHRvIGFuIGFycmF5IG9mCisgKiAgICAgICAgPGNvZGU+dWNudl9jb3VudEFsaWFzZXMo
KTwvY29kZT4gc3RyaW5nLXBvaW50ZXJzCisgKiAgICAgICAgKDxjb2RlPmNvbnN0IGNoYXIgKjwv
Y29kZT4pIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4uCisgKiAgICAgICAgVGhlIHN0cmluZ3MgdGhl
bXNlbHZlcyBhcmUgb3duZWQgYnkgdGhlIGxpYnJhcnkuCisgKiBAcGFyYW0gcEVycm9yQ29kZSBy
ZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9p
ZCBVX0VYUE9SVDIgCit1Y252X2dldEFsaWFzZXMoY29uc3QgY2hhciAqYWxpYXMsIGNvbnN0IGNo
YXIgKiphbGlhc2VzLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBSZXR1cm4g
YSBuZXcgVUVudW1lcmF0aW9uIG9iamVjdCBmb3IgZW51bWVyYXRpbmcgYWxsIHRoZQorICogYWxp
YXMgbmFtZXMgZm9yIGEgZ2l2ZW4gY29udmVydGVyIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgYSBz
dGFuZGFyZC4KKyAqIFRoaXMgbWV0aG9kIG9ubHkgZW51bWVyYXRlcyB0aGUgbGlzdGVkIGVudHJp
ZXMgaW4gdGhlIGFsaWFzIGZpbGUuCisgKiBUaGUgY29udnJ0cnMudHh0IGZpbGUgY2FuIGJlIG1v
ZGlmaWVkIHRvIGNoYW5nZSB0aGUgcmVzdWx0cyBvZgorICogdGhpcyBmdW5jdGlvbi4KKyAqIFRo
ZSBmaXJzdCByZXN1bHQgaW4gdGhpcyBsaXN0IGlzIHRoZSBzYW1lIHJlc3VsdCBnaXZlbiBieQor
ICogPGNvZGU+dWNudl9nZXRTdGFuZGFyZE5hbWU8L2NvZGU+LCB3aGljaCBpcyB0aGUgZGVmYXVs
dCBhbGlhcyBmb3IKKyAqIHRoZSBzcGVjaWZpZWQgc3RhbmRhcmQgbmFtZS4gVGhlIHJldHVybmVk
IG9iamVjdCBtdXN0IGJlIGNsb3NlZCB3aXRoCisgKiA8Y29kZT51ZW51bV9jbG9zZTwvY29kZT4g
d2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjb252TmFt
ZSBvcmlnaW5hbCBjb252ZXJ0ZXIgbmFtZQorICogQHBhcmFtIHN0YW5kYXJkIG5hbWUgb2YgdGhl
IHN0YW5kYXJkIGdvdmVybmluZyB0aGUgbmFtZXM7IE1JTUUgYW5kIElBTkEKKyAqICAgICAgYXJl
IHN1Y2ggc3RhbmRhcmRzCisgKiBAcGFyYW0gcEVycm9yQ29kZSBUaGUgZXJyb3IgY29kZQorICog
QHJldHVybiBBIFVFbnVtZXJhdGlvbiBvYmplY3QgZm9yIGdldHRpbmcgYWxsIGFsaWFzZXMgdGhh
dCBhcmUgcmVjb2duaXplZAorICogICAgICBieSBhIHN0YW5kYXJkLiBJZiBhbnkgb2YgdGhlIHBh
cmFtZXRlcnMgYXJlIGludmFsaWQsIE5VTEwKKyAqICAgICAgaXMgcmV0dXJuZWQuCisgKiBAc2Vl
IHVjbnZfZ2V0U3RhbmRhcmROYW1lCisgKiBAc2VlIHVlbnVtX2Nsb3NlCisgKiBAc2VlIHVlbnVt
X25leHQKKyAqIEBzdGFibGUgSUNVIDIuMgorICovCitVX1NUQUJMRSBVRW51bWVyYXRpb24gKiBV
X0VYUE9SVDIKK3VjbnZfb3BlblN0YW5kYXJkTmFtZXMoY29uc3QgY2hhciAqY29udk5hbWUsCisg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YW5kYXJkLAorICAgICAgICAgICAg
ICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyoqCisgKiBHaXZlcyB0aGUg
bnVtYmVyIG9mIHN0YW5kYXJkcyBhc3NvY2lhdGVkIHRvIGNvbnZlcnRlciBuYW1lcy4KKyAqIEBy
ZXR1cm4gbnVtYmVyIG9mIHN0YW5kYXJkcworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RB
QkxFIHVpbnQxNl90IFVfRVhQT1JUMgordWNudl9jb3VudFN0YW5kYXJkcyh2b2lkKTsKKworLyoq
CisgKiBHaXZlcyB0aGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgYXQgZ2l2ZW4gaW5kZXggb2Ygc3Rh
bmRhcmQgbGlzdC4KKyAqIEBwYXJhbSBuIGluZGV4IGluIHN0YW5kYXJkIGxpc3QKKyAqIEBwYXJh
bSBwRXJyb3JDb2RlIHJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIEByZXR1cm4gcmV0dXJucyB0aGUg
bmFtZSBvZiB0aGUgc3RhbmRhcmQgYXQgZ2l2ZW4gaW5kZXguIE93bmVkIGJ5IHRoZSBsaWJyYXJ5
LgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9S
VDIKK3VjbnZfZ2V0U3RhbmRhcmQodWludDE2X3QgbiwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7
CisKKy8qKgorICogUmV0dXJucyBhIHN0YW5kYXJkIG5hbWUgZm9yIGEgZ2l2ZW4gY29udmVydGVy
IG5hbWUuCisgKiA8cD4KKyAqIEV4YW1wbGUgYWxpYXMgdGFibGU6PGJyPgorICogY29udiBhbGlh
czEgeyBTVEFOREFSRDEgfSBhbGlhczIgeyBTVEFOREFSRDEqIH0KKyAqIDxwPgorICogUmVzdWx0
IG9mIHVjbnZfZ2V0U3RhbmRhcmROYW1lKCJjb252IiwgIlNUQU5EQVJEMSIpIGZyb20gZXhhbXBs
ZQorICogYWxpYXMgdGFibGU6PGJyPgorICogPGI+ImFsaWFzMiI8L2I+CisgKgorICogQHBhcmFt
IG5hbWUgb3JpZ2luYWwgY29udmVydGVyIG5hbWUKKyAqIEBwYXJhbSBzdGFuZGFyZCBuYW1lIG9m
IHRoZSBzdGFuZGFyZCBnb3Zlcm5pbmcgdGhlIG5hbWVzOyBNSU1FIGFuZCBJQU5BCisgKiAgICAg
ICAgYXJlIHN1Y2ggc3RhbmRhcmRzCisgKiBAcGFyYW0gcEVycm9yQ29kZSByZXN1bHQgb2Ygb3Bl
cmF0aW9uCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIHN0YW5kYXJkIGNvbnZlcnRlciBuYW1lOwor
ICogICAgICAgICBpZiBhIHN0YW5kYXJkIGNvbnZlcnRlciBuYW1lIGNhbm5vdCBiZSBkZXRlcm1p
bmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVybmVkLiBPd25l
ZCBieSB0aGUgbGlicmFyeS4KKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBjb25z
dCBjaGFyICogVV9FWFBPUlQyCit1Y252X2dldFN0YW5kYXJkTmFtZShjb25zdCBjaGFyICpuYW1l
LCBjb25zdCBjaGFyICpzdGFuZGFyZCwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKy8qKgor
ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaW50ZXJuYWwgY2Fub25pY2FsIGNvbnZl
cnRlciBuYW1lIG9mIHRoZQorICogdGFnZ2VkIGFsaWFzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBv
ZiB1Y252X29wZW5TdGFuZGFyZE5hbWVzLCB3aGljaAorICogcmV0dXJucyB0aGUgdGFnZ2VkIGFs
aWFzIGdpdmVuIHRoZSBjYW5vbmljYWwgbmFtZS4KKyAqIDxwPgorICogRXhhbXBsZSBhbGlhcyB0
YWJsZTo8YnI+CisgKiBjb252IGFsaWFzMSB7IFNUQU5EQVJEMSB9IGFsaWFzMiB7IFNUQU5EQVJE
MSogfQorICogPHA+CisgKiBSZXN1bHQgb2YgdWNudl9nZXRTdGFuZGFyZE5hbWUoImFsaWFzMSIs
ICJTVEFOREFSRDEiKSBmcm9tIGV4YW1wbGUKKyAqIGFsaWFzIHRhYmxlOjxicj4KKyAqIDxiPiJj
b252IjwvYj4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNhbm9uaWNhbCBjb252ZXJ0ZXIg
bmFtZTsKKyAqICAgICAgICAgaWYgYSBzdGFuZGFyZCBvciBhbGlhcyBuYW1lIGNhbm5vdCBiZSBk
ZXRlcm1pbmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVybmVk
LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzCisgKiAgICAgICAgIG93bmVkIGJ5IHRoZSBsaWJyYXJ5
LgorICogQHNlZSB1Y252X2dldFN0YW5kYXJkTmFtZQorICogQHN0YWJsZSBJQ1UgMi40CisgKi8K
K1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIKK3VjbnZfZ2V0Q2Fub25pY2FsTmFtZShj
b25zdCBjaGFyICphbGlhcywgY29uc3QgY2hhciAqc3RhbmRhcmQsIFVFcnJvckNvZGUgKnBFcnJv
ckNvZGUpOworCisvKioKKyAqIHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0ZXIg
bmFtZS4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0
ZXIgbmFtZTsKKyAqICAgICAgICAgaWYgYSBkZWZhdWx0IGNvbnZlcnRlciBuYW1lIGNhbm5vdCBi
ZSBkZXRlcm1pbmVkLAorICogICAgICAgICB0aGVuIDxjb2RlPk5VTEw8L2NvZGU+IGlzIHJldHVy
bmVkLgorICogICAgICAgICBTdG9yYWdlIG93bmVkIGJ5IHRoZSBsaWJyYXJ5CisgKiBAc2VlIHVj
bnZfc2V0RGVmYXVsdE5hbWUKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSBjb25z
dCBjaGFyICogVV9FWFBPUlQyCit1Y252X2dldERlZmF1bHROYW1lKHZvaWQpOworCisvKioKKyAq
IHNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb252ZXJ0ZXIgbmFtZS4gQ2FsbGVyIG11c3Qgb3du
IHRoZSBzdG9yYWdlIGZvciAnbmFtZScKKyAqIGFuZCBwcmVzZXJ2ZSBpdCBpbmRlZmluaXRlbHku
IAorICogQHBhcmFtIG5hbWUgdGhlIGNvbnZlcnRlciBuYW1lIHRvIGJlIHRoZSBkZWZhdWx0ICht
dXN0IGV4aXN0KS4KKyAqIEBzZWUgdWNudl9nZXREZWZhdWx0TmFtZQorICogQHN5c3RlbSBTWVNU
RU0gQVBJCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIK
K3VjbnZfc2V0RGVmYXVsdE5hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogRml4ZXMg
dGhlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgbWlzbWFwcGluZy4gIEZvciBleGFtcGxlLCBpbiBTSklT
LCB0aGUgYmFja3NsYXNoIAorICogY2hhcmFjdGVyIGluIHRoZSBBU0NJSSBwb3J0aW9uIGlzIGFs
c28gdXNlZCB0byByZXByZXNlbnQgdGhlIHllbiBjdXJyZW5jeSBzaWduLiAgCisgKiBXaGVuIG1h
cHBpbmcgZnJvbSBVbmljb2RlIGNoYXJhY3RlciAweDAwNUMsIGl0J3MgdW5jbGVhciB3aGV0aGVy
IHRvIG1hcCB0aGUgCisgKiBjaGFyYWN0ZXIgYmFjayB0byB5ZW4gb3IgYmFja3NsYXNoIGluIFNK
SVMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBhbmQgcmVw
bGFjZSBhbGwgdGhlIHllbiBzaWduIGNoYXJhY3RlcnMgd2l0aCBiYWNrc2xhc2guICBUaGlzIGlz
IG5lY2Vzc2FyeQorICogd2hlbiB0aGUgdXNlciB0cmllcyB0byBvcGVuIGEgZmlsZSB3aXRoIHRo
ZSBpbnB1dCBidWZmZXIgb24gV2luZG93cy4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0ZXN0IHRo
ZSBjb252ZXJ0ZXIgdG8gc2VlIHdoZXRoZXIgc3VjaCBtYXBwaW5nIGlzCisgKiByZXF1aXJlZC4g
IFlvdSBjYW4gc29tZXRpbWVzIGF2b2lkIHVzaW5nIHRoaXMgZnVuY3Rpb24gYnkgdXNpbmcgdGhl
IGNvcnJlY3QgdmVyc2lvbgorICogb2YgU2hpZnQtSklTLgorICoKKyAqIEBwYXJhbSBjbnYgVGhl
IGNvbnZlcnRlciByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBjb2RlcGFnZS4KKyAqIEBwYXJhbSBz
b3VyY2UgdGhlIGlucHV0IGJ1ZmZlciB0byBiZSBmaXhlZAorICogQHBhcmFtIHNvdXJjZUxlbiB0
aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBzZWUgdWNudl9pc0FtYmlndW91cwor
ICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyCit1Y252X2Zp
eEZpbGVTZXBhcmF0b3IoY29uc3QgVUNvbnZlcnRlciAqY252LCBVQ2hhciAqc291cmNlLCBpbnQz
Ml90IHNvdXJjZUxlbik7CisKKy8qKgorICogRGV0ZXJtaW5lcyBpZiB0aGUgY29udmVydGVyIGNv
bnRhaW5zIGFtYmlndW91cyBtYXBwaW5ncyBvZiB0aGUgc2FtZQorICogY2hhcmFjdGVyIG9yIG5v
dC4KKyAqIEBwYXJhbSBjbnYgdGhlIGNvbnZlcnRlciB0byBiZSB0ZXN0ZWQKKyAqIEByZXR1cm4g
VFJVRSBpZiB0aGUgY29udmVydGVyIGNvbnRhaW5zIGFtYmlndW91cyBtYXBwaW5nIG9mIHRoZSBz
YW1lIAorICogY2hhcmFjdGVyLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLworVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyCit1Y252X2lzQW1iaWd1b3VzKGNvbnN0IFVD
b252ZXJ0ZXIgKmNudik7CisKKy8qKgorICogU2V0cyB0aGUgY29udmVydGVyIHRvIHVzZSBmYWxs
YmFjayBtYXBwaW5nIG9yIG5vdC4KKyAqIEBwYXJhbSBjbnYgVGhlIGNvbnZlcnRlciB0byBzZXQg
dGhlIGZhbGxiYWNrIG1hcHBpbmcgdXNhZ2Ugb24uCisgKiBAcGFyYW0gdXNlc0ZhbGxiYWNrIFRS
VUUgaWYgdGhlIHVzZXIgd2FudHMgdGhlIGNvbnZlcnRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0
aGUgZmFsbGJhY2sgCisgKiBtYXBwaW5nLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCit1Y252X3NldEZhbGxiYWNrKFVD
b252ZXJ0ZXIgKmNudiwgVUJvb2wgdXNlc0ZhbGxiYWNrKTsKKworLyoqCisgKiBEZXRlcm1pbmVz
IGlmIHRoZSBjb252ZXJ0ZXIgdXNlcyBmYWxsYmFjayBtYXBwaW5ncyBvciBub3QuCisgKiBAcGFy
YW0gY252IFRoZSBjb252ZXJ0ZXIgdG8gYmUgdGVzdGVkCisgKiBAcmV0dXJuIFRSVUUgaWYgdGhl
IGNvbnZlcnRlciB1c2VzIGZhbGxiYWNrLCBGQUxTRSBvdGhlcndpc2UuCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyIAordWNudl91c2VzRmFsbGJhY2so
Y29uc3QgVUNvbnZlcnRlciAqY252KTsKKworLyoqCisgKiBEZXRlY3RzIFVuaWNvZGUgc2lnbmF0
dXJlIGJ5dGUgc2VxdWVuY2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgYnl0ZSBzdHJlYW0KKyAqIGFu
ZCByZXR1cm5zIHRoZSBjaGFyc2V0IG5hbWUgb2YgdGhlIGluZGljYXRlZCBVbmljb2RlIGNoYXJz
ZXQuCisgKiBOVUxMIGlzIHJldHVybmVkIHdoZW4gbm8gVW5pY29kZSBzaWduYXR1cmUgaXMgcmVj
b2duaXplZC4KKyAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNpZ25hdHVyZSBpcyBvdXRw
dXQgYXMgd2VsbC4KKyAqCisgKiBUaGUgY2FsbGVyIGNhbiB1Y252X29wZW4oKSBhIGNvbnZlcnRl
ciB1c2luZyB0aGUgY2hhcnNldCBuYW1lLgorICogVGhlIGZpcnN0IGNvZGUgdW5pdCAoVUNoYXIp
IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0gd2lsbCBiZSBVK0ZFRkYKKyAqICh0aGUgVW5p
Y29kZSBCT00vc2lnbmF0dXJlIGNoYXJhY3RlcikgYW5kIGNhbiB1c3VhbGx5IGJlIGlnbm9yZWQu
CisgKgorICogRm9yIG1vc3QgVW5pY29kZSBjaGFyc2V0cyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRv
IGlnbm9yZSB0aGUgaW5kaWNhdGVkCisgKiBudW1iZXIgb2YgaW5pdGlhbCBzdHJlYW0gYnl0ZXMg
YW5kIHN0YXJ0IGNvbnZlcnRpbmcgYWZ0ZXIgdGhlbS4KKyAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBz
dGF0ZWZ1bCBVbmljb2RlIGNoYXJzZXRzIChVVEYtNyBhbmQgQk9DVS0xKSBmb3Igd2hpY2gKKyAq
IHRoaXMgd2lsbCBub3Qgd29yay4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGlnbm9yZSB0aGUg
Zmlyc3Qgb3V0cHV0IFVDaGFyCisgKiBpbnN0ZWFkIG9mIHRoZSBpbnB1dCBzaWduYXR1cmUgYnl0
ZXMuCisgKiA8cD4KKyAqIFVzYWdlOgorICogQGNvZGUgICAgIAorICogICAgICBVRXJyb3JDb2Rl
IGVyciA9IFVfWkVST19FUlJPUjsKKyAqICAgICAgY2hhciBpbnB1dFtdID0geyAnXHhFRicsJ1x4
QkInLCAnXHhCRicsJ1x4NDEnLCdceDQyJywnXHg0MycgfTsKKyAqICAgICAgaW50MzJfdCBzaWdu
YXR1cmVMZW5ndGggPSAwOworICogICAgICBjaGFyICplbmNvZGluZyA9IHVjbnZfZGV0ZWN0VW5p
Y29kZVNpZ25hdHVyZXMoaW5wdXQsc2l6ZW9mKGlucHV0KSwmc2lnbmF0dXJlTGVuZ3RoLCZlcnIp
OworICogICAgICBVQ29udmVydGVyICpjb252ID0gTlVMTDsKKyAqICAgICAgVUNoYXIgb3V0cHV0
WzEwMF07CisgKiAgICAgIFVDaGFyICp0YXJnZXQgPSBvdXRwdXQsICpvdXQ7CisgKiAgICAgIGNo
YXIgKnNvdXJjZSA9IGlucHV0OworICogICAgICBpZihlbmNvZGluZyE9TlVMTCAmJiBVX1NVQ0NF
U1MoZXJyKSl7CisgKiAgICAgICAgICAvLyBzaG91bGQgc2lnbmF0dXJlIGJlIGRpc2NhcmRlZCA/
CisgKiAgICAgICAgICBjb252ID0gdWNudl9vcGVuKGVuY29kaW5nLCAmZXJyKTsKKyAqICAgICAg
ICAgIC8vIGRvIHRoZSBjb252ZXJzaW9uCisgKiAgICAgICAgICB1Y252X3RvVW5pY29kZShjb252
LAorICogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBvdXRwdXQgKyBzaXplb2Yob3V0
cHV0KS9VX1NJWkVPRl9VQ0hBUiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwg
aW5wdXQgKyBzaXplb2YoaW5wdXQpLAorICogICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwg
VFJVRSwgJmVycik7CisgKiAgICAgICAgICBvdXQgPSBvdXRwdXQ7CisgKiAgICAgICAgICBpZiAo
ZGlzY2FyZFNpZ25hdHVyZSl7CisgKiAgICAgICAgICAgICAgKytvdXQ7IC8vIGlnbm9yZSBpbml0
aWFsIFUrRkVGRgorICogICAgICAgICAgfQorICogICAgICAgICAgd2hpbGUob3V0ICE9IHRhcmdl
dCkgeworICogICAgICAgICAgICAgIHByaW50ZigiJTA0eCAiLCAqb3V0KyspOworICogICAgICAg
ICAgfQorICogICAgICAgICAgcHV0cygiIik7CisgKiAgICAgIH0KKyAqICAgICAKKyAqIEBlbmRj
b2RlCisgKgorICogQHBhcmFtIHNvdXJjZSAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nIGlu
IHdoaWNoIHRoZSBzaWduYXR1cmUgc2hvdWxkIGJlIGRldGVjdGVkLgorICogQHBhcmFtIHNvdXJj
ZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nLCBvciAtMSBpZiB0ZXJtaW5h
dGVkIHdpdGggYSBOVUwgYnl0ZS4KKyAqIEBwYXJhbSBzaWduYXR1cmVMZW5ndGggICBBIHBvaW50
ZXIgdG8gaW50MzJfdCB0byByZWNlaXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYWtlIHVw
IHRoZSBzaWduYXR1cmUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGRldGVj
dGVkIFVURi4gMCBpZiBub3QgZGV0ZWN0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg
Q2FuIGJlIGEgTlVMTCBwb2ludGVyLgorICogQHBhcmFtIHBFcnJvckNvZGUgICAgICAgIEEgcG9p
bnRlciB0byByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IGFueSBlcnJvcnMgdGhhdCBtYXkgb2Nj
dXIgZHVyaW5nIGRldGVjdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJl
IGEgdmFsaWQgcG9pbnRlciB0byBhbiBlcnJvciBjb2RlIHZhbHVlLCB3aGljaCBtdXN0IG5vdCBp
bmRpY2F0ZSBhIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhl
IGZ1bmN0aW9uIGNhbGwuCisgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyBkZXRl
Y3RlZC4gTlVMTCBpZiBlbmNvZGluZyBpcyBub3QgZGV0ZWN0ZWQuIAorICogQHN0YWJsZSBJQ1Ug
Mi40CisgKi8KK1VfU1RBQkxFIGNvbnN0IGNoYXIqIFVfRVhQT1JUMgordWNudl9kZXRlY3RVbmlj
b2RlU2lnbmF0dXJlKGNvbnN0IGNoYXIqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQzMl90IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnQzMl90ICpzaWduYXR1cmVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVy
cm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKyNlbmRpZgorCisjZW5kaWYKKy8qX1VDTlYqLwpJbmRl
eDogSmF2YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWNudl9lcnIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9pY3UvdW5pY29kZS91Y252X2Vyci5oCShyZXZpc2lvbiAwKQorKysgSmF2
YVNjcmlwdENvcmUvaWN1L3VuaWNvZGUvdWNudl9lcnIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw0NTYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQs
IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3Ro
ZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogICB1
Y252X2Vyci5oOgorICovCisKKy8qKgorICogXGZpbGUKKyAqIFxicmllZiBDIFVDb252ZXJ0ZXIg
cHJlZGVmaW5lZCBlcnJvciBjYWxsYmFja3MKKyAqCisgKiAgPGgyPkVycm9yIEJlaGF2aW91ciBG
dW5jdGlvbnM8L2gyPgorICogIERlZmluZXMgc29tZSBlcnJvciBiZWhhdmlvdXIgZnVuY3Rpb25z
IGNhbGxlZCBieSB1Y252X3tmcm9tLHRvfVVuaWNvZGUKKyAqICBUaGVzZSBhcmUgcHJvdmlkZWQg
YXMgcGFydCBvZiBJQ1UgYW5kIG1hbnkgYXJlIHN0YWJsZSwgYnV0IHRoZXkKKyAqICBjYW4gYWxz
byBiZSBjb25zaWRlcmVkIG9ubHkgYXMgYW4gZXhhbXBsZSBvZiB3aGF0IGNhbiBiZSBkb25lIHdp
dGgKKyAqICBjYWxsYmFja3MuICBZb3UgbWF5IG9mIGNvdXJzZSB3cml0ZSB5b3VyIG93bi4KKyAq
CisgKiAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24sIHlvdSBtYXkgYWxzbyBmaW5kIHRo
ZSBmdW5jdGlvbnMgZnJvbQorICogIHVjbnZfY2IuaCB1c2VmdWwgd2hlbiB3cml0aW5nIHlvdXIg
b3duIGNhbGxiYWNrcy4KKyAqCisgKiAgVGhlc2UgZnVuY3Rpb25zLCBhbHRob3VnaCBwdWJsaWMs
IHNob3VsZCBORVZFUiBiZSBjYWxsZWQgZGlyZWN0bHkuCisgKiAgVGhleSBzaG91bGQgYmUgdXNl
ZCBhcyBwYXJhbWV0ZXJzIHRvIHRoZSB1Y252X3NldEZyb21VQ2FsbGJhY2sKKyAqICBhbmQgdWNu
dl9zZXRUb1VDYWxsYmFjayBmdW5jdGlvbnMsIHRvIHNldCB0aGUgYmVoYXZpb3VyIG9mIGEgY29u
dmVydGVyCisgKiAgd2hlbiBpdCBlbmNvdW50ZXJzIElMTEVHQUwvVU5NQVBQRUQvSU5WQUxJRCBz
ZXF1ZW5jZXMuCisgKgorICogIHVzYWdlIGV4YW1wbGU6ICAnU1RPUCcgZG9lc24ndCBuZWVkIGFu
eSBjb250ZXh0LCBidXQgbmV3Q29udGV4dAorICogICAgY291bGQgYmUgc2V0IHRvIHNvbWV0aGlu
ZyBvdGhlciB0aGFuICdOVUxMJyBpZiBuZWVkZWQuIFRoZSBhdmFpbGFibGUKKyAqICAgIGNvbnRl
eHRzIGluIHRoaXMgaGVhZGVyIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhl
IGNhbGxiYWNrLgorICoKKyAqICBcY29kZQorICogIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VS
Uk9SOworICogIFVDb252ZXJ0ZXIgKm15Q29udmVydGVyID0gdWNudl9vcGVuKCJpYm0tOTQ5Iiwg
JmVycik7CisgKiAgY29uc3Qgdm9pZCAqb2xkQ29udGV4dDsKKyAqICBVQ29udmVydGVyRnJvbVVD
YWxsYmFjayBvbGRBY3Rpb247CisgKgorICoKKyAqICBpZiAoVV9TVUNDRVNTKGVycikpCisgKiAg
eworICogICAgICB1Y252X3NldEZyb21VQ2FsbEJhY2sobXlDb252ZXJ0ZXIsCisgKiAgICAgICAg
ICAgICAgICAgICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1RPUCwKKyAqICAgICAgICAgICAg
ICAgICAgICAgICBOVUxMLAorICogICAgICAgICAgICAgICAgICAgICAgICZvbGRBY3Rpb24sCisg
KiAgICAgICAgICAgICAgICAgICAgICAgJm9sZENvbnRleHQsCisgKiAgICAgICAgICAgICAgICAg
ICAgICAgJnN0YXR1cyk7CisgKiAgfQorICogIFxlbmRjb2RlCisgKgorICogIFRoZSBjb2RlIGFi
b3ZlIHRlbGxzICJteUNvbnZlcnRlciIgdG8gc3RvcCB3aGVuIGl0IGVuY291bnRlcnMgYW4KKyAq
ICBJTExFR0FML1RSVU5DQVRFRC9JTlZBTElEIHNlcXVlbmNlcyB3aGVuIGl0IGlzIHVzZWQgdG8g
Y29udmVydCBmcm9tCisgKiAgVW5pY29kZSAtPiBDb2RlcGFnZS4gVGhlIGJlaGF2aW9yIGZyb20g
Q29kZXBhZ2UgdG8gVW5pY29kZSBpcyBub3QgY2hhbmdlZCwKKyAqICBhbmQgdWNudl9zZXRUb1VD
YWxsQmFjayB3b3VsZCBuZWVkIHRvIGJlIGNhbGxlZCBpbiBvcmRlciB0byBjaGFuZ2UKKyAqICB0
aGF0IGJlaGF2aW9yIHRvby4KKyAqCisgKiAgSGVyZSBpcyBhbiBleGFtcGxlIHdpdGggYSBjb250
ZXh0OgorICoKKyAqICBcY29kZQorICogIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwor
ICogIFVDb252ZXJ0ZXIgKm15Q29udmVydGVyID0gdWNudl9vcGVuKCJpYm0tOTQ5IiwgJmVycik7
CisgKiAgY29uc3Qgdm9pZCAqb2xkQ29udGV4dDsKKyAqICBVQ29udmVydGVyRnJvbVVDYWxsYmFj
ayBvbGRBY3Rpb247CisgKgorICoKKyAqICBpZiAoVV9TVUNDRVNTKGVycikpCisgKiAgeworICog
ICAgICB1Y252X3NldFRvVUNhbGxCYWNrKG15Q29udmVydGVyLAorICogICAgICAgICAgICAgICAg
ICAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TVUJTVElUVVRFLAorICogICAgICAgICAgICAgICAg
ICAgICAgIFVDTlZfU1VCX1NUT1BfT05fSUxMRUdBTCwKKyAqICAgICAgICAgICAgICAgICAgICAg
ICAmb2xkQWN0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICZvbGRDb250ZXh0LAorICog
ICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICogIH0KKyAqICBcZW5kY29kZQorICoK
KyAqICBUaGUgY29kZSBhYm92ZSB0ZWxscyAibXlDb252ZXJ0ZXIiIHRvIHN0b3Agd2hlbiBpdCBl
bmNvdW50ZXJzIGFuCisgKiAgSUxMRUdBTC9UUlVOQ0FURUQvSU5WQUxJRCBzZXF1ZW5jZXMgd2hl
biBpdCBpcyB1c2VkIHRvIGNvbnZlcnQgZnJvbQorICogIENvZGVwYWdlIC0+IFVuaWNvZGUuIEFu
eSB1bm1hcHBlZCBhbmQgbGVnYWwgY2hhcmFjdGVycyB3aWxsIGJlCisgKiAgc3Vic3RpdHV0ZWQg
dG8gYmUgdGhlIGRlZmF1bHQgc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKyAqLworCisjaWZuZGVm
IFVDTlZfRVJSX0gKKyNkZWZpbmUgVUNOVl9FUlJfSAorCisjaW5jbHVkZSAidW5pY29kZS91dHlw
ZXMuaCIKKworI2lmICFVQ09ORklHX05PX0NPTlZFUlNJT04KKworLyoqIEZvcndhcmQgZGVjbGFy
aW5nIHRoZSBVQ29udmVydGVyIHN0cnVjdHVyZS4gQHN0YWJsZSBJQ1UgMi4wICovCitzdHJ1Y3Qg
VUNvbnZlcnRlcjsKKworLyoqIEBzdGFibGUgSUNVIDIuMCAqLwordHlwZWRlZiBzdHJ1Y3QgVUNv
bnZlcnRlciBVQ29udmVydGVyOworCisvKioKKyAqIEZST01fVSwgVE9fVSBjb250ZXh0IG9wdGlv
bnMgZm9yIHN1YiBjYWxsYmFjaworICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KKyNkZWZpbmUgVUNO
Vl9TVUJfU1RPUF9PTl9JTExFR0FMICJpIgorCisvKioKKyAqIEZST01fVSwgVE9fVSBjb250ZXh0
IG9wdGlvbnMgZm9yIHNraXAgY2FsbGJhY2sKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVm
aW5lIFVDTlZfU0tJUF9TVE9QX09OX0lMTEVHQUwgImkiCisKKy8qKgorICogRlJPTV9VX0NBTExC
QUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRp
bmcgdG8gSUNVICglVVhYWFgpIAorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KKyNkZWZpbmUgVUNO
Vl9FU0NBUEVfSUNVICAgICAgIE5VTEwKKy8qKgorICogRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSBj
b250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRpbmcgdG8gSkFWQSAo
XFx1WFhYWCkKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCisjZGVmaW5lIFVDTlZfRVNDQVBFX0pB
VkEgICAgICAiSiIKKy8qKgorICogRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlv
biB0byBlc2NhcGUgdGhlIGNvZGUgdW5pdCBhY2NvcmRpbmcgdG8gQyAoXFx1WFhYWCBcXFVYWFhY
WFhYWCkKKyAqIFRPX1VfQ0FMTEJBQ0tfRVNDQVBFIG9wdGlvbiB0byBlc2NhcGUgdGhlIGNoYXJh
Y3RlciB2YWx1ZSBhY2NvZGluZyB0byBDIChcXHhYWFhYKQorICogQHN0YWJsZSBJQ1UgMi4wCisg
Ki8KKyNkZWZpbmUgVUNOVl9FU0NBUEVfQyAgICAgICAgICJDIgorLyoqCisgKiBGUk9NX1VfQ0FM
TEJBQ0tfRVNDQVBFIGNvbnRleHQgb3B0aW9uIHRvIGVzY2FwZSB0aGUgY29kZSB1bml0IGFjY29y
ZGluZyB0byBYTUwgRGVjaW1hbCBlc2NhcGUgKCZhbXA7I0REREQ7KQorICogVE9fVV9DQUxMQkFD
S19FU0NBUEUgY29udGV4dCBvcHRpb24gdG8gZXNjYXBlIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYWNj
b2RpbmcgdG8gWE1MIERlY2ltYWwgZXNjYXBlICgmYW1wOyNEREREOykKKyAqIEBzdGFibGUgSUNV
IDIuMAorICovCisjZGVmaW5lIFVDTlZfRVNDQVBFX1hNTF9ERUMgICAiRCIKKy8qKgorICogRlJP
TV9VX0NBTExCQUNLX0VTQ0FQRSBjb250ZXh0IG9wdGlvbiB0byBlc2NhcGUgdGhlIGNvZGUgdW5p
dCBhY2NvcmRpbmcgdG8gWE1MIEhleCBlc2NhcGUgKCZhbXA7I3hYWFhYOykKKyAqIFRPX1VfQ0FM
TEJBQ0tfRVNDQVBFIGNvbnRleHQgb3B0aW9uIHRvIGVzY2FwZSB0aGUgY2hhcmFjdGVyIHZhbHVl
IGFjY29kaW5nIHRvIFhNTCBIZXggZXNjYXBlICgmYW1wOyN4WFhYWDspCisgKiBAc3RhYmxlIElD
VSAyLjAKKyAqLworI2RlZmluZSBVQ05WX0VTQ0FQRV9YTUxfSEVYICAgIlgiCisvKioKKyAqIEZS
T01fVV9DQUxMQkFDS19FU0NBUEUgY29udGV4dCBvcHRpb24gdG8gZXNjYXBlIHRlaCBjb2RlIHVu
aXQgYWNjb3JkaW5nIHRvIFVuaWNvZGUgKFUrWFhYWFgpCisgKiBAc3RhYmxlIElDVSAyLjAKKyAq
LworI2RlZmluZSBVQ05WX0VTQ0FQRV9VTklDT0RFICAgIlUiCisKKy8qKiAKKyAqIFRoZSBwcm9j
ZXNzIGNvbmRpdGlvbiBjb2RlIHRvIGJlIHVzZWQgd2l0aCB0aGUgY2FsbGJhY2tzLiAgCisgKiBD
b2RlcyB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIFVDTlZfSVJSRUdVTEFSIHNob3VsZCBiZSAKKyAq
IHBhc3NlZCBvbiB0byBhbnkgY2hhaW5lZCBjYWxsYmFja3MuCisgKiBAc3RhYmxlIElDVSAyLjAK
KyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBVQ05WX1VOQVNTSUdORUQgPSAwLCAgLyoqPCBUaGUg
Y29kZSBwb2ludCBpcyB1bmFzc2lnbmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU
aGUgZXJyb3IgY29kZSBVX0lOVkFMSURfQ0hBUl9GT1VORCB3aWxsIGJlIHNldC4gKi8KKyAgICBV
Q05WX0lMTEVHQUwgPSAxLCAgICAgLyoqPCBUaGUgY29kZSBwb2ludCBpcyBpbGxlZ2FsLiBGb3Ig
ZXhhbXBsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxceDgxXFx4MkUgaXMgaWxs
ZWdhbCBpbiBTSklTIGJlY2F1c2UgXFx4MkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aXMgbm90IGEgdmFsaWQgdHJhaWwgYnl0ZSBmb3IgdGhlIFxceDgxIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBsZWFkIGJ5dGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFs
c28sIHN0YXJ0aW5nIHdpdGggVW5pY29kZSAzLjAuMSwgbm9uLXNob3J0ZXN0IGJ5dGUgc2VxdWVu
Y2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFVURi04IChsaWtlIFxceEMxXFx4
QTEgaW5zdGVhZCBvZiBcXHg2MSBmb3IgVSswMDYxKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhcmUgYWxzbyBpbGxlZ2FsLCBub3QganVzdCBpcnJlZ3VsYXIuCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFRoZSBlcnJvciBjb2RlIFVfSUxMRUdBTF9DSEFSX0ZPVU5EIHdpbGwg
YmUgc2V0LiAqLworICAgIFVDTlZfSVJSRUdVTEFSID0gMiwgICAvKio8IFRoZSBjb2RlcG9pbnQg
aXMgbm90IGEgcmVndWxhciBzZXF1ZW5jZSBpbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhlIGVuY29kaW5nLiBGb3IgZXhhbXBsZSwgXFx4RURcXHhBMFxceDgwLi5cXHhFRFxceEJG
XFx4QkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGlycmVndWxhciBVVEYtOCBi
eXRlIHNlcXVlbmNlcyBmb3Igc2luZ2xlIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb2RlIHBvaW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVy
cm9yIGNvZGUgVV9JTlZBTElEX0NIQVJfRk9VTkQgd2lsbCBiZSBzZXQuICovCisgICAgVUNOVl9S
RVNFVCA9IDMsICAgICAgIC8qKjwgVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoaXMgcmVh
c29uIHdoZW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZXQnIGhhcyBvY2N1
cmVkLiBDYWxsYmFjayBzaG91bGQgcmVzZXQgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlLiAqLworICAgIFVDTlZfQ0xPU0UgPSA0LCAgICAgICAgLyoqPCBDYWxsZWQgd2hl
biB0aGUgY29udmVydGVyIGlzIGNsb3NlZC4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNhbGxiYWNrIHNob3VsZCByZWxlYXNlIGFueSBhbGxvY2F0ZWQgbWVtb3J5LiovCisgICAg
VUNOVl9DTE9ORSA9IDUgICAgICAgICAvKio8IENhbGxlZCB3aGVuIHVjbnZfc2FmZUNsb25lKCkg
aXMgY2FsbGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVy
LiB0aGUgcG9pbnRlciBhdmFpbGFibGUgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnY29udGV4dCcgaXMgYW4gYWxpYXMgdG8gdGhlIG9yaWdpbmFsIGNvbnZlcnRlcnMnCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0IHBvaW50ZXIuIElmIHRoZSBjb250
ZXh0IG11c3QgYmUgb3duZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBu
ZXcgY29udmVydGVyLCB0aGUgY2FsbGJhY2sgbXVzdCBjbG9uZSAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRoZSBkYXRhIGFuZCBjYWxsIHVjbnZfc2V0RnJvbVVDYWxsYmFjayAKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBzZXRUb1VDYWxsYmFjaykgd2l0aCB0aGUg
Y29ycmVjdCBwb2ludGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YWJsZSBJ
Q1UgMi4yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBVQ29udmVydGVyQ2FsbGJh
Y2tSZWFzb247CisKKworLyoqCisgKiBUaGUgc3RydWN0dXJlIGZvciB0aGUgZnJvbVVuaWNvZGUg
Y2FsbGJhY2sgZnVuY3Rpb24gcGFyYW1ldGVyLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK3R5
cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBUaGUg
c2l6ZSBvZiB0aGlzIHN0cnVjdC4gQHN0YWJsZSBJQ1UgMi4wICovCisgICAgVUJvb2wgZmx1c2g7
ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGludGVybmFsIHN0YXRlIG9mIGNvbnZlcnRlciB3aWxs
IGJlIHJlc2V0IGFuZCBkYXRhIGZsdXNoZWQgaWYgc2V0IHRvIFRSVUUuIEBzdGFibGUgSUNVIDIu
MCAgICAqLworICAgIFVDb252ZXJ0ZXIgKmNvbnZlcnRlcjsgICAgICAvKio8IFBvaW50ZXIgdG8g
dGhlIGNvbnZlcnRlciB0aGF0IGlzIG9wZW5lZCBhbmQgdG8gd2hpY2ggdGhpcyBzdHJ1Y3QgaXMg
cGFzc2VkIGFzIGFuIGFyZ3VtZW50LiBAc3RhYmxlIElDVSAyLjAgICovCisgICAgY29uc3QgVUNo
YXIgKnNvdXJjZTsgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgc291cmNlIHNvdXJjZSBidWZm
ZXIuIEBzdGFibGUgSUNVIDIuMCAgICAqLworICAgIGNvbnN0IFVDaGFyICpzb3VyY2VMaW1pdDsg
ICAvKio8IFBvaW50ZXIgdG8gdGhlIGxpbWl0IChlbmQgKyAxKSBvZiBzb3VyY2UgYnVmZmVyLiBA
c3RhYmxlIElDVSAyLjAgICAgKi8KKyAgICBjaGFyICp0YXJnZXQ7ICAgICAgICAgICAgICAgLyoq
PCBQb2ludGVyIHRvIHRoZSB0YXJnZXQgYnVmZmVyLiBAc3RhYmxlIElDVSAyLjAgICAgKi8KKyAg
ICBjb25zdCBjaGFyICp0YXJnZXRMaW1pdDsgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBsaW1pdCAo
ZW5kICsgMSkgb2YgdGFyZ2V0IGJ1ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICAqLworICAgIGlu
dDMyX3QgKm9mZnNldHM7ICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0
IHJlY2lldmVzIHRoZSBvZmZzZXRzLiAqb2Zmc2V0ID0gYmxhaCA7IG9mZnNldCsrOy4gQHN0YWJs
ZSBJQ1UgMi4wICAqLworfSBVQ29udmVydGVyRnJvbVVuaWNvZGVBcmdzOworCisKKy8qKgorICog
VGhlIHN0cnVjdHVyZSBmb3IgdGhlIHRvVW5pY29kZSBjYWxsYmFjayBmdW5jdGlvbiBwYXJhbWV0
ZXIuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQx
Nl90IHNpemU7ICAgICAgICAgICAgICAvKio8IFRoZSBzaXplIG9mIHRoaXMgc3RydWN0ICAgQHN0
YWJsZSBJQ1UgMi4wICovCisgICAgVUJvb2wgZmx1c2g7ICAgICAgICAgICAgICAgIC8qKjwgVGhl
IGludGVybmFsIHN0YXRlIG9mIGNvbnZlcnRlciB3aWxsIGJlIHJlc2V0IGFuZCBkYXRhIGZsdXNo
ZWQgaWYgc2V0IHRvIFRSVUUuIEBzdGFibGUgSUNVIDIuMCAgICovCisgICAgVUNvbnZlcnRlciAq
Y29udmVydGVyOyAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgY29udmVydGVyIHRoYXQgaXMgb3Bl
bmVkIGFuZCB0byB3aGljaCB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIEBz
dGFibGUgSUNVIDIuMCAqLworICAgIGNvbnN0IGNoYXIgKnNvdXJjZTsgICAgICAgICAvKio8IFBv
aW50ZXIgdG8gdGhlIHNvdXJjZSBzb3VyY2UgYnVmZmVyLiBAc3RhYmxlIElDVSAyLjAgICAgKi8K
KyAgICBjb25zdCBjaGFyICpzb3VyY2VMaW1pdDsgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBsaW1p
dCAoZW5kICsgMSkgb2Ygc291cmNlIGJ1ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICovCisgICAg
VUNoYXIgKnRhcmdldDsgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1
ZmZlci4gQHN0YWJsZSBJQ1UgMi4wICAgICovCisgICAgY29uc3QgVUNoYXIgKnRhcmdldExpbWl0
OyAgIC8qKjwgUG9pbnRlciB0byB0aGUgbGltaXQgKGVuZCArIDEpIG9mIHRhcmdldCBidWZmZXIu
IEBzdGFibGUgSUNVIDIuMCAgICAgKi8KKyAgICBpbnQzMl90ICpvZmZzZXRzOyAgICAgICAgICAg
LyoqPCBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCByZWNpZXZlcyB0aGUgb2Zmc2V0cy4gKm9m
ZnNldCA9IGJsYWggOyBvZmZzZXQrKzsuIEBzdGFibGUgSUNVIDIuMCAgKi8KK30gVUNvbnZlcnRl
clRvVW5pY29kZUFyZ3M7CisKKworLyoqCisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJ
UkVDVExZIQorICogVGhpcyBGcm9tIFVuaWNvZGUgY2FsbGJhY2sgU1RPUFMgYXQgdGhlIElMTEVH
QUxfU0VRVUVOQ0UsCisgKiByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYmFjayB0byB0aGUgY2Fs
bGVyIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFBvaW50ZXIgdG8gdGhlIGNh
bGxiYWNrJ3MgcHJpdmF0ZSBkYXRhCisgKiBAcGFyYW0gZnJvbVVBcmdzIEluZm9ybWF0aW9uIGFi
b3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29kZVVuaXRzIFBvaW50
cyB0byAnbGVuZ3RoJyBVQ2hhcnMgb2YgdGhlIGNvbmNlcm5lZCBVbmljb2RlIHNlcXVlbmNlCisg
KiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdl
IHNlcXVlbmNlCisgKiBAcGFyYW0gY29kZVBvaW50IFNpbmdsZSBVQ2hhcjMyIChVVEYtMzIpIGNv
bnRhaW5pbmcgdGhlIGNvbmNlcmVuZCBVbmljb2RlIGNvZGVwb2ludC4KKyAqIEBwYXJhbSByZWFz
b24gRGVmaW5lcyB0aGUgcmVhc29uIHRoZSBjYWxsYmFjayB3YXMgaW52b2tlZAorICogQHBhcmFt
IGVyciBUaGlzIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIGEgZmFpbHVyZSBzdGF0dXMgcHJpb3Ig
dG8gY2FsbGluZy4KKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQ
T1JUMiBVQ05WX0ZST01fVV9DQUxMQkFDS19TVE9QICgKKyAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVyRnJvbVVuaWNvZGVB
cmdzICpmcm9tVUFyZ3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY29kZVVuaXRz
LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBV
Q2hhcjMyIGNvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworCisK
Ky8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSEKKyAqIFRoaXMgVG8g
VW5pY29kZSBjYWxsYmFjayBTVE9QUyBhdCB0aGUgSUxMRUdBTF9TRVFVRU5DRSwKKyAqIHJldHVy
bmluZyB0aGUgZXJyb3IgY29kZSBiYWNrIHRvIHRoZSBjYWxsZXIgaW1tZWRpYXRlbHkuCisgKgor
ICogQHBhcmFtIGNvbnRleHQgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sncyBwcml2YXRlIGRhdGEK
KyAqIEBwYXJhbSB0b1VBcmdzIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHBy
b2dyZXNzCisgKiBAcGFyYW0gY29kZVVuaXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0
aGUgY29uY2VybmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGlu
IGJ5dGVzKSBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVh
c29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJh
bSBlcnIgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzIHByaW9y
IHRvIGNhbGxpbmcuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUgdm9pZCBVX0VY
UE9SVDIgVUNOVl9UT19VX0NBTExCQUNLX1NUT1AgKAorICAgICAgICAgICAgICAgICAgY29uc3Qg
dm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1VuaWNvZGVBcmdz
ICp0b1VBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29kZVVuaXRzLAorICAg
ICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBVQ29udmVy
dGVyQ2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAq
IGVycik7CisKKy8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSEKKyAq
IFRoaXMgRnJvbSBVbmljb2RlIGNhbGxiYWNrIHNraXBzIGFueSBJTExFR0FMX1NFUVVFTkNFLCBv
cgorICogc2tpcHMgb25seSBVTkFTU0lOR0VEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiB0aGUgY29u
dGV4dCBwYXJhbWV0ZXIKKyAqIHNpbXBseSBpZ25vcmluZyB0aG9zZSBjaGFyYWN0ZXJzLiAKKyAq
CisgKiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25pemVzIHRo
ZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAgIFVDTlZfU0tJUF9TVE9QX09O
X0lMTEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FMX1NFUVVFTkNFLAorICogICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1l
ZGlhdGVseS4KKyAqICAgICAgICAgICAgICAgICBOVUxMOiBTa2lwcyBhbnkgSUxMRUdBTF9TRVFV
RU5DRQorICogQHBhcmFtIGZyb21VQXJncyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lv
biBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNo
YXJzIG9mIHRoZSBjb25jZXJuZWQgVW5pY29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBT
aXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBh
cmFtIGNvZGVQb2ludCBTaW5nbGUgVUNoYXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25j
ZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQuCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJl
YXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVl
IHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICog
ICAgICBvdGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVz
LgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIFVDTlZf
RlJPTV9VX0NBTExCQUNLX1NLSVAgKAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29u
dGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVW5pY29kZUFyZ3MgKmZyb21V
QXJncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBjb2RlVW5pdHMsCisgICAgICAg
ICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDaGFyMzIgY29k
ZVBvaW50LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlckNhbGxiYWNrUmVhc29uIHJlYXNv
biwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKiBlcnIpOworCisvKioKKyAqIERPIE5P
VCBDQUxMIFRISVMgRlVOQ1RJT04gRElSRUNUTFkhCisgKiBUaGlzIEZyb20gVW5pY29kZSBjYWxs
YmFjayB3aWxsIFN1YnN0aXR1dGUgdGhlIElMTEVHQUwgU0VRVUVOQ0UsIG9yIAorICogVU5BU1NJ
R05FRF9TRVFVRU5DRSBkZXBlbmRpbmcgb24gY29udGV4dCBwYXJhbWV0ZXIsIHdpdGggdGhlCisg
KiBjdXJyZW50IHN1YnN0aXR1dGlvbiBzdHJpbmcgZm9yIHRoZSBjb252ZXJ0ZXIuIFRoaXMgaXMg
dGhlIGRlZmF1bHQKKyAqIGNhbGxiYWNrLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBmdW5j
dGlvbiBjdXJyZW50bHkgcmVjb2duaXplcyB0aGUgY2FsbGJhY2sgb3B0aW9uczoKKyAqICAgICAg
ICAgICAgICAgICBVQ05WX1NVQl9TVE9QX09OX0lMTEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FM
X1NFUVVFTkNFLAorICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBj
b2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1lZGlhdGVseS4KKyAqICAgICAgICAgICAgICAgICBO
VUxMOiBTdWJzdGl0dXRlcyBhbnkgSUxMRUdBTF9TRVFVRU5DRQorICogQHBhcmFtIGZyb21VQXJn
cyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFt
IGNvZGVVbml0cyBQb2ludHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQgVW5p
Y29kZSBzZXF1ZW5jZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNv
bmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUgVUNo
YXIzMiAoVVRGLTMyKSBjb250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQu
CisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGlu
dm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3Mg
aWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICogICAgICBvdGhlcndpc2UgdGhpcyB2YWx1
ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzLgorICogQHNlZSB1Y252X3NldFN1YnN0
Q2hhcnMKKyAqIEBzdGFibGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiBV
Q05WX0ZST01fVV9DQUxMQkFDS19TVUJTVElUVVRFICgKKyAgICAgICAgICAgICAgICAgIGNvbnN0
IHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVyRnJvbVVuaWNvZGVB
cmdzICpmcm9tVUFyZ3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY29kZVVuaXRz
LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBV
Q2hhcjMyIGNvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworLyoq
CisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICogVGhpcyBGcm9tIFVu
aWNvZGUgY2FsbGJhY2sgd2lsbCBTdWJzdGl0dXRlIHRoZSBJTExFR0FMIFNFUVVFTkNFIHdpdGgg
dGhlCisgKiBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWxsZWdhbCBjb2RlcG9p
bnRzCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25p
emVzIHRoZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgIDx1bD4KKyAqICAgICAgICA8bGk+
VUNOVl9FU0NBUEVfSUNVOiBTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRo
ZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmb3JtYXQg
ICVVWFhYWCwgZS5nLiAiJXVGRkZFJXUwMEFDJXVDOEZFIikuIAorICogICAgICAgICAgSW4gdGhl
IEV2ZW50IHRoZSBjb252ZXJ0ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBjaGFyYWN0ZXJzIHslLFV9
W0EtRl1bMC05XSwgCisgKiAgICAgICAgICBpdCB3aWxsICBzdWJzdGl0dXRlICB0aGUgaWxsZWdh
bCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJzdGl0dXRpb24gY2hhcmFjdGVycy4KKyAqICAgICAgICAg
IE5vdGUgdGhhdCAgY29kZVVuaXQoMzJiaXQgaW50IGVnOiB1bml0IG9mIGEgc3Vycm9nYXRlIHBh
aXIpIGlzIHJlcHJlc2VudGVkIGFzCisgKiAgICAgICAgICAlVUQ4NEQlVURDNTY8L2xpPgorICog
ICAgICAgIDxsaT5VQ05WX0VTQ0FQRV9KQVZBOiBTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFV
RU5DRSB3aXRoIHRoZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGlu
IHRoZSBmb3JtYXQgIFxcdVhYWFgsIGUuZy4gIlxcdUZGRkVcXHUwMEFDXFx1QzhGRSIpLiAKKyAq
ICAgICAgICAgIEluIHRoZSBFdmVudCB0aGUgY29udmVydGVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUg
Y2hhcmFjdGVycyB7XCx1fVtBLUZdWzAtOV0sIAorICogICAgICAgICAgaXQgd2lsbCAgc3Vic3Rp
dHV0ZSAgdGhlIGlsbGVnYWwgc2VxdWVuY2Ugd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3Rl
cnMuCisgKiAgICAgICAgICBOb3RlIHRoYXQgIGNvZGVVbml0KDMyYml0IGludCBlZzogdW5pdCBv
ZiBhIHN1cnJvZ2F0ZSBwYWlyKSBpcyByZXByZXNlbnRlZCBhcworICogICAgICAgICAgXFx1RDg0
RFxcdURDNTY8L2xpPgorICogICAgICAgIDxsaT5VQ05WX0VTQ0FQRV9DOiBTdWJzdGl0dWVzIHRo
ZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZSBoZXhhZGVjaW1hbCAKKyAqICAgICAgICAgIHJl
cHJlc2VudGF0aW9uIGluIHRoZSBmb3JtYXQgIFxcdVhYWFgsIGUuZy4gIlxcdUZGRkVcXHUwMEFD
XFx1QzhGRSIpLiAKKyAqICAgICAgICAgIEluIHRoZSBFdmVudCB0aGUgY29udmVydGVyIGRvZXNu
J3Qgc3VwcG9ydCB0aGUgY2hhcmFjdGVycyB7XCx1LFV9W0EtRl1bMC05XSwgCisgKiAgICAgICAg
ICBpdCB3aWxsICBzdWJzdGl0dXRlICB0aGUgaWxsZWdhbCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJz
dGl0dXRpb24gY2hhcmFjdGVycy4KKyAqICAgICAgICAgIE5vdGUgdGhhdCAgY29kZVVuaXQoMzJi
aXQgaW50IGVnOiB1bml0IG9mIGEgc3Vycm9nYXRlIHBhaXIpIGlzIHJlcHJlc2VudGVkIGFzCisg
KiAgICAgICAgICBcXFUwMDAyMzQ1NjwvbGk+CisgKiAgICAgICAgPGxpPlVDTlZfRVNDQVBFX1hN
TF9ERUM6IFN1YnN0aXR1ZXMgdGhlICBJTExFR0FMIFNFUVVFTkNFIHdpdGggdGhlIGRlY2ltYWwg
CisgKiAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiB0aGUgZm9ybWF0ICAmYW1wOyNERERERERE
RDssIGUuZy4gIiZhbXA7IzY1NTM0OyZhbXA7IzE3MjsmYW1wOyM1MTQ1NDsiKS4gCisgKiAgICAg
ICAgICBJbiB0aGUgRXZlbnQgdGhlIGNvbnZlcnRlciBkb2Vzbid0IHN1cHBvcnQgdGhlIGNoYXJh
Y3RlcnMgeyZhbXA7LCN9WzAtOV0sIAorICogICAgICAgICAgaXQgd2lsbCAgc3Vic3RpdHV0ZSAg
dGhlIGlsbGVnYWwgc2VxdWVuY2Ugd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMuCisg
KiAgICAgICAgICBOb3RlIHRoYXQgIGNvZGVVbml0KDMyYml0IGludCBlZzogdW5pdCBvZiBhIHN1
cnJvZ2F0ZSBwYWlyKSBpcyByZXByZXNlbnRlZCBhcworICogICAgICAgICAgJmFtcDsjMTQ0NDcw
OyBhbmQgWmVybyBwYWRkaW5nIGlzIGlnbm9yZWQuPC9saT4KKyAqICAgICAgICA8bGk+VUNOVl9F
U0NBUEVfWE1MX0hFWDpTdWJzdGl0dWVzIHRoZSAgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZSBk
ZWNpbWFsIAorICogICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gdGhlIGZvcm1hdCAgJiN4WFhY
WCwgZS5nLiAiJmFtcDsjeEZGRkU7JmFtcDsjeDAwQUM7JmFtcDsjeEM4RkU7IikuIAorICogICAg
ICAgICAgSW4gdGhlIEV2ZW50IHRoZSBjb252ZXJ0ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBjaGFy
YWN0ZXJzIHsmLCMseH1bMC05XSwgCisgKiAgICAgICAgICBpdCB3aWxsICBzdWJzdGl0dXRlICB0
aGUgaWxsZWdhbCBzZXF1ZW5jZSB3aXRoIHRoZSBzdWJzdGl0dXRpb24gY2hhcmFjdGVycy4KKyAq
ICAgICAgICAgIE5vdGUgdGhhdCAgY29kZVVuaXQoMzJiaXQgaW50IGVnOiB1bml0IG9mIGEgc3Vy
cm9nYXRlIHBhaXIpIGlzIHJlcHJlc2VudGVkIGFzCisgKiAgICAgICAgICAmYW1wOyN4MjM0NTY7
PC9saT4KKyAqICAgICAgICA8L3VsPgorICogQHBhcmFtIGZyb21VQXJncyBJbmZvcm1hdGlvbiBh
Ym91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQb2lu
dHMgdG8gJ2xlbmd0aCcgVUNoYXJzIG9mIHRoZSBjb25jZXJuZWQgVW5pY29kZSBzZXF1ZW5jZQor
ICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFn
ZSBzZXF1ZW5jZQorICogQHBhcmFtIGNvZGVQb2ludCBTaW5nbGUgVUNoYXIzMiAoVVRGLTMyKSBj
b250YWluaW5nIHRoZSBjb25jZXJlbmQgVW5pY29kZSBjb2RlcG9pbnQuCisgKiBAcGFyYW0gcmVh
c29uIERlZmluZXMgdGhlIHJlYXNvbiB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJh
bSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNr
IHdhcyBoYW5kbGVkLAorICogICAgICBvdGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0
byBhIGZhaWx1cmUgc3RhdHVzLgorICogQHN0YWJsZSBJQ1UgMi4wCisgKi8KK1VfU1RBQkxFIHZv
aWQgVV9FWFBPUlQyIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSAoCisgICAgICAgICAgICAg
ICAgICBjb25zdCB2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlckZy
b21Vbmljb2RlQXJncyAqZnJvbVVBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIq
IGNvZGVVbml0cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgVUNoYXIzMiBjb2RlUG9pbnQsCisgICAgICAgICAgICAgICAgICBVQ29udmVydGVy
Q2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqIGVy
cik7CisKKworLyoqCisgKiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICog
VGhpcyBUbyBVbmljb2RlIGNhbGxiYWNrIHNraXBzIGFueSBJTExFR0FMX1NFUVVFTkNFLCBvcgor
ICogc2tpcHMgb25seSBVTkFTU0lOR0VEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiB0aGUgY29udGV4
dCBwYXJhbWV0ZXIKKyAqIHNpbXBseSBpZ25vcmluZyB0aG9zZSBjaGFyYWN0ZXJzLiAKKyAqCisg
KiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSByZWNvZ25pemVzIHRoZSBj
YWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAgIFVDTlZfU0tJUF9TVE9QX09OX0lM
TEVHQUw6IFNUT1BTIGF0IHRoZSBJTExFR0FMX1NFUVVFTkNFLAorICogICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIGNhbGxlciBpbW1lZGlh
dGVseS4KKyAqICAgICAgICAgICAgICAgICBOVUxMOiBTa2lwcyBhbnkgSUxMRUdBTF9TRVFVRU5D
RQorICogQHBhcmFtIHRvVUFyZ3MgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnZlcnNpb24gaW4g
cHJvZ3Jlc3MKKyAqIEBwYXJhbSBjb2RlVW5pdHMgUG9pbnRzIHRvICdsZW5ndGgnIGJ5dGVzIG9m
IHRoZSBjb25jZXJuZWQgY29kZXBhZ2Ugc2VxdWVuY2UKKyAqIEBwYXJhbSBsZW5ndGggU2l6ZSAo
aW4gYnl0ZXMpIG9mIHRoZSBjb25jZXJuZWQgY29kZXBhZ2Ugc2VxdWVuY2UKKyAqIEBwYXJhbSBy
ZWFzb24gRGVmaW5lcyB0aGUgcmVhc29uIHRoZSBjYWxsYmFjayB3YXMgaW52b2tlZAorICogQHBh
cmFtIGVyciBSZXR1cm4gdmFsdWUgd2lsbCBiZSBzZXQgdG8gc3VjY2VzcyBpZiB0aGUgY2FsbGJh
Y2sgd2FzIGhhbmRsZWQsCisgKiAgICAgIG90aGVyd2lzZSB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0
IHRvIGEgZmFpbHVyZSBzdGF0dXMuCisgKiBAc3RhYmxlIElDVSAyLjAKKyAqLworVV9TVEFCTEUg
dm9pZCBVX0VYUE9SVDIgVUNOVl9UT19VX0NBTExCQUNLX1NLSVAgKAorICAgICAgICAgICAgICAg
ICAgY29uc3Qgdm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJUb1Vu
aWNvZGVBcmdzICp0b1VBcmdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29kZVVu
aXRzLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAg
ICBVQ29udmVydGVyQ2FsbGJhY2tSZWFzb24gcmVhc29uLAorICAgICAgICAgICAgICAgICAgVUVy
cm9yQ29kZSAqIGVycik7CisKKy8qKgorICogRE8gTk9UIENBTEwgVEhJUyBGVU5DVElPTiBESVJF
Q1RMWSEKKyAqIFRoaXMgVG8gVW5pY29kZSBjYWxsYmFjayB3aWxsIFN1YnN0aXR1dGUgdGhlIElM
TEVHQUwgU0VRVUVOQ0Usb3IgCisgKiBVTkFTU0lHTkVEX1NFUVVFTkNFIGRlcGVuZGluZyBvbiBj
b250ZXh0IHBhcmFtZXRlciwgIHdpdGggdGhlCisgKiBVbmljb2RlIHN1YnN0aXR1dGlvbiBjaGFy
YWN0ZXIsIFUrRkZGRC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCAgVGhlIGZ1bmN0aW9uIGN1cnJl
bnRseSByZWNvZ25pemVzIHRoZSBjYWxsYmFjayBvcHRpb25zOgorICogICAgICAgICAgICAgICAg
IFVDTlZfU1VCX1NUT1BfT05fSUxMRUdBTDogU1RPUFMgYXQgdGhlIElMTEVHQUxfU0VRVUVOQ0Us
CisgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYmFjayB0
byB0aGUgY2FsbGVyIGltbWVkaWF0ZWx5LgorICogICAgICAgICAgICAgICAgIE5VTEw6IFN1YnN0
aXR1dGVzIGFueSBJTExFR0FMX1NFUVVFTkNFCisgKiBAcGFyYW0gdG9VQXJncyBJbmZvcm1hdGlv
biBhYm91dCB0aGUgY29udmVyc2lvbiBpbiBwcm9ncmVzcworICogQHBhcmFtIGNvZGVVbml0cyBQ
b2ludHMgdG8gJ2xlbmd0aCcgYnl0ZXMgb2YgdGhlIGNvbmNlcm5lZCBjb2RlcGFnZSBzZXF1ZW5j
ZQorICogQHBhcmFtIGxlbmd0aCBTaXplIChpbiBieXRlcykgb2YgdGhlIGNvbmNlcm5lZCBjb2Rl
cGFnZSBzZXF1ZW5jZQorICogQHBhcmFtIHJlYXNvbiBEZWZpbmVzIHRoZSByZWFzb24gdGhlIGNh
bGxiYWNrIHdhcyBpbnZva2VkCisgKiBAcGFyYW0gZXJyIFJldHVybiB2YWx1ZSB3aWxsIGJlIHNl
dCB0byBzdWNjZXNzIGlmIHRoZSBjYWxsYmFjayB3YXMgaGFuZGxlZCwKKyAqICAgICAgb3RoZXJ3
aXNlIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYSBmYWlsdXJlIHN0YXR1cy4KKyAqIEBzdGFi
bGUgSUNVIDIuMAorICovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiBVQ05WX1RPX1VfQ0FMTEJB
Q0tfU1VCU1RJVFVURSAoCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb250ZXh0LAor
ICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlclRvVW5pY29kZUFyZ3MgKnRvVUFyZ3MsCisgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAgICBp
bnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1JlYXNv
biByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworLyoqCisg
KiBETyBOT1QgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZIQorICogVGhpcyBUbyBVbmljb2Rl
IGNhbGxiYWNrIHdpbGwgU3Vic3RpdHV0ZSB0aGUgSUxMRUdBTCBTRVFVRU5DRSB3aXRoIHRoZQor
ICogaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlsbGVnYWwgYnl0ZXMKKyAqICAo
aW4gdGhlIGZvcm1hdCAgJVhOTiwgZS5nLiAiJVhGRiVYMEElWEM4JVgwMyIpLgorICoKKyAqIEBw
YXJhbSBjb250ZXh0IFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IHJlY29nbml6ZXMgdGhlIGNhbGxi
YWNrIG9wdGlvbnM6CisgKiAgICAgIFVDTlZfRVNDQVBFX0lDVSwgVUNOVl9FU0NBUEVfSkFWQSwg
VUNOVl9FU0NBUEVfQywgVUNOVl9FU0NBUEVfWE1MX0RFQywKKyAqICAgICAgVUNOVl9FU0NBUEVf
WE1MX0hFWCBhbmQgVUNOVl9FU0NBUEVfVU5JQ09ERS4KKyAqIEBwYXJhbSB0b1VBcmdzIEluZm9y
bWF0aW9uIGFib3V0IHRoZSBjb252ZXJzaW9uIGluIHByb2dyZXNzCisgKiBAcGFyYW0gY29kZVVu
aXRzIFBvaW50cyB0byAnbGVuZ3RoJyBieXRlcyBvZiB0aGUgY29uY2VybmVkIGNvZGVwYWdlIHNl
cXVlbmNlCisgKiBAcGFyYW0gbGVuZ3RoIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgY29uY2VybmVk
IGNvZGVwYWdlIHNlcXVlbmNlCisgKiBAcGFyYW0gcmVhc29uIERlZmluZXMgdGhlIHJlYXNvbiB0
aGUgY2FsbGJhY2sgd2FzIGludm9rZWQKKyAqIEBwYXJhbSBlcnIgUmV0dXJuIHZhbHVlIHdpbGwg
YmUgc2V0IHRvIHN1Y2Nlc3MgaWYgdGhlIGNhbGxiYWNrIHdhcyBoYW5kbGVkLAorICogICAgICBv
dGhlcndpc2UgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBhIGZhaWx1cmUgc3RhdHVzLgorICog
QHN0YWJsZSBJQ1UgMi4wCisgKi8KKworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgVUNOVl9UT19V
X0NBTExCQUNLX0VTQ0FQRSAoCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb250ZXh0
LAorICAgICAgICAgICAgICAgICAgVUNvbnZlcnRlclRvVW5pY29kZUFyZ3MgKnRvVUFyZ3MsCisg
ICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb2RlVW5pdHMsCisgICAgICAgICAgICAgICAg
ICBpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJDYWxsYmFja1Jl
YXNvbiByZWFzb24sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICogZXJyKTsKKworI2Vu
ZGlmCisKKyNlbmRpZgorCisvKlVDTlZfRVJSX0gqLyAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9u
IDEzMTI2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsMTYgQEAKKzIwMDYtMDMteHggIERhdmlkIENhcnNvbiA8ZGFjYXJzb25AZ21haWwuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PX09ORS4uCisKKyAgICAgICAgLSBGaXhlZCBodHRw
Oi8vYnVnemlsbGEub3BlbmRhcndpbi5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODIKKyAgICAgICAg
Y191dGlsaXR5LmNwcCBjb250YWlucyBwbGF0Zm9ybSBkZXBlbmRhbnQgY29kZQorCisgICAgICAg
IFRlc3RlZCB3aXRoIHRlc3QgY2FzZSBmcm9tOgorCWh0dHA6Ly9idWd6aWxsYS5vcGVuZGFyd2lu
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTE2MworCisgICAgICAgICogYmluZGluZ3MvY191dGlsaXR5
LmNwcAorICAgICAgICAoY29udmVydFVURjhUb1VURjE2KTogQ2hhbmdlZCB0byB1c2luZyB1bmlj
b2RlIGNvbnZlcnRlciBmcm9tIElDVS4KKwogMjAwNi0wMy0wMyAgR2VvZmZyZXkgR2FyZW4gIDxn
Z2FyZW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluLgpJbmRleDogSmF2
YVNjcmlwdENvcmUvYmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL2JpbmRpbmdzL2MvY191dGlsaXR5LmNwcAkocmV2aXNpb24gMTMxMjYpCisrKyBK
YXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9jL2NfdXRpbGl0eS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImNfdXRpbGl0
eS5oIgorI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgogCiAjaW5jbHVkZSAiSlNUeXBlLmgiCiAj
aW5jbHVkZSAiTlBfanNvYmplY3QuaCIKQEAgLTQ1LDI3ICs0NiwzOCBAQCB2b2lkIGNvbnZlcnRO
UFN0cmluZ1RvVVRGMTYoY29uc3QgTlBTdHJpCiB2b2lkIGNvbnZlcnRVVEY4VG9VVEYxNihjb25z
dCBOUFVURjggKlVURjhDaGFycywgaW50IFVURjhMZW5ndGgsIE5QVVRGMTYgKipVVEYxNkNoYXJz
LCB1bnNpZ25lZCBpbnQgKlVURjE2TGVuZ3RoKQogewogICAgIGFzc2VydChVVEY4Q2hhcnMgfHwg
VVRGOExlbmd0aCA9PSAwKTsKKyAgICBhc3NlcnQoVVRGMTZDaGFycyk7CiAgICAgCiAgICAgaWYg
KFVURjhMZW5ndGggPT0gLTEpCiAgICAgICAgIFVURjhMZW5ndGggPSBzdHJsZW4oVVRGOENoYXJz
KTsKLQotICAgIENGU3RyaW5nUmVmIHN0cmluZ1JlZiA9IENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVz
KE5VTEwsIChjb25zdCBVSW50OCopVVRGOENoYXJzLCAoQ0ZJbmRleClVVEY4TGVuZ3RoLCBrQ0ZT
dHJpbmdFbmNvZGluZ1VURjgsIGZhbHNlKTsKKyAgICAgICAgCisgICAgLy8gVVRGMTZMZW5ndGgg
bWF4aW11bSBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgVVRGOCBzdHJpbmcsIHBsdXMgb25l
IHRvIGluY2x1ZGUgdGVybWluYXRvcgorICAgIC8vIFdpdGhvdXQgdGhlIHBsdXMgb25lLCBpdCB3
aWxsIGNvbnZlcnQgb2ssIGJ1dCBhIHdhcm5pbmcgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnZl
cnRlciBhcworICAgIC8vIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB0ZXJtaW5hdGlu
ZyBjaGFyYWN0ZXIuCisgICAgKlVURjE2TGVuZ3RoID0gVVRGOExlbmd0aCArIDE7IAorICAgICAg
ICAKKyAgICAqVVRGMTZDaGFycyA9IDA7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9f
RVJST1I7CisgICAgVUNvbnZlcnRlciogY29udiA9IHVjbnZfb3BlbigidXRmOCIsICZzdGF0dXMp
OworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeyAKKyAgICAgICAgKlVURjE2Q2hhcnMgPSAo
TlBVVEYxNiAqKW1hbGxvYyhzaXplb2YoTlBVVEYxNikgKiAoKlVURjE2TGVuZ3RoKSk7CisgICAg
ICAgIHVjbnZfc2V0VG9VQ2FsbEJhY2soY29udiwgVUNOVl9UT19VX0NBTExCQUNLX1NUT1AsIDAs
IDAsIDAsICZzdGF0dXMpOworICAgICAgICB1Y252X3RvVUNoYXJzKGNvbnYsICpVVEYxNkNoYXJz
LCAqVVRGMTZMZW5ndGgsIFVURjhDaGFycywgVVRGOExlbmd0aCwgJnN0YXR1cyk7IAorICAgICAg
ICB1Y252X2Nsb3NlKGNvbnYpOworICAgIH0gCiAgICAgCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlm
IHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsCiAgICAgLy8gU29tZSBwbHVnaW5zIHJldHVy
biBpbnZhbGlkIFVURi04IGluIE5QVmFyaWFudFR5cGVfU3RyaW5nLCBzZWUgPGh0dHA6Ly9idWd6
aWxsYS5vcGVuZGFyd2luLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTE2Mz4KLSAgICBpZiAoIXN0cmlu
Z1JlZikKLSAgICAgICAgc3RyaW5nUmVmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoTlVMTCwg
KGNvbnN0IFVJbnQ4KilVVEY4Q2hhcnMsIChDRkluZGV4KVVURjhMZW5ndGgsIGtDRlN0cmluZ0Vu
Y29kaW5nSVNPTGF0aW4xLCBmYWxzZSk7Ci0KLSAgICAvLyBUaGVyZSBpcyBubyAiYmFkIGRhdGEi
IGZvciBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMS4gSXQgaXMgdW5saWtlbHkgdGhhdCB0aGUg
cGx1Z2luIHdhcyByZWFsbHkgc2VuZGluZyB0ZXh0IGluIHRoaXMgZW5jb2RpbmcsCisgICAgLy8g
VGhlcmUgaXMgbm8gImJhZCBkYXRhIiBmb3IgbGF0aW4xLiBJdCBpcyB1bmxpa2VseSB0aGF0IHRo
ZSBwbHVnaW4gd2FzIHJlYWxseSBzZW5kaW5nIHRleHQgaW4gdGhpcyBlbmNvZGluZywKICAgICAv
LyBidXQgaXQgc2hvdWxkIGhhdmUgdXNlZCBVVEYtOCwgYW5kIG5vdyB3ZSBhcmUgc2ltcGx5IGF2
b2lkaW5nIGEgY3Jhc2guCi0gICAgYXNzZXJ0KHN0cmluZ1JlZik7Ci0KLSAgICAqVVRGMTZMZW5n
dGggPSAodW5zaWduZWQgaW50KUNGU3RyaW5nR2V0TGVuZ3RoKHN0cmluZ1JlZik7Ci0gICAgKlVU
RjE2Q2hhcnMgPSAoTlBVVEYxNiAqKW1hbGxvYyhzaXplb2YoTlBVVEYxNikgKiAoKlVURjE2TGVu
Z3RoKSk7CisgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICBpZiAoISpVVEYx
NkNoYXJzKSAgIC8vIElmIHRoZSBtZW1vcnkgd2Fzbid0IGFsbG9jYXRlZCwgYWxsb2NhdGUgaXQu
CisgICAgICAgICAgICAqVVRGMTZDaGFycyA9IChOUFVURjE2ICopbWFsbG9jKHNpemVvZihOUFVU
RjE2KSAqICgqVVRGMTZMZW5ndGgpKTsKKyAKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8ICpVVEYxNkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgKCpVVEYxNkNoYXJzKVtpXSA9IFVU
RjhDaGFyc1tpXSAmIDB4RkY7CiAKLSAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gVVRGMTYu
Ci0gICAgQ0ZSYW5nZSByYW5nZSA9IHsgMCwgKlVURjE2TGVuZ3RoIH07Ci0gICAgQ0ZTdHJpbmdH
ZXRDaGFyYWN0ZXJzKHN0cmluZ1JlZiwgcmFuZ2UsIChVbmlDaGFyICopKlVURjE2Q2hhcnMpOwot
ICAgIENGUmVsZWFzZShzdHJpbmdSZWYpOworICAgIH0KIH0KIAogLy8gVmFyaWFudCB2YWx1ZSBt
dXN0IGJlIHJlbGVhc2VkIHdpdGggTlBSZWxlYXNlVmFyaWFudFZhbHVlKCkK
</data>
<flag name="review"
          id="1777"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>