<?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>80611</bug_id>
          
          <creation_ts>2012-03-08 10:49:03 -0800</creation_ts>
          <short_desc>Move WebNSURLExtras code down to WebCore</short_desc>
          <delta_ts>2012-03-12 09:37:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>Unspecified</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="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>ap</cc>
    
    <cc>menard</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>573942</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 10:49:03 -0800</bug_when>
    <thetext>This is a cleanup task aimed at improving the overall pasteboard code on Mac.
This will allow us to remove the Frame parameter from the Pasteboard class interface in most cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573952</commentid>
    <comment_count>1</comment_count>
      <attachid>130852</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 10:56:47 -0800</bug_when>
    <thetext>Created attachment 130852
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573958</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-08 11:01:52 -0800</bug_when>
    <thetext>Attachment 130852 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/mac/WebCoreNSStringExtras.h:44:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/ChangeLog:5:  Line contains tab character.  [whitespace/tab] [5]
Total errors found: 2 in 14 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574017</commentid>
    <comment_count>3</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 11:39:10 -0800</bug_when>
    <thetext>Will fix the style before landing the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574023</commentid>
    <comment_count>4</comment_count>
      <attachid>130852</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-08 11:46:18 -0800</bug_when>
    <thetext>Comment on attachment 130852
Patch

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

This adds code to WebCore, but doesn&apos;t switch WebKit to using it. Do you want to do that in a separate patch? I think that this would be easier to review as one patch.

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.h:34
&gt; +#include &lt;Foundation/Foundation.h&gt;
&gt; +@class NSString;
&gt; +@class NSURL;

You probably meant to remove the #include.

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.mm:791
&gt; +    // journaled the data we&apos;re&apos;re trying to set. Depending on what other I/O is going on, it can take some

Typo: we&apos;re&apos;re</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574029</commentid>
    <comment_count>5</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 11:52:06 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; This adds code to WebCore, but doesn&apos;t switch WebKit to using it. Do you want to do that in a separate patch? I think that this would be easier to review as one patch.
I thought this was easier, since it is a lot of code. Also, I don&apos;t plan to change WebKit to use this, only WebKit2.
&gt; 
&gt; You probably meant to remove the #include.

Sure. 
&gt; &gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.mm:791
&gt; &gt; +    // journaled the data we&apos;re&apos;re trying to set. Depending on what other I/O is going on, it can take some
&gt; 
&gt; Typo: we&apos;re&apos;re</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574033</commentid>
    <comment_count>6</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 11:53:25 -0800</bug_when>
    <thetext>I plan on start using this code for https://bugs.webkit.org/show_bug.cgi?id=80073, then I&apos;ll post another patch to remove the use of Frame from the Pasteboard class</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574048</commentid>
    <comment_count>7</comment_count>
      <attachid>130852</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-08 12:02:03 -0800</bug_when>
    <thetext>Comment on attachment 130852
Patch

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

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.mm:157
&gt; +    NSBundle *bundle = [NSBundle bundleWithIdentifier:@&quot;com.apple.WebKit&quot;];

I think that this needs stronger error checking now, since we&apos;re looking into a different framework. Maybe even as a strong as CRASH.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574077</commentid>
    <comment_count>8</comment_count>
      <attachid>130852</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-08 12:26:11 -0800</bug_when>
    <thetext>Comment on attachment 130852
Patch

Talked to Enrica in person. We really don&apos;t want two copies of this security sensitive code in the project.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574343</commentid>
    <comment_count>9</comment_count>
      <attachid>130929</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 15:59:02 -0800</bug_when>
    <thetext>Created attachment 130929
Patch2

New patch per discussion with Alexey.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574345</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-08 16:02:14 -0800</bug_when>
    <thetext>Attachment 130929 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/mac/WebCoreNSStringExtras.h:44:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:44:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:45:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:45:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:46:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:47:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:47:  The parameter name &quot;range&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:48:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:48:  The parameter name &quot;range&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:49:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:49:  The parameter name &quot;range&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:50:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:50:  The parameter name &quot;range&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:51:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:52:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:53:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:53:  The parameter name &quot;component&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:54:  The parameter name &quot;data&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:55:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:56:  The parameter name &quot;URL&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:56:  The parameter name &quot;componentType&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/mac/WebCoreNSURLExtras.h:57:  The parameter name &quot;string&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/mac/ChangeLog:8:  Line contains tab character.  [whitespace/tab] [5]
Total errors found: 23 in 18 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574353</commentid>
    <comment_count>11</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-08 16:08:08 -0800</bug_when>
    <thetext>Fixing the style issues now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574471</commentid>
    <comment_count>12</comment_count>
      <attachid>130929</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-08 18:35:57 -0800</bug_when>
    <thetext>Comment on attachment 130929
Patch2

Yup, this looks like what I had in mind overall. What aspect of this did you want to discuss?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574969</commentid>
    <comment_count>13</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-09 09:53:34 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 130929 [details])
&gt; Yup, this looks like what I had in mind overall. What aspect of this did you want to discuss?

Nothing, I mentioned that I was uploading a patch as result of our conversation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575074</commentid>
    <comment_count>14</comment_count>
      <attachid>130929</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-09 12:21:54 -0800</bug_when>
    <thetext>Comment on attachment 130929
Patch2

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

I don&apos;t know how I managed to read &quot;per discussion&quot; as &quot;for discussion&quot; :)

r=me with some comments.

&gt; Source/WebCore/WebCore.exp.in:1516
&gt; +_originalData

I don&apos;t think that this is a good name to export in global namespace. These are not even used in any .m files AFAICT, so you can just remove &apos;extern &quot;C&quot;&apos; from the new WebCore function prototypes.

&gt; Source/WebCore/platform/mac/FileSystemMac.mm:78
&gt; +static void *setMetaData(void* context)

Misplaced star in returned type.

&gt; Source/WebCore/platform/mac/FileSystemMac.mm:81
&gt; +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

I&apos;m not sure if it&apos;s actually needed for anything. Can you remove the pool, and see if Objective C runtime complains?

&gt; Source/WebCore/platform/mac/FileSystemMac.mm:82
&gt; +    wkSetMetadataURL((NSString *)info-&gt;URLString, (NSString *)info-&gt;referrer, (NSString *)info-&gt;path);

The path should be passed through fileSystemRepresentation before being used outside WebKit (for consistency if nothing else).

&gt; Source/WebCore/platform/mac/FileSystemMac.mm:111
&gt; +    MetaDataInfo *info = static_cast&lt;MetaDataInfo *&gt;(malloc(sizeof(MetaDataInfo)));

It seems that you can use new (and RefPtr members) for this structure. We have full C++ powers!

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.h:34
&gt; +#include &lt;Foundation/Foundation.h&gt;
&gt; +@class NSString;
&gt; +@class NSURL;

This looks wrong. Why both include and forward declare?

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.h:37
&gt; +typedef struct NSString NSString;
&gt; +typedef struct NSURL NSURL;

We have OBJ_CLASS macro for this now.

&gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.mm:159
&gt; +    if (!bundle)
&gt; +        CRASH();

It might be better to have the check when file doesn&apos;t exist, in case we forget to master it into WebKit. We didn&apos;t really have such check before (discarding the error silently), but why not add it now?

&gt; Source/WebKit/mac/Misc/WebNSURLExtras.mm:49
&gt; -// Needs to be big enough to hold an IDN-encoded name.
&gt; -// For host names bigger than this, we won&apos;t do IDN encoding, which is almost certainly OK.
&gt; -#define HOST_NAME_BUFFER_LENGTH 2048
&gt; -
&gt;  #define URL_BYTES_BUFFER_LENGTH 2048

What is URL_BYTES_BUFFER_LENGTH still used for? Does it need a comment?

&gt; Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm:172
&gt; +    INIT(SetMetadataURL);

Eventually, you&apos;ll need the same for WK2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575258</commentid>
    <comment_count>15</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-09 14:47:09 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/WebCore.exp.in:1516
&gt; &gt; +_originalData
&gt; 
&gt; I don&apos;t think that this is a good name to export in global namespace. These are not even used in any .m files AFAICT, so you can just remove &apos;extern &quot;C&quot;&apos; from the new WebCore function prototypes.

It is used in WebKit WebNSURLExtras.mm in several places.
I&apos;ll change the name to orginalURLData.

&gt; &gt; Source/WebCore/platform/mac/FileSystemMac.mm:78
&gt; &gt; +static void *setMetaData(void* context)
&gt; 
&gt; Misplaced star in returned type.

Done.

&gt; &gt; Source/WebCore/platform/mac/FileSystemMac.mm:81
&gt; &gt; +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
&gt; 
&gt; I&apos;m not sure if it&apos;s actually needed for anything. Can you remove the pool, and see if Objective C runtime complains?

It doesn&apos;t and I&apos;ve removed it.

&gt; &gt; Source/WebCore/platform/mac/FileSystemMac.mm:82
&gt; &gt; +    wkSetMetadataURL((NSString *)info-&gt;URLString, (NSString *)info-&gt;referrer, (NSString *)info-&gt;path);
&gt; 
&gt; The path should be passed through fileSystemRepresentation before being used outside WebKit (for consistency if nothing else).
&gt; 
&gt; &gt; Source/WebCore/platform/mac/FileSystemMac.mm:111
&gt; &gt; +    MetaDataInfo *info = static_cast&lt;MetaDataInfo *&gt;(malloc(sizeof(MetaDataInfo)));
&gt; 
&gt; It seems that you can use new (and RefPtr members) for this structure. We have full C++ powers!

Ok.

&gt; &gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.h:34
&gt; &gt; +#include &lt;Foundation/Foundation.h&gt;
Removed.
&gt; &gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.h:37
&gt; &gt; +typedef struct NSString NSString;
&gt; &gt; +typedef struct NSURL NSURL;
&gt; 
&gt; We have OBJ_CLASS macro for this now.
Done.

&gt; 
&gt; &gt; Source/WebCore/platform/mac/WebCoreNSURLExtras.mm:159
&gt; &gt; +    if (!bundle)
&gt; &gt; +        CRASH();
&gt; 
&gt; It might be better to have the check when file doesn&apos;t exist, in case we forget to master it into WebKit. We didn&apos;t really have such check before (discarding the error silently), but why not add it now?
Will do.
&gt; 
&gt; 
&gt; What is URL_BYTES_BUFFER_LENGTH still used for? Does it need a comment?
&gt; 
It is used by _web_URLWithLowercasedScheme.

&gt; &gt; Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm:172
&gt; &gt; +    INIT(SetMetadataURL);
&gt; 
&gt; Eventually, you&apos;ll need the same for WK2.
I had already done it, it wasn&apos;t added to the patch by mistake. I&apos;ll add it when landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575407</commentid>
    <comment_count>16</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2012-03-09 18:54:29 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/110360</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575479</commentid>
    <comment_count>17</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2012-03-10 01:52:58 -0800</bug_when>
    <thetext>Reopen, because it broke Qt Mac build:

In file included from ../../../../Source/WebCore/platform/mac/WebCoreObjCExtras.mm:35:
../../../../Source/WebCore/platform/mac/WebCoreObjCExtras.h:39: error: ‘WebCoreCFAutorelease’ declared as an ‘inline’ variable
../../../../Source/WebCore/platform/mac/WebCoreObjCExtras.h:39: error: ‘CFTypeRef’ was not declared in this scope
../../../../Source/WebCore/platform/mac/WebCoreObjCExtras.h:40: error: expected ‘,’ or ‘;’ before ‘{’ token</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>576190</commentid>
    <comment_count>18</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2012-03-12 09:37:52 -0700</bug_when>
    <thetext>Fixed by http://trac.webkit.org/changeset/110431</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130852</attachid>
            <date>2012-03-08 10:56:47 -0800</date>
            <delta_ts>2012-03-08 15:59:02 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>NSURLExtras.txt</filename>
            <type>text/plain</type>
            <size>47551</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMDE3NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIxIEBACisyMDEyLTAzLTA4ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBXZWJOU1VSTEV4dHJh
cyBjb2RlIGRvd24gdG8gV2ViQ29yZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTgwNjExCisJCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogV2ViQ29yZS5leHAuaW46IEFkZGVkIGV4cG9ydGVkIGZ1bmN0aW9u
cy4KKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVkIFdl
YkNvcmVOU1VSTEV4dHJhcy4qIGZpbGVzLgorICAgICAgICAqIHBsYXRmb3JtL21hYy9XZWJDb3Jl
TlNTdHJpbmdFeHRyYXMuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5n
RXh0cmFzLm1tOgorICAgICAgICAoaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4KTogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vbWFjL1dlYkNvcmVOU1VSTEV4dHJhcy5oOiBBZGRlZC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU5TVVJMRXh0cmFzLm1tOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU9iakNFeHRyYXMuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9t
YWMvV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oOgorICAgICAgICAqIHBsYXRmb3JtL21hYy9XZWJD
b3JlU3lzdGVtSW50ZXJmYWNlLm1tOiBBZGRlZCB3a1NldE1ldGFkYXRhVVJMLgorCiAyMDEyLTAz
LTA4ICBDYWlvIE1hcmNlbG8gZGUgT2xpdmVpcmEgRmlsaG8gIDxjYWlvLm9saXZlaXJhQG9wZW5i
b3NzYS5vcmc+CiAKICAgICAgICAgTWFrZSBlbGVtZW50cyB3aXRoIGF0dHJpYnV0ZXMgc21hbGxl
ciBieSBlbGltaW5hdGluZyB0aGUgbV9lbGVtZW50IGJhY2sgcG9pbnRlciBpbiBOYW1lZE5vZGVN
YXAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiAxMTAwOTUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkod29ya2luZyBjb3B5KQpAQCAtMTQ5Miw2ICsxNDkyLDcg
QEAgX19aVFZON1dlYkNvcmUyOEluc3BlY3RvckZyb250ZW5kQ2xpZW50TAogX2ZpbGVuYW1lQnlG
aXhpbmdJbGxlZ2FsQ2hhcmFjdGVycwogX2hhc0Nhc2VJbnNlbnNpdGl2ZVN1YnN0cmluZwogX2hh
c0Nhc2VJbnNlbnNpdGl2ZVN1ZmZpeAorX3NldE1ldGFkYXRhVVJMCiBfc3RyaW5nRW5jb2RpbmdG
b3JSZXNvdXJjZQogX3N0cmluZ0lzQ2FzZUluc2Vuc2l0aXZlRXF1YWxUb1N0cmluZwogX3N1Z2dl
c3RlZEZpbGVuYW1lV2l0aE1JTUVUeXBlCkBAIC0xNTc3LDYgKzE1NzgsNyBAQCBfd2tTZXRIVFRQ
Q29va2llc0ZvclVSTAogX3drU2V0SFRUUFBpcGVsaW5pbmdNYXhpbXVtUHJpb3JpdHkKIF93a1Nl
dEhUVFBQaXBlbGluaW5nTWluaW11bUZhc3RMYW5lUHJpb3JpdHkKIF93a1NldEhUVFBQaXBlbGlu
aW5nUHJpb3JpdHkKK193a1NldE1ldGFkYXRhVVJMCiBfd2tTZXROU1VSTENvbm5lY3Rpb25EZWZl
cnNDYWxsYmFja3MKIF93a1NldE5TVVJMUmVxdWVzdFNob3VsZENvbnRlbnRTbmlmZgogX3drU2V0
UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDExMDA5NSkKKysrIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5
KQpAQCAtNTY0Nyw2ICs1NjQ3LDggQEAKIAkJQzU5ODkwMkUxNEU5QjBGODAwRThEMThCIC8qIFBs
YXRmb3JtUGFzdGVib2FyZE1hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEM1Rjc2NUJBMTRFMUVDRjQwMDZDODk5QiAvKiBQbGF0Zm9ybVBhc3RlYm9h
cmRNYWMubW0gKi87IH07CiAJCUM1OTg5MDU3MTRFOUMyODAwMEU4RDE4QiAvKiBQYXN0ZWJvYXJk
U3RyYXRlZ3kuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEM1Rjc2NUI0MTRFMUQ0MTQwMDZDODk5QiAvKiBQYXN0ZWJvYXJkU3RyYXRlZ3kuaCAqLzsgc2V0
dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlDNTk4OTA1ODE0RTlD
Mjk5MDBFOEQxOEIgLyogUGxhdGZvcm1QYXN0ZWJvYXJkLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNUJBQzE2RjE0RTMwRTQ3MDAwMDg4MzcgLyogUGxh
dGZvcm1QYXN0ZWJvYXJkLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKKwkJQzVCNEMyNEQxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VSTEV4dHJh
cy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzVCNEMy
NEIxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VSTEV4dHJhcy5oICovOyBzZXR0aW5ncyA9
IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUM1QjRDMjRFMTUwOTIzNkMwMEE2
RUYzNyAvKiBXZWJDb3JlTlNVUkxFeHRyYXMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBDNUI0QzI0QzE1MDkyMzZDMDBBNkVGMzcgLyogV2ViQ29yZU5T
VVJMRXh0cmFzLm1tICovOyB9OwogCQlDNUQ0QUE3QTExNkJBRkI2MDA2OUNBOTMgLyogR2x5cGhN
ZXRyaWNzTWFwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBDNUQ0QUE3ODExNkJBRkI2MDA2OUNBOTMgLyogR2x5cGhNZXRyaWNzTWFwLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQzVFOUI2NzcxMDY5N0Ux
MzAwQzdCQjFBIC8qIFN0b3JhZ2VFdmVudERpc3BhdGNoZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzVFOUI2NzYxMDY5N0UxMzAwQzdCQjFBIC8q
IFN0b3JhZ2VFdmVudERpc3BhdGNoZXIuY3BwICovOyB9OwogCQlDNUVCREQ4NDEwNUVEREVDMDA1
NjgxNkYgLyogU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzVFQkREODExMDVFRERFQzAwNTY4MTZGIC8qIFN0b3Jh
Z2VFdmVudERpc3BhdGNoZXIuaCAqLzsgfTsKQEAgLTEyNjgyLDYgKzEyNjg0LDggQEAKIAkJQzU4
NUE2NzkxMUQ0RkIwNzAwNEMzRTRCIC8qIEpTSURCUmVxdWVzdC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBKU0lEQlJlcXVlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJQzU4NUE2OTQxMUQ0RkIxMzAwNEMzRTRCIC8qIEpTSURCRmFjdG9yeS5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0lEQkZhY3RvcnkuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQlDNTg1QTY5NTExRDRGQjEzMDA0QzNFNEIgLyogSlNJREJG
YWN0b3J5LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTSURCRmFjdG9yeS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNUI0QzI0QjE1MDkyMzZDMDBBNkVGMzcg
LyogV2ViQ29yZU5TVVJMRXh0cmFzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFdlYkNvcmVOU1VSTEV4dHJhcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDNUI0
QzI0QzE1MDkyMzZDMDBBNkVGMzcgLyogV2ViQ29yZU5TVVJMRXh0cmFzLm1tICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gV2ViQ29yZU5TVVJMRXh0cmFzLm1tOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNUJBQzE2RjE0RTMwRTQ3MDAwMDg4MzcgLyogUGxh
dGZvcm1QYXN0ZWJvYXJkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBsYXRm
b3JtUGFzdGVib2FyZC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNUQ0QUE3ODEx
NkJBRkI2MDA2OUNBOTMgLyogR2x5cGhNZXRyaWNzTWFwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IEdseXBoTWV0cmljc01hcC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlDNUU5QjY3NjEwNjk3RTEzMDBDN0JCMUEgLyogU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTdG9yYWdlRXZlbnREaXNw
YXRjaGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE1MTI3LDYgKzE1MTMx
LDggQEAKIAkJCQk1MURGNkQ3RjBCOTJBMThFMDBDMkRDODUgLyogVGhyZWFkQ2hlY2subW0gKi8s
CiAJCQkJOTM0RDlCQTYwQjhDMTE3NTAwN0I0MkE5IC8qIFdlYkNvcmVOU1N0cmluZ0V4dHJhcy5o
ICovLAogCQkJCTkzNEQ5QkE0MEI4QzExNkIwMDdCNDJBOSAvKiBXZWJDb3JlTlNTdHJpbmdFeHRy
YXMubW0gKi8sCisJCQkJQzVCNEMyNEIxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VSTEV4
dHJhcy5oICovLAorCQkJCUM1QjRDMjRDMTUwOTIzNkMwMEE2RUYzNyAvKiBXZWJDb3JlTlNVUkxF
eHRyYXMubW0gKi8sCiAJCQkJREQwNUZFMEIwQjhCQTNDNjAwOUFDREZFIC8qIFdlYkNvcmVPYmpD
RXh0cmFzLmggKi8sCiAJCQkJQjUwRjVCODAwRTk2Q0Q5OTAwQUQ3MUE2IC8qIFdlYkNvcmVPYmpD
RXh0cmFzLm1tICovLAogCQkJCTkzRUIxNjk2MDlGODgwQzAwMDkxRjhGRiAvKiBXZWJDb3JlU3lz
dGVtSW50ZXJmYWNlLmggKi8sCkBAIC0yNDU0Miw2ICsyNDU0OCw3IEBACiAJCQkJRkQ1MzczNTMx
MzdCNjUxODAwMDA4RENFIC8qIFplcm9Qb2xlLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMUNERTky
MjE1MDE5MTY5MDA4NjJDQzUgLyogQXN5bmNGaWxlU3RyZWFtLmggaW4gSGVhZGVycyAqLywKIAkJ
CQk0NTBDRUJGMTE1MDczQkJFMDAyQkIxNDkgLyogTGFiZWxhYmxlRWxlbWVudC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJQzVCNEMyNEQxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VSTEV4dHJh
cy5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJv
Y2Vzc2luZyA9IDA7CiAJCX07CkBAIC0yNzUxNiw2ICsyNzUyMyw3IEBACiAJCQkJRkQ1MzczNTIx
MzdCNjUxODAwMDA4RENFIC8qIFplcm9Qb2xlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUUxQ0RF
OTIwMTUwMThFRDAwMDg2MkNDNSAvKiBBc3luY0ZpbGVTdHJlYW0uY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJNDUwQ0VCRjAxNTA3M0JCRTAwMkJCMTQ5IC8qIExhYmVsYWJsZUVsZW1lbnQuY3BwIGlu
IFNvdXJjZXMgKi8sCisJCQkJQzVCNEMyNEUxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VS
TEV4dHJhcy5tbSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50
UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bWFjL1dlYkNvcmVOU1N0cmluZ0V4dHJhcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMuaAkocmV2aXNpb24gMTEwMDk1KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVOU1N0cmluZ0V4dHJhcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC00MSw2ICs0MSw3IEBAIGV4dGVybiAiQyIgewogCiBCT09MIHN0cmlu
Z0lzQ2FzZUluc2Vuc2l0aXZlRXF1YWxUb1N0cmluZyhOU1N0cmluZyAqZmlyc3QsIE5TU3RyaW5n
ICpzZWNvbmQpOwogQk9PTCBoYXNDYXNlSW5zZW5zaXRpdmVTdWZmaXgoTlNTdHJpbmcgKnN0cmlu
ZywgTlNTdHJpbmcgKnN1ZmZpeCk7CitCT09MIGhhc0Nhc2VJbnNlbnNpdGl2ZVByZWZpeChOU1N0
cmluZyAqc3RyaW5nLCBOU1N0cmluZyAqcHJlZml4KTsKIEJPT0wgaGFzQ2FzZUluc2Vuc2l0aXZl
U3Vic3RyaW5nKE5TU3RyaW5nICpzdHJpbmcsIE5TU3RyaW5nICpzdWJzdHJpbmcpOwogTlNTdHJp
bmcgKmZpbGVuYW1lQnlGaXhpbmdJbGxlZ2FsQ2hhcmFjdGVycyhOU1N0cmluZyAqc3RyaW5nKTsK
ICNpZiAhUExBVEZPUk0oSU9TKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dl
YkNvcmVOU1N0cmluZ0V4dHJhcy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLm1tCShyZXZpc2lvbiAxMTAwOTUpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MSw2ICs0MSwxMSBAQCBCT09MIGhhc0Nhc2VJbnNlbnNpdGl2ZVN1ZmZp
eChOU1N0cmluZyAqCiAgICAgcmV0dXJuIFtzdHJpbmcgcmFuZ2VPZlN0cmluZzpzdWZmaXggb3B0
aW9uczooTlNDYXNlSW5zZW5zaXRpdmVTZWFyY2ggfCBOU0JhY2t3YXJkc1NlYXJjaCB8IE5TQW5j
aG9yZWRTZWFyY2gpXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOwogfQogCitCT09MIGhhc0Nhc2VJ
bnNlbnNpdGl2ZVByZWZpeChOU1N0cmluZyAqc3RyaW5nLCBOU1N0cmluZyAqcHJlZml4KQorewor
ICAgIHJldHVybiBbc3RyaW5nIHJhbmdlT2ZTdHJpbmc6cHJlZml4IG9wdGlvbnM6KE5TQ2FzZUlu
c2Vuc2l0aXZlU2VhcmNoIHwgTlNBbmNob3JlZFNlYXJjaCldLmxvY2F0aW9uICE9IE5TTm90Rm91
bmQ7Cit9CisKIEJPT0wgaGFzQ2FzZUluc2Vuc2l0aXZlU3Vic3RyaW5nKE5TU3RyaW5nICpzdHJp
bmcsIE5TU3RyaW5nICpzdWJzdHJpbmcpCiB7CiAgICAgcmV0dXJuIFtzdHJpbmcgcmFuZ2VPZlN0
cmluZzpzdWJzdHJpbmcgb3B0aW9uczpOU0Nhc2VJbnNlbnNpdGl2ZVNlYXJjaF0ubG9jYXRpb24g
IT0gTlNOb3RGb3VuZDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3Jl
TlNVUkxFeHRyYXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMv
V2ViQ29yZU5TVVJMRXh0cmFzLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tYWMvV2ViQ29yZU5TVVJMRXh0cmFzLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMTIgQXBwbGUsIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9m
CisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG9iamMvb2JqYy5oPgorCisjaWZkZWYgX19P
QkpDX18KKyNpbmNsdWRlIDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KK0BjbGFzcyBOU1N0cmlu
ZzsKK0BjbGFzcyBOU1VSTDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBOU1N0cmluZyBOU1N0cmlu
ZzsKK3R5cGVkZWYgc3RydWN0IE5TVVJMIE5TVVJMOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVz
cGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBzZXRNZXRhZGF0YVVSTChOU1N0cmlu
ZyAqVVJMLCBOU1N0cmluZyAqcmVmZXJyZXIsIE5TU3RyaW5nICpwYXRoKTsKKworI2lmZGVmIF9f
Y3BsdXNwbHVzCit9CisjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9X
ZWJDb3JlTlNVUkxFeHRyYXMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbWFjL1dlYkNvcmVOU1VSTEV4dHJhcy5tbQkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlTlNVUkxFeHRyYXMubW0JKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsODA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIldlYkNv
cmVPYmpDRXh0cmFzLmgiCisjaW1wb3J0ICJXZWJDb3JlTlNTdHJpbmdFeHRyYXMuaCIKKyNpbXBv
cnQgIldlYkNvcmVOU1VSTEV4dHJhcy5oIgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFj
ZS5oIgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8d3RmL1ZlY3Rvci5oPgor
I2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9ydCA8dW5pY29kZS91aWRuYS5oPgorI2lt
cG9ydCA8dW5pY29kZS91c2NyaXB0Lmg+CisKKy8vIE5lZWRzIHRvIGJlIGJpZyBlbm91Z2ggdG8g
aG9sZCBhbiBJRE4tZW5jb2RlZCBuYW1lLgorLy8gRm9yIGhvc3QgbmFtZXMgYmlnZ2VyIHRoYW4g
dGhpcywgd2Ugd29uJ3QgZG8gSUROIGVuY29kaW5nLCB3aGljaCBpcyBhbG1vc3QgY2VydGFpbmx5
IE9LLgorI2RlZmluZSBIT1NUX05BTUVfQlVGRkVSX0xFTkdUSCAyMDQ4CisjZGVmaW5lIFVSTF9C
WVRFU19CVUZGRVJfTEVOR1RIIDIwNDgKKwordHlwZWRlZiB2b2lkICgqIFN0cmluZ1JhbmdlQXBw
bGllckZ1bmN0aW9uKShOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJhbmdlLCB2b2lkICpjb250
ZXh0KTsKKworc3RhdGljIHB0aHJlYWRfb25jZV90IElETlNjcmlwdFdoaXRlTGlzdEZpbGVSZWFk
ID0gUFRIUkVBRF9PTkNFX0lOSVQ7CitzdGF0aWMgdWludDMyX3QgSUROU2NyaXB0V2hpdGVMaXN0
WyhVU0NSSVBUX0NPREVfTElNSVQgKyAzMSkgLyAzMl07CisKK3N0YXRpYyBpbmxpbmUgQk9PTCBp
c0xvb2thbGlrZUNoYXJhY3RlcihpbnQgY2hhckNvZGUpCit7CisgICAgLy8gVGhpcyBmdW5jdGlv
biB0cmVhdHMgdGhlIGZvbGxvd2luZyBhcyB1bnNhZmUsIGxvb2thbGlrZSBjaGFyYWN0ZXJzOgor
ICAgIC8vIGFueSBub24tcHJpbnRhYmxlIGNoYXJhY3RlciwgYW55IGNoYXJhY3RlciBjb25zaWRl
cmVkIGFzIHdoaXRlc3BhY2UgdGhhdCBpc24ndCBhbHJlYWR5IGNvbnZlcnRlZCB0byBhIHNwYWNl
IGJ5IElDVSwgCisgICAgLy8gYW5kIGFueSBpZ25vcmFibGUgY2hhcmFjdGVyLgorICAgIAorICAg
IC8vIFdlIGFsc28gY29uc2lkZXJlZCB0aGUgY2hhcmFjdGVycyBpbiBNb3ppbGxhJ3MgYmxhY2ts
aXN0IChodHRwOi8va2IubW96aWxsYXppbmUub3JnL05ldHdvcmsuSUROLmJsYWNrbGlzdF9jaGFy
cyksIAorICAgIC8vIGFuZCBpbmNsdWRlZCBhbGwgb2YgdGhlc2UgY2hhcmFjdGVycyB0aGF0IElD
VSBjYW4gZW5jb2RlLgorICAgIAorICAgIGlmICghdV9pc3ByaW50KGNoYXJDb2RlKSB8fCB1X2lz
VVdoaXRlU3BhY2UoY2hhckNvZGUpIHx8IHVfaGFzQmluYXJ5UHJvcGVydHkoY2hhckNvZGUsIFVD
SEFSX0RFRkFVTFRfSUdOT1JBQkxFX0NPREVfUE9JTlQpKQorICAgICAgICByZXR1cm4gWUVTOwor
ICAgIAorICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKKyAgICAgICAgY2FzZSAweDAwRUQ6IC8qIExB
VElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KKyAgICAgICAgY2FzZSAweDAxQzM6IC8q
IExBVElOIExFVFRFUiBSRVRST0ZMRVggQ0xJQ0sgKi8KKyAgICAgICAgY2FzZSAweDAyNTE6IC8q
IExBVElOIFNNQUxMIExFVFRFUiBBTFBIQSAqLworICAgICAgICBjYXNlIDB4MDI2MTogLyogTEFU
SU4gU01BTEwgTEVUVEVSIFNDUklQVCBHICovCisgICAgICAgIGNhc2UgMHgwMzM3OiAvKiBDT01C
SU5JTkcgU0hPUlQgU09MSURVUyBPVkVSTEFZICovCisgICAgICAgIGNhc2UgMHgwMzM4OiAvKiBD
T01CSU5JTkcgTE9ORyBTT0xJRFVTIE9WRVJMQVkgKi8KKyAgICAgICAgY2FzZSAweDA1QjQ6IC8q
IEhFQlJFVyBQT0lOVCBISVJJUSAqLworICAgICAgICBjYXNlIDB4MDVCQzogLyogSEVCUkVXIFBP
SU5UIERBR0VTSCBPUiBNQVBJUSAqLworICAgICAgICBjYXNlIDB4MDVDMzogLyogSEVCUkVXIFBV
TkNUVUFUSU9OIFNPRiBQQVNVUSAqLworICAgICAgICBjYXNlIDB4MDVGNDogLyogSEVCUkVXIFBV
TkNUVUFUSU9OIEdFUlNIQVlJTSAqLworICAgICAgICBjYXNlIDB4MDY2MDogLyogQVJBQklDIElO
RElDIERJR0lUIFpFUk8gKi8KKyAgICAgICAgY2FzZSAweDA2RDQ6IC8qIEFSQUJJQyBGVUxMIFNU
T1AgKi8KKyAgICAgICAgY2FzZSAweDA2RjA6IC8qIEVYVEVOREVEIEFSQUJJQyBJTkRJQyBESUdJ
VCBaRVJPICovCisgICAgICAgIGNhc2UgMHgyMDI3OiAvKiBIWVBIRU5BVElPTiBQT0lOVCAqLwor
ICAgICAgICBjYXNlIDB4MjAzOTogLyogU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFU
SU9OIE1BUksgKi8KKyAgICAgICAgY2FzZSAweDIwM0E6IC8qIFNJTkdMRSBSSUdIVC1QT0lOVElO
RyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgICBjYXNlIDB4MjA0NDogLyogRlJBQ1RJ
T04gU0xBU0ggKi8KKyAgICAgICAgY2FzZSAweDIyMTU6IC8qIERJVklTSU9OIFNMQVNIICovCisg
ICAgICAgIGNhc2UgMHgyMjE2OiAvKiBTRVQgTUlOVVMgKi8KKyAgICAgICAgY2FzZSAweDIzM0Y6
IC8qIEFQTCBGVU5DVElPTkFMIFNZTUJPTCBTTEFTSCBCQVIgKi8KKyAgICAgICAgY2FzZSAweDIz
QUU6IC8qIElOVEVHUkFMIEVYVEVOU0lPTiAqLworICAgICAgICBjYXNlIDB4MjQ0QTogLyogT0NS
IERPVUJMRSBCQUNLU0xBU0ggKi8KKyAgICAgICAgY2FzZSAweDI1NzE6IC8qIEJPWCBEUkFXSU5H
UyBMSUdIVCBESUFHT05BTCBVUFBFUiBSSUdIVCBUTyBMT1dFUiBMRUZUICovCisgICAgICAgIGNh
c2UgMHgyNTcyOiAvKiBCT1ggRFJBV0lOR1MgTElHSFQgRElBR09OQUwgVVBQRVIgTEVGVCBUTyBM
T1dFUiBSSUdIVCAqLworICAgICAgICBjYXNlIDB4MjlGODogLyogQklHIFNPTElEVVMgKi8KKyAg
ICAgICAgY2FzZSAweDI5ZjY6IC8qIFNPTElEVVMgV0lUSCBPVkVSQkFSICovCisgICAgICAgIGNh
c2UgMHgyQUZCOiAvKiBUUklQTEUgU09MSURVUyBCSU5BUlkgUkVMQVRJT04gKi8KKyAgICAgICAg
Y2FzZSAweDJBRkQ6IC8qIERPVUJMRSBTT0xJRFVTIE9QRVJBVE9SICovCisgICAgICAgIGNhc2Ug
MHgzMDA4OiAvKiBMRUZUIEFOR0xFIEJSQUNLRVQgKi8KKyAgICAgICAgY2FzZSAweDMwMTQ6IC8q
IExFRlQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCAqLworICAgICAgICBjYXNlIDB4MzAxNTogLyog
UklHSFQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCAqLworICAgICAgICBjYXNlIDB4MzAzMzogLyog
VkVSVElDQUwgS0FOQSBSRVBFQVQgTUFSSyBVUFBFUiBIQUxGICovCisgICAgICAgIGNhc2UgMHgz
MDM1OiAvKiBWRVJUSUNBTCBLQU5BIFJFUEVBVCBNQVJLIExPV0VSIEhBTEYgKi8KKyAgICAgICAg
Y2FzZSAweDMyMUQ6IC8qIFBBUkVOVEhFU0laRUQgS09SRUFOIENIQVJBQ1RFUiBPSkVPTiAqLwor
ICAgICAgICBjYXNlIDB4MzIxRTogLyogUEFSRU5USEVTSVpFRCBLT1JFQU4gQ0hBUkFDVEVSIE8g
SFUgKi8KKyAgICAgICAgY2FzZSAweDMzREY6IC8qIFNRVUFSRSBBIE9WRVIgTSAqLworICAgICAg
ICBjYXNlIDB4RkUxNDogLyogUFJFU0VOVEFUSU9OIEZPUk0gRk9SIFZFUlRJQ0FMIFNFTUlDT0xP
TiAqLworICAgICAgICBjYXNlIDB4RkUxNTogLyogUFJFU0VOVEFUSU9OIEZPUk0gRk9SIFZFUlRJ
Q0FMIEVYQ0xBTUFUSU9OIE1BUksgKi8KKyAgICAgICAgY2FzZSAweEZFM0Y6IC8qIFBSRVNFTlRB
VElPTiBGT1JNIEZPUiBWRVJUSUNBTCBMRUZUIEFOR0xFIEJSQUNLRVQgKi8KKyAgICAgICAgY2Fz
ZSAweEZFNUQ6IC8qIFNNQUxMIExFRlQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCAqLworICAgICAg
ICBjYXNlIDB4RkU1RTogLyogU01BTEwgUklHSFQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCAqLwor
ICAgICAgICAgICAgcmV0dXJuIFlFUzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJl
dHVybiBOTzsKKyAgICB9Cit9CisKK3N0YXRpYyBCT09MIHJlYWRJRE5TY3JpcHRXaGl0ZUxpc3RG
aWxlKE5TU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICBy
ZXR1cm4gTk87CisKKyAgICBGSUxFICpmaWxlID0gZm9wZW4oW2ZpbGVuYW1lIGZpbGVTeXN0ZW1S
ZXByZXNlbnRhdGlvbl0sICJyIik7CisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gTk87
CisgICAgCisgICAgLy8gUmVhZCBhIHdvcmQgYXQgYSB0aW1lLgorICAgIC8vIEFsbG93IGNvbW1l
bnRzLCBzdGFydGluZyB3aXRoICMgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisg
ICAgd2hpbGUgKDEpIHsKKyAgICAgICAgLy8gU2tpcCBhIGNvbW1lbnQgaWYgcHJlc2VudC4KKyAg
ICAgICAgaWYgKGZzY2FuZihmaWxlLCAiICMlKlteXG5ccl0lKltcblxyXSIpID09IEVPRikKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLy8gUmVhZCBhIHNjcmlwdCBuYW1l
IGlmIHByZXNlbnQuCisgICAgICAgIGNoYXIgd29yZFszM107CisgICAgICAgIGludCByZXN1bHQg
PSBmc2NhbmYoZmlsZSwgIiAlMzJbXiMgXHRcblxyXSUqW14jIFx0XG5ccl0gIiwgd29yZCk7Cisg
ICAgICAgIGlmIChyZXN1bHQgPT0gRU9GKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAor
ICAgICAgICBpZiAocmVzdWx0ID09IDEpIHsKKyAgICAgICAgICAgIC8vIEdvdCBhIHdvcmQsIG1h
cCB0byBzY3JpcHQgY29kZSBhbmQgcHV0IGl0IGludG8gdGhlIGFycmF5LgorICAgICAgICAgICAg
aW50MzJfdCBzY3JpcHQgPSB1X2dldFByb3BlcnR5VmFsdWVFbnVtKFVDSEFSX1NDUklQVCwgd29y
ZCk7CisgICAgICAgICAgICBpZiAoc2NyaXB0ID49IDAgJiYgc2NyaXB0IDwgVVNDUklQVF9DT0RF
X0xJTUlUKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc2NyaXB0IC8gMzI7Cisg
ICAgICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IDEgPDwgKHNjcmlwdCAlIDMyKTsKKyAgICAg
ICAgICAgICAgICBJRE5TY3JpcHRXaGl0ZUxpc3RbaW5kZXhdIHw9IG1hc2s7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICAgIHJldHVybiBZRVM7
Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRJRE5TY3JpcHRXaGl0ZUxpc3Qodm9pZCkKK3sKKyAgICAv
LyBSZWFkIHdoaXRlIGxpc3QgZnJvbSBsaWJyYXJ5LgorICAgIE5TQXJyYXkgKmRpcnMgPSBOU1Nl
YXJjaFBhdGhGb3JEaXJlY3Rvcmllc0luRG9tYWlucyhOU0xpYnJhcnlEaXJlY3RvcnksIE5TQWxs
RG9tYWluc01hc2ssIFlFUyk7CisgICAgaW50IG51bURpcnMgPSBbZGlycyBjb3VudF07CisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1EaXJzOyBpKyspIHsKKyAgICAgICAgaWYgKHJlYWRJRE5T
Y3JpcHRXaGl0ZUxpc3RGaWxlKFtbZGlycyBvYmplY3RBdEluZGV4OmldIHN0cmluZ0J5QXBwZW5k
aW5nUGF0aENvbXBvbmVudDpAIklETlNjcmlwdFdoaXRlTGlzdC50eHQiXSkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEZhbGwgYmFjayBvbiB3aGl0ZSBsaXN0IGlu
c2lkZSBidW5kbGUuCisgICAgTlNCdW5kbGUgKmJ1bmRsZSA9IFtOU0J1bmRsZSBidW5kbGVXaXRo
SWRlbnRpZmllcjpAImNvbS5hcHBsZS5XZWJLaXQiXTsKKyAgICByZWFkSUROU2NyaXB0V2hpdGVM
aXN0RmlsZShbYnVuZGxlIHBhdGhGb3JSZXNvdXJjZTpAIklETlNjcmlwdFdoaXRlTGlzdCIgb2ZU
eXBlOkAidHh0Il0pOworfQorCitzdGF0aWMgQk9PTCBhbGxDaGFyYWN0ZXJzSW5JRE5TY3JpcHRX
aGl0ZUxpc3QoY29uc3QgVUNoYXIgKmJ1ZmZlciwgaW50MzJfdCBsZW5ndGgpCit7CisgICAgcHRo
cmVhZF9vbmNlKCZJRE5TY3JpcHRXaGl0ZUxpc3RGaWxlUmVhZCwgcmVhZElETlNjcmlwdFdoaXRl
TGlzdCk7CisgICAgCisgICAgaW50MzJfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkg
eworICAgICAgICBVQ2hhcjMyIGM7CisgICAgICAgIFUxNl9ORVhUKGJ1ZmZlciwgaSwgbGVuZ3Ro
LCBjKQorICAgICAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOworICAgICAgICBV
U2NyaXB0Q29kZSBzY3JpcHQgPSB1c2NyaXB0X2dldFNjcmlwdChjLCAmZXJyb3IpOworICAgICAg
ICBpZiAoZXJyb3IgIT0gVV9aRVJPX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoImdv
dCBJQ1UgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGxvb2sgYXQgc2NyaXB0czogJWQiLCBlcnJvcik7
CisgICAgICAgICAgICByZXR1cm4gTk87CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjcmlwdCA8
IDApIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiZ290IG5lZ2F0aXZlIG51bWJlciBmb3Igc2Ny
aXB0IGNvZGUgZnJvbSBJQ1U6ICVkIiwgc2NyaXB0KTsKKyAgICAgICAgICAgIHJldHVybiBOTzsK
KyAgICAgICAgfQorICAgICAgICBpZiAoc2NyaXB0ID49IFVTQ1JJUFRfQ09ERV9MSU1JVCkKKyAg
ICAgICAgICAgIHJldHVybiBOTzsKKworICAgICAgICBzaXplX3QgaW5kZXggPSBzY3JpcHQgLyAz
MjsKKyAgICAgICAgdWludDMyX3QgbWFzayA9IDEgPDwgKHNjcmlwdCAlIDMyKTsKKyAgICAgICAg
aWYgKCEoSUROU2NyaXB0V2hpdGVMaXN0W2luZGV4XSAmIG1hc2spKQorICAgICAgICAgICAgcmV0
dXJuIE5POworICAgICAgICAKKyAgICAgICAgaWYgKGlzTG9va2FsaWtlQ2hhcmFjdGVyKGMpKQor
ICAgICAgICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICByZXR1cm4gWUVTOworfQorCitzdGF0
aWMgQk9PTCBhbGxDaGFyYWN0ZXJzQWxsb3dlZEJ5VExEUnVsZXMoY29uc3QgVUNoYXIqIGJ1ZmZl
ciwgaW50MzJfdCBsZW5ndGgpCit7CisgICAgLy8gU2tpcCB0cmFpbGluZyBkb3QgZm9yIHJvb3Qg
ZG9tYWluLgorICAgIGlmIChidWZmZXJbbGVuZ3RoIC0gMV0gPT0gJy4nKQorICAgICAgICBsZW5n
dGgtLTsKKyAgICAKKyAgICBpZiAobGVuZ3RoID4gMyAmJiBidWZmZXJbbGVuZ3RoIC0gM10gPT0g
Jy4nCisgICAgICAgICYmIGJ1ZmZlcltsZW5ndGggLSAyXSA9PSAweDA0NDAgLy8gQ1lSSUxMSUMg
U01BTEwgTEVUVEVSIEVSCisgICAgICAgICYmIGJ1ZmZlcltsZW5ndGggLSAxXSA9PSAweDA0NDQp
IC8vIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHsKKyAgICAgICAgLy8gUnVsZXMgZGVm
aW5lZCBieSA8aHR0cDovL3d3dy5jY3RsZC5ydS9ydS9kb2NzL3J1bGVzcmYucGhwPi4gVGhpcyBj
b2RlIG9ubHkgY2hlY2tzIHJlcXVpcmVtZW50cyB0aGF0IG1hdHRlciBmb3IgcHJlc2VudGF0aW9u
IHB1cnBvc2VzLgorICAgICAgICBmb3IgKGludDMyX3QgaSA9IGxlbmd0aCAtIDQ7IGk7IC0taSkg
eworICAgICAgICAgICAgVUNoYXIgY2ggPSBidWZmZXJbaV07CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIE9ubHkgbW9kZXJuIFJ1c3NpYW4gbGV0dGVycywgZGlnaXRzIGFuZCBkYXNoZXMg
YXJlIGFsbG93ZWQuCisgICAgICAgICAgICBpZiAoKGNoID49IDB4MDQzMCAmJiBjaCA8PSAweDA0
NGYpIHx8IGNoID09IDB4MDQ1MXx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAn
LScpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIE9ubHkgY2hlY2sgdG9wIGxldmVsIGRvbWFpbi4gTG93ZXIgbGV2ZWwgcmVnaXN0cmFycyBt
YXkgaGF2ZSBkaWZmZXJlbnQgcnVsZXMuCisgICAgICAgICAgICBpZiAoY2ggPT0gJy4nKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gTk87
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICB9CisgICAgCisgICAgLy8gTm90
IGEga25vd24gdG9wIGxldmVsIGRvbWFpbiB3aXRoIHNwZWNpYWwgcnVsZXMuCisgICAgcmV0dXJu
IE5POworfQorCisvLyBSZXR1cm4gdmFsdWUgb2YgbmlsIG1lYW5zIG5vIG1hcHBpbmcgaXMgbmVj
ZXNzYXJ5LgorLy8gSWYgbWFrZVN0cmluZyBpcyBOTywgdGhlbiByZXR1cm4gdmFsdWUgaXMgZWl0
aGVyIG5pbCBvciBzZWxmIHRvIGluZGljYXRlIG1hcHBpbmcgaXMgbmVjZXNzYXJ5LgorLy8gSWYg
bWFrZVN0cmluZyBpcyBZRVMsIHRoZW4gcmV0dXJuIHZhbHVlIGlzIGVpdGhlciBuaWwgb3IgdGhl
IG1hcHBlZCBzdHJpbmcuCitzdGF0aWMgTlNTdHJpbmcgKm1hcEhvc3ROYW1lV2l0aFJhbmdlKE5T
U3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UsIEJPT0wgZW5jb2RlLCBCT09MIG1ha2VTdHJp
bmcpCit7CisgICAgaWYgKHJhbmdlLmxlbmd0aCA+IEhPU1RfTkFNRV9CVUZGRVJfTEVOR1RIKQor
ICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIGlmICghW3N0cmluZyBsZW5ndGhdKQorICAg
ICAgICByZXR1cm4gbmlsOworICAgIAorICAgIFVDaGFyIHNvdXJjZUJ1ZmZlcltIT1NUX05BTUVf
QlVGRkVSX0xFTkdUSF07CisgICAgVUNoYXIgZGVzdGluYXRpb25CdWZmZXJbSE9TVF9OQU1FX0JV
RkZFUl9MRU5HVEhdOworICAgIAorICAgIGlmIChlbmNvZGUgJiYgW3N0cmluZyByYW5nZU9mU3Ry
aW5nOkAiJSIgb3B0aW9uczpOU0xpdGVyYWxTZWFyY2ggcmFuZ2U6cmFuZ2VdLmxvY2F0aW9uICE9
IE5TTm90Rm91bmQpIHsKKyAgICAgICAgTlNTdHJpbmcgKnN1YnN0cmluZyA9IFtzdHJpbmcgc3Vi
c3RyaW5nV2l0aFJhbmdlOnJhbmdlXTsKKyAgICAgICAgc3Vic3RyaW5nID0gV2ViQ29yZUNGQXV0
b3JlbGVhc2UoQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzKE5VTEws
IChDRlN0cmluZ1JlZilzdWJzdHJpbmcsIENGU1RSKCIiKSkpOworICAgICAgICBpZiAoc3Vic3Ry
aW5nKSB7CisgICAgICAgICAgICBzdHJpbmcgPSBzdWJzdHJpbmc7CisgICAgICAgICAgICByYW5n
ZSA9IE5TTWFrZVJhbmdlKDAsIFtzdHJpbmcgbGVuZ3RoXSk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgaW50IGxlbmd0aCA9IHJhbmdlLmxlbmd0aDsKKyAgICBbc3RyaW5nIGdldENoYXJh
Y3RlcnM6c291cmNlQnVmZmVyIHJhbmdlOnJhbmdlXTsKKyAgICAKKyAgICBVRXJyb3JDb2RlIGVy
cm9yID0gVV9aRVJPX0VSUk9SOworICAgIGludDMyX3QgbnVtQ2hhcmFjdGVyc0NvbnZlcnRlZCA9
IChlbmNvZGUgPyB1aWRuYV9JRE5Ub0FTQ0lJIDogdWlkbmFfSUROVG9Vbmljb2RlKShzb3VyY2VC
dWZmZXIsIGxlbmd0aCwgZGVzdGluYXRpb25CdWZmZXIsIEhPU1RfTkFNRV9CVUZGRVJfTEVOR1RI
LCBVSUROQV9BTExPV19VTkFTU0lHTkVELCBOVUxMLCAmZXJyb3IpOworICAgIGlmIChlcnJvciAh
PSBVX1pFUk9fRVJST1IpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgaWYgKG51bUNo
YXJhY3RlcnNDb252ZXJ0ZWQgPT0gbGVuZ3RoICYmICFtZW1jbXAoc291cmNlQnVmZmVyLCBkZXN0
aW5hdGlvbkJ1ZmZlciwgbGVuZ3RoICogc2l6ZW9mKFVDaGFyKSkpCisgICAgICAgIHJldHVybiBu
aWw7CisgICAgCisgICAgaWYgKCFlbmNvZGUgJiYgIWFsbENoYXJhY3RlcnNJbklETlNjcmlwdFdo
aXRlTGlzdChkZXN0aW5hdGlvbkJ1ZmZlciwgbnVtQ2hhcmFjdGVyc0NvbnZlcnRlZCkgJiYgIWFs
bENoYXJhY3RlcnNBbGxvd2VkQnlUTERSdWxlcyhkZXN0aW5hdGlvbkJ1ZmZlciwgbnVtQ2hhcmFj
dGVyc0NvbnZlcnRlZCkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgcmV0dXJuIG1h
a2VTdHJpbmcgPyAoTlNTdHJpbmcgKilbTlNTdHJpbmcgc3RyaW5nV2l0aENoYXJhY3RlcnM6ZGVz
dGluYXRpb25CdWZmZXIgbGVuZ3RoOm51bUNoYXJhY3RlcnNDb252ZXJ0ZWRdIDogc3RyaW5nOwor
fQorCitzdGF0aWMgQk9PTCBob3N0TmFtZU5lZWRzRGVjb2RpbmdXaXRoUmFuZ2UoTlNTdHJpbmcg
KnN0cmluZywgTlNSYW5nZSByYW5nZSkKK3sKKyAgICAgcmV0dXJuIG1hcEhvc3ROYW1lV2l0aFJh
bmdlKHN0cmluZywgcmFuZ2UsIE5PLCBOTykgIT0gbmlsOworfQorIAorc3RhdGljIEJPT0wgaG9z
dE5hbWVOZWVkc0VuY29kaW5nV2l0aFJhbmdlKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFu
Z2UpCit7CisgICAgIHJldHVybiBtYXBIb3N0TmFtZVdpdGhSYW5nZShzdHJpbmcsIHJhbmdlLCBZ
RVMsICBOTykgIT0gbmlsOworfQorCitzdGF0aWMgTlNTdHJpbmcgKmRlY29kZUhvc3ROYW1lV2l0
aFJhbmdlKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UpCit7CisgICAgcmV0dXJuIG1h
cEhvc3ROYW1lV2l0aFJhbmdlKHN0cmluZywgcmFuZ2UsIE5PLCBZRVMpOworfQorCitzdGF0aWMg
TlNTdHJpbmcgKmVuY29kZUhvc3ROYW1lV2l0aFJhbmdlKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFu
Z2UgcmFuZ2UpCit7CisgICAgcmV0dXJuIG1hcEhvc3ROYW1lV2l0aFJhbmdlKHN0cmluZywgcmFu
Z2UsIFlFUywgWUVTKTsKK30KKworc3RhdGljIHZvaWQgY29sbGVjdFJhbmdlc1RoYXROZWVkTWFw
cGluZyhOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJhbmdlLCB2b2lkICpjb250ZXh0LCBCT09M
IGVuY29kZSkKK3sKKyAgICBCT09MIG5lZWRzTWFwcGluZyA9IGVuY29kZSA/IGhvc3ROYW1lTmVl
ZHNFbmNvZGluZ1dpdGhSYW5nZShzdHJpbmcsIHJhbmdlKSA6IGhvc3ROYW1lTmVlZHNEZWNvZGlu
Z1dpdGhSYW5nZShzdHJpbmcsIHJhbmdlKTsKKyAgICBpZiAoIW5lZWRzTWFwcGluZykKKyAgICAg
ICAgcmV0dXJuOworICAgIAorICAgIE5TTXV0YWJsZUFycmF5ICoqYXJyYXkgPSAoTlNNdXRhYmxl
QXJyYXkgKiopY29udGV4dDsKKyAgICBpZiAoISphcnJheSkKKyAgICAgICAgKmFycmF5ID0gW1tO
U011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgICAgCisgICAgWyphcnJheSBhZGRPYmplY3Q6
W05TVmFsdWUgdmFsdWVXaXRoUmFuZ2U6cmFuZ2VdXTsKK30KKworc3RhdGljIHZvaWQgY29sbGVj
dFJhbmdlc1RoYXROZWVkRW5jb2RpbmcoTlNTdHJpbmcgKnN0cmluZywgTlNSYW5nZSByYW5nZSwg
dm9pZCAqY29udGV4dCkKK3sKKyAgICByZXR1cm4gY29sbGVjdFJhbmdlc1RoYXROZWVkTWFwcGlu
ZyhzdHJpbmcsIHJhbmdlLCBjb250ZXh0LCBZRVMpOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0
UmFuZ2VzVGhhdE5lZWREZWNvZGluZyhOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJhbmdlLCB2
b2lkICpjb250ZXh0KQoreworICAgIHJldHVybiBjb2xsZWN0UmFuZ2VzVGhhdE5lZWRNYXBwaW5n
KHN0cmluZywgcmFuZ2UsIGNvbnRleHQsIE5PKTsKK30KKworc3RhdGljIGlubGluZSBOU0NoYXJh
Y3RlclNldCAqcmV0YWluKE5TQ2hhcmFjdGVyU2V0ICpjaGFyc2V0KQoreworICAgIENGUmV0YWlu
KGNoYXJzZXQpOworICAgIHJldHVybiBjaGFyc2V0OworfQorCitzdGF0aWMgdm9pZCBhcHBseUhv
c3ROYW1lRnVuY3Rpb25Ub01haWxUb1VSTFN0cmluZyhOU1N0cmluZyAqc3RyaW5nLCBTdHJpbmdS
YW5nZUFwcGxpZXJGdW5jdGlvbiBmLCB2b2lkICpjb250ZXh0KQoreworICAgIC8vIEluIGEgbWFp
bHRvOiBVUkwsIGhvc3QgbmFtZXMgY29tZSBhZnRlciBhICdAJyBjaGFyYWN0ZXIgYW5kIGVuZCB3
aXRoIGEgJz4nIG9yICcsJyBvciAnPycgY2hhcmFjdGVyLgorICAgIC8vIFNraXAgcXVvdGVkIHN0
cmluZ3Mgc28gdGhhdCBjaGFyYWN0ZXJzIGluIHRoZW0gZG9uJ3QgY29uZnVzZSB1cy4KKyAgICAv
LyBXaGVuIHdlIGZpbmQgYSAnPycgY2hhcmFjdGVyLCB3ZSBhcmUgcGFzdCB0aGUgcGFydCBvZiB0
aGUgVVJMIHRoYXQgY29udGFpbnMgaG9zdCBuYW1lcy4KKyAgICAKKyAgICBzdGF0aWMgTlNDaGFy
YWN0ZXJTZXQgKmhvc3ROYW1lT3JTdHJpbmdTdGFydENoYXJhY3RlcnMgPSByZXRhaW4oW05TQ2hh
cmFjdGVyU2V0IGNoYXJhY3RlclNldFdpdGhDaGFyYWN0ZXJzSW5TdHJpbmc6QCJcIkA/Il0pOwor
ICAgIHN0YXRpYyBOU0NoYXJhY3RlclNldCAqaG9zdE5hbWVFbmRDaGFyYWN0ZXJzID0gcmV0YWlu
KFtOU0NoYXJhY3RlclNldCBjaGFyYWN0ZXJTZXRXaXRoQ2hhcmFjdGVyc0luU3RyaW5nOkAiPiw/
Il0pOworICAgIHN0YXRpYyBOU0NoYXJhY3RlclNldCAqcXVvdGVkU3RyaW5nQ2hhcmFjdGVycyA9
IHJldGFpbihbTlNDaGFyYWN0ZXJTZXQgY2hhcmFjdGVyU2V0V2l0aENoYXJhY3RlcnNJblN0cmlu
ZzpAIlwiXFwiXSk7CisgICAgCisgICAgdW5zaWduZWQgc3RyaW5nTGVuZ3RoID0gW3N0cmluZyBs
ZW5ndGhdOworICAgIE5TUmFuZ2UgcmVtYWluaW5nID0gTlNNYWtlUmFuZ2UoMCwgc3RyaW5nTGVu
Z3RoKTsKKyAgICAKKyAgICB3aGlsZSAoMSkgeworICAgICAgICAvLyBGaW5kIHN0YXJ0IG9mIGhv
c3QgbmFtZSBvciBvZiBxdW90ZWQgc3RyaW5nLgorICAgICAgICBOU1JhbmdlIGhvc3ROYW1lT3JT
dHJpbmdTdGFydCA9IFtzdHJpbmcgcmFuZ2VPZkNoYXJhY3RlckZyb21TZXQ6aG9zdE5hbWVPclN0
cmluZ1N0YXJ0Q2hhcmFjdGVycyBvcHRpb25zOjAgcmFuZ2U6cmVtYWluaW5nXTsKKyAgICAgICAg
aWYgKGhvc3ROYW1lT3JTdHJpbmdTdGFydC5sb2NhdGlvbiA9PSBOU05vdEZvdW5kKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIHVuaWNoYXIgYyA9IFtzdHJpbmcgY2hhcmFjdGVyQXRJ
bmRleDpob3N0TmFtZU9yU3RyaW5nU3RhcnQubG9jYXRpb25dOworICAgICAgICByZW1haW5pbmcu
bG9jYXRpb24gPSBOU01heFJhbmdlKGhvc3ROYW1lT3JTdHJpbmdTdGFydCk7CisgICAgICAgIHJl
bWFpbmluZy5sZW5ndGggPSBzdHJpbmdMZW5ndGggLSByZW1haW5pbmcubG9jYXRpb247CisgICAg
ICAgIAorICAgICAgICBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IAorICAgICAgICBpZiAoYyA9PSAnQCcpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgZW5kIG9mIGhv
c3QgbmFtZS4KKyAgICAgICAgICAgIHVuc2lnbmVkIGhvc3ROYW1lU3RhcnQgPSByZW1haW5pbmcu
bG9jYXRpb247CisgICAgICAgICAgICBOU1JhbmdlIGhvc3ROYW1lRW5kID0gW3N0cmluZyByYW5n
ZU9mQ2hhcmFjdGVyRnJvbVNldDpob3N0TmFtZUVuZENoYXJhY3RlcnMgb3B0aW9uczowIHJhbmdl
OnJlbWFpbmluZ107CisgICAgICAgICAgICBCT09MIGRvbmU7CisgICAgICAgICAgICBpZiAoaG9z
dE5hbWVFbmQubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkgeworICAgICAgICAgICAgICAgIGhvc3RO
YW1lRW5kLmxvY2F0aW9uID0gc3RyaW5nTGVuZ3RoOworICAgICAgICAgICAgICAgIGRvbmUgPSBZ
RVM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbWFpbmluZy5sb2Nh
dGlvbiA9IGhvc3ROYW1lRW5kLmxvY2F0aW9uOworICAgICAgICAgICAgICAgIHJlbWFpbmluZy5s
ZW5ndGggPSBzdHJpbmdMZW5ndGggLSByZW1haW5pbmcubG9jYXRpb247CisgICAgICAgICAgICAg
ICAgZG9uZSA9IE5POworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAv
LyBQcm9jZXNzIGhvc3QgbmFtZSByYW5nZS4KKyAgICAgICAgICAgIGYoc3RyaW5nLCBOU01ha2VS
YW5nZShob3N0TmFtZVN0YXJ0LCBob3N0TmFtZUVuZC5sb2NhdGlvbiAtIGhvc3ROYW1lU3RhcnQp
LCBjb250ZXh0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2tpcCBx
dW90ZWQgc3RyaW5nLgorICAgICAgICAgICAgQVNTRVJUKGMgPT0gJyInKTsKKyAgICAgICAgICAg
IHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgTlNSYW5nZSBlc2NhcGVkQ2hhcmFjdGVyT3JT
dHJpbmdFbmQgPSBbc3RyaW5nIHJhbmdlT2ZDaGFyYWN0ZXJGcm9tU2V0OnF1b3RlZFN0cmluZ0No
YXJhY3RlcnMgb3B0aW9uczowIHJhbmdlOnJlbWFpbmluZ107CisgICAgICAgICAgICAgICAgaWYg
KGVzY2FwZWRDaGFyYWN0ZXJPclN0cmluZ0VuZC5sb2NhdGlvbiA9PSBOU05vdEZvdW5kKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBjID0gW3N0cmluZyBj
aGFyYWN0ZXJBdEluZGV4OmVzY2FwZWRDaGFyYWN0ZXJPclN0cmluZ0VuZC5sb2NhdGlvbl07Cisg
ICAgICAgICAgICAgICAgcmVtYWluaW5nLmxvY2F0aW9uID0gTlNNYXhSYW5nZShlc2NhcGVkQ2hh
cmFjdGVyT3JTdHJpbmdFbmQpOworICAgICAgICAgICAgICAgIHJlbWFpbmluZy5sZW5ndGggPSBz
dHJpbmdMZW5ndGggLSByZW1haW5pbmcubG9jYXRpb247CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgdGhlbiBicmVh
ayBmcm9tIHRoZSBzdHJpbmcgbG9vcCBiYWNrIHRvIHRoZSBob3N0IG5hbWUgbG9vcC4KKyAgICAg
ICAgICAgICAgICBpZiAoYyA9PSAnIicpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFNraXAgZXNjYXBlZCBjaGFyYWN0ZXIu
CisgICAgICAgICAgICAgICAgQVNTRVJUKGMgPT0gJ1xcJyk7CisgICAgICAgICAgICAgICAgaWYg
KCFyZW1haW5pbmcubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgICAgICAgICByZW1haW5pbmcubG9jYXRpb24gKz0gMTsKKyAgICAgICAgICAgICAgICByZW1h
aW5pbmcubGVuZ3RoIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisK
K3N0YXRpYyB2b2lkIGFwcGx5SG9zdE5hbWVGdW5jdGlvblRvVVJMU3RyaW5nKE5TU3RyaW5nICpz
dHJpbmcsIFN0cmluZ1JhbmdlQXBwbGllckZ1bmN0aW9uIGYsIHZvaWQgKmNvbnRleHQpCit7Cisg
ICAgLy8gRmluZCBob3N0bmFtZXMuIFRvbyBiYWQgd2UgY2FuJ3QgdXNlIGFueSByZWFsIFVSTC1w
YXJzaW5nIGNvZGUgdG8gZG8gdGhpcywKKyAgICAvLyBidXQgd2UgaGF2ZSB0byBkbyBpdCBiZWZv
cmUgZG9pbmcgYWxsIHRoZSAlLWVzY2FwaW5nLCBhbmQgdGhpcyBpcyB0aGUgb25seQorICAgIC8v
IGNvZGUgd2UgaGF2ZSB0aGF0IHBhcnNlcyBtYWlsdG8gVVJMcyBhbnl3YXkuCisgICAgCisgICAg
Ly8gTWF5YmUgd2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIHVzaW5nIGEgY2hhcmFjdGVyIGJ1ZmZl
ciBpbnN0ZWFkPworICAgIAorICAgIGlmIChoYXNDYXNlSW5zZW5zaXRpdmVQcmVmaXgoc3RyaW5n
LCBAIm1haWx0bzoiKSkgeworICAgICAgICBhcHBseUhvc3ROYW1lRnVuY3Rpb25Ub01haWxUb1VS
TFN0cmluZyhzdHJpbmcsIGYsIGNvbnRleHQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
IAorICAgIC8vIEZpbmQgdGhlIGhvc3QgbmFtZSBpbiBhIGhpZXJhcmNoaWNhbCBVUkwuCisgICAg
Ly8gSXQgY29tZXMgYWZ0ZXIgYSAiOi8vIiBzZXF1ZW5jZSwgd2l0aCBzY2hlbWUgY2hhcmFjdGVy
cyBwcmVjZWRpbmcuCisgICAgLy8gSWYgZW5kcyB3aXRoIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBv
ciBhICI6IiwgIi8iLCBvciBhICI/Ii4KKyAgICAvLyBJZiB0aGVyZSBpcyBhICJAIiBjaGFyYWN0
ZXIsIHRoZSBob3N0IHBhcnQgaXMganVzdCB0aGUgcGFydCBhZnRlciB0aGUgIkAiLgorICAgIE5T
UmFuZ2Ugc2VwYXJhdG9yUmFuZ2UgPSBbc3RyaW5nIHJhbmdlT2ZTdHJpbmc6QCI6Ly8iXTsKKyAg
ICBpZiAoc2VwYXJhdG9yUmFuZ2UubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkKKyAgICAgICAgcmV0
dXJuOworICAgIAorICAgIC8vIENoZWNrIHRoYXQgYWxsIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSA6
Ly8gYXJlIHZhbGlkIHNjaGVtZSBjaGFyYWN0ZXJzLgorICAgIHN0YXRpYyBOU0NoYXJhY3RlclNl
dCAqbm9uU2NoZW1lQ2hhcmFjdGVycyA9IHJldGFpbihbW05TQ2hhcmFjdGVyU2V0IGNoYXJhY3Rl
clNldFdpdGhDaGFyYWN0ZXJzSW5TdHJpbmc6QCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFi
Y2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstLiJdIGludmVydGVkU2V0XSk7Cisg
ICAgaWYgKFtzdHJpbmcgcmFuZ2VPZkNoYXJhY3RlckZyb21TZXQ6bm9uU2NoZW1lQ2hhcmFjdGVy
cyBvcHRpb25zOjAgcmFuZ2U6TlNNYWtlUmFuZ2UoMCwgc2VwYXJhdG9yUmFuZ2UubG9jYXRpb24p
XS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgdW5z
aWduZWQgc3RyaW5nTGVuZ3RoID0gW3N0cmluZyBsZW5ndGhdOworICAgIAorICAgIHN0YXRpYyBO
U0NoYXJhY3RlclNldCAqaG9zdFRlcm1pbmF0b3JzID0gcmV0YWluKFtOU0NoYXJhY3RlclNldCBj
aGFyYWN0ZXJTZXRXaXRoQ2hhcmFjdGVyc0luU3RyaW5nOkAiOi8/IyJdKTsKKyAgICAKKyAgICAv
LyBTdGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLgorICAgIHVuc2lnbmVkIGF1dGhvcml0eVN0YXJ0
ID0gTlNNYXhSYW5nZShzZXBhcmF0b3JSYW5nZSk7CisgICAgCisgICAgLy8gRmluZCB0ZXJtaW5h
dGluZyBjaGFyYWN0ZXIuCisgICAgTlNSYW5nZSBob3N0TmFtZVRlcm1pbmF0b3IgPSBbc3RyaW5n
IHJhbmdlT2ZDaGFyYWN0ZXJGcm9tU2V0Omhvc3RUZXJtaW5hdG9ycyBvcHRpb25zOjAgcmFuZ2U6
TlNNYWtlUmFuZ2UoYXV0aG9yaXR5U3RhcnQsIHN0cmluZ0xlbmd0aCAtIGF1dGhvcml0eVN0YXJ0
KV07CisgICAgdW5zaWduZWQgaG9zdE5hbWVFbmQgPSBob3N0TmFtZVRlcm1pbmF0b3IubG9jYXRp
b24gPT0gTlNOb3RGb3VuZCA/IHN0cmluZ0xlbmd0aCA6IGhvc3ROYW1lVGVybWluYXRvci5sb2Nh
dGlvbjsKKyAgICAKKyAgICAvLyBGaW5kICJAIiBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBob3N0IG5h
bWUuCisgICAgTlNSYW5nZSB1c2VySW5mb1Rlcm1pbmF0b3IgPSBbc3RyaW5nIHJhbmdlT2ZTdHJp
bmc6QCJAIiBvcHRpb25zOjAgcmFuZ2U6TlNNYWtlUmFuZ2UoYXV0aG9yaXR5U3RhcnQsIGhvc3RO
YW1lRW5kIC0gYXV0aG9yaXR5U3RhcnQpXTsKKyAgICB1bnNpZ25lZCBob3N0TmFtZVN0YXJ0ID0g
dXNlckluZm9UZXJtaW5hdG9yLmxvY2F0aW9uID09IE5TTm90Rm91bmQgPyBhdXRob3JpdHlTdGFy
dCA6IE5TTWF4UmFuZ2UodXNlckluZm9UZXJtaW5hdG9yKTsKKyAgICAKKyAgICBmKHN0cmluZywg
TlNNYWtlUmFuZ2UoaG9zdE5hbWVTdGFydCwgaG9zdE5hbWVFbmQgLSBob3N0TmFtZVN0YXJ0KSwg
Y29udGV4dCk7Cit9CisKK3N0YXRpYyBOU1N0cmluZyAqbWFwSG9zdE5hbWVzKE5TU3RyaW5nICpz
dHJpbmcsIEJPT0wgZW5jb2RlKQoreworICAgIC8vIEdlbmVyYWxseSwgd2Ugd2FudCB0byBvcHRp
bWl6ZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25lIGhvc3QgbmFtZSB0aGF0IGRvZXMg
bm90IG5lZWQgbWFwcGluZy4KKyAgICAKKyAgICBpZiAoZW5jb2RlICYmIFtzdHJpbmcgY2FuQmVD
b252ZXJ0ZWRUb0VuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ10pCisgICAgICAgIHJldHVy
biBzdHJpbmc7CisgICAgCisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgcmFuZ2VzIHRoYXQgYWN0dWFs
bHkgbmVlZCBtYXBwaW5nLgorICAgIE5TTXV0YWJsZUFycmF5ICpob3N0TmFtZVJhbmdlcyA9IG5p
bDsKKyAgICBTdHJpbmdSYW5nZUFwcGxpZXJGdW5jdGlvbiBmID0gZW5jb2RlID8gY29sbGVjdFJh
bmdlc1RoYXROZWVkRW5jb2RpbmcgOiBjb2xsZWN0UmFuZ2VzVGhhdE5lZWREZWNvZGluZzsKKyAg
ICBhcHBseUhvc3ROYW1lRnVuY3Rpb25Ub1VSTFN0cmluZyhzdHJpbmcsIGYsICZob3N0TmFtZVJh
bmdlcyk7CisgICAgaWYgKCFob3N0TmFtZVJhbmdlcykKKyAgICAgICAgcmV0dXJuIHN0cmluZzsK
KyAgICAKKyAgICAvLyBEbyB0aGUgbWFwcGluZy4KKyAgICBOU011dGFibGVTdHJpbmcgKm11dGFi
bGVDb3B5ID0gW3N0cmluZyBtdXRhYmxlQ29weV07CisgICAgdW5zaWduZWQgaSA9IFtob3N0TmFt
ZVJhbmdlcyBjb3VudF07CisgICAgd2hpbGUgKGktLSkgeworICAgICAgICBOU1JhbmdlIGhvc3RO
YW1lUmFuZ2UgPSBbW2hvc3ROYW1lUmFuZ2VzIG9iamVjdEF0SW5kZXg6aV0gcmFuZ2VWYWx1ZV07
CisgICAgICAgIE5TU3RyaW5nICptYXBwZWRIb3N0TmFtZSA9IGVuY29kZSA/IGVuY29kZUhvc3RO
YW1lV2l0aFJhbmdlKHN0cmluZywgaG9zdE5hbWVSYW5nZSkgOiBkZWNvZGVIb3N0TmFtZVdpdGhS
YW5nZShzdHJpbmcsIGhvc3ROYW1lUmFuZ2UpOworICAgICAgICBbbXV0YWJsZUNvcHkgcmVwbGFj
ZUNoYXJhY3RlcnNJblJhbmdlOmhvc3ROYW1lUmFuZ2Ugd2l0aFN0cmluZzptYXBwZWRIb3N0TmFt
ZV07CisgICAgfQorICAgIFtob3N0TmFtZVJhbmdlcyByZWxlYXNlXTsKKyAgICByZXR1cm4gW211
dGFibGVDb3B5IGF1dG9yZWxlYXNlXTsKK30KKworc3RhdGljIEJPT0wgaXNIZXhEaWdpdChjaGFy
IGMpCit7CisgICAgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYm
IGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorCitzdGF0aWMgY2hhciBo
ZXhEaWdpdChpbnQgaSkKK3sKKyAgICBpZiAoaSA8IDAgfHwgaSA+IDE2KQorICAgICAgICByZXR1
cm4gJzAnOworCisgICAgcmV0dXJuIChpID49IDEwKSA/IGkgLSAxMCArICdBJyA6IGkgKz0gJzAn
OyAKK30KKworc3RhdGljIGludCBoZXhEaWdpdFZhbHVlKGNoYXIgYykKK3sKKyAgICBpZiAoYyA+
PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIHJldHVybiBjIC0gJzAnOworCisgICAgaWYgKGMg
Pj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICByZXR1cm4gYyAtICdBJyArIDEwOworCisgICAg
aWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwor
CisgICAgTE9HX0VSUk9SKCJpbGxlZ2FsIGhleCBkaWdpdCIpOworICAgIHJldHVybiAwOworfQor
CitzdGF0aWMgTlNTdHJpbmcgKnN0cmluZ0J5VHJpbW1pbmdXaGl0ZXNwYWNlKE5TU3RyaW5nICpz
dHJpbmcpCit7CisgICAgTlNNdXRhYmxlU3RyaW5nICp0cmltbWVkID0gW1tzdHJpbmcgbXV0YWJs
ZUNvcHldIGF1dG9yZWxlYXNlXTsKKyAgICBDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKChDRk11dGFi
bGVTdHJpbmdSZWYpdHJpbW1lZCk7CisgICAgcmV0dXJuIHRyaW1tZWQ7Cit9CisKK3N0YXRpYyBO
U1VSTCAqVVJMQnlUcnVuY2F0aW5nT25lQ2hhcmFjdGVyQmVmb3JlQ29tcG9uZW50KE5TVVJMICpV
UkwsIENGVVJMQ29tcG9uZW50VHlwZSBjb21wb25lbnQpCit7CisgICAgQ0ZSYW5nZSBmcmFnUmcg
PSBDRlVSTEdldEJ5dGVSYW5nZUZvckNvbXBvbmVudCgoQ0ZVUkxSZWYpVVJMLCBjb21wb25lbnQs
IE5VTEwpOworICAgIGlmIChmcmFnUmcubG9jYXRpb24gPT0ga0NGTm90Rm91bmQpCisgICAgICAg
IHJldHVybiBVUkw7CisgICAgCisgICAgVUludDggKnVybEJ5dGVzLCBidWZmZXJbMjA0OF07Cisg
ICAgQ0ZJbmRleCBudW1CeXRlcyA9IENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVmKVVSTCwgYnVmZmVy
LCAyMDQ4KTsKKyAgICBpZiAobnVtQnl0ZXMgPT0gLTEpIHsKKyAgICAgICAgbnVtQnl0ZXMgPSBD
RlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIE5VTEwsIDApOworICAgICAgICB1cmxCeXRlcyA9
IHN0YXRpY19jYXN0PFVJbnQ4Kj4obWFsbG9jKG51bUJ5dGVzKSk7CisgICAgICAgIENGVVJMR2V0
Qnl0ZXMoKENGVVJMUmVmKVVSTCwgdXJsQnl0ZXMsIG51bUJ5dGVzKTsKKyAgICB9IGVsc2UKKyAg
ICAgICAgdXJsQnl0ZXMgPSBidWZmZXI7CisgICAgICAgIAorICAgIE5TVVJMICpyZXN1bHQgPSAo
TlNVUkwgKilDRk1ha2VDb2xsZWN0YWJsZShDRlVSTENyZWF0ZVdpdGhCeXRlcyhOVUxMLCB1cmxC
eXRlcywgZnJhZ1JnLmxvY2F0aW9uIC0gMSwga0NGU3RyaW5nRW5jb2RpbmdVVEY4LCBOVUxMKSk7
CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IChOU1VSTCAqKUNGTWFrZUNvbGxl
Y3RhYmxlKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIHVybEJ5dGVzLCBmcmFnUmcubG9jYXRp
b24gLSAxLCBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwgTlVMTCkpOworICAgICAgICAKKyAg
ICBpZiAodXJsQnl0ZXMgIT0gYnVmZmVyKQorICAgICAgICBmcmVlKHVybEJ5dGVzKTsKKyAgICBy
ZXR1cm4gcmVzdWx0ID8gW3Jlc3VsdCBhdXRvcmVsZWFzZV0gOiBVUkw7Cit9CisKK3N0YXRpYyBO
U1VSTCAqVVJMQnlSZW1vdmluZ1Jlc291cmNlU3BlY2lmaWVyKE5TVVJMICpVUkwpCit7CisgICAg
cmV0dXJuIFVSTEJ5VHJ1bmNhdGluZ09uZUNoYXJhY3RlckJlZm9yZUNvbXBvbmVudChVUkwsIGtD
RlVSTENvbXBvbmVudFJlc291cmNlU3BlY2lmaWVyKTsKK30KKworc3RhdGljIE5TVVJMICpVUkxX
aXRoRGF0YShOU0RhdGEgKmRhdGEsIE5TVVJMICpiYXNlVVJMKQoreworICAgIGlmICghZGF0YSkK
KyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBOU1VSTCAqcmVzdWx0ID0gbmlsOworICAg
IHNpemVfdCBsZW5ndGggPSBbZGF0YSBsZW5ndGhdOworICAgIGlmIChsZW5ndGggPiAwKSB7Cisg
ICAgICAgIC8vIHdvcmsgYXJvdW5kIDxyZGFyOi8vNDQ3MDc3MT46IENGVVJMQ3JlYXRlQWJzb2x1
dGVVUkxXaXRoQnl0ZXMoLi4sIFRSVUUpIGRvZXNuJ3QgcmVtb3ZlIG5vbi1wYXRoIGNvbXBvbmVu
dHMuCisgICAgICAgIGJhc2VVUkwgPSBVUkxCeVJlbW92aW5nUmVzb3VyY2VTcGVjaWZpZXIoYmFz
ZVVSTCk7CisgICAgICAgIAorICAgICAgICBjb25zdCBVSW50OCAqYnl0ZXMgPSBzdGF0aWNfY2Fz
dDxjb25zdCBVSW50OCo+KFtkYXRhIGJ5dGVzXSk7CisgICAgICAgIAorICAgICAgICAvLyBDRlVS
TENyZWF0ZUFic29sdXRlVVJMV2l0aEJ5dGVzIHdvdWxkIGNvbXBsYWluIHRvIGNvbnNvbGUgaWYg
d2UgcGFzc2VkIGEgcGF0aCB0byBpdC4KKyAgICAgICAgaWYgKGJ5dGVzWzBdID09ICcvJyAmJiAh
YmFzZVVSTCkKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIAorICAgICAgICAvLyBO
T1RFOiBXZSB1c2UgVVRGLTggaGVyZSBzaW5jZSB0aGlzIGVuY29kaW5nIGlzIHVzZWQgd2hlbiBj
b21wdXRpbmcgc3RyaW5ncyB3aGVuIHJldHVybmluZyBVUkwgY29tcG9uZW50cworICAgICAgICAv
LyAoZS5nIGNhbGxzIHRvIE5TVVJMIC1wYXRoKS4gSG93ZXZlciwgdGhpcyBmdW5jdGlvbiBpcyBu
b3QgdG9sZXJhbnQgb2YgaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZXMsIHdoaWNoCisgICAgICAgIC8v
IGNvdWxkIGVpdGhlciBiZSBhIG1hbGZvcm1lZCBzdHJpbmcgb3IgYnl0ZXMgaW4gYSBkaWZmZXJl
bnQgZW5jb2RpbmcsIGxpa2Ugc2hpZnQtamlzLCBzbyB3ZSBmYWxsIGJhY2sKKyAgICAgICAgLy8g
b250byB1c2luZyBJU08gTGF0aW4gMSBpbiB0aG9zZSBjYXNlcy4KKyAgICAgICAgcmVzdWx0ID0g
V2ViQ29yZUNGQXV0b3JlbGVhc2UoQ0ZVUkxDcmVhdGVBYnNvbHV0ZVVSTFdpdGhCeXRlcyhOVUxM
LCBieXRlcywgbGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgsIChDRlVSTFJlZiliYXNlVVJM
LCBZRVMpKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXN1bHQgPSBXZWJD
b3JlQ0ZBdXRvcmVsZWFzZShDRlVSTENyZWF0ZUFic29sdXRlVVJMV2l0aEJ5dGVzKE5VTEwsIGJ5
dGVzLCBsZW5ndGgsIGtDRlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xLCAoQ0ZVUkxSZWYpYmFzZVVS
TCwgWUVTKSk7CisgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBbTlNVUkwgVVJMV2l0
aFN0cmluZzpAIiJdOworICAgICAgICAgICAgICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K3N0YXRpYyBOU1VSTCAqVVJMV2l0aFVzZXJUeXBlZFN0cmluZyhOU1N0cmluZyAqc3RyaW5nLCBO
U1VSTCAqVVJMKQoreworICAgIGlmICghc3RyaW5nKQorICAgICAgICByZXR1cm4gbmlsOworCisg
ICAgc3RyaW5nID0gbWFwSG9zdE5hbWVzKHN0cmluZ0J5VHJpbW1pbmdXaGl0ZXNwYWNlKHN0cmlu
ZyksIFlFUyk7CisgICAgCisgICAgTlNEYXRhICp1c2VyVHlwZWREYXRhID0gW3N0cmluZyBkYXRh
VXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisgICAgQVNTRVJUKHVzZXJUeXBl
ZERhdGEpOworICAgIAorICAgIGNvbnN0IFVJbnQ4KiBpbkJ5dGVzID0gc3RhdGljX2Nhc3Q8Y29u
c3QgVUludDggKj4oW3VzZXJUeXBlZERhdGEgYnl0ZXNdKTsKKyAgICBpbnQgaW5MZW5ndGggPSBb
dXNlclR5cGVkRGF0YSBsZW5ndGhdOworICAgIGlmICghaW5MZW5ndGgpCisgICAgICAgIHJldHVy
biBbTlNVUkwgVVJMV2l0aFN0cmluZzpAIiJdOworICAgIAorICAgIGNoYXIqIG91dEJ5dGVzID0g
c3RhdGljX2Nhc3Q8Y2hhciAqPihtYWxsb2MoaW5MZW5ndGggKiAzKSk7IC8vIGxhcmdlIGVub3Vn
aCB0byAlLWVzY2FwZSBldmVyeSBjaGFyYWN0ZXIKKyAgICBjaGFyKiBwID0gb3V0Qnl0ZXM7Cisg
ICAgaW50IG91dExlbmd0aCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkxlbmd0aDsg
aSsrKSB7CisgICAgICAgIFVJbnQ4IGMgPSBpbkJ5dGVzW2ldOworICAgICAgICBpZiAoYyA8PSAw
eDIwIHx8IGMgPj0gMHg3ZikgeworICAgICAgICAgICAgKnArKyA9ICclJzsKKyAgICAgICAgICAg
ICpwKysgPSBoZXhEaWdpdChjID4+IDQpOworICAgICAgICAgICAgKnArKyA9IGhleERpZ2l0KGMg
JiAweGYpOworICAgICAgICAgICAgb3V0TGVuZ3RoICs9IDM7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAqcCsrID0gYzsKKyAgICAgICAgICAgIG91dExlbmd0aCsrOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIE5TRGF0YSAqZGF0YSA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlc05v
Q29weTpvdXRCeXRlcyBsZW5ndGg6b3V0TGVuZ3RoXTsgLy8gYWRvcHRzIG91dEJ5dGVzCisgICAg
cmV0dXJuIFVSTFdpdGhEYXRhKGRhdGEsIFVSTCk7Cit9CisKK3N0YXRpYyBOU1VSTCAqVVJMQnlS
ZW1vdmluZ0NvbXBvbmVudEFuZFN1YnNlcXVlbnRDaGFyYWN0ZXIoTlNVUkwgKlVSTCwgQ0ZVUkxD
b21wb25lbnRUeXBlIGNvbXBvbmVudCkKK3sKKyAgICBDRlJhbmdlIHJhbmdlID0gQ0ZVUkxHZXRC
eXRlUmFuZ2VGb3JDb21wb25lbnQoKENGVVJMUmVmKVVSTCwgY29tcG9uZW50LCAwKTsKKyAgICBp
ZiAocmFuZ2UubG9jYXRpb24gPT0ga0NGTm90Rm91bmQpCisgICAgICAgIHJldHVybiBVUkw7Cisg
ICAgCisgICAgLy8gUmVtb3ZlIG9uZSBzdWJzZXF1ZW50IGNoYXJhY3Rlci4KKyAgICByYW5nZS5s
ZW5ndGgrKzsKKyAgICAKKyAgICBVSW50OCogdXJsQnl0ZXM7CisgICAgVUludDggYnVmZmVyWzIw
NDhdOworICAgIENGSW5kZXggbnVtQnl0ZXMgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkws
IGJ1ZmZlciwgMjA0OCk7CisgICAgaWYgKG51bUJ5dGVzID09IC0xKSB7CisgICAgICAgIG51bUJ5
dGVzID0gQ0ZVUkxHZXRCeXRlcygoQ0ZVUkxSZWYpVVJMLCBOVUxMLCAwKTsKKyAgICAgICAgdXJs
Qnl0ZXMgPSBzdGF0aWNfY2FzdDxVSW50OCo+KG1hbGxvYyhudW1CeXRlcykpOworICAgICAgICBD
RlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIHVybEJ5dGVzLCBudW1CeXRlcyk7CisgICAgfSBl
bHNlCisgICAgICAgIHVybEJ5dGVzID0gYnVmZmVyOworICAgICAgICAKKyAgICBpZiAobnVtQnl0
ZXMgPCByYW5nZS5sb2NhdGlvbikKKyAgICAgICAgcmV0dXJuIFVSTDsKKyAgICBpZiAobnVtQnl0
ZXMgPCByYW5nZS5sb2NhdGlvbiArIHJhbmdlLmxlbmd0aCkKKyAgICAgICAgcmFuZ2UubGVuZ3Ro
ID0gbnVtQnl0ZXMgLSByYW5nZS5sb2NhdGlvbjsKKyAgICAgICAgCisgICAgbWVtbW92ZSh1cmxC
eXRlcyArIHJhbmdlLmxvY2F0aW9uLCB1cmxCeXRlcyArIHJhbmdlLmxvY2F0aW9uICsgcmFuZ2Uu
bGVuZ3RoLCBudW1CeXRlcyAtIHJhbmdlLmxvY2F0aW9uICsgcmFuZ2UubGVuZ3RoKTsKKyAgICAK
KyAgICBOU1VSTCAqcmVzdWx0ID0gKE5TVVJMICopQ0ZNYWtlQ29sbGVjdGFibGUoQ0ZVUkxDcmVh
dGVXaXRoQnl0ZXMoTlVMTCwgdXJsQnl0ZXMsIG51bUJ5dGVzIC0gcmFuZ2UubGVuZ3RoLCBrQ0ZT
dHJpbmdFbmNvZGluZ1VURjgsIE5VTEwpKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmVz
dWx0ID0gKE5TVVJMICopQ0ZNYWtlQ29sbGVjdGFibGUoQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoTlVM
TCwgdXJsQnl0ZXMsIG51bUJ5dGVzIC0gcmFuZ2UubGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGluZ0lT
T0xhdGluMSwgTlVMTCkpOworICAgICAgICAgICAgCisgICAgaWYgKHVybEJ5dGVzICE9IGJ1ZmZl
cikKKyAgICAgICAgZnJlZSh1cmxCeXRlcyk7CisgICAgICAgICAgICAgICAgCisgICAgcmV0dXJu
IHJlc3VsdCA/IFtyZXN1bHQgYXV0b3JlbGVhc2VdIDogVVJMOworfQorCitzdGF0aWMgTlNVUkwg
KlVSTEJ5UmVtb3ZpbmdVc2VySW5mbyhOU1VSTCAqVVJMKQoreworICAgIHJldHVybiBVUkxCeVJl
bW92aW5nQ29tcG9uZW50QW5kU3Vic2VxdWVudENoYXJhY3RlcihVUkwsIGtDRlVSTENvbXBvbmVu
dFVzZXJJbmZvKTsKK30KKworc3RhdGljIE5TRGF0YSAqb3JpZ2luYWxEYXRhKE5TVVJMICpVUkwp
Cit7CisgICAgVUludDggKmJ1ZmZlciA9IChVSW50OCAqKW1hbGxvYyhVUkxfQllURVNfQlVGRkVS
X0xFTkdUSCk7CisgICAgQ0ZJbmRleCBieXRlc0ZpbGxlZCA9IENGVVJMR2V0Qnl0ZXMoKENGVVJM
UmVmKVVSTCwgYnVmZmVyLCBVUkxfQllURVNfQlVGRkVSX0xFTkdUSCk7CisgICAgaWYgKGJ5dGVz
RmlsbGVkID09IC0xKSB7CisgICAgICAgIENGSW5kZXggYnl0ZXNUb0FsbG9jYXRlID0gQ0ZVUkxH
ZXRCeXRlcygoQ0ZVUkxSZWYpVVJMLCBOVUxMLCAwKTsKKyAgICAgICAgYnVmZmVyID0gKFVJbnQ4
ICopcmVhbGxvYyhidWZmZXIsIGJ5dGVzVG9BbGxvY2F0ZSk7CisgICAgICAgIGJ5dGVzRmlsbGVk
ID0gQ0ZVUkxHZXRCeXRlcygoQ0ZVUkxSZWYpVVJMLCBidWZmZXIsIGJ5dGVzVG9BbGxvY2F0ZSk7
CisgICAgICAgIEFTU0VSVChieXRlc0ZpbGxlZCA9PSBieXRlc1RvQWxsb2NhdGUpOworICAgIH0K
KyAgICAKKyAgICAvLyBidWZmZXIgaXMgYWRvcHRlZCBieSB0aGUgTlNEYXRhCisgICAgTlNEYXRh
ICpkYXRhID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OmJ1ZmZlciBsZW5ndGg6Ynl0ZXNG
aWxsZWQgZnJlZVdoZW5Eb25lOllFU107CisgICAgCisgICAgTlNVUkwgKmJhc2VVUkwgPSAoTlNV
UkwgKilDRlVSTEdldEJhc2VVUkwoKENGVVJMUmVmKVVSTCk7CisgICAgaWYgKGJhc2VVUkwpCisg
ICAgICAgIHJldHVybiBvcmlnaW5hbERhdGEoVVJMV2l0aERhdGEoZGF0YSwgYmFzZVVSTCkpOwor
ICAgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgQ0ZTdHJpbmdSZWYgY3JlYXRlU3RyaW5nV2l0
aEVzY2FwZWRVbnNhZmVDaGFyYWN0ZXJzKENGU3RyaW5nUmVmIHN0cmluZykKK3sKKyAgICBDRklu
ZGV4IGxlbmd0aCA9IENGU3RyaW5nR2V0TGVuZ3RoKHN0cmluZyk7CisgICAgVmVjdG9yPFVDaGFy
LCAyMDQ4PiBzb3VyY2VCdWZmZXIobGVuZ3RoKTsKKyAgICBDRlN0cmluZ0dldENoYXJhY3RlcnMo
c3RyaW5nLCBDRlJhbmdlTWFrZSgwLCBsZW5ndGgpLCBzb3VyY2VCdWZmZXIuZGF0YSgpKTsKKyAg
ICAKKyAgICBWZWN0b3I8VUNoYXIsIDIwNDg+IG91dEJ1ZmZlcjsKKyAgICAKKyAgICBDRkluZGV4
IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CisgICAgICAgIFVDaGFyMzIgYzsKKyAg
ICAgICAgVTE2X05FWFQoc291cmNlQnVmZmVyLCBpLCBsZW5ndGgsIGMpCisgICAgICAgIAorICAg
ICAgICBpZiAoaXNMb29rYWxpa2VDaGFyYWN0ZXIoYykpIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qg
dXRmOEJ1ZmZlcls0XTsKKyAgICAgICAgICAgIENGSW5kZXggb2Zmc2V0ID0gMDsKKyAgICAgICAg
ICAgIFVCb29sIGZhaWx1cmUgPSBmYWxzZTsKKyAgICAgICAgICAgIFU4X0FQUEVORCh1dGY4QnVm
ZmVyLCBvZmZzZXQsIDQsIGMsIGZhaWx1cmUpCisgICAgICAgICAgICBBU1NFUlQoIWZhaWx1cmUp
OworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKENGSW5kZXggaiA9IDA7IGogPCBvZmZz
ZXQ7ICsraikgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQoJyUnKTsKKyAgICAg
ICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKGhleERpZ2l0KHV0ZjhCdWZmZXJbal0gPj4gNCkp
OworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQoaGV4RGlnaXQodXRmOEJ1ZmZlcltq
XSAmIDB4ZikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
VUNoYXIgdXRmMTZCdWZmZXJbMl07CisgICAgICAgICAgICBDRkluZGV4IG9mZnNldCA9IDA7Cisg
ICAgICAgICAgICBVQm9vbCBmYWlsdXJlID0gZmFsc2U7CisgICAgICAgICAgICBVMTZfQVBQRU5E
KHV0ZjE2QnVmZmVyLCBvZmZzZXQsIDIsIGMsIGZhaWx1cmUpCisgICAgICAgICAgICBBU1NFUlQo
IWZhaWx1cmUpOworICAgICAgICAgICAgZm9yIChDRkluZGV4IGogPSAwOyBqIDwgb2Zmc2V0OyAr
K2opCisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCh1dGYxNkJ1ZmZlcltqXSk7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIENGU3RyaW5nQ3JlYXRlV2l0aENoYXJh
Y3RlcnMoTlVMTCwgb3V0QnVmZmVyLmRhdGEoKSwgb3V0QnVmZmVyLnNpemUoKSk7Cit9CisKK3N0
YXRpYyBOU1N0cmluZyAqdXNlclZpc2libGVTdHJpbmcoTlNVUkwgKlVSTCkKK3sKKyAgICBOU0Rh
dGEgKmRhdGEgPSBvcmlnaW5hbERhdGEoVVJMKTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpi
ZWZvcmUgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oW2RhdGEgYnl0ZXNdKTsK
KyAgICBpbnQgbGVuZ3RoID0gW2RhdGEgbGVuZ3RoXTsKKyAgICAKKyAgICBib29sIG5lZWRzSG9z
dE5hbWVEZWNvZGluZyA9IGZhbHNlOworICAgIAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAg
PSBiZWZvcmU7CisgICAgaW50IGJ1ZmZlckxlbmd0aCA9IChsZW5ndGggKiAzKSArIDE7CisgICAg
Y2hhciAqYWZ0ZXIgPSBzdGF0aWNfY2FzdDxjaGFyICo+KG1hbGxvYyhidWZmZXJMZW5ndGgpKTsg
Ly8gbGFyZ2UgZW5vdWdoIHRvICUtZXNjYXBlIGV2ZXJ5IGNoYXJhY3RlcgorICAgIGNoYXIgKnEg
PSBhZnRlcjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAg
IHVuc2lnbmVkIGNoYXIgYyA9IHBbaV07CisgICAgICAgIC8vIHVuZXNjYXBlIGVzY2FwZSBzZXF1
ZW5jZXMgdGhhdCBpbmRpY2F0ZSBieXRlcyBncmVhdGVyIHRoYW4gMHg3ZgorICAgICAgICBpZiAo
YyA9PSAnJScgJiYgKGkgKyAxIDwgbGVuZ3RoICYmIGlzSGV4RGlnaXQocFtpICsgMV0pKSAmJiBp
ICsgMiA8IGxlbmd0aCAmJiBpc0hleERpZ2l0KHBbaSArIDJdKSkgeworICAgICAgICAgICAgdW5z
aWduZWQgY2hhciB1ID0gKGhleERpZ2l0VmFsdWUocFtpICsgMV0pIDw8IDQpIHwgaGV4RGlnaXRW
YWx1ZShwW2kgKyAyXSk7CisgICAgICAgICAgICBpZiAodSA+IDB4N2YpIHsKKyAgICAgICAgICAg
ICAgICAvLyB1bmVzY2FwZQorICAgICAgICAgICAgICAgICpxKysgPSB1OworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgdW5lc2NhcGUKKyAgICAgICAgICAg
ICAgICAqcSsrID0gcFtpXTsKKyAgICAgICAgICAgICAgICAqcSsrID0gcFtpICsgMV07CisgICAg
ICAgICAgICAgICAgKnErKyA9IHBbaSArIDJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aSArPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnErKyA9IGM7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciAieG4tLSIgaW4gYW4gZWZmaWNpZW50LCBu
b24tY2FzZS1zZW5zaXRpdmUsIHdheS4KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiBpID49
IDMgJiYgIW5lZWRzSG9zdE5hbWVEZWNvZGluZyAmJiAocVstNF0gfCAweDIwKSA9PSAneCcgJiYg
KHFbLTNdIHwgMHgyMCkgPT0gJ24nICYmIHFbLTJdID09ICctJykKKyAgICAgICAgICAgICAgICBu
ZWVkc0hvc3ROYW1lRGVjb2RpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgICpxID0g
J1wwJzsKKyAgICAKKyAgICAvLyBDaGVjayBzdHJpbmcgdG8gc2VlIGlmIGl0IGNhbiBiZSBjb252
ZXJ0ZWQgdG8gZGlzcGxheSB1c2luZyBVVEYtOCAgCisgICAgTlNTdHJpbmcgKnJlc3VsdCA9IFtO
U1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzphZnRlcl07CisgICAgaWYgKCFyZXN1bHQpIHsK
KyAgICAgICAgLy8gQ291bGQgbm90IGNvbnZlcnQgdG8gVVRGLTguCisgICAgICAgIC8vIENvbnZl
cnQgY2hhcmFjdGVycyBncmVhdGVyIHRoYW4gMHg3ZiB0byBlc2NhcGUgc2VxdWVuY2VzLgorICAg
ICAgICAvLyBTaGlmdCBjdXJyZW50IHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAg
ICAgICAgLy8gdGhlbiB3ZSB3aWxsIGNvcHkgYmFjayBieXRlcyB0byB0aGUgc3RhcnQgb2YgdGhl
IGJ1ZmZlciAKKyAgICAgICAgLy8gYXMgd2UgY29udmVydC4KKyAgICAgICAgaW50IGFmdGVybGVu
Z3RoID0gcSAtIGFmdGVyOworICAgICAgICBjaGFyICpwID0gYWZ0ZXIgKyBidWZmZXJMZW5ndGgg
LSBhZnRlcmxlbmd0aCAtIDE7CisgICAgICAgIG1lbW1vdmUocCwgYWZ0ZXIsIGFmdGVybGVuZ3Ro
ICsgMSk7IC8vIGNvcGllcyB0cmFpbGluZyAnXDAnCisgICAgICAgIGNoYXIgKnEgPSBhZnRlcjsK
KyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqcDsK
KyAgICAgICAgICAgIGlmIChjID4gMHg3ZikgeworICAgICAgICAgICAgICAgICpxKysgPSAnJSc7
CisgICAgICAgICAgICAgICAgKnErKyA9IGhleERpZ2l0KGMgPj4gNCk7CisgICAgICAgICAgICAg
ICAgKnErKyA9IGhleERpZ2l0KGMgJiAweGYpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgKnErKyA9ICpwOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAg
ICpxID0gJ1wwJzsKKyAgICAgICAgcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3Ry
aW5nOmFmdGVyXTsKKyAgICB9CisgICAgCisgICAgZnJlZShhZnRlcik7CisgICAgCisgICAgcmVz
dWx0ID0gbWFwSG9zdE5hbWVzKHJlc3VsdCwgIW5lZWRzSG9zdE5hbWVEZWNvZGluZyk7CisgICAg
cmVzdWx0ID0gW3Jlc3VsdCBwcmVjb21wb3NlZFN0cmluZ1dpdGhDYW5vbmljYWxNYXBwaW5nXTsK
KyAgICByZXR1cm4gV2ViQ29yZUNGQXV0b3JlbGVhc2UoY3JlYXRlU3RyaW5nV2l0aEVzY2FwZWRV
bnNhZmVDaGFyYWN0ZXJzKChDRlN0cmluZ1JlZilyZXN1bHQpKTsKK30KKwordHlwZWRlZiBzdHJ1
Y3QgTWV0YURhdGFJbmZvCit7CisgICAgQ0ZTdHJpbmdSZWYgVVJMU3RyaW5nOworICAgIENGU3Ry
aW5nUmVmIHJlZmVycmVyOworICAgIENGU3RyaW5nUmVmIHBhdGg7Cit9IE1ldGFEYXRhSW5mbzsK
Kworc3RhdGljIHZvaWQgKnNldE1ldGFEYXRhKHZvaWQqIGNvbnRleHQpCit7CisgICAgTWV0YURh
dGFJbmZvICppbmZvID0gKE1ldGFEYXRhSW5mbyAqKWNvbnRleHQ7CisgICAgTlNBdXRvcmVsZWFz
ZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICB3a1Nl
dE1ldGFkYXRhVVJMKChOU1N0cmluZyAqKWluZm8tPlVSTFN0cmluZywgKE5TU3RyaW5nICopaW5m
by0+cmVmZXJyZXIsIChOU1N0cmluZyAqKWluZm8tPnBhdGgpOworICAgIAorICAgIGlmIChpbmZv
LT5VUkxTdHJpbmcpCisgICAgICAgIENGUmVsZWFzZShpbmZvLT5VUkxTdHJpbmcpOworICAgIGlm
IChpbmZvLT5yZWZlcnJlcikKKyAgICAgICAgQ0ZSZWxlYXNlKGluZm8tPnJlZmVycmVyKTsKKyAg
ICBpZiAoaW5mby0+cGF0aCkKKyAgICAgICAgQ0ZSZWxlYXNlKGluZm8tPnBhdGgpOworICAgIAor
ICAgIGZyZWUoaW5mbyk7CisgICAgW3Bvb2wgZHJhaW5dOworICAgIAorICAgIHJldHVybiAwOwor
fQorCit2b2lkIHNldE1ldGFkYXRhVVJMKE5TU3RyaW5nICpVUkxTdHJpbmcsIE5TU3RyaW5nICpy
ZWZlcnJlciwgTlNTdHJpbmcgKnBhdGgpCit7CisgICAgQVNTRVJUKFVSTFN0cmluZyk7CisgICAg
QVNTRVJUKHBhdGgpOworICAgIAorICAgIE5TVVJMICpVUkwgPSBVUkxXaXRoVXNlclR5cGVkU3Ry
aW5nKFVSTFN0cmluZywgbmlsKTsKKyAgICBpZiAoVVJMKQorICAgICAgICBVUkxTdHJpbmcgPSB1
c2VyVmlzaWJsZVN0cmluZyhVUkxCeVJlbW92aW5nVXNlckluZm8oVVJMKSk7CisgICAgICAgIAor
ICAgIC8vIFNwYXduIGEgYmFja2dyb3VuZCB0aHJlYWQgZm9yIFdLU2V0TWV0YWRhdGFVUkwgYmVj
YXVzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiB1bnRpbCBtZHMgaGFzCisgICAgLy8g
am91cm5hbGVkIHRoZSBkYXRhIHdlJ3JlJ3JlIHRyeWluZyB0byBzZXQuIERlcGVuZGluZyBvbiB3
aGF0IG90aGVyIEkvTyBpcyBnb2luZyBvbiwgaXQgY2FuIHRha2Ugc29tZQorICAgIC8vIHRpbWUu
IAorICAgIHB0aHJlYWRfdCB0aWQ7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhy
ZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZh
dHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisgICAgCisgICAgTWV0YURhdGFJbmZvICpp
bmZvID0gc3RhdGljX2Nhc3Q8TWV0YURhdGFJbmZvICo+KG1hbGxvYyhzaXplb2YoTWV0YURhdGFJ
bmZvKSkpOworICAgIAorICAgIGluZm8tPlVSTFN0cmluZyA9IFVSTFN0cmluZyA/IENGU3RyaW5n
Q3JlYXRlQ29weSgwLCAoQ0ZTdHJpbmdSZWYpVVJMU3RyaW5nKSA6IDA7CisgICAgaW5mby0+cmVm
ZXJyZXIgPSByZWZlcnJlciA/IENGU3RyaW5nQ3JlYXRlQ29weSgwLCAoQ0ZTdHJpbmdSZWYpcmVm
ZXJyZXIpIDogMDsKKyAgICBpbmZvLT5wYXRoID0gcGF0aCA/IENGU3RyaW5nQ3JlYXRlQ29weSgw
LCAoQ0ZTdHJpbmdSZWYpcGF0aCkgOiAwOworICAgIAorICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQs
ICZhdHRyLCBzZXRNZXRhRGF0YSwgaW5mbyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0
dHIpOworfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVPYmpDRXh0
cmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVP
YmpDRXh0cmFzLmgJKHJldmlzaW9uIDExMDA5NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21hYy9XZWJDb3JlT2JqQ0V4dHJhcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiwxOCBA
QAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorLy8gVXNlIFdlYkNGQXV0b3JlbGVhc2UgdG8gcmV0
dXJuIGFuIG9iamVjdCBtYWRlIGJ5IGEgQ29yZUZvdW5kYXRpb24KKy8vICJjcmVhdGUiIG9yICJj
b3B5IiBmdW5jdGlvbiBhcyBhbiBhdXRvcmVsZWFzZWQgYW5kIGdhcmJhZ2UgY29sbGVjdGVkCisv
LyBvYmplY3QuIENGIG9iamVjdHMgbmVlZCB0byBiZSAibWFkZSBjb2xsZWN0YWJsZSIgZm9yIGF1
dG9yZWxlYXNlIHRvIHdvcmsKKy8vIHByb3Blcmx5IHVuZGVyIEdDLgorc3RhdGljIGlubGluZSBp
ZCBXZWJDb3JlQ0ZBdXRvcmVsZWFzZShDRlR5cGVSZWYgb2JqKQoreworICAgIGlmIChvYmopCisg
ICAgICAgIENGTWFrZUNvbGxlY3RhYmxlKG9iaik7CisgICAgWyhpZClvYmogYXV0b3JlbGVhc2Vd
OworICAgIHJldHVybiAoaWQpb2JqOworfQorCiB2b2lkIFdlYkNvcmVPYmpDRmluYWxpemVPbk1h
aW5UaHJlYWQoQ2xhc3MgY2xzKTsKIAogLy8gVGhlICdDbGFzcycgdGhhdCBzaG91bGQgYmUgcGFz
c2VkIGluIGhlcmUgaXMgdGhlIGNsYXNzIG9mIHRoZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbWFjL1dlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oCShyZXZpc2lvbiAx
MTAwOTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZVN5c3RlbUludGVy
ZmFjZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOTIsNyArMjkyLDggQEAgZXh0ZXJuIENGQXJyYXlS
ZWYgKCp3a0NGVVJMUmVxdWVzdENvcHlIVAogZXh0ZXJuIHZvaWQgKCp3a0NGVVJMUmVxdWVzdFNl
dEhUVFBSZXF1ZXN0Qm9keVBhcnRzKShDRk11dGFibGVVUkxSZXF1ZXN0UmVmLCBDRkFycmF5UmVm
IGJvZHlQYXJ0cyk7CiBleHRlcm4gdm9pZCAoKndrU2V0UmVxdWVzdFN0b3JhZ2VTZXNzaW9uKShD
RlVSTFN0b3JhZ2VTZXNzaW9uUmVmLCBDRk11dGFibGVVUkxSZXF1ZXN0UmVmKTsKICNlbmRpZgot
CitleHRlcm4gdm9pZCAoKndrU2V0TWV0YWRhdGFVUkwpKE5TU3RyaW5nICp1cmxTdHJpbmcsIE5T
U3RyaW5nICpyZWZlcnJlciwgTlNTdHJpbmcgKnBhdGgpOworICAgIAogI2lmICFkZWZpbmVkKEJV
SUxESU5HX09OX0xFT1BBUkQpICYmICFkZWZpbmVkKEJVSUxESU5HX09OX1NOT1dfTEVPUEFSRCkK
ICNpbXBvcnQgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21hYy9XZWJDb3JlU3lzdGVtSW50ZXJmYWNlLm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlU3lzdGVtSW50ZXJmYWNlLm1tCShyZXZpc2lv
biAxMTAwOTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZVN5c3RlbUlu
dGVyZmFjZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMTc2LDYgKzE3Niw3IEBAIENGVVJMUmVmICgq
d2tHZXRDRlVSTFJlc3BvbnNlVVJMKShDRlVSTFIKIENGSFRUUE1lc3NhZ2VSZWYgKCp3a0dldENG
VVJMUmVzcG9uc2VIVFRQUmVzcG9uc2UpKENGVVJMUmVzcG9uc2VSZWYpOwogQ0ZTdHJpbmdSZWYg
KCp3a0NvcHlDRlVSTFJlc3BvbnNlU3VnZ2VzdGVkRmlsZW5hbWUpKENGVVJMUmVzcG9uc2VSZWYp
Owogdm9pZCAoKndrU2V0Q0ZVUkxSZXNwb25zZU1JTUVUeXBlKShDRlVSTFJlc3BvbnNlUmVmLCBD
RlN0cmluZ1JlZiBtaW1lVHlwZSk7Cit2b2lkICgqd2tTZXRNZXRhZGF0YVVSTCkoTlNTdHJpbmcg
KnVybFN0cmluZywgTlNTdHJpbmcgKnJlZmVycmVyLCBOU1N0cmluZyAqcGF0aCk7CiAKICNpZiAh
ZGVmaW5lZChCVUlMRElOR19PTl9MRU9QQVJEKSAmJiAhZGVmaW5lZChCVUlMRElOR19PTl9TTk9X
X0xFT1BBUkQpCiBkaXNwYXRjaF9zb3VyY2VfdCAoKndrQ3JlYXRlVk1QcmVzc3VyZURpc3BhdGNo
T25NYWluUXVldWUpKHZvaWQpOwpJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gMTEwMTc1KQorKysg
U291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAK
KzIwMTItMDMtMDggIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAg
ICBNb3ZlIFdlYk5TVVJMRXh0cmFzIGNvZGUgZG93biB0byBXZWJDb3JlLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODA2MTEKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29yZVN1
cHBvcnQvbWFjL1dlYlN5c3RlbUludGVyZmFjZS5tbToKKyAgICAgICAgKEluaXRXZWJDb3JlU3lz
dGVtSW50ZXJmYWNlKTogQWRkZWQgV0tTZXRNZXRhZGF0YVVSTAorCiAyMDEyLTAzLTA4ICBEaW51
IEphY29iICA8ZGludS5qYWNvYkBub2tpYS5jb20+CiAKICAgICAgICAgW1F0IFdLMl0gUmVtb3Zl
IGR1cGxpY2F0ZSBjb2RlIHJlbGF0ZWQgdG8gZGlhbG9nIGhhbmRsaW5nIGluIFFRdWlja1dlYlZp
ZXcKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFjL1dl
YlN5c3RlbUludGVyZmFjZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9j
ZXNzL1dlYkNvcmVTdXBwb3J0L21hYy9XZWJTeXN0ZW1JbnRlcmZhY2UubW0JKHJldmlzaW9uIDEx
MDA5NSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFjL1dl
YlN5c3RlbUludGVyZmFjZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMTU0LDYgKzE1NCw4IEBAIHZv
aWQgSW5pdFdlYkNvcmVTeXN0ZW1JbnRlcmZhY2Uodm9pZCkKICAgICAgICAgSU5JVChDb3B5Q0ZV
UkxSZXNwb25zZVN1Z2dlc3RlZEZpbGVuYW1lKTsKICAgICAgICAgSU5JVChTZXRDRlVSTFJlc3Bv
bnNlTUlNRVR5cGUpOwogCisgICAgICAgIElOSVQoU2V0TWV0YWRhdGFVUkwpOworCiAjaWYgIWRl
ZmluZWQoQlVJTERJTkdfT05fU05PV19MRU9QQVJEKQogICAgICAgICBJTklUKENyZWF0ZVZNUHJl
c3N1cmVEaXNwYXRjaE9uTWFpblF1ZXVlKTsKICNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdC9t
YWMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwko
cmV2aXNpb24gMTEwMTc1KQorKysgU291cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTItMDMtMDggIEVucmljYSBDYXN1Y2NpICA8ZW5y
aWNhQGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIFdlYk5TVVJMRXh0cmFzIGNvZGUgZG93biB0
byBXZWJDb3JlLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODA2MTEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICAqIFdlYkNvcmVTdXBwb3J0L1dlYlN5c3RlbUludGVyZmFjZS5tbToKKyAgICAgICAgKEluaXRX
ZWJDb3JlU3lzdGVtSW50ZXJmYWNlKTogQWRkZWQgV0tTZXRNZXRhZGF0YVVSTC4KKwogMjAxMi0w
My0wNyAgSm9zZXBoIFBlY29yYXJvICA8cGVjb3Jhcm9AYXBwbGUuY29tPgogCiAgICAgICAgIDxo
dHRwOi8vd2Via2l0Lm9yZy9iLzgwNTEwPiBXZWIgSW5zcGVjdG9yIGNyYXNoIChpQ2FiKQpJbmRl
eDogU291cmNlL1dlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViU3lzdGVtSW50ZXJmYWNlLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL1dlYkNvcmVTdXBwb3J0L1dlYlN5c3Rl
bUludGVyZmFjZS5tbQkocmV2aXNpb24gMTEwMDk1KQorKysgU291cmNlL1dlYktpdC9tYWMvV2Vi
Q29yZVN1cHBvcnQvV2ViU3lzdGVtSW50ZXJmYWNlLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNjks
NiArMTY5LDggQEAgdm9pZCBJbml0V2ViQ29yZVN5c3RlbUludGVyZmFjZSh2b2lkKQogICAgIElO
SVQoQ29weUNGVVJMUmVzcG9uc2VTdWdnZXN0ZWRGaWxlbmFtZSk7CiAgICAgSU5JVChTZXRDRlVS
TFJlc3BvbnNlTUlNRVR5cGUpOwogCisgICAgSU5JVChTZXRNZXRhZGF0YVVSTCk7CisgICAgCiAj
aWYgIWRlZmluZWQoQlVJTERJTkdfT05fTEVPUEFSRCkgJiYgIWRlZmluZWQoQlVJTERJTkdfT05f
U05PV19MRU9QQVJEKQogICAgIElOSVQoQ3JlYXRlVk1QcmVzc3VyZURpc3BhdGNoT25NYWluUXVl
dWUpOwogI2VuZGlmCg==
</data>
<flag name="review"
          id="133980"
          type_id="1"
          status="-"
          setter="ap"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130929</attachid>
            <date>2012-03-08 15:59:02 -0800</date>
            <delta_ts>2012-03-09 12:21:54 -0800</delta_ts>
            <desc>Patch2</desc>
            <filename>NSURLExtras.txt</filename>
            <type>text/plain</type>
            <size>94610</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMDIyNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDEyLTAzLTA4ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBXZWJOU1VSTEV4dHJh
cyBjb2RlIGRvd24gdG8gV2ViQ29yZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTgwNjExCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgKiBXZWJDb3JlLmV4cC5pbjogQWRkZWQgbmV3IGV4cG9ydGVkIGZ1bmN0
aW9ucy4KKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVk
IFdlYkNvcmVOU1VSTEV4dHJhcy4qCisgICAgICAgICogcGxhdGZvcm0vRmlsZVN5c3RlbS5oOiBB
ZGRlZCBzZXRNZXRhZGF0YVVSTC4KKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvRmlsZVN5c3RlbU1h
Yy5tbToKKyAgICAgICAgKFdlYkNvcmU6OnNldE1ldGFEYXRhKTogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpzZXRNZXRhZGF0YVVSTCk6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL21hYy9X
ZWJDb3JlTlNTdHJpbmdFeHRyYXMuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU5T
U3RyaW5nRXh0cmFzLm1tOgorICAgICAgICAoaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4KTogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vbWFjL1dlYkNvcmVOU1VSTEV4dHJhcy5oOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU5TVVJMRXh0cmFzLm1tOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZU9iakNFeHRyYXMuaDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9tYWMvV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oOgorICAgICAgICAqIHBsYXRmb3JtL21h
Yy9XZWJDb3JlU3lzdGVtSW50ZXJmYWNlLm1tOgorCiAyMDEyLTAzLTA4ICBKYW1lcyBSb2JpbnNv
biAgPGphbWVzckBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgVXNlIGFuIGV4cGxpY2l0IGF0dHJp
YnV0ZSB0byBzaWduYWwgdGhhdCBhIGNvbnRleHQgcHJlZmVycyB0byB1c2UgYSBkaXNjcmV0ZSBH
UFUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiAxMTAyMjYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkod29ya2luZyBjb3B5KQpAQCAtMTQ5NiwxNiArMTQ5Niwz
MiBAQCBfX1pOSzdXZWJDb3JlOVBhZ2VDYWNoZTEwZnJhbWVDb3VudEV2CiBfX1pOSzdXZWJDb3Jl
OVBhZ2VDYWNoZTIxYXV0b3JlbGVhc2VkUGFnZUNvdW50RXYKIF9fWk5LN1dlYkNvcmU5VHJlZVNj
b3BlMTRnZXRFbGVtZW50QnlJZEVSS04zV1RGMTJBdG9taWNTdHJpbmdFCiBfX1pUVk43V2ViQ29y
ZTEyQ2hyb21lQ2xpZW50RQorX19aTjdXZWJDb3JlMTRzZXRNZXRhZGF0YVVSTEVSTjNXVEY2U3Ry
aW5nRVJLUzFfUzRfCiBfX1pUVk43V2ViQ29yZTE2SWNvbkRhdGFiYXNlQmFzZUUKIF9fWlRWTjdX
ZWJDb3JlMTdGcmFtZUxvYWRlckNsaWVudEUKIF9fWlRWTjdXZWJDb3JlMjVIaXN0b3J5UHJvcGVy
dHlMaXN0V3JpdGVyRQogX19aVFZON1dlYkNvcmUyOEluc3BlY3RvckZyb250ZW5kQ2xpZW50TG9j
YWw4U2V0dGluZ3NFCitfZGF0YUZvclVSTENvbXBvbmVudFR5cGUKK19kZWNvZGVIb3N0TmFtZQor
X2RlY29kZUhvc3ROYW1lV2l0aFJhbmdlCitfZW5jb2RlSG9zdE5hbWUKK19lbmNvZGVIb3N0TmFt
ZVdpdGhSYW5nZQogX2ZpbGVuYW1lQnlGaXhpbmdJbGxlZ2FsQ2hhcmFjdGVycwogX2hhc0Nhc2VJ
bnNlbnNpdGl2ZVN1YnN0cmluZworX2hhc0Nhc2VJbnNlbnNpdGl2ZVByZWZpeAogX2hhc0Nhc2VJ
bnNlbnNpdGl2ZVN1ZmZpeAorX2hvc3ROYW1lTmVlZHNEZWNvZGluZ1dpdGhSYW5nZQorX2hvc3RO
YW1lTmVlZHNFbmNvZGluZ1dpdGhSYW5nZQorX2lzVXNlclZpc2libGVVUkwKK19vcmlnaW5hbERh
dGEKIF9zdHJpbmdFbmNvZGluZ0ZvclJlc291cmNlCiBfc3RyaW5nSXNDYXNlSW5zZW5zaXRpdmVF
cXVhbFRvU3RyaW5nCiBfc3VnZ2VzdGVkRmlsZW5hbWVXaXRoTUlNRVR5cGUKK191c2VyVmlzaWJs
ZVN0cmluZworX1VSTEJ5UmVtb3ZpbmdVc2VySW5mbworX1VSTEJ5VHJ1bmNhdGluZ09uZUNoYXJh
Y3RlckJlZm9yZUNvbXBvbmVudAorX1VSTFdpdGhEYXRhCitfVVJMV2l0aFVzZXJUeXBlZFN0cmlu
ZwogX3drQWR2YW5jZURlZmF1bHRCdXR0b25QdWxzZUFuaW1hdGlvbgogI2lmICFkZWZpbmVkKEJV
SUxESU5HX09OX0xFT1BBUkQpICYmICFkZWZpbmVkKEJVSUxESU5HX09OX1NOT1dfTEVPUEFSRCkK
IF93a0NBTGF5ZXJFbnVtZXJhdGVSZWN0c0JlaW5nRHJhd25XaXRoQmxvY2sKQEAgLTE1ODgsNiAr
MTYwNCw3IEBAIF93a1NldEhUVFBDb29raWVzRm9yVVJMCiBfd2tTZXRIVFRQUGlwZWxpbmluZ01h
eGltdW1Qcmlvcml0eQogX3drU2V0SFRUUFBpcGVsaW5pbmdNaW5pbXVtRmFzdExhbmVQcmlvcml0
eQogX3drU2V0SFRUUFBpcGVsaW5pbmdQcmlvcml0eQorX3drU2V0TWV0YWRhdGFVUkwKIF93a1Nl
dE5TVVJMQ29ubmVjdGlvbkRlZmVyc0NhbGxiYWNrcwogX3drU2V0TlNVUkxSZXF1ZXN0U2hvdWxk
Q29udGVudFNuaWZmCiBfd2tTZXRQYXR0ZXJuUGhhc2VJblVzZXJTcGFjZQpJbmRleDogU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNp
b24gMTEwMjI2KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01NjQ4LDYgKzU2NDgsOCBAQAogCQlDNTk4OTAyRTE0
RTlCMEY4MDBFOEQxOEIgLyogUGxhdGZvcm1QYXN0ZWJvYXJkTWFjLm1tIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQzVGNzY1QkExNEUxRUNGNDAwNkM4OTlC
IC8qIFBsYXRmb3JtUGFzdGVib2FyZE1hYy5tbSAqLzsgfTsKIAkJQzU5ODkwNTcxNEU5QzI4MDAw
RThEMThCIC8qIFBhc3RlYm9hcmRTdHJhdGVneS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQzVGNzY1QjQxNEUxRDQxNDAwNkM4OTlCIC8qIFBhc3RlYm9h
cmRTdHJhdGVneS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07
IH07CiAJCUM1OTg5MDU4MTRFOUMyOTkwMEU4RDE4QiAvKiBQbGF0Zm9ybVBhc3RlYm9hcmQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1QkFDMTZGMTRF
MzBFNDcwMDAwODgzNyAvKiBQbGF0Zm9ybVBhc3RlYm9hcmQuaCAqLzsgc2V0dGluZ3MgPSB7QVRU
UklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQlDNUI0QzI0RDE1MDkyMzZDMDBBNkVGMzcg
LyogV2ViQ29yZU5TVVJMRXh0cmFzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBDNUI0QzI0QjE1MDkyMzZDMDBBNkVGMzcgLyogV2ViQ29yZU5TVVJMRXh0
cmFzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJ
QzVCNEMyNEUxNTA5MjM2QzAwQTZFRjM3IC8qIFdlYkNvcmVOU1VSTEV4dHJhcy5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1QjRDMjRDMTUwOTIzNkMw
MEE2RUYzNyAvKiBXZWJDb3JlTlNVUkxFeHRyYXMubW0gKi87IH07CiAJCUM1RDRBQTdBMTE2QkFG
QjYwMDY5Q0E5MyAvKiBHbHlwaE1ldHJpY3NNYXAuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEM1RDRBQTc4MTE2QkFGQjYwMDY5Q0E5MyAvKiBHbHlwaE1l
dHJpY3NNYXAuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwogCQlDNUU5QjY3NzEwNjk3RTEzMDBDN0JCMUEgLyogU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNUU5QjY3
NjEwNjk3RTEzMDBDN0JCMUEgLyogU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5jcHAgKi87IH07CiAJ
CUM1RUJERDg0MTA1RURERUMwMDU2ODE2RiAvKiBTdG9yYWdlRXZlbnREaXNwYXRjaGVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNUVCREQ4MTEwNUVE
REVDMDA1NjgxNkYgLyogU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oICovOyB9OwpAQCAtMTI2ODYs
NiArMTI2ODgsOCBAQAogCQlDNTg1QTY3OTExRDRGQjA3MDA0QzNFNEIgLyogSlNJREJSZXF1ZXN0
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTSURCUmVxdWVzdC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDNTg1QTY5NDExRDRGQjEzMDA0QzNFNEIgLyogSlNJ
REJGYWN0b3J5LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTSURC
RmFjdG9yeS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1ODVBNjk1MTFENEZC
MTMwMDRDM0U0QiAvKiBKU0lEQkZhY3RvcnkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gSlNJREJGYWN0b3J5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUM1QjRD
MjRCMTUwOTIzNkMwMEE2RUYzNyAvKiBXZWJDb3JlTlNVUkxFeHRyYXMuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gV2ViQ29yZU5TVVJMRXh0cmFzLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUM1QjRDMjRDMTUwOTIzNkMwMEE2RUYzNyAvKiBXZWJDb3JlTlNVUkxF
eHRyYXMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXZWJDb3Jl
TlNVUkxFeHRyYXMubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1QkFDMTZGMTRF
MzBFNDcwMDAwODgzNyAvKiBQbGF0Zm9ybVBhc3RlYm9hcmQuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gUGxhdGZvcm1QYXN0ZWJvYXJkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUM1RDRBQTc4MTE2QkFGQjYwMDY5Q0E5MyAvKiBHbHlwaE1ldHJpY3NNYXAuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gR2x5cGhNZXRyaWNzTWFwLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUM1RTlCNjc2MTA2OTdFMTMwMEM3QkIxQSAvKiBTdG9y
YWdlRXZlbnREaXNwYXRjaGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IFN0b3JhZ2VFdmVudERpc3BhdGNoZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtMTUxMzYsNiArMTUxNDAsOCBAQAogCQkJCTUxREY2RDdGMEI5MkExOEUwMEMyREM4NSAv
KiBUaHJlYWRDaGVjay5tbSAqLywKIAkJCQk5MzREOUJBNjBCOEMxMTc1MDA3QjQyQTkgLyogV2Vi
Q29yZU5TU3RyaW5nRXh0cmFzLmggKi8sCiAJCQkJOTM0RDlCQTQwQjhDMTE2QjAwN0I0MkE5IC8q
IFdlYkNvcmVOU1N0cmluZ0V4dHJhcy5tbSAqLywKKwkJCQlDNUI0QzI0QjE1MDkyMzZDMDBBNkVG
MzcgLyogV2ViQ29yZU5TVVJMRXh0cmFzLmggKi8sCisJCQkJQzVCNEMyNEMxNTA5MjM2QzAwQTZF
RjM3IC8qIFdlYkNvcmVOU1VSTEV4dHJhcy5tbSAqLywKIAkJCQlERDA1RkUwQjBCOEJBM0M2MDA5
QUNERkUgLyogV2ViQ29yZU9iakNFeHRyYXMuaCAqLywKIAkJCQlCNTBGNUI4MDBFOTZDRDk5MDBB
RDcxQTYgLyogV2ViQ29yZU9iakNFeHRyYXMubW0gKi8sCiAJCQkJOTNFQjE2OTYwOUY4ODBDMDAw
OTFGOEZGIC8qIFdlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaCAqLywKQEAgLTI0NTUyLDYgKzI0NTU4
LDcgQEAKIAkJCQlGRDUzNzM1MzEzN0I2NTE4MDAwMDhEQ0UgLyogWmVyb1BvbGUuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUUxQ0RFOTIyMTUwMTkxNjkwMDg2MkNDNSAvKiBBc3luY0ZpbGVTdHJlYW0u
aCBpbiBIZWFkZXJzICovLAogCQkJCTQ1MENFQkYxMTUwNzNCQkUwMDJCQjE0OSAvKiBMYWJlbGFi
bGVFbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlDNUI0QzI0RDE1MDkyMzZDMDBBNkVGMzcg
LyogV2ViQ29yZU5TVVJMRXh0cmFzLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5
Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTI3NTI4LDYgKzI3NTM1
LDcgQEAKIAkJCQlGRDUzNzM1MjEzN0I2NTE4MDAwMDhEQ0UgLyogWmVyb1BvbGUuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJRTFDREU5MjAxNTAxOEVEMDAwODYyQ0M1IC8qIEFzeW5jRmlsZVN0cmVh
bS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk0NTBDRUJGMDE1MDczQkJFMDAyQkIxNDkgLyogTGFi
ZWxhYmxlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlDNUI0QzI0RTE1MDkyMzZDMDBB
NkVGMzcgLyogV2ViQ29yZU5TVVJMRXh0cmFzLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJ
cnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9GaWxlU3lzdGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vRmlsZVN5c3RlbS5oCShyZXZpc2lvbiAxMTAyMjYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9GaWxlU3lzdGVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5NCw2ICsx
OTQsMTAgQEAgU3RyaW5nIGVuY29kZUZvckZpbGVOYW1lKGNvbnN0IFN0cmluZyYpOwogUmV0YWlu
UHRyPENGVVJMUmVmPiBwYXRoQXNVUkwoY29uc3QgU3RyaW5nJik7CiAjZW5kaWYKIAorI2lmIFBM
QVRGT1JNKE1BQykKK3ZvaWQgc2V0TWV0YWRhdGFVUkwoU3RyaW5nJiBVUkxTdHJpbmcsIGNvbnN0
IFN0cmluZyYgcmVmZXJyZXIsIGNvbnN0IFN0cmluZyYgcGF0aCk7CisjZW5kaWYKKwogI2lmIFBM
QVRGT1JNKEdUSykKIFN0cmluZyBmaWxlbmFtZVRvU3RyaW5nKGNvbnN0IGNoYXIqKTsKIFN0cmlu
ZyBmaWxlbmFtZUZvckRpc3BsYXkoY29uc3QgU3RyaW5nJik7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9tYWMvRmlsZVN5c3RlbU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tYWMvRmlsZVN5c3RlbU1hYy5tbQkocmV2aXNpb24gMTEwMjI2KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL0ZpbGVTeXN0ZW1NYWMubW0JKHdvcmtpbmcgY29w
eSkKQEAgLTMwLDYgKzMwLDkgQEAKICNpbXBvcnQgIkZpbGVTeXN0ZW0uaCIKIAogI2ltcG9ydCAi
UGxhdGZvcm1TdHJpbmcuaCIKKy8vI2ltcG9ydCAiV2ViQ29yZU5TU3RyaW5nRXh0cmFzLmgiCisj
aW1wb3J0ICJXZWJDb3JlTlNVUkxFeHRyYXMuaCIKKyNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRl
cmZhY2UuaCIKICNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KICNpbXBvcnQgPHd0Zi90ZXh0L0NT
dHJpbmcuaD4KIApAQCAtNjUsNiArNjgsNTYgQEAgU3RyaW5nIG9wZW5UZW1wb3JhcnlGaWxlKGNv
bnN0IFN0cmluZyYgcAogICAgIHJldHVybiBTdHJpbmc6OmZyb21VVEY4KHRlbXBvcmFyeUZpbGVQ
YXRoLmRhdGEoKSk7CiB9CiAKK3R5cGVkZWYgc3RydWN0IE1ldGFEYXRhSW5mbworeworICAgIENG
U3RyaW5nUmVmIFVSTFN0cmluZzsKKyAgICBDRlN0cmluZ1JlZiByZWZlcnJlcjsKKyAgICBDRlN0
cmluZ1JlZiBwYXRoOworfSBNZXRhRGF0YUluZm87CisKK3N0YXRpYyB2b2lkICpzZXRNZXRhRGF0
YSh2b2lkKiBjb250ZXh0KQoreworICAgIE1ldGFEYXRhSW5mbyAqaW5mbyA9IChNZXRhRGF0YUlu
Zm8gKiljb250ZXh0OworICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxl
YXNlUG9vbCBhbGxvY10gaW5pdF07CisgICAgd2tTZXRNZXRhZGF0YVVSTCgoTlNTdHJpbmcgKilp
bmZvLT5VUkxTdHJpbmcsIChOU1N0cmluZyAqKWluZm8tPnJlZmVycmVyLCAoTlNTdHJpbmcgKilp
bmZvLT5wYXRoKTsKKyAgICAKKyAgICBpZiAoaW5mby0+VVJMU3RyaW5nKQorICAgICAgICBDRlJl
bGVhc2UoaW5mby0+VVJMU3RyaW5nKTsKKyAgICBpZiAoaW5mby0+cmVmZXJyZXIpCisgICAgICAg
IENGUmVsZWFzZShpbmZvLT5yZWZlcnJlcik7CisgICAgaWYgKGluZm8tPnBhdGgpCisgICAgICAg
IENGUmVsZWFzZShpbmZvLT5wYXRoKTsKKyAgICAKKyAgICBmcmVlKGluZm8pOworICAgIFtwb29s
IGRyYWluXTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzZXRNZXRhZGF0YVVSTChT
dHJpbmcmIFVSTFN0cmluZywgY29uc3QgU3RyaW5nJiByZWZlcnJlciwgY29uc3QgU3RyaW5nJiBw
YXRoKQoreworICAgIE5TVVJMICpVUkwgPSBVUkxXaXRoVXNlclR5cGVkU3RyaW5nKFVSTFN0cmlu
ZywgbmlsKTsKKyAgICBpZiAoVVJMKQorICAgICAgICBVUkxTdHJpbmcgPSB1c2VyVmlzaWJsZVN0
cmluZyhVUkxCeVJlbW92aW5nVXNlckluZm8oVVJMKSk7CisgICAgCisgICAgLy8gU3Bhd24gYSBi
YWNrZ3JvdW5kIHRocmVhZCBmb3IgV0tTZXRNZXRhZGF0YVVSTCBiZWNhdXNlIHRoaXMgZnVuY3Rp
b24gd2lsbCBub3QgcmV0dXJuIHVudGlsIG1kcyBoYXMKKyAgICAvLyBqb3VybmFsZWQgdGhlIGRh
dGEgd2UncmUncmUgdHJ5aW5nIHRvIHNldC4gRGVwZW5kaW5nIG9uIHdoYXQgb3RoZXIgSS9PIGlz
IGdvaW5nIG9uLCBpdCBjYW4gdGFrZSBzb21lCisgICAgLy8gdGltZS4gCisgICAgcHRocmVhZF90
IHRpZDsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZh
dHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JF
QVRFX0RFVEFDSEVEKTsKKyAgICAKKyAgICBNZXRhRGF0YUluZm8gKmluZm8gPSBzdGF0aWNfY2Fz
dDxNZXRhRGF0YUluZm8gKj4obWFsbG9jKHNpemVvZihNZXRhRGF0YUluZm8pKSk7CisgICAgCisg
ICAgaW5mby0+VVJMU3RyaW5nID0gIVVSTFN0cmluZy5pc0VtcHR5KCkgPyBVUkxTdHJpbmcuY3Jl
YXRlQ0ZTdHJpbmcoKSA6IDA7CisgICAgaW5mby0+cmVmZXJyZXIgPSAhcmVmZXJyZXIuaXNFbXB0
eSgpID8gcmVmZXJyZXIuY3JlYXRlQ0ZTdHJpbmcoKSA6IDA7CisgICAgaW5mby0+cGF0aCA9ICFw
YXRoLmlzRW1wdHkoKSA/IHBhdGguY3JlYXRlQ0ZTdHJpbmcoKSA6IDA7CisgICAgCisgICAgcHRo
cmVhZF9jcmVhdGUoJnRpZCwgJmF0dHIsIHNldE1ldGFEYXRhLCBpbmZvKTsKKyAgICBwdGhyZWFk
X2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisKICNpZiAhUExBVEZPUk0oSU9TKQogYm9vbCBjYW5F
eGNsdWRlRnJvbUJhY2t1cCgpCiB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMv
V2ViQ29yZU5TU3RyaW5nRXh0cmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbWFjL1dlYkNvcmVOU1N0cmluZ0V4dHJhcy5oCShyZXZpc2lvbiAxMTAyMjYpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQxLDYgKzQxLDcgQEAgZXh0ZXJuICJDIiB7CiAKIEJPT0wgc3RyaW5nSXND
YXNlSW5zZW5zaXRpdmVFcXVhbFRvU3RyaW5nKE5TU3RyaW5nICpmaXJzdCwgTlNTdHJpbmcgKnNl
Y29uZCk7CiBCT09MIGhhc0Nhc2VJbnNlbnNpdGl2ZVN1ZmZpeChOU1N0cmluZyAqc3RyaW5nLCBO
U1N0cmluZyAqc3VmZml4KTsKK0JPT0wgaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4KE5TU3RyaW5n
ICpzdHJpbmcsIE5TU3RyaW5nICpwcmVmaXgpOwogQk9PTCBoYXNDYXNlSW5zZW5zaXRpdmVTdWJz
dHJpbmcoTlNTdHJpbmcgKnN0cmluZywgTlNTdHJpbmcgKnN1YnN0cmluZyk7CiBOU1N0cmluZyAq
ZmlsZW5hbWVCeUZpeGluZ0lsbGVnYWxDaGFyYWN0ZXJzKE5TU3RyaW5nICpzdHJpbmcpOwogI2lm
ICFQTEFURk9STShJT1MpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29y
ZU5TU3RyaW5nRXh0cmFzLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW0JKHJldmlzaW9uIDExMDIyNikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW0JKHdvcmtpbmcg
Y29weSkKQEAgLTQxLDYgKzQxLDExIEBAIEJPT0wgaGFzQ2FzZUluc2Vuc2l0aXZlU3VmZml4KE5T
U3RyaW5nICoKICAgICByZXR1cm4gW3N0cmluZyByYW5nZU9mU3RyaW5nOnN1ZmZpeCBvcHRpb25z
OihOU0Nhc2VJbnNlbnNpdGl2ZVNlYXJjaCB8IE5TQmFja3dhcmRzU2VhcmNoIHwgTlNBbmNob3Jl
ZFNlYXJjaCldLmxvY2F0aW9uICE9IE5TTm90Rm91bmQ7CiB9CiAKK0JPT0wgaGFzQ2FzZUluc2Vu
c2l0aXZlUHJlZml4KE5TU3RyaW5nICpzdHJpbmcsIE5TU3RyaW5nICpwcmVmaXgpCit7CisgICAg
cmV0dXJuIFtzdHJpbmcgcmFuZ2VPZlN0cmluZzpwcmVmaXggb3B0aW9uczooTlNDYXNlSW5zZW5z
aXRpdmVTZWFyY2ggfCBOU0FuY2hvcmVkU2VhcmNoKV0ubG9jYXRpb24gIT0gTlNOb3RGb3VuZDsK
K30KKwogQk9PTCBoYXNDYXNlSW5zZW5zaXRpdmVTdWJzdHJpbmcoTlNTdHJpbmcgKnN0cmluZywg
TlNTdHJpbmcgKnN1YnN0cmluZykKIHsKICAgICByZXR1cm4gW3N0cmluZyByYW5nZU9mU3RyaW5n
OnN1YnN0cmluZyBvcHRpb25zOk5TQ2FzZUluc2Vuc2l0aXZlU2VhcmNoXS5sb2NhdGlvbiAhPSBO
U05vdEZvdW5kOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVOU1VS
TEV4dHJhcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJD
b3JlTlNVUkxFeHRyYXMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21hYy9XZWJDb3JlTlNVUkxFeHRyYXMuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAxMiBBcHBsZSwgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5h
bWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAq
ICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8b2JqYy9vYmpjLmg+CisKKyNpZmRlZiBfX09CSkNf
XworI2luY2x1ZGUgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorQGNsYXNzIE5TU3RyaW5nOwor
QGNsYXNzIE5TVVJMOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IE5TU3RyaW5nIE5TU3RyaW5nOwor
dHlwZWRlZiBzdHJ1Y3QgTlNVUkwgTlNVUkw7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVz
CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitOU1N0cmluZyAqdXNlclZpc2libGVTdHJpbmcoTlNV
UkwgKlVSTCk7CitOU1VSTCAqVVJMV2l0aFVzZXJUeXBlZFN0cmluZyhOU1N0cmluZyAqc3RyaW5n
LCBOU1VSTCAqVVJMKTsKK05TVVJMICpVUkxCeVJlbW92aW5nVXNlckluZm8oTlNVUkwgKlVSTCk7
CitCT09MIGhvc3ROYW1lTmVlZHNEZWNvZGluZ1dpdGhSYW5nZShOU1N0cmluZyAqc3RyaW5nLCBO
U1JhbmdlIHJhbmdlKTsKK0JPT0wgaG9zdE5hbWVOZWVkc0VuY29kaW5nV2l0aFJhbmdlKE5TU3Ry
aW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UpOworTlNTdHJpbmcgKmRlY29kZUhvc3ROYW1lV2l0
aFJhbmdlKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UpOworTlNTdHJpbmcgKmVuY29k
ZUhvc3ROYW1lV2l0aFJhbmdlKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UpOworTlNT
dHJpbmcgKmRlY29kZUhvc3ROYW1lKE5TU3RyaW5nICpzdHJpbmcpOworTlNTdHJpbmcgKmVuY29k
ZUhvc3ROYW1lKE5TU3RyaW5nICpzdHJpbmcpOworTlNVUkwgKlVSTEJ5VHJ1bmNhdGluZ09uZUNo
YXJhY3RlckJlZm9yZUNvbXBvbmVudChOU1VSTCAqVVJMLCBDRlVSTENvbXBvbmVudFR5cGUgY29t
cG9uZW50KTsKK05TVVJMICpVUkxXaXRoRGF0YShOU0RhdGEgKmRhdGEsIE5TVVJMICpiYXNlVVJM
KTsKK05TRGF0YSAqb3JpZ2luYWxEYXRhKE5TVVJMICpVUkwpOworTlNEYXRhICpkYXRhRm9yVVJM
Q29tcG9uZW50VHlwZShOU1VSTCAqVVJMLCBDRlVSTENvbXBvbmVudFR5cGUgY29tcG9uZW50VHlw
ZSk7CitCT09MIGlzVXNlclZpc2libGVVUkwoTlNTdHJpbmcgKnN0cmluZyk7CisKKyNpZmRlZiBf
X2NwbHVzcGx1cworfQorI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMv
V2ViQ29yZU5TVVJMRXh0cmFzLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21hYy9XZWJDb3JlTlNVUkxFeHRyYXMubW0JKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZU5TVVJMRXh0cmFzLm1tCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDg3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJXZWJD
b3JlT2JqQ0V4dHJhcy5oIgorI2ltcG9ydCAiV2ViQ29yZU5TU3RyaW5nRXh0cmFzLmgiCisjaW1w
b3J0ICJXZWJDb3JlTlNVUkxFeHRyYXMuaCIKKyNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRlcmZh
Y2UuaCIKKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9WZWN0b3IuaD4K
KyNpbXBvcnQgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbXBvcnQgPHVuaWNvZGUvdWlkbmEuaD4KKyNp
bXBvcnQgPHVuaWNvZGUvdXNjcmlwdC5oPgorCisvLyBOZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRv
IGhvbGQgYW4gSUROLWVuY29kZWQgbmFtZS4KKy8vIEZvciBob3N0IG5hbWVzIGJpZ2dlciB0aGFu
IHRoaXMsIHdlIHdvbid0IGRvIElETiBlbmNvZGluZywgd2hpY2ggaXMgYWxtb3N0IGNlcnRhaW5s
eSBPSy4KKyNkZWZpbmUgSE9TVF9OQU1FX0JVRkZFUl9MRU5HVEggMjA0OAorI2RlZmluZSBVUkxf
QllURVNfQlVGRkVSX0xFTkdUSCAyMDQ4CisKK3R5cGVkZWYgdm9pZCAoKiBTdHJpbmdSYW5nZUFw
cGxpZXJGdW5jdGlvbikoTlNTdHJpbmcgKnN0cmluZywgTlNSYW5nZSByYW5nZSwgdm9pZCAqY29u
dGV4dCk7CisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBJRE5TY3JpcHRXaGl0ZUxpc3RGaWxlUmVh
ZCA9IFBUSFJFQURfT05DRV9JTklUOworc3RhdGljIHVpbnQzMl90IElETlNjcmlwdFdoaXRlTGlz
dFsoVVNDUklQVF9DT0RFX0xJTUlUICsgMzEpIC8gMzJdOworCitzdGF0aWMgaW5saW5lIEJPT0wg
aXNMb29rYWxpa2VDaGFyYWN0ZXIoaW50IGNoYXJDb2RlKQoreworICAgIC8vIFRoaXMgZnVuY3Rp
b24gdHJlYXRzIHRoZSBmb2xsb3dpbmcgYXMgdW5zYWZlLCBsb29rYWxpa2UgY2hhcmFjdGVyczoK
KyAgICAvLyBhbnkgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXIsIGFueSBjaGFyYWN0ZXIgY29uc2lk
ZXJlZCBhcyB3aGl0ZXNwYWNlIHRoYXQgaXNuJ3QgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gYSBzcGFj
ZSBieSBJQ1UsIAorICAgIC8vIGFuZCBhbnkgaWdub3JhYmxlIGNoYXJhY3Rlci4KKyAgICAKKyAg
ICAvLyBXZSBhbHNvIGNvbnNpZGVyZWQgdGhlIGNoYXJhY3RlcnMgaW4gTW96aWxsYSdzIGJsYWNr
bGlzdCAoaHR0cDovL2tiLm1vemlsbGF6aW5lLm9yZy9OZXR3b3JrLklETi5ibGFja2xpc3RfY2hh
cnMpLCAKKyAgICAvLyBhbmQgaW5jbHVkZWQgYWxsIG9mIHRoZXNlIGNoYXJhY3RlcnMgdGhhdCBJ
Q1UgY2FuIGVuY29kZS4KKyAgICAKKyAgICBpZiAoIXVfaXNwcmludChjaGFyQ29kZSkgfHwgdV9p
c1VXaGl0ZVNwYWNlKGNoYXJDb2RlKSB8fCB1X2hhc0JpbmFyeVByb3BlcnR5KGNoYXJDb2RlLCBV
Q0hBUl9ERUZBVUxUX0lHTk9SQUJMRV9DT0RFX1BPSU5UKSkKKyAgICAgICAgcmV0dXJuIFlFUzsK
KyAgICAKKyAgICBzd2l0Y2ggKGNoYXJDb2RlKSB7CisgICAgICAgIGNhc2UgMHgwMEVEOiAvKiBM
QVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisgICAgICAgIGNhc2UgMHgwMUMzOiAv
KiBMQVRJTiBMRVRURVIgUkVUUk9GTEVYIENMSUNLICovCisgICAgICAgIGNhc2UgMHgwMjUxOiAv
KiBMQVRJTiBTTUFMTCBMRVRURVIgQUxQSEEgKi8KKyAgICAgICAgY2FzZSAweDAyNjE6IC8qIExB
VElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgRyAqLworICAgICAgICBjYXNlIDB4MDMzNzogLyogQ09N
QklOSU5HIFNIT1JUIFNPTElEVVMgT1ZFUkxBWSAqLworICAgICAgICBjYXNlIDB4MDMzODogLyog
Q09NQklOSU5HIExPTkcgU09MSURVUyBPVkVSTEFZICovCisgICAgICAgIGNhc2UgMHgwNUI0OiAv
KiBIRUJSRVcgUE9JTlQgSElSSVEgKi8KKyAgICAgICAgY2FzZSAweDA1QkM6IC8qIEhFQlJFVyBQ
T0lOVCBEQUdFU0ggT1IgTUFQSVEgKi8KKyAgICAgICAgY2FzZSAweDA1QzM6IC8qIEhFQlJFVyBQ
VU5DVFVBVElPTiBTT0YgUEFTVVEgKi8KKyAgICAgICAgY2FzZSAweDA1RjQ6IC8qIEhFQlJFVyBQ
VU5DVFVBVElPTiBHRVJTSEFZSU0gKi8KKyAgICAgICAgY2FzZSAweDA2NjA6IC8qIEFSQUJJQyBJ
TkRJQyBESUdJVCBaRVJPICovCisgICAgICAgIGNhc2UgMHgwNkQ0OiAvKiBBUkFCSUMgRlVMTCBT
VE9QICovCisgICAgICAgIGNhc2UgMHgwNkYwOiAvKiBFWFRFTkRFRCBBUkFCSUMgSU5ESUMgRElH
SVQgWkVSTyAqLworICAgICAgICBjYXNlIDB4MjAyNzogLyogSFlQSEVOQVRJT04gUE9JTlQgKi8K
KyAgICAgICAgY2FzZSAweDIwMzk6IC8qIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RB
VElPTiBNQVJLICovCisgICAgICAgIGNhc2UgMHgyMDNBOiAvKiBTSU5HTEUgUklHSFQtUE9JTlRJ
TkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgICAgY2FzZSAweDIwNDQ6IC8qIEZSQUNU
SU9OIFNMQVNIICovCisgICAgICAgIGNhc2UgMHgyMjE1OiAvKiBESVZJU0lPTiBTTEFTSCAqLwor
ICAgICAgICBjYXNlIDB4MjIxNjogLyogU0VUIE1JTlVTICovCisgICAgICAgIGNhc2UgMHgyMzNG
OiAvKiBBUEwgRlVOQ1RJT05BTCBTWU1CT0wgU0xBU0ggQkFSICovCisgICAgICAgIGNhc2UgMHgy
M0FFOiAvKiBJTlRFR1JBTCBFWFRFTlNJT04gKi8KKyAgICAgICAgY2FzZSAweDI0NEE6IC8qIE9D
UiBET1VCTEUgQkFDS1NMQVNIICovCisgICAgICAgIGNhc2UgMHgyNTcxOiAvKiBCT1ggRFJBV0lO
R1MgTElHSFQgRElBR09OQUwgVVBQRVIgUklHSFQgVE8gTE9XRVIgTEVGVCAqLworICAgICAgICBj
YXNlIDB4MjU3MjogLyogQk9YIERSQVdJTkdTIExJR0hUIERJQUdPTkFMIFVQUEVSIExFRlQgVE8g
TE9XRVIgUklHSFQgKi8KKyAgICAgICAgY2FzZSAweDI5Rjg6IC8qIEJJRyBTT0xJRFVTICovCisg
ICAgICAgIGNhc2UgMHgyOWY2OiAvKiBTT0xJRFVTIFdJVEggT1ZFUkJBUiAqLworICAgICAgICBj
YXNlIDB4MkFGQjogLyogVFJJUExFIFNPTElEVVMgQklOQVJZIFJFTEFUSU9OICovCisgICAgICAg
IGNhc2UgMHgyQUZEOiAvKiBET1VCTEUgU09MSURVUyBPUEVSQVRPUiAqLworICAgICAgICBjYXNl
IDB4MzAwODogLyogTEVGVCBBTkdMRSBCUkFDS0VUICovCisgICAgICAgIGNhc2UgMHgzMDE0OiAv
KiBMRUZUIFRPUlRPSVNFIFNIRUxMIEJSQUNLRVQgKi8KKyAgICAgICAgY2FzZSAweDMwMTU6IC8q
IFJJR0hUIFRPUlRPSVNFIFNIRUxMIEJSQUNLRVQgKi8KKyAgICAgICAgY2FzZSAweDMwMzM6IC8q
IFZFUlRJQ0FMIEtBTkEgUkVQRUFUIE1BUksgVVBQRVIgSEFMRiAqLworICAgICAgICBjYXNlIDB4
MzAzNTogLyogVkVSVElDQUwgS0FOQSBSRVBFQVQgTUFSSyBMT1dFUiBIQUxGICovCisgICAgICAg
IGNhc2UgMHgzMjFEOiAvKiBQQVJFTlRIRVNJWkVEIEtPUkVBTiBDSEFSQUNURVIgT0pFT04gKi8K
KyAgICAgICAgY2FzZSAweDMyMUU6IC8qIFBBUkVOVEhFU0laRUQgS09SRUFOIENIQVJBQ1RFUiBP
IEhVICovCisgICAgICAgIGNhc2UgMHgzM0RGOiAvKiBTUVVBUkUgQSBPVkVSIE0gKi8KKyAgICAg
ICAgY2FzZSAweEZFMTQ6IC8qIFBSRVNFTlRBVElPTiBGT1JNIEZPUiBWRVJUSUNBTCBTRU1JQ09M
T04gKi8KKyAgICAgICAgY2FzZSAweEZFMTU6IC8qIFBSRVNFTlRBVElPTiBGT1JNIEZPUiBWRVJU
SUNBTCBFWENMQU1BVElPTiBNQVJLICovCisgICAgICAgIGNhc2UgMHhGRTNGOiAvKiBQUkVTRU5U
QVRJT04gRk9STSBGT1IgVkVSVElDQUwgTEVGVCBBTkdMRSBCUkFDS0VUICovCisgICAgICAgIGNh
c2UgMHhGRTVEOiAvKiBTTUFMTCBMRUZUIFRPUlRPSVNFIFNIRUxMIEJSQUNLRVQgKi8KKyAgICAg
ICAgY2FzZSAweEZFNUU6IC8qIFNNQUxMIFJJR0hUIFRPUlRPSVNFIFNIRUxMIEJSQUNLRVQgKi8K
KyAgICAgICAgICAgIHJldHVybiBZRVM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gTk87CisgICAgfQorfQorCitzdGF0aWMgQk9PTCByZWFkSUROU2NyaXB0V2hpdGVMaXN0
RmlsZShOU1N0cmluZyAqZmlsZW5hbWUpCit7CisgICAgaWYgKCFmaWxlbmFtZSkKKyAgICAgICAg
cmV0dXJuIE5POworCisgICAgRklMRSAqZmlsZSA9IGZvcGVuKFtmaWxlbmFtZSBmaWxlU3lzdGVt
UmVwcmVzZW50YXRpb25dLCAiciIpOworICAgIGlmICghZmlsZSkKKyAgICAgICAgcmV0dXJuIE5P
OworICAgIAorICAgIC8vIFJlYWQgYSB3b3JkIGF0IGEgdGltZS4KKyAgICAvLyBBbGxvdyBjb21t
ZW50cywgc3RhcnRpbmcgd2l0aCAjIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgor
ICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8vIFNraXAgYSBjb21tZW50IGlmIHByZXNlbnQuCisg
ICAgICAgIGlmIChmc2NhbmYoZmlsZSwgIiAjJSpbXlxuXHJdJSpbXG5ccl0iKSA9PSBFT0YpCisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIC8vIFJlYWQgYSBzY3JpcHQgbmFt
ZSBpZiBwcmVzZW50LgorICAgICAgICBjaGFyIHdvcmRbMzNdOworICAgICAgICBpbnQgcmVzdWx0
ID0gZnNjYW5mKGZpbGUsICIgJTMyW14jIFx0XG5ccl0lKlteIyBcdFxuXHJdICIsIHdvcmQpOwor
ICAgICAgICBpZiAocmVzdWx0ID09IEVPRikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAK
KyAgICAgICAgaWYgKHJlc3VsdCA9PSAxKSB7CisgICAgICAgICAgICAvLyBHb3QgYSB3b3JkLCBt
YXAgdG8gc2NyaXB0IGNvZGUgYW5kIHB1dCBpdCBpbnRvIHRoZSBhcnJheS4KKyAgICAgICAgICAg
IGludDMyX3Qgc2NyaXB0ID0gdV9nZXRQcm9wZXJ0eVZhbHVlRW51bShVQ0hBUl9TQ1JJUFQsIHdv
cmQpOworICAgICAgICAgICAgaWYgKHNjcmlwdCA+PSAwICYmIHNjcmlwdCA8IFVTQ1JJUFRfQ09E
RV9MSU1JVCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IHNjcmlwdCAvIDMyOwor
ICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAxIDw8IChzY3JpcHQgJSAzMik7CisgICAg
ICAgICAgICAgICAgSUROU2NyaXB0V2hpdGVMaXN0W2luZGV4XSB8PSBtYXNrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmaWxlKTsKKyAgICByZXR1cm4gWUVT
OworfQorCitzdGF0aWMgdm9pZCByZWFkSUROU2NyaXB0V2hpdGVMaXN0KHZvaWQpCit7CisgICAg
Ly8gUmVhZCB3aGl0ZSBsaXN0IGZyb20gbGlicmFyeS4KKyAgICBOU0FycmF5ICpkaXJzID0gTlNT
ZWFyY2hQYXRoRm9yRGlyZWN0b3JpZXNJbkRvbWFpbnMoTlNMaWJyYXJ5RGlyZWN0b3J5LCBOU0Fs
bERvbWFpbnNNYXNrLCBZRVMpOworICAgIGludCBudW1EaXJzID0gW2RpcnMgY291bnRdOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlyczsgaSsrKSB7CisgICAgICAgIGlmIChyZWFkSURO
U2NyaXB0V2hpdGVMaXN0RmlsZShbW2RpcnMgb2JqZWN0QXRJbmRleDppXSBzdHJpbmdCeUFwcGVu
ZGluZ1BhdGhDb21wb25lbnQ6QCJJRE5TY3JpcHRXaGl0ZUxpc3QudHh0Il0pKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBGYWxsIGJhY2sgb24gd2hpdGUgbGlzdCBp
bnNpZGUgYnVuZGxlLgorICAgIE5TQnVuZGxlICpidW5kbGUgPSBbTlNCdW5kbGUgYnVuZGxlV2l0
aElkZW50aWZpZXI6QCJjb20uYXBwbGUuV2ViS2l0Il07CisgICAgaWYgKCFidW5kbGUpCisgICAg
ICAgIENSQVNIKCk7CisgICAgCisgICAgcmVhZElETlNjcmlwdFdoaXRlTGlzdEZpbGUoW2J1bmRs
ZSBwYXRoRm9yUmVzb3VyY2U6QCJJRE5TY3JpcHRXaGl0ZUxpc3QiIG9mVHlwZTpAInR4dCJdKTsK
K30KKworc3RhdGljIEJPT0wgYWxsQ2hhcmFjdGVyc0luSUROU2NyaXB0V2hpdGVMaXN0KGNvbnN0
IFVDaGFyICpidWZmZXIsIGludDMyX3QgbGVuZ3RoKQoreworICAgIHB0aHJlYWRfb25jZSgmSURO
U2NyaXB0V2hpdGVMaXN0RmlsZVJlYWQsIHJlYWRJRE5TY3JpcHRXaGl0ZUxpc3QpOworICAgIAor
ICAgIGludDMyX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgVUNo
YXIzMiBjOworICAgICAgICBVMTZfTkVYVChidWZmZXIsIGksIGxlbmd0aCwgYykKKyAgICAgICAg
VUVycm9yQ29kZSBlcnJvciA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgVVNjcmlwdENvZGUgc2Ny
aXB0ID0gdXNjcmlwdF9nZXRTY3JpcHQoYywgJmVycm9yKTsKKyAgICAgICAgaWYgKGVycm9yICE9
IFVfWkVST19FUlJPUikgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJnb3QgSUNVIGVycm9yIHdo
aWxlIHRyeWluZyB0byBsb29rIGF0IHNjcmlwdHM6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAg
cmV0dXJuIE5POworICAgICAgICB9CisgICAgICAgIGlmIChzY3JpcHQgPCAwKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoImdvdCBuZWdhdGl2ZSBudW1iZXIgZm9yIHNjcmlwdCBjb2RlIGZyb20g
SUNVOiAlZCIsIHNjcmlwdCk7CisgICAgICAgICAgICByZXR1cm4gTk87CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKHNjcmlwdCA+PSBVU0NSSVBUX0NPREVfTElNSVQpCisgICAgICAgICAgICByZXR1
cm4gTk87CisKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gc2NyaXB0IC8gMzI7CisgICAgICAgIHVp
bnQzMl90IG1hc2sgPSAxIDw8IChzY3JpcHQgJSAzMik7CisgICAgICAgIGlmICghKElETlNjcmlw
dFdoaXRlTGlzdFtpbmRleF0gJiBtYXNrKSkKKyAgICAgICAgICAgIHJldHVybiBOTzsKKyAgICAg
ICAgCisgICAgICAgIGlmIChpc0xvb2thbGlrZUNoYXJhY3RlcihjKSkKKyAgICAgICAgICAgIHJl
dHVybiBOTzsKKyAgICB9CisgICAgcmV0dXJuIFlFUzsKK30KKworc3RhdGljIEJPT0wgYWxsQ2hh
cmFjdGVyc0FsbG93ZWRCeVRMRFJ1bGVzKGNvbnN0IFVDaGFyKiBidWZmZXIsIGludDMyX3QgbGVu
Z3RoKQoreworICAgIC8vIFNraXAgdHJhaWxpbmcgZG90IGZvciByb290IGRvbWFpbi4KKyAgICBp
ZiAoYnVmZmVyW2xlbmd0aCAtIDFdID09ICcuJykKKyAgICAgICAgbGVuZ3RoLS07CisgICAgCisg
ICAgaWYgKGxlbmd0aCA+IDMgJiYgYnVmZmVyW2xlbmd0aCAtIDNdID09ICcuJworICAgICAgICAm
JiBidWZmZXJbbGVuZ3RoIC0gMl0gPT0gMHgwNDQwIC8vIENZUklMTElDIFNNQUxMIExFVFRFUiBF
UgorICAgICAgICAmJiBidWZmZXJbbGVuZ3RoIC0gMV0gPT0gMHgwNDQ0KSAvLyBDWVJJTExJQyBT
TUFMTCBMRVRURVIgRUYKKyAgICB7CisgICAgICAgIC8vIFJ1bGVzIGRlZmluZWQgYnkgPGh0dHA6
Ly93d3cuY2N0bGQucnUvcnUvZG9jcy9ydWxlc3JmLnBocD4uIFRoaXMgY29kZSBvbmx5IGNoZWNr
cyByZXF1aXJlbWVudHMgdGhhdCBtYXR0ZXIgZm9yIHByZXNlbnRhdGlvbiBwdXJwb3Nlcy4KKyAg
ICAgICAgZm9yIChpbnQzMl90IGkgPSBsZW5ndGggLSA0OyBpOyAtLWkpIHsKKyAgICAgICAgICAg
IFVDaGFyIGNoID0gYnVmZmVyW2ldOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBPbmx5
IG1vZGVybiBSdXNzaWFuIGxldHRlcnMsIGRpZ2l0cyBhbmQgZGFzaGVzIGFyZSBhbGxvd2VkLgor
ICAgICAgICAgICAgaWYgKChjaCA+PSAweDA0MzAgJiYgY2ggPD0gMHgwNDRmKSB8fCBjaCA9PSAw
eDA0NTF8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgY2ggPT0gJy0nKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBPbmx5IGNoZWNr
IHRvcCBsZXZlbCBkb21haW4uIExvd2VyIGxldmVsIHJlZ2lzdHJhcnMgbWF5IGhhdmUgZGlmZmVy
ZW50IHJ1bGVzLgorICAgICAgICAgICAgaWYgKGNoID09ICcuJykKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIE5POworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBZRVM7CisgICAgfQorICAgIAorICAgIC8vIE5vdCBhIGtub3duIHRvcCBs
ZXZlbCBkb21haW4gd2l0aCBzcGVjaWFsIHJ1bGVzLgorICAgIHJldHVybiBOTzsKK30KKworLy8g
UmV0dXJuIHZhbHVlIG9mIG5pbCBtZWFucyBubyBtYXBwaW5nIGlzIG5lY2Vzc2FyeS4KKy8vIElm
IG1ha2VTdHJpbmcgaXMgTk8sIHRoZW4gcmV0dXJuIHZhbHVlIGlzIGVpdGhlciBuaWwgb3Igc2Vs
ZiB0byBpbmRpY2F0ZSBtYXBwaW5nIGlzIG5lY2Vzc2FyeS4KKy8vIElmIG1ha2VTdHJpbmcgaXMg
WUVTLCB0aGVuIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbmlsIG9yIHRoZSBtYXBwZWQgc3RyaW5n
Lgorc3RhdGljIE5TU3RyaW5nICptYXBIb3N0TmFtZVdpdGhSYW5nZShOU1N0cmluZyAqc3RyaW5n
LCBOU1JhbmdlIHJhbmdlLCBCT09MIGVuY29kZSwgQk9PTCBtYWtlU3RyaW5nKQoreworICAgIGlm
IChyYW5nZS5sZW5ndGggPiBIT1NUX05BTUVfQlVGRkVSX0xFTkdUSCkKKyAgICAgICAgcmV0dXJu
IG5pbDsKKyAgICAKKyAgICBpZiAoIVtzdHJpbmcgbGVuZ3RoXSkKKyAgICAgICAgcmV0dXJuIG5p
bDsKKyAgICAKKyAgICBVQ2hhciBzb3VyY2VCdWZmZXJbSE9TVF9OQU1FX0JVRkZFUl9MRU5HVEhd
OworICAgIFVDaGFyIGRlc3RpbmF0aW9uQnVmZmVyW0hPU1RfTkFNRV9CVUZGRVJfTEVOR1RIXTsK
KyAgICAKKyAgICBpZiAoZW5jb2RlICYmIFtzdHJpbmcgcmFuZ2VPZlN0cmluZzpAIiUiIG9wdGlv
bnM6TlNMaXRlcmFsU2VhcmNoIHJhbmdlOnJhbmdlXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kKSB7
CisgICAgICAgIE5TU3RyaW5nICpzdWJzdHJpbmcgPSBbc3RyaW5nIHN1YnN0cmluZ1dpdGhSYW5n
ZTpyYW5nZV07CisgICAgICAgIHN1YnN0cmluZyA9IFdlYkNvcmVDRkF1dG9yZWxlYXNlKENGVVJM
Q3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcyhOVUxMLCAoQ0ZTdHJpbmdSZWYp
c3Vic3RyaW5nLCBDRlNUUigiIikpKTsKKyAgICAgICAgaWYgKHN1YnN0cmluZykgeworICAgICAg
ICAgICAgc3RyaW5nID0gc3Vic3RyaW5nOworICAgICAgICAgICAgcmFuZ2UgPSBOU01ha2VSYW5n
ZSgwLCBbc3RyaW5nIGxlbmd0aF0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGludCBs
ZW5ndGggPSByYW5nZS5sZW5ndGg7CisgICAgW3N0cmluZyBnZXRDaGFyYWN0ZXJzOnNvdXJjZUJ1
ZmZlciByYW5nZTpyYW5nZV07CisgICAgCisgICAgVUVycm9yQ29kZSBlcnJvciA9IFVfWkVST19F
UlJPUjsKKyAgICBpbnQzMl90IG51bUNoYXJhY3RlcnNDb252ZXJ0ZWQgPSAoZW5jb2RlID8gdWlk
bmFfSUROVG9BU0NJSSA6IHVpZG5hX0lETlRvVW5pY29kZSkoc291cmNlQnVmZmVyLCBsZW5ndGgs
IGRlc3RpbmF0aW9uQnVmZmVyLCBIT1NUX05BTUVfQlVGRkVSX0xFTkdUSCwgVUlETkFfQUxMT1df
VU5BU1NJR05FRCwgTlVMTCwgJmVycm9yKTsKKyAgICBpZiAoZXJyb3IgIT0gVV9aRVJPX0VSUk9S
KQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIGlmIChudW1DaGFyYWN0ZXJzQ29udmVy
dGVkID09IGxlbmd0aCAmJiAhbWVtY21wKHNvdXJjZUJ1ZmZlciwgZGVzdGluYXRpb25CdWZmZXIs
IGxlbmd0aCAqIHNpemVvZihVQ2hhcikpKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAg
IGlmICghZW5jb2RlICYmICFhbGxDaGFyYWN0ZXJzSW5JRE5TY3JpcHRXaGl0ZUxpc3QoZGVzdGlu
YXRpb25CdWZmZXIsIG51bUNoYXJhY3RlcnNDb252ZXJ0ZWQpICYmICFhbGxDaGFyYWN0ZXJzQWxs
b3dlZEJ5VExEUnVsZXMoZGVzdGluYXRpb25CdWZmZXIsIG51bUNoYXJhY3RlcnNDb252ZXJ0ZWQp
KQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIHJldHVybiBtYWtlU3RyaW5nID8gKE5T
U3RyaW5nICopW05TU3RyaW5nIHN0cmluZ1dpdGhDaGFyYWN0ZXJzOmRlc3RpbmF0aW9uQnVmZmVy
IGxlbmd0aDpudW1DaGFyYWN0ZXJzQ29udmVydGVkXSA6IHN0cmluZzsKK30KKworQk9PTCBob3N0
TmFtZU5lZWRzRGVjb2RpbmdXaXRoUmFuZ2UoTlNTdHJpbmcgKnN0cmluZywgTlNSYW5nZSByYW5n
ZSkKK3sKKyAgICAgcmV0dXJuIG1hcEhvc3ROYW1lV2l0aFJhbmdlKHN0cmluZywgcmFuZ2UsIE5P
LCBOTykgIT0gbmlsOworfQorIAorQk9PTCBob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUmFuZ2Uo
TlNTdHJpbmcgKnN0cmluZywgTlNSYW5nZSByYW5nZSkKK3sKKyAgICAgcmV0dXJuIG1hcEhvc3RO
YW1lV2l0aFJhbmdlKHN0cmluZywgcmFuZ2UsIFlFUywgIE5PKSAhPSBuaWw7Cit9CisKK05TU3Ry
aW5nICpkZWNvZGVIb3N0TmFtZVdpdGhSYW5nZShOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJh
bmdlKQoreworICAgIHJldHVybiBtYXBIb3N0TmFtZVdpdGhSYW5nZShzdHJpbmcsIHJhbmdlLCBO
TywgWUVTKTsKK30KKworTlNTdHJpbmcgKmVuY29kZUhvc3ROYW1lV2l0aFJhbmdlKE5TU3RyaW5n
ICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UpCit7CisgICAgcmV0dXJuIG1hcEhvc3ROYW1lV2l0aFJh
bmdlKHN0cmluZywgcmFuZ2UsIFlFUywgWUVTKTsKK30KKworTlNTdHJpbmcgKmRlY29kZUhvc3RO
YW1lKE5TU3RyaW5nICpzdHJpbmcpCit7CisgICAgTlNTdHJpbmcgKm5hbWUgPSBtYXBIb3N0TmFt
ZVdpdGhSYW5nZShzdHJpbmcsIE5TTWFrZVJhbmdlKDAsIFtzdHJpbmcgbGVuZ3RoXSksIE5PLCBZ
RVMpOworICAgIHJldHVybiAhbmFtZSA/IHN0cmluZyA6IG5hbWU7Cit9CisKK05TU3RyaW5nICpl
bmNvZGVIb3N0TmFtZShOU1N0cmluZyAqc3RyaW5nKQoreworICAgIE5TU3RyaW5nICpuYW1lID0g
IG1hcEhvc3ROYW1lV2l0aFJhbmdlKHN0cmluZywgTlNNYWtlUmFuZ2UoMCwgW3N0cmluZyBsZW5n
dGhdKSwgWUVTLCBZRVMpOworICAgIHJldHVybiAhbmFtZSA/IHN0cmluZyA6IG5hbWU7Cit9CisK
K3N0YXRpYyB2b2lkIGNvbGxlY3RSYW5nZXNUaGF0TmVlZE1hcHBpbmcoTlNTdHJpbmcgKnN0cmlu
ZywgTlNSYW5nZSByYW5nZSwgdm9pZCAqY29udGV4dCwgQk9PTCBlbmNvZGUpCit7CisgICAgQk9P
TCBuZWVkc01hcHBpbmcgPSBlbmNvZGUgPyBob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUmFuZ2Uo
c3RyaW5nLCByYW5nZSkgOiBob3N0TmFtZU5lZWRzRGVjb2RpbmdXaXRoUmFuZ2Uoc3RyaW5nLCBy
YW5nZSk7CisgICAgaWYgKCFuZWVkc01hcHBpbmcpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAg
ICBOU011dGFibGVBcnJheSAqKmFycmF5ID0gKE5TTXV0YWJsZUFycmF5ICoqKWNvbnRleHQ7Cisg
ICAgaWYgKCEqYXJyYXkpCisgICAgICAgICphcnJheSA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2Nd
IGluaXRdOworICAgIAorICAgIFsqYXJyYXkgYWRkT2JqZWN0OltOU1ZhbHVlIHZhbHVlV2l0aFJh
bmdlOnJhbmdlXV07Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3RSYW5nZXNUaGF0TmVlZEVuY29k
aW5nKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UsIHZvaWQgKmNvbnRleHQpCit7Cisg
ICAgcmV0dXJuIGNvbGxlY3RSYW5nZXNUaGF0TmVlZE1hcHBpbmcoc3RyaW5nLCByYW5nZSwgY29u
dGV4dCwgWUVTKTsKK30KKworc3RhdGljIHZvaWQgY29sbGVjdFJhbmdlc1RoYXROZWVkRGVjb2Rp
bmcoTlNTdHJpbmcgKnN0cmluZywgTlNSYW5nZSByYW5nZSwgdm9pZCAqY29udGV4dCkKK3sKKyAg
ICByZXR1cm4gY29sbGVjdFJhbmdlc1RoYXROZWVkTWFwcGluZyhzdHJpbmcsIHJhbmdlLCBjb250
ZXh0LCBOTyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgTlNDaGFyYWN0ZXJTZXQgKnJldGFpbihOU0No
YXJhY3RlclNldCAqY2hhcnNldCkKK3sKKyAgICBDRlJldGFpbihjaGFyc2V0KTsKKyAgICByZXR1
cm4gY2hhcnNldDsKK30KKworc3RhdGljIHZvaWQgYXBwbHlIb3N0TmFtZUZ1bmN0aW9uVG9NYWls
VG9VUkxTdHJpbmcoTlNTdHJpbmcgKnN0cmluZywgU3RyaW5nUmFuZ2VBcHBsaWVyRnVuY3Rpb24g
Ziwgdm9pZCAqY29udGV4dCkKK3sKKyAgICAvLyBJbiBhIG1haWx0bzogVVJMLCBob3N0IG5hbWVz
IGNvbWUgYWZ0ZXIgYSAnQCcgY2hhcmFjdGVyIGFuZCBlbmQgd2l0aCBhICc+JyBvciAnLCcgb3Ig
Jz8nIGNoYXJhY3Rlci4KKyAgICAvLyBTa2lwIHF1b3RlZCBzdHJpbmdzIHNvIHRoYXQgY2hhcmFj
dGVycyBpbiB0aGVtIGRvbid0IGNvbmZ1c2UgdXMuCisgICAgLy8gV2hlbiB3ZSBmaW5kIGEgJz8n
IGNoYXJhY3Rlciwgd2UgYXJlIHBhc3QgdGhlIHBhcnQgb2YgdGhlIFVSTCB0aGF0IGNvbnRhaW5z
IGhvc3QgbmFtZXMuCisgICAgCisgICAgc3RhdGljIE5TQ2hhcmFjdGVyU2V0ICpob3N0TmFtZU9y
U3RyaW5nU3RhcnRDaGFyYWN0ZXJzID0gcmV0YWluKFtOU0NoYXJhY3RlclNldCBjaGFyYWN0ZXJT
ZXRXaXRoQ2hhcmFjdGVyc0luU3RyaW5nOkAiXCJAPyJdKTsKKyAgICBzdGF0aWMgTlNDaGFyYWN0
ZXJTZXQgKmhvc3ROYW1lRW5kQ2hhcmFjdGVycyA9IHJldGFpbihbTlNDaGFyYWN0ZXJTZXQgY2hh
cmFjdGVyU2V0V2l0aENoYXJhY3RlcnNJblN0cmluZzpAIj4sPyJdKTsKKyAgICBzdGF0aWMgTlND
aGFyYWN0ZXJTZXQgKnF1b3RlZFN0cmluZ0NoYXJhY3RlcnMgPSByZXRhaW4oW05TQ2hhcmFjdGVy
U2V0IGNoYXJhY3RlclNldFdpdGhDaGFyYWN0ZXJzSW5TdHJpbmc6QCJcIlxcIl0pOworICAgIAor
ICAgIHVuc2lnbmVkIHN0cmluZ0xlbmd0aCA9IFtzdHJpbmcgbGVuZ3RoXTsKKyAgICBOU1Jhbmdl
IHJlbWFpbmluZyA9IE5TTWFrZVJhbmdlKDAsIHN0cmluZ0xlbmd0aCk7CisgICAgCisgICAgd2hp
bGUgKDEpIHsKKyAgICAgICAgLy8gRmluZCBzdGFydCBvZiBob3N0IG5hbWUgb3Igb2YgcXVvdGVk
IHN0cmluZy4KKyAgICAgICAgTlNSYW5nZSBob3N0TmFtZU9yU3RyaW5nU3RhcnQgPSBbc3RyaW5n
IHJhbmdlT2ZDaGFyYWN0ZXJGcm9tU2V0Omhvc3ROYW1lT3JTdHJpbmdTdGFydENoYXJhY3RlcnMg
b3B0aW9uczowIHJhbmdlOnJlbWFpbmluZ107CisgICAgICAgIGlmIChob3N0TmFtZU9yU3RyaW5n
U3RhcnQubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICB1bmljaGFyIGMgPSBbc3RyaW5nIGNoYXJhY3RlckF0SW5kZXg6aG9zdE5hbWVPclN0cmlu
Z1N0YXJ0LmxvY2F0aW9uXTsKKyAgICAgICAgcmVtYWluaW5nLmxvY2F0aW9uID0gTlNNYXhSYW5n
ZShob3N0TmFtZU9yU3RyaW5nU3RhcnQpOworICAgICAgICByZW1haW5pbmcubGVuZ3RoID0gc3Ry
aW5nTGVuZ3RoIC0gcmVtYWluaW5nLmxvY2F0aW9uOworICAgICAgICAKKyAgICAgICAgaWYgKGMg
PT0gJz8nKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKGMgPT0g
J0AnKSB7CisgICAgICAgICAgICAvLyBGaW5kIGVuZCBvZiBob3N0IG5hbWUuCisgICAgICAgICAg
ICB1bnNpZ25lZCBob3N0TmFtZVN0YXJ0ID0gcmVtYWluaW5nLmxvY2F0aW9uOworICAgICAgICAg
ICAgTlNSYW5nZSBob3N0TmFtZUVuZCA9IFtzdHJpbmcgcmFuZ2VPZkNoYXJhY3RlckZyb21TZXQ6
aG9zdE5hbWVFbmRDaGFyYWN0ZXJzIG9wdGlvbnM6MCByYW5nZTpyZW1haW5pbmddOworICAgICAg
ICAgICAgQk9PTCBkb25lOworICAgICAgICAgICAgaWYgKGhvc3ROYW1lRW5kLmxvY2F0aW9uID09
IE5TTm90Rm91bmQpIHsKKyAgICAgICAgICAgICAgICBob3N0TmFtZUVuZC5sb2NhdGlvbiA9IHN0
cmluZ0xlbmd0aDsKKyAgICAgICAgICAgICAgICBkb25lID0gWUVTOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcubG9jYXRpb24gPSBob3N0TmFtZUVuZC5s
b2NhdGlvbjsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcubGVuZ3RoID0gc3RyaW5nTGVuZ3Ro
IC0gcmVtYWluaW5nLmxvY2F0aW9uOworICAgICAgICAgICAgICAgIGRvbmUgPSBOTzsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUHJvY2VzcyBob3N0IG5hbWUg
cmFuZ2UuCisgICAgICAgICAgICBmKHN0cmluZywgTlNNYWtlUmFuZ2UoaG9zdE5hbWVTdGFydCwg
aG9zdE5hbWVFbmQubG9jYXRpb24gLSBob3N0TmFtZVN0YXJ0KSwgY29udGV4dCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNraXAgcXVvdGVkIHN0cmluZy4KKyAgICAg
ICAgICAgIEFTU0VSVChjID09ICciJyk7CisgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAg
ICAgICAgICAgIE5TUmFuZ2UgZXNjYXBlZENoYXJhY3Rlck9yU3RyaW5nRW5kID0gW3N0cmluZyBy
YW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpxdW90ZWRTdHJpbmdDaGFyYWN0ZXJzIG9wdGlvbnM6MCBy
YW5nZTpyZW1haW5pbmddOworICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkQ2hhcmFjdGVyT3JT
dHJpbmdFbmQubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgICAgICAgICAgYyA9IFtzdHJpbmcgY2hhcmFjdGVyQXRJbmRleDplc2Nh
cGVkQ2hhcmFjdGVyT3JTdHJpbmdFbmQubG9jYXRpb25dOworICAgICAgICAgICAgICAgIHJlbWFp
bmluZy5sb2NhdGlvbiA9IE5TTWF4UmFuZ2UoZXNjYXBlZENoYXJhY3Rlck9yU3RyaW5nRW5kKTsK
KyAgICAgICAgICAgICAgICByZW1haW5pbmcubGVuZ3RoID0gc3RyaW5nTGVuZ3RoIC0gcmVtYWlu
aW5nLmxvY2F0aW9uOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdl
IGFyZSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHRoZW4gYnJlYWsgZnJvbSB0aGUgc3RyaW5nIGxv
b3AgYmFjayB0byB0aGUgaG9zdCBuYW1lIGxvb3AuCisgICAgICAgICAgICAgICAgaWYgKGMgPT0g
JyInKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAvLyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIEFT
U0VSVChjID09ICdcXCcpOworICAgICAgICAgICAgICAgIGlmICghcmVtYWluaW5nLmxlbmd0aCkK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgcmVtYWluaW5n
LmxvY2F0aW9uICs9IDE7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nLmxlbmd0aCAtPSAxOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhcHBseUhv
c3ROYW1lRnVuY3Rpb25Ub1VSTFN0cmluZyhOU1N0cmluZyAqc3RyaW5nLCBTdHJpbmdSYW5nZUFw
cGxpZXJGdW5jdGlvbiBmLCB2b2lkICpjb250ZXh0KQoreworICAgIC8vIEZpbmQgaG9zdG5hbWVz
LiBUb28gYmFkIHdlIGNhbid0IHVzZSBhbnkgcmVhbCBVUkwtcGFyc2luZyBjb2RlIHRvIGRvIHRo
aXMsCisgICAgLy8gYnV0IHdlIGhhdmUgdG8gZG8gaXQgYmVmb3JlIGRvaW5nIGFsbCB0aGUgJS1l
c2NhcGluZywgYW5kIHRoaXMgaXMgdGhlIG9ubHkKKyAgICAvLyBjb2RlIHdlIGhhdmUgdGhhdCBw
YXJzZXMgbWFpbHRvIFVSTHMgYW55d2F5LgorICAgIAorICAgIC8vIE1heWJlIHdlIHNob3VsZCBp
bXBsZW1lbnQgdGhpcyB1c2luZyBhIGNoYXJhY3RlciBidWZmZXIgaW5zdGVhZD8KKyAgICAKKyAg
ICBpZiAoaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4KHN0cmluZywgQCJtYWlsdG86IikpIHsKKyAg
ICAgICAgYXBwbHlIb3N0TmFtZUZ1bmN0aW9uVG9NYWlsVG9VUkxTdHJpbmcoc3RyaW5nLCBmLCBj
b250ZXh0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBGaW5kIHRoZSBo
b3N0IG5hbWUgaW4gYSBoaWVyYXJjaGljYWwgVVJMLgorICAgIC8vIEl0IGNvbWVzIGFmdGVyIGEg
IjovLyIgc2VxdWVuY2UsIHdpdGggc2NoZW1lIGNoYXJhY3RlcnMgcHJlY2VkaW5nLgorICAgIC8v
IElmIGVuZHMgd2l0aCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgYSAiOiIsICIvIiwgb3IgYSAi
PyIuCisgICAgLy8gSWYgdGhlcmUgaXMgYSAiQCIgY2hhcmFjdGVyLCB0aGUgaG9zdCBwYXJ0IGlz
IGp1c3QgdGhlIHBhcnQgYWZ0ZXIgdGhlICJAIi4KKyAgICBOU1JhbmdlIHNlcGFyYXRvclJhbmdl
ID0gW3N0cmluZyByYW5nZU9mU3RyaW5nOkAiOi8vIl07CisgICAgaWYgKHNlcGFyYXRvclJhbmdl
LmxvY2F0aW9uID09IE5TTm90Rm91bmQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBD
aGVjayB0aGF0IGFsbCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgOi8vIGFyZSB2YWxpZCBzY2hlbWUg
Y2hhcmFjdGVycy4KKyAgICBzdGF0aWMgTlNDaGFyYWN0ZXJTZXQgKm5vblNjaGVtZUNoYXJhY3Rl
cnMgPSByZXRhaW4oW1tOU0NoYXJhY3RlclNldCBjaGFyYWN0ZXJTZXRXaXRoQ2hhcmFjdGVyc0lu
U3RyaW5nOkAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2
d3h5ejAxMjM0NTY3ODkrLS4iXSBpbnZlcnRlZFNldF0pOworICAgIGlmIChbc3RyaW5nIHJhbmdl
T2ZDaGFyYWN0ZXJGcm9tU2V0Om5vblNjaGVtZUNoYXJhY3RlcnMgb3B0aW9uczowIHJhbmdlOk5T
TWFrZVJhbmdlKDAsIHNlcGFyYXRvclJhbmdlLmxvY2F0aW9uKV0ubG9jYXRpb24gIT0gTlNOb3RG
b3VuZCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIHVuc2lnbmVkIHN0cmluZ0xlbmd0aCA9
IFtzdHJpbmcgbGVuZ3RoXTsKKyAgICAKKyAgICBzdGF0aWMgTlNDaGFyYWN0ZXJTZXQgKmhvc3RU
ZXJtaW5hdG9ycyA9IHJldGFpbihbTlNDaGFyYWN0ZXJTZXQgY2hhcmFjdGVyU2V0V2l0aENoYXJh
Y3RlcnNJblN0cmluZzpAIjovPyMiXSk7CisgICAgCisgICAgLy8gU3RhcnQgYWZ0ZXIgdGhlIHNl
cGFyYXRvci4KKyAgICB1bnNpZ25lZCBhdXRob3JpdHlTdGFydCA9IE5TTWF4UmFuZ2Uoc2VwYXJh
dG9yUmFuZ2UpOworICAgIAorICAgIC8vIEZpbmQgdGVybWluYXRpbmcgY2hhcmFjdGVyLgorICAg
IE5TUmFuZ2UgaG9zdE5hbWVUZXJtaW5hdG9yID0gW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJv
bVNldDpob3N0VGVybWluYXRvcnMgb3B0aW9uczowIHJhbmdlOk5TTWFrZVJhbmdlKGF1dGhvcml0
eVN0YXJ0LCBzdHJpbmdMZW5ndGggLSBhdXRob3JpdHlTdGFydCldOworICAgIHVuc2lnbmVkIGhv
c3ROYW1lRW5kID0gaG9zdE5hbWVUZXJtaW5hdG9yLmxvY2F0aW9uID09IE5TTm90Rm91bmQgPyBz
dHJpbmdMZW5ndGggOiBob3N0TmFtZVRlcm1pbmF0b3IubG9jYXRpb247CisgICAgCisgICAgLy8g
RmluZCAiQCIgZm9yIHRoZSBzdGFydCBvZiB0aGUgaG9zdCBuYW1lLgorICAgIE5TUmFuZ2UgdXNl
ckluZm9UZXJtaW5hdG9yID0gW3N0cmluZyByYW5nZU9mU3RyaW5nOkAiQCIgb3B0aW9uczowIHJh
bmdlOk5TTWFrZVJhbmdlKGF1dGhvcml0eVN0YXJ0LCBob3N0TmFtZUVuZCAtIGF1dGhvcml0eVN0
YXJ0KV07CisgICAgdW5zaWduZWQgaG9zdE5hbWVTdGFydCA9IHVzZXJJbmZvVGVybWluYXRvci5s
b2NhdGlvbiA9PSBOU05vdEZvdW5kID8gYXV0aG9yaXR5U3RhcnQgOiBOU01heFJhbmdlKHVzZXJJ
bmZvVGVybWluYXRvcik7CisgICAgCisgICAgZihzdHJpbmcsIE5TTWFrZVJhbmdlKGhvc3ROYW1l
U3RhcnQsIGhvc3ROYW1lRW5kIC0gaG9zdE5hbWVTdGFydCksIGNvbnRleHQpOworfQorCitzdGF0
aWMgTlNTdHJpbmcgKm1hcEhvc3ROYW1lcyhOU1N0cmluZyAqc3RyaW5nLCBCT09MIGVuY29kZSkK
K3sKKyAgICAvLyBHZW5lcmFsbHksIHdlIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdo
ZXJlIHRoZXJlIGlzIG9uZSBob3N0IG5hbWUgdGhhdCBkb2VzIG5vdCBuZWVkIG1hcHBpbmcuCisg
ICAgCisgICAgaWYgKGVuY29kZSAmJiBbc3RyaW5nIGNhbkJlQ29udmVydGVkVG9FbmNvZGluZzpO
U0FTQ0lJU3RyaW5nRW5jb2RpbmddKQorICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIAorICAg
IC8vIE1ha2UgYSBsaXN0IG9mIHJhbmdlcyB0aGF0IGFjdHVhbGx5IG5lZWQgbWFwcGluZy4KKyAg
ICBOU011dGFibGVBcnJheSAqaG9zdE5hbWVSYW5nZXMgPSBuaWw7CisgICAgU3RyaW5nUmFuZ2VB
cHBsaWVyRnVuY3Rpb24gZiA9IGVuY29kZSA/IGNvbGxlY3RSYW5nZXNUaGF0TmVlZEVuY29kaW5n
IDogY29sbGVjdFJhbmdlc1RoYXROZWVkRGVjb2Rpbmc7CisgICAgYXBwbHlIb3N0TmFtZUZ1bmN0
aW9uVG9VUkxTdHJpbmcoc3RyaW5nLCBmLCAmaG9zdE5hbWVSYW5nZXMpOworICAgIGlmICghaG9z
dE5hbWVSYW5nZXMpCisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgCisgICAgLy8gRG8gdGhl
IG1hcHBpbmcuCisgICAgTlNNdXRhYmxlU3RyaW5nICptdXRhYmxlQ29weSA9IFtzdHJpbmcgbXV0
YWJsZUNvcHldOworICAgIHVuc2lnbmVkIGkgPSBbaG9zdE5hbWVSYW5nZXMgY291bnRdOworICAg
IHdoaWxlIChpLS0pIHsKKyAgICAgICAgTlNSYW5nZSBob3N0TmFtZVJhbmdlID0gW1tob3N0TmFt
ZVJhbmdlcyBvYmplY3RBdEluZGV4OmldIHJhbmdlVmFsdWVdOworICAgICAgICBOU1N0cmluZyAq
bWFwcGVkSG9zdE5hbWUgPSBlbmNvZGUgPyBlbmNvZGVIb3N0TmFtZVdpdGhSYW5nZShzdHJpbmcs
IGhvc3ROYW1lUmFuZ2UpIDogZGVjb2RlSG9zdE5hbWVXaXRoUmFuZ2Uoc3RyaW5nLCBob3N0TmFt
ZVJhbmdlKTsKKyAgICAgICAgW211dGFibGVDb3B5IHJlcGxhY2VDaGFyYWN0ZXJzSW5SYW5nZTpo
b3N0TmFtZVJhbmdlIHdpdGhTdHJpbmc6bWFwcGVkSG9zdE5hbWVdOworICAgIH0KKyAgICBbaG9z
dE5hbWVSYW5nZXMgcmVsZWFzZV07CisgICAgcmV0dXJuIFttdXRhYmxlQ29weSBhdXRvcmVsZWFz
ZV07Cit9CisKK3N0YXRpYyBCT09MIGlzSGV4RGlnaXQoY2hhciBjKQoreworICAgIHJldHVybiAo
YyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0g
J2EnICYmIGMgPD0gJ2YnKTsKK30KKworc3RhdGljIGNoYXIgaGV4RGlnaXQoaW50IGkpCit7Cisg
ICAgaWYgKGkgPCAwIHx8IGkgPiAxNikKKyAgICAgICAgcmV0dXJuICcwJzsKKworICAgIHJldHVy
biAoaSA+PSAxMCkgPyBpIC0gMTAgKyAnQScgOiBpICs9ICcwJzsgCit9CisKK3N0YXRpYyBpbnQg
aGV4RGlnaXRWYWx1ZShjaGFyIGMpCit7CisgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQor
ICAgICAgICByZXR1cm4gYyAtICcwJzsKKworICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykK
KyAgICAgICAgcmV0dXJuIGMgLSAnQScgKyAxMDsKKworICAgIGlmIChjID49ICdhJyAmJiBjIDw9
ICdmJykKKyAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKKworICAgIExPR19FUlJPUigiaWxs
ZWdhbCBoZXggZGlnaXQiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIE5TU3RyaW5nICpz
dHJpbmdCeVRyaW1taW5nV2hpdGVzcGFjZShOU1N0cmluZyAqc3RyaW5nKQoreworICAgIE5TTXV0
YWJsZVN0cmluZyAqdHJpbW1lZCA9IFtbc3RyaW5nIG11dGFibGVDb3B5XSBhdXRvcmVsZWFzZV07
CisgICAgQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSgoQ0ZNdXRhYmxlU3RyaW5nUmVmKXRyaW1tZWQp
OworICAgIHJldHVybiB0cmltbWVkOworfQorCitOU1VSTCAqVVJMQnlUcnVuY2F0aW5nT25lQ2hh
cmFjdGVyQmVmb3JlQ29tcG9uZW50KE5TVVJMICpVUkwsIENGVVJMQ29tcG9uZW50VHlwZSBjb21w
b25lbnQpCit7CisgICAgaWYgKCFVUkwpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAg
Q0ZSYW5nZSBmcmFnUmcgPSBDRlVSTEdldEJ5dGVSYW5nZUZvckNvbXBvbmVudCgoQ0ZVUkxSZWYp
VVJMLCBjb21wb25lbnQsIE5VTEwpOworICAgIGlmIChmcmFnUmcubG9jYXRpb24gPT0ga0NGTm90
Rm91bmQpCisgICAgICAgIHJldHVybiBVUkw7CisgICAgCisgICAgVUludDggKnVybEJ5dGVzLCBi
dWZmZXJbMjA0OF07CisgICAgQ0ZJbmRleCBudW1CeXRlcyA9IENGVVJMR2V0Qnl0ZXMoKENGVVJM
UmVmKVVSTCwgYnVmZmVyLCAyMDQ4KTsKKyAgICBpZiAobnVtQnl0ZXMgPT0gLTEpIHsKKyAgICAg
ICAgbnVtQnl0ZXMgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIE5VTEwsIDApOworICAg
ICAgICB1cmxCeXRlcyA9IHN0YXRpY19jYXN0PFVJbnQ4Kj4obWFsbG9jKG51bUJ5dGVzKSk7Cisg
ICAgICAgIENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVmKVVSTCwgdXJsQnl0ZXMsIG51bUJ5dGVzKTsK
KyAgICB9IGVsc2UKKyAgICAgICAgdXJsQnl0ZXMgPSBidWZmZXI7CisgICAgICAgIAorICAgIE5T
VVJMICpyZXN1bHQgPSAoTlNVUkwgKilDRk1ha2VDb2xsZWN0YWJsZShDRlVSTENyZWF0ZVdpdGhC
eXRlcyhOVUxMLCB1cmxCeXRlcywgZnJhZ1JnLmxvY2F0aW9uIC0gMSwga0NGU3RyaW5nRW5jb2Rp
bmdVVEY4LCBOVUxMKSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IChOU1VS
TCAqKUNGTWFrZUNvbGxlY3RhYmxlKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIHVybEJ5dGVz
LCBmcmFnUmcubG9jYXRpb24gLSAxLCBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwgTlVMTCkp
OworICAgICAgICAKKyAgICBpZiAodXJsQnl0ZXMgIT0gYnVmZmVyKQorICAgICAgICBmcmVlKHVy
bEJ5dGVzKTsKKyAgICByZXR1cm4gcmVzdWx0ID8gW3Jlc3VsdCBhdXRvcmVsZWFzZV0gOiBVUkw7
Cit9CisKK3N0YXRpYyBOU1VSTCAqVVJMQnlSZW1vdmluZ1Jlc291cmNlU3BlY2lmaWVyKE5TVVJM
ICpVUkwpCit7CisgICAgcmV0dXJuIFVSTEJ5VHJ1bmNhdGluZ09uZUNoYXJhY3RlckJlZm9yZUNv
bXBvbmVudChVUkwsIGtDRlVSTENvbXBvbmVudFJlc291cmNlU3BlY2lmaWVyKTsKK30KKworTlNV
UkwgKlVSTFdpdGhEYXRhKE5TRGF0YSAqZGF0YSwgTlNVUkwgKmJhc2VVUkwpCit7CisgICAgaWYg
KCFkYXRhKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIE5TVVJMICpyZXN1bHQgPSBu
aWw7CisgICAgc2l6ZV90IGxlbmd0aCA9IFtkYXRhIGxlbmd0aF07CisgICAgaWYgKGxlbmd0aCA+
IDApIHsKKyAgICAgICAgLy8gd29yayBhcm91bmQgPHJkYXI6Ly80NDcwNzcxPjogQ0ZVUkxDcmVh
dGVBYnNvbHV0ZVVSTFdpdGhCeXRlcyguLiwgVFJVRSkgZG9lc24ndCByZW1vdmUgbm9uLXBhdGgg
Y29tcG9uZW50cy4KKyAgICAgICAgYmFzZVVSTCA9IFVSTEJ5UmVtb3ZpbmdSZXNvdXJjZVNwZWNp
ZmllcihiYXNlVVJMKTsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IFVJbnQ4ICpieXRlcyA9IHN0
YXRpY19jYXN0PGNvbnN0IFVJbnQ4Kj4oW2RhdGEgYnl0ZXNdKTsKKyAgICAgICAgCisgICAgICAg
IC8vIENGVVJMQ3JlYXRlQWJzb2x1dGVVUkxXaXRoQnl0ZXMgd291bGQgY29tcGxhaW4gdG8gY29u
c29sZSBpZiB3ZSBwYXNzZWQgYSBwYXRoIHRvIGl0LgorICAgICAgICBpZiAoYnl0ZXNbMF0gPT0g
Jy8nICYmICFiYXNlVVJMKQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgCisgICAg
ICAgIC8vIE5PVEU6IFdlIHVzZSBVVEYtOCBoZXJlIHNpbmNlIHRoaXMgZW5jb2RpbmcgaXMgdXNl
ZCB3aGVuIGNvbXB1dGluZyBzdHJpbmdzIHdoZW4gcmV0dXJuaW5nIFVSTCBjb21wb25lbnRzCisg
ICAgICAgIC8vIChlLmcgY2FsbHMgdG8gTlNVUkwgLXBhdGgpLiBIb3dldmVyLCB0aGlzIGZ1bmN0
aW9uIGlzIG5vdCB0b2xlcmFudCBvZiBpbGxlZ2FsIFVURi04IHNlcXVlbmNlcywgd2hpY2gKKyAg
ICAgICAgLy8gY291bGQgZWl0aGVyIGJlIGEgbWFsZm9ybWVkIHN0cmluZyBvciBieXRlcyBpbiBh
IGRpZmZlcmVudCBlbmNvZGluZywgbGlrZSBzaGlmdC1qaXMsIHNvIHdlIGZhbGwgYmFjaworICAg
ICAgICAvLyBvbnRvIHVzaW5nIElTTyBMYXRpbiAxIGluIHRob3NlIGNhc2VzLgorICAgICAgICBy
ZXN1bHQgPSBXZWJDb3JlQ0ZBdXRvcmVsZWFzZShDRlVSTENyZWF0ZUFic29sdXRlVVJMV2l0aEJ5
dGVzKE5VTEwsIGJ5dGVzLCBsZW5ndGgsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCwgKENGVVJMUmVm
KWJhc2VVUkwsIFlFUykpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHJlc3Vs
dCA9IFdlYkNvcmVDRkF1dG9yZWxlYXNlKENGVVJMQ3JlYXRlQWJzb2x1dGVVUkxXaXRoQnl0ZXMo
TlVMTCwgYnl0ZXMsIGxlbmd0aCwga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEsIChDRlVSTFJl
ZiliYXNlVVJMLCBZRVMpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFtOU1VS
TCBVUkxXaXRoU3RyaW5nOkAiIl07CisgICAgICAgICAgICAgICAgCisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKworTlNVUkwgKlVSTFdpdGhVc2VyVHlwZWRTdHJpbmcoTlNTdHJpbmcgKnN0cmluZywg
TlNVUkwgKlVSTCkKK3sKKyAgICBpZiAoIXN0cmluZykKKyAgICAgICAgcmV0dXJuIG5pbDsKKwor
ICAgIHN0cmluZyA9IG1hcEhvc3ROYW1lcyhzdHJpbmdCeVRyaW1taW5nV2hpdGVzcGFjZShzdHJp
bmcpLCBZRVMpOworICAgIAorICAgIE5TRGF0YSAqdXNlclR5cGVkRGF0YSA9IFtzdHJpbmcgZGF0
YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOworICAgIEFTU0VSVCh1c2VyVHlw
ZWREYXRhKTsKKyAgICAKKyAgICBjb25zdCBVSW50OCogaW5CeXRlcyA9IHN0YXRpY19jYXN0PGNv
bnN0IFVJbnQ4ICo+KFt1c2VyVHlwZWREYXRhIGJ5dGVzXSk7CisgICAgaW50IGluTGVuZ3RoID0g
W3VzZXJUeXBlZERhdGEgbGVuZ3RoXTsKKyAgICBpZiAoIWluTGVuZ3RoKQorICAgICAgICByZXR1
cm4gW05TVVJMIFVSTFdpdGhTdHJpbmc6QCIiXTsKKyAgICAKKyAgICBjaGFyKiBvdXRCeXRlcyA9
IHN0YXRpY19jYXN0PGNoYXIgKj4obWFsbG9jKGluTGVuZ3RoICogMykpOyAvLyBsYXJnZSBlbm91
Z2ggdG8gJS1lc2NhcGUgZXZlcnkgY2hhcmFjdGVyCisgICAgY2hhciogcCA9IG91dEJ5dGVzOwor
ICAgIGludCBvdXRMZW5ndGggPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5MZW5ndGg7
IGkrKykgeworICAgICAgICBVSW50OCBjID0gaW5CeXRlc1tpXTsKKyAgICAgICAgaWYgKGMgPD0g
MHgyMCB8fCBjID49IDB4N2YpIHsKKyAgICAgICAgICAgICpwKysgPSAnJSc7CisgICAgICAgICAg
ICAqcCsrID0gaGV4RGlnaXQoYyA+PiA0KTsKKyAgICAgICAgICAgICpwKysgPSBoZXhEaWdpdChj
ICYgMHhmKTsKKyAgICAgICAgICAgIG91dExlbmd0aCArPSAzOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgICAgICBvdXRMZW5ndGgrKzsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICBOU0RhdGEgKmRhdGEgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXNO
b0NvcHk6b3V0Qnl0ZXMgbGVuZ3RoOm91dExlbmd0aF07IC8vIGFkb3B0cyBvdXRCeXRlcworICAg
IHJldHVybiBVUkxXaXRoRGF0YShkYXRhLCBVUkwpOworfQorCitzdGF0aWMgQk9PTCBoYXNRdWVz
dGlvbk1hcmtPbmx5UXVlcnlTdHJpbmcoTlNVUkwgKlVSTCkKK3sKKyAgICBDRlJhbmdlIHJhbmdl
V2l0aFNlcGFyYXRvcnM7CisgICAgQ0ZVUkxHZXRCeXRlUmFuZ2VGb3JDb21wb25lbnQoKENGVVJM
UmVmKVVSTCwga0NGVVJMQ29tcG9uZW50UXVlcnksICZyYW5nZVdpdGhTZXBhcmF0b3JzKTsKKyAg
ICBpZiAocmFuZ2VXaXRoU2VwYXJhdG9ycy5sb2NhdGlvbiAhPSBrQ0ZOb3RGb3VuZCAmJiByYW5n
ZVdpdGhTZXBhcmF0b3JzLmxlbmd0aCA9PSAxKQorICAgICAgICByZXR1cm4gWUVTOworCisgICAg
cmV0dXJuIE5POworfQorCisjZGVmaW5lIGNvbXBsZXRlVVJMIChDRlVSTENvbXBvbmVudFR5cGUp
LTEKKworTlNEYXRhICpkYXRhRm9yVVJMQ29tcG9uZW50VHlwZShOU1VSTCAqVVJMLCBDRlVSTENv
bXBvbmVudFR5cGUgY29tcG9uZW50VHlwZSkKK3sKKyAgICBzdGF0aWMgaW50IFVSTENvbXBvbmVu
dFR5cGVCdWZmZXJMZW5ndGggPSAyMDQ4OworICAgIAorICAgIFVJbnQ4IHN0YXRpY0FsbEJ5dGVz
QnVmZmVyW1VSTENvbXBvbmVudFR5cGVCdWZmZXJMZW5ndGhdOworICAgIFVJbnQ4ICphbGxCeXRl
c0J1ZmZlciA9IHN0YXRpY0FsbEJ5dGVzQnVmZmVyOworICAgIAorICAgIENGSW5kZXggYnl0ZXNG
aWxsZWQgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIGFsbEJ5dGVzQnVmZmVyLCBVUkxD
b21wb25lbnRUeXBlQnVmZmVyTGVuZ3RoKTsKKyAgICBpZiAoYnl0ZXNGaWxsZWQgPT0gLTEpIHsK
KyAgICAgICAgQ0ZJbmRleCBieXRlc1RvQWxsb2NhdGUgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJl
ZilVUkwsIE5VTEwsIDApOworICAgICAgICBhbGxCeXRlc0J1ZmZlciA9IHN0YXRpY19jYXN0PFVJ
bnQ4ICo+KG1hbGxvYyhieXRlc1RvQWxsb2NhdGUpKTsKKyAgICAgICAgYnl0ZXNGaWxsZWQgPSBD
RlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIGFsbEJ5dGVzQnVmZmVyLCBieXRlc1RvQWxsb2Nh
dGUpOworICAgIH0KKyAgICAKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIGlmIChjb21wb25lbnRU
eXBlICE9IGNvbXBsZXRlVVJMKSB7CisgICAgICAgIHJhbmdlID0gQ0ZVUkxHZXRCeXRlUmFuZ2VG
b3JDb21wb25lbnQoKENGVVJMUmVmKVVSTCwgY29tcG9uZW50VHlwZSwgTlVMTCk7CisgICAgICAg
IGlmIChyYW5nZS5sb2NhdGlvbiA9PSBrQ0ZOb3RGb3VuZCkKKyAgICAgICAgICAgIHJldHVybiBu
aWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmFuZ2UubG9jYXRpb24gPSAwOworICAgICAgICBy
YW5nZS5sZW5ndGggPSBieXRlc0ZpbGxlZDsKKyAgICB9CisgICAgCisgICAgTlNEYXRhICpjb21w
b25lbnREYXRhID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOmFsbEJ5dGVzQnVmZmVyICsgcmFuZ2Uu
bG9jYXRpb24gbGVuZ3RoOnJhbmdlLmxlbmd0aF07IAorICAgIAorICAgIGNvbnN0IHVuc2lnbmVk
IGNoYXIgKmJ5dGVzID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihbY29tcG9u
ZW50RGF0YSBieXRlc10pOworICAgIE5TTXV0YWJsZURhdGEgKnJlc3VsdERhdGEgPSBbTlNNdXRh
YmxlRGF0YSBkYXRhXTsKKyAgICAvLyBOT1RFOiBhZGQgbGVhZGluZyAnPycgdG8gcXVlcnkgc3Ry
aW5ncyBub24temVybyBsZW5ndGggcXVlcnkgc3RyaW5ncy4KKyAgICAvLyBOT1RFOiByZXRhaW4g
cXVlc3Rpb24tbWFyayBvbmx5IHF1ZXJ5IHN0cmluZ3MuCisgICAgaWYgKGNvbXBvbmVudFR5cGUg
PT0ga0NGVVJMQ29tcG9uZW50UXVlcnkpIHsKKyAgICAgICAgaWYgKHJhbmdlLmxlbmd0aCA+IDAg
fHwgaGFzUXVlc3Rpb25NYXJrT25seVF1ZXJ5U3RyaW5nKFVSTCkpCisgICAgICAgICAgICBbcmVz
dWx0RGF0YSBhcHBlbmRCeXRlczoiPyIgbGVuZ3RoOjFdOyAgICAKKyAgICB9CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBjaGFy
IGMgPSBieXRlc1tpXTsKKyAgICAgICAgaWYgKGMgPD0gMHgyMCB8fCBjID49IDB4N2YpIHsKKyAg
ICAgICAgICAgIGNoYXIgZXNjYXBlZFszXTsKKyAgICAgICAgICAgIGVzY2FwZWRbMF0gPSAnJSc7
CisgICAgICAgICAgICBlc2NhcGVkWzFdID0gaGV4RGlnaXQoYyA+PiA0KTsKKyAgICAgICAgICAg
IGVzY2FwZWRbMl0gPSBoZXhEaWdpdChjICYgMHhmKTsKKyAgICAgICAgICAgIFtyZXN1bHREYXRh
IGFwcGVuZEJ5dGVzOmVzY2FwZWQgbGVuZ3RoOjNdOyAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIGNoYXIgYlsxXTsKKyAgICAgICAgICAgIGJbMF0gPSBjOworICAgICAgICAgICAg
W3Jlc3VsdERhdGEgYXBwZW5kQnl0ZXM6YiBsZW5ndGg6MV07ICAgIAorICAgICAgICB9ICAgICAg
ICAgICAgICAgCisgICAgfQorICAgIAorICAgIGlmIChzdGF0aWNBbGxCeXRlc0J1ZmZlciAhPSBh
bGxCeXRlc0J1ZmZlcikKKyAgICAgICAgZnJlZShhbGxCeXRlc0J1ZmZlcik7CisgICAgCisgICAg
cmV0dXJuIHJlc3VsdERhdGE7Cit9CisKK3N0YXRpYyBOU1VSTCAqVVJMQnlSZW1vdmluZ0NvbXBv
bmVudEFuZFN1YnNlcXVlbnRDaGFyYWN0ZXIoTlNVUkwgKlVSTCwgQ0ZVUkxDb21wb25lbnRUeXBl
IGNvbXBvbmVudCkKK3sKKyAgICBDRlJhbmdlIHJhbmdlID0gQ0ZVUkxHZXRCeXRlUmFuZ2VGb3JD
b21wb25lbnQoKENGVVJMUmVmKVVSTCwgY29tcG9uZW50LCAwKTsKKyAgICBpZiAocmFuZ2UubG9j
YXRpb24gPT0ga0NGTm90Rm91bmQpCisgICAgICAgIHJldHVybiBVUkw7CisgICAgCisgICAgLy8g
UmVtb3ZlIG9uZSBzdWJzZXF1ZW50IGNoYXJhY3Rlci4KKyAgICByYW5nZS5sZW5ndGgrKzsKKyAg
ICAKKyAgICBVSW50OCogdXJsQnl0ZXM7CisgICAgVUludDggYnVmZmVyWzIwNDhdOworICAgIENG
SW5kZXggbnVtQnl0ZXMgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIGJ1ZmZlciwgMjA0
OCk7CisgICAgaWYgKG51bUJ5dGVzID09IC0xKSB7CisgICAgICAgIG51bUJ5dGVzID0gQ0ZVUkxH
ZXRCeXRlcygoQ0ZVUkxSZWYpVVJMLCBOVUxMLCAwKTsKKyAgICAgICAgdXJsQnl0ZXMgPSBzdGF0
aWNfY2FzdDxVSW50OCo+KG1hbGxvYyhudW1CeXRlcykpOworICAgICAgICBDRlVSTEdldEJ5dGVz
KChDRlVSTFJlZilVUkwsIHVybEJ5dGVzLCBudW1CeXRlcyk7CisgICAgfSBlbHNlCisgICAgICAg
IHVybEJ5dGVzID0gYnVmZmVyOworICAgICAgICAKKyAgICBpZiAobnVtQnl0ZXMgPCByYW5nZS5s
b2NhdGlvbikKKyAgICAgICAgcmV0dXJuIFVSTDsKKyAgICBpZiAobnVtQnl0ZXMgPCByYW5nZS5s
b2NhdGlvbiArIHJhbmdlLmxlbmd0aCkKKyAgICAgICAgcmFuZ2UubGVuZ3RoID0gbnVtQnl0ZXMg
LSByYW5nZS5sb2NhdGlvbjsKKyAgICAgICAgCisgICAgbWVtbW92ZSh1cmxCeXRlcyArIHJhbmdl
LmxvY2F0aW9uLCB1cmxCeXRlcyArIHJhbmdlLmxvY2F0aW9uICsgcmFuZ2UubGVuZ3RoLCBudW1C
eXRlcyAtIHJhbmdlLmxvY2F0aW9uICsgcmFuZ2UubGVuZ3RoKTsKKyAgICAKKyAgICBOU1VSTCAq
cmVzdWx0ID0gKE5TVVJMICopQ0ZNYWtlQ29sbGVjdGFibGUoQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMo
TlVMTCwgdXJsQnl0ZXMsIG51bUJ5dGVzIC0gcmFuZ2UubGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGlu
Z1VURjgsIE5VTEwpKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gKE5TVVJM
ICopQ0ZNYWtlQ29sbGVjdGFibGUoQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoTlVMTCwgdXJsQnl0ZXMs
IG51bUJ5dGVzIC0gcmFuZ2UubGVuZ3RoLCBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwgTlVM
TCkpOworICAgICAgICAgICAgCisgICAgaWYgKHVybEJ5dGVzICE9IGJ1ZmZlcikKKyAgICAgICAg
ZnJlZSh1cmxCeXRlcyk7CisgICAgICAgICAgICAgICAgCisgICAgcmV0dXJuIHJlc3VsdCA/IFty
ZXN1bHQgYXV0b3JlbGVhc2VdIDogVVJMOworfQorCitOU1VSTCAqVVJMQnlSZW1vdmluZ1VzZXJJ
bmZvKE5TVVJMICpVUkwpCit7CisgICAgcmV0dXJuIFVSTEJ5UmVtb3ZpbmdDb21wb25lbnRBbmRT
dWJzZXF1ZW50Q2hhcmFjdGVyKFVSTCwga0NGVVJMQ29tcG9uZW50VXNlckluZm8pOworfQorCitO
U0RhdGEgKm9yaWdpbmFsRGF0YShOU1VSTCAqVVJMKQoreworICAgIFVJbnQ4ICpidWZmZXIgPSAo
VUludDggKiltYWxsb2MoVVJMX0JZVEVTX0JVRkZFUl9MRU5HVEgpOworICAgIENGSW5kZXggYnl0
ZXNGaWxsZWQgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilVUkwsIGJ1ZmZlciwgVVJMX0JZVEVT
X0JVRkZFUl9MRU5HVEgpOworICAgIGlmIChieXRlc0ZpbGxlZCA9PSAtMSkgeworICAgICAgICBD
RkluZGV4IGJ5dGVzVG9BbGxvY2F0ZSA9IENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVmKVVSTCwgTlVM
TCwgMCk7CisgICAgICAgIGJ1ZmZlciA9IChVSW50OCAqKXJlYWxsb2MoYnVmZmVyLCBieXRlc1Rv
QWxsb2NhdGUpOworICAgICAgICBieXRlc0ZpbGxlZCA9IENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVm
KVVSTCwgYnVmZmVyLCBieXRlc1RvQWxsb2NhdGUpOworICAgICAgICBBU1NFUlQoYnl0ZXNGaWxs
ZWQgPT0gYnl0ZXNUb0FsbG9jYXRlKTsKKyAgICB9CisgICAgCisgICAgLy8gYnVmZmVyIGlzIGFk
b3B0ZWQgYnkgdGhlIE5TRGF0YQorICAgIE5TRGF0YSAqZGF0YSA9IFtOU0RhdGEgZGF0YVdpdGhC
eXRlc05vQ29weTpidWZmZXIgbGVuZ3RoOmJ5dGVzRmlsbGVkIGZyZWVXaGVuRG9uZTpZRVNdOwor
ICAgIAorICAgIE5TVVJMICpiYXNlVVJMID0gKE5TVVJMICopQ0ZVUkxHZXRCYXNlVVJMKChDRlVS
TFJlZilVUkwpOworICAgIGlmIChiYXNlVVJMKQorICAgICAgICByZXR1cm4gb3JpZ2luYWxEYXRh
KFVSTFdpdGhEYXRhKGRhdGEsIGJhc2VVUkwpKTsKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3Rh
dGljIENGU3RyaW5nUmVmIGNyZWF0ZVN0cmluZ1dpdGhFc2NhcGVkVW5zYWZlQ2hhcmFjdGVycyhD
RlN0cmluZ1JlZiBzdHJpbmcpCit7CisgICAgQ0ZJbmRleCBsZW5ndGggPSBDRlN0cmluZ0dldExl
bmd0aChzdHJpbmcpOworICAgIFZlY3RvcjxVQ2hhciwgMjA0OD4gc291cmNlQnVmZmVyKGxlbmd0
aCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHN0cmluZywgQ0ZSYW5nZU1ha2UoMCwgbGVu
Z3RoKSwgc291cmNlQnVmZmVyLmRhdGEoKSk7CisgICAgCisgICAgVmVjdG9yPFVDaGFyLCAyMDQ4
PiBvdXRCdWZmZXI7CisgICAgCisgICAgQ0ZJbmRleCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxl
bmd0aCkgeworICAgICAgICBVQ2hhcjMyIGM7CisgICAgICAgIFUxNl9ORVhUKHNvdXJjZUJ1ZmZl
ciwgaSwgbGVuZ3RoLCBjKQorICAgICAgICAKKyAgICAgICAgaWYgKGlzTG9va2FsaWtlQ2hhcmFj
dGVyKGMpKSB7CisgICAgICAgICAgICB1aW50OF90IHV0ZjhCdWZmZXJbNF07CisgICAgICAgICAg
ICBDRkluZGV4IG9mZnNldCA9IDA7CisgICAgICAgICAgICBVQm9vbCBmYWlsdXJlID0gZmFsc2U7
CisgICAgICAgICAgICBVOF9BUFBFTkQodXRmOEJ1ZmZlciwgb2Zmc2V0LCA0LCBjLCBmYWlsdXJl
KQorICAgICAgICAgICAgQVNTRVJUKCFmYWlsdXJlKTsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgZm9yIChDRkluZGV4IGogPSAwOyBqIDwgb2Zmc2V0OyArK2opIHsKKyAgICAgICAgICAgICAg
ICBvdXRCdWZmZXIuYXBwZW5kKCclJyk7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVu
ZChoZXhEaWdpdCh1dGY4QnVmZmVyW2pdID4+IDQpKTsKKyAgICAgICAgICAgICAgICBvdXRCdWZm
ZXIuYXBwZW5kKGhleERpZ2l0KHV0ZjhCdWZmZXJbal0gJiAweGYpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVDaGFyIHV0ZjE2QnVmZmVyWzJdOworICAg
ICAgICAgICAgQ0ZJbmRleCBvZmZzZXQgPSAwOworICAgICAgICAgICAgVUJvb2wgZmFpbHVyZSA9
IGZhbHNlOworICAgICAgICAgICAgVTE2X0FQUEVORCh1dGYxNkJ1ZmZlciwgb2Zmc2V0LCAyLCBj
LCBmYWlsdXJlKQorICAgICAgICAgICAgQVNTRVJUKCFmYWlsdXJlKTsKKyAgICAgICAgICAgIGZv
ciAoQ0ZJbmRleCBqID0gMDsgaiA8IG9mZnNldDsgKytqKQorICAgICAgICAgICAgICAgIG91dEJ1
ZmZlci5hcHBlbmQodXRmMTZCdWZmZXJbal0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IHJldHVybiBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE5VTEwsIG91dEJ1ZmZlci5kYXRh
KCksIG91dEJ1ZmZlci5zaXplKCkpOworfQorCitOU1N0cmluZyAqdXNlclZpc2libGVTdHJpbmco
TlNVUkwgKlVSTCkKK3sKKyAgICBOU0RhdGEgKmRhdGEgPSBvcmlnaW5hbERhdGEoVVJMKTsKKyAg
ICBjb25zdCB1bnNpZ25lZCBjaGFyICpiZWZvcmUgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25l
ZCBjaGFyKj4oW2RhdGEgYnl0ZXNdKTsKKyAgICBpbnQgbGVuZ3RoID0gW2RhdGEgbGVuZ3RoXTsK
KyAgICAKKyAgICBib29sIG5lZWRzSG9zdE5hbWVEZWNvZGluZyA9IGZhbHNlOworICAgIAorICAg
IGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBiZWZvcmU7CisgICAgaW50IGJ1ZmZlckxlbmd0aCA9
IChsZW5ndGggKiAzKSArIDE7CisgICAgY2hhciAqYWZ0ZXIgPSBzdGF0aWNfY2FzdDxjaGFyICo+
KG1hbGxvYyhidWZmZXJMZW5ndGgpKTsgLy8gbGFyZ2UgZW5vdWdoIHRvICUtZXNjYXBlIGV2ZXJ5
IGNoYXJhY3RlcgorICAgIGNoYXIgKnEgPSBhZnRlcjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHBbaV07CisgICAgICAg
IC8vIHVuZXNjYXBlIGVzY2FwZSBzZXF1ZW5jZXMgdGhhdCBpbmRpY2F0ZSBieXRlcyBncmVhdGVy
IHRoYW4gMHg3ZgorICAgICAgICBpZiAoYyA9PSAnJScgJiYgKGkgKyAxIDwgbGVuZ3RoICYmIGlz
SGV4RGlnaXQocFtpICsgMV0pKSAmJiBpICsgMiA8IGxlbmd0aCAmJiBpc0hleERpZ2l0KHBbaSAr
IDJdKSkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1ID0gKGhleERpZ2l0VmFsdWUocFtp
ICsgMV0pIDw8IDQpIHwgaGV4RGlnaXRWYWx1ZShwW2kgKyAyXSk7CisgICAgICAgICAgICBpZiAo
dSA+IDB4N2YpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmVzY2FwZQorICAgICAgICAgICAgICAg
ICpxKysgPSB1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBu
b3QgdW5lc2NhcGUKKyAgICAgICAgICAgICAgICAqcSsrID0gcFtpXTsKKyAgICAgICAgICAgICAg
ICAqcSsrID0gcFtpICsgMV07CisgICAgICAgICAgICAgICAgKnErKyA9IHBbaSArIDJdOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaSArPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgKnErKyA9IGM7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciAi
eG4tLSIgaW4gYW4gZWZmaWNpZW50LCBub24tY2FzZS1zZW5zaXRpdmUsIHdheS4KKyAgICAgICAg
ICAgIGlmIChjID09ICctJyAmJiBpID49IDMgJiYgIW5lZWRzSG9zdE5hbWVEZWNvZGluZyAmJiAo
cVstNF0gfCAweDIwKSA9PSAneCcgJiYgKHFbLTNdIHwgMHgyMCkgPT0gJ24nICYmIHFbLTJdID09
ICctJykKKyAgICAgICAgICAgICAgICBuZWVkc0hvc3ROYW1lRGVjb2RpbmcgPSB0cnVlOworICAg
ICAgICB9CisgICAgfQorICAgICpxID0gJ1wwJzsKKyAgICAKKyAgICAvLyBDaGVjayBzdHJpbmcg
dG8gc2VlIGlmIGl0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gZGlzcGxheSB1c2luZyBVVEYtOCAgCisg
ICAgTlNTdHJpbmcgKnJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzphZnRl
cl07CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGNvbnZlcnQgdG8g
VVRGLTguCisgICAgICAgIC8vIENvbnZlcnQgY2hhcmFjdGVycyBncmVhdGVyIHRoYW4gMHg3ZiB0
byBlc2NhcGUgc2VxdWVuY2VzLgorICAgICAgICAvLyBTaGlmdCBjdXJyZW50IHN0cmluZyB0byB0
aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICAgLy8gdGhlbiB3ZSB3aWxsIGNvcHkgYmFjayBi
eXRlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAKKyAgICAgICAgLy8gYXMgd2UgY29udmVy
dC4KKyAgICAgICAgaW50IGFmdGVybGVuZ3RoID0gcSAtIGFmdGVyOworICAgICAgICBjaGFyICpw
ID0gYWZ0ZXIgKyBidWZmZXJMZW5ndGggLSBhZnRlcmxlbmd0aCAtIDE7CisgICAgICAgIG1lbW1v
dmUocCwgYWZ0ZXIsIGFmdGVybGVuZ3RoICsgMSk7IC8vIGNvcGllcyB0cmFpbGluZyAnXDAnCisg
ICAgICAgIGNoYXIgKnEgPSBhZnRlcjsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAg
ICB1bnNpZ25lZCBjaGFyIGMgPSAqcDsKKyAgICAgICAgICAgIGlmIChjID4gMHg3ZikgeworICAg
ICAgICAgICAgICAgICpxKysgPSAnJSc7CisgICAgICAgICAgICAgICAgKnErKyA9IGhleERpZ2l0
KGMgPj4gNCk7CisgICAgICAgICAgICAgICAgKnErKyA9IGhleERpZ2l0KGMgJiAweGYpOworICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKnErKyA9ICpwOworICAgICAgICAgICAg
cCsrOworICAgICAgICB9CisgICAgICAgICpxID0gJ1wwJzsKKyAgICAgICAgcmVzdWx0ID0gW05T
U3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOmFmdGVyXTsKKyAgICB9CisgICAgCisgICAgZnJl
ZShhZnRlcik7CisgICAgCisgICAgcmVzdWx0ID0gbWFwSG9zdE5hbWVzKHJlc3VsdCwgIW5lZWRz
SG9zdE5hbWVEZWNvZGluZyk7CisgICAgcmVzdWx0ID0gW3Jlc3VsdCBwcmVjb21wb3NlZFN0cmlu
Z1dpdGhDYW5vbmljYWxNYXBwaW5nXTsKKyAgICByZXR1cm4gV2ViQ29yZUNGQXV0b3JlbGVhc2Uo
Y3JlYXRlU3RyaW5nV2l0aEVzY2FwZWRVbnNhZmVDaGFyYWN0ZXJzKChDRlN0cmluZ1JlZilyZXN1
bHQpKTsKK30KKworQk9PTCBpc1VzZXJWaXNpYmxlVVJMKE5TU3RyaW5nICpzdHJpbmcpCit7Cisg
ICAgQk9PTCB2YWxpZCA9IFlFUzsKKyAgICAvLyBnZXQgYnVmZmVyCisgICAgCisgICAgY2hhciBz
dGF0aWNfYnVmZmVyWzEwMjRdOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgQk9PTCBzdWNjZXNz
ID0gQ0ZTdHJpbmdHZXRDU3RyaW5nKChDRlN0cmluZ1JlZilzdHJpbmcsIHN0YXRpY19idWZmZXIs
IDEwMjMsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgICAgcCA9IHN1Y2Nlc3MgPyBzdGF0aWNf
YnVmZmVyIDogW3N0cmluZyBVVEY4U3RyaW5nXTsKKyAgICAKKyAgICBpbnQgbGVuZ3RoID0gc3Ry
bGVuKHApOworICAgIAorICAgIC8vIGNoZWNrIGZvciBjaGFyYWN0ZXJzIDw9IDB4MjAgb3IgPj0w
eDdmLCAlLWVzY2FwZSBzZXF1ZW5jZXMgb2YgJTdmLCBhbmQgeG4tLSwgdGhlc2UKKyAgICAvLyBh
cmUgdGhlIHRoaW5ncyB0aGF0IHdpbGwgbGVhZCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nIHRvIGFj
dHVhbGx5IGNoYW5nZSB0aGluZ3MuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkr
KykgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBwW2ldOworICAgICAgICAvLyBlc2NhcGUg
Y29udHJvbCBjaGFyYWN0ZXJzLCBzcGFjZSwgYW5kIGRlbGV0ZQorICAgICAgICBpZiAoYyA8PSAw
eDIwIHx8IGMgPT0gMHg3ZikgeworICAgICAgICAgICAgdmFsaWQgPSBOTzsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyUnICYmIChpICsgMSA8IGxlbmd0aCAm
JiBpc0hleERpZ2l0KHBbaSArIDFdKSkgJiYgaSArIDIgPCBsZW5ndGggJiYgaXNIZXhEaWdpdChw
W2kgKyAyXSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdSA9IChoZXhEaWdpdFZhbHVl
KHBbaSArIDFdKSA8PCA0KSB8IGhleERpZ2l0VmFsdWUocFtpICsgMl0pOworICAgICAgICAgICAg
aWYgKHUgPiAweDdmKSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBOTzsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciAieG4tLSIgaW4gYW4gZWZmaWNpZW50
LCBub24tY2FzZS1zZW5zaXRpdmUsIHdheS4KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiBp
ID49IDMgJiYgKHBbaSAtIDNdIHwgMHgyMCkgPT0gJ3gnICYmIChwW2kgLSAyXSB8IDB4MjApID09
ICduJyAmJiBwW2kgLSAxXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICB2YWxpZCA9IE5POwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIHJldHVybiB2YWxpZDsKK30KKwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbWFjL1dlYkNvcmVPYmpDRXh0cmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbWFjL1dlYkNvcmVPYmpDRXh0cmFzLmgJKHJldmlzaW9uIDExMDIyNikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlT2JqQ0V4dHJhcy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMiw2ICszMiwxOCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorLy8gVXNlIFdl
YkNGQXV0b3JlbGVhc2UgdG8gcmV0dXJuIGFuIG9iamVjdCBtYWRlIGJ5IGEgQ29yZUZvdW5kYXRp
b24KKy8vICJjcmVhdGUiIG9yICJjb3B5IiBmdW5jdGlvbiBhcyBhbiBhdXRvcmVsZWFzZWQgYW5k
IGdhcmJhZ2UgY29sbGVjdGVkCisvLyBvYmplY3QuIENGIG9iamVjdHMgbmVlZCB0byBiZSAibWFk
ZSBjb2xsZWN0YWJsZSIgZm9yIGF1dG9yZWxlYXNlIHRvIHdvcmsKKy8vIHByb3Blcmx5IHVuZGVy
IEdDLgorc3RhdGljIGlubGluZSBpZCBXZWJDb3JlQ0ZBdXRvcmVsZWFzZShDRlR5cGVSZWYgb2Jq
KQoreworICAgIGlmIChvYmopCisgICAgICAgIENGTWFrZUNvbGxlY3RhYmxlKG9iaik7CisgICAg
WyhpZClvYmogYXV0b3JlbGVhc2VdOworICAgIHJldHVybiAoaWQpb2JqOworfQorCiB2b2lkIFdl
YkNvcmVPYmpDRmluYWxpemVPbk1haW5UaHJlYWQoQ2xhc3MgY2xzKTsKIAogLy8gVGhlICdDbGFz
cycgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGluIGhlcmUgaXMgdGhlIGNsYXNzIG9mIHRoZQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZVN5c3RlbUlu
dGVyZmFjZS5oCShyZXZpc2lvbiAxMTAyMjYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
YWMvV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOTIsNyArMjky
LDggQEAgZXh0ZXJuIENGQXJyYXlSZWYgKCp3a0NGVVJMUmVxdWVzdENvcHlIVAogZXh0ZXJuIHZv
aWQgKCp3a0NGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keVBhcnRzKShDRk11dGFibGVVUkxS
ZXF1ZXN0UmVmLCBDRkFycmF5UmVmIGJvZHlQYXJ0cyk7CiBleHRlcm4gdm9pZCAoKndrU2V0UmVx
dWVzdFN0b3JhZ2VTZXNzaW9uKShDRlVSTFN0b3JhZ2VTZXNzaW9uUmVmLCBDRk11dGFibGVVUkxS
ZXF1ZXN0UmVmKTsKICNlbmRpZgotCitleHRlcm4gdm9pZCAoKndrU2V0TWV0YWRhdGFVUkwpKE5T
U3RyaW5nICp1cmxTdHJpbmcsIE5TU3RyaW5nICpyZWZlcnJlciwgTlNTdHJpbmcgKnBhdGgpOwor
ICAgIAogI2lmICFkZWZpbmVkKEJVSUxESU5HX09OX0xFT1BBUkQpICYmICFkZWZpbmVkKEJVSUxE
SU5HX09OX1NOT1dfTEVPUEFSRCkKICNpbXBvcnQgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+CiAKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlU3lzdGVtSW50ZXJmYWNlLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlU3lzdGVt
SW50ZXJmYWNlLm1tCShyZXZpc2lvbiAxMTAyMjYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tYWMvV2ViQ29yZVN5c3RlbUludGVyZmFjZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMTc2LDYg
KzE3Niw3IEBAIENGVVJMUmVmICgqd2tHZXRDRlVSTFJlc3BvbnNlVVJMKShDRlVSTFIKIENGSFRU
UE1lc3NhZ2VSZWYgKCp3a0dldENGVVJMUmVzcG9uc2VIVFRQUmVzcG9uc2UpKENGVVJMUmVzcG9u
c2VSZWYpOwogQ0ZTdHJpbmdSZWYgKCp3a0NvcHlDRlVSTFJlc3BvbnNlU3VnZ2VzdGVkRmlsZW5h
bWUpKENGVVJMUmVzcG9uc2VSZWYpOwogdm9pZCAoKndrU2V0Q0ZVUkxSZXNwb25zZU1JTUVUeXBl
KShDRlVSTFJlc3BvbnNlUmVmLCBDRlN0cmluZ1JlZiBtaW1lVHlwZSk7Cit2b2lkICgqd2tTZXRN
ZXRhZGF0YVVSTCkoTlNTdHJpbmcgKnVybFN0cmluZywgTlNTdHJpbmcgKnJlZmVycmVyLCBOU1N0
cmluZyAqcGF0aCk7CiAKICNpZiAhZGVmaW5lZChCVUlMRElOR19PTl9MRU9QQVJEKSAmJiAhZGVm
aW5lZChCVUlMRElOR19PTl9TTk9XX0xFT1BBUkQpCiBkaXNwYXRjaF9zb3VyY2VfdCAoKndrQ3Jl
YXRlVk1QcmVzc3VyZURpc3BhdGNoT25NYWluUXVldWUpKHZvaWQpOwpJbmRleDogU291cmNlL1dl
YktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwko
cmV2aXNpb24gMTEwMjI3KQorKysgU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTItMDMtMDggIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNh
QGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIFdlYk5TVVJMRXh0cmFzIGNvZGUgZG93biB0byBX
ZWJDb3JlLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
ODA2MTEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAq
IFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFjL1dlYlN5c3RlbUludGVyZmFjZS5tbToKKyAg
ICAgICAgKEluaXRXZWJDb3JlU3lzdGVtSW50ZXJmYWNlKToKKwogMjAxMi0wMy0wOCAgSmVyIE5v
YmxlICA8amVyLm5vYmxlQGFwcGxlLmNvbT4KIAogICAgICAgICBGdXJ0aGVyIHVucmV2aWV3ZWQg
YnVpbGQgZml4LgpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9y
dC9tYWMvV2ViU3lzdGVtSW50ZXJmYWNlLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFjL1dlYlN5c3RlbUludGVyZmFjZS5tbQkocmV2
aXNpb24gMTEwMjI2KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9y
dC9tYWMvV2ViU3lzdGVtSW50ZXJmYWNlLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNTQsNiArMTU0
LDggQEAgdm9pZCBJbml0V2ViQ29yZVN5c3RlbUludGVyZmFjZSh2b2lkKQogICAgICAgICBJTklU
KENvcHlDRlVSTFJlc3BvbnNlU3VnZ2VzdGVkRmlsZW5hbWUpOwogICAgICAgICBJTklUKFNldENG
VVJMUmVzcG9uc2VNSU1FVHlwZSk7CiAKKyAgICAgICAgSU5JVChTZXRNZXRhZGF0YVVSTCk7CisK
ICNpZiAhZGVmaW5lZChCVUlMRElOR19PTl9TTk9XX0xFT1BBUkQpCiAgICAgICAgIElOSVQoQ3Jl
YXRlVk1QcmVzc3VyZURpc3BhdGNoT25NYWluUXVldWUpOwogI2VuZGlmCkluZGV4OiBTb3VyY2Uv
V2ViS2l0L21hYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9tYWMvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxMTAyMjcpCisrKyBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw0MSBAQAorMjAxMi0wMy0wOCAgRW5yaWNhIENhc3Vj
Y2kgIDxlbnJpY2FAYXBwbGUuY29tPgorCisgICAgICAgIE1vdmUgV2ViTlNVUkxFeHRyYXMgY29k
ZSBkb3duIHRvIFdlYkNvcmUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD04MDYxMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisJQ2hhbmdlZCB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlIG5ld2x5IG1vdmVkIFdlYkNvcmUg
ZnVuY3Rpb25zLgorCisgICAgICAgICogTWlzYy9XZWJLaXROU1N0cmluZ0V4dHJhcy5tbToKKyAg
ICAgICAgKC1bTlNTdHJpbmcgX3dlYmtpdF9oYXNDYXNlSW5zZW5zaXRpdmVQcmVmaXg6XSk6Cisg
ICAgICAgICogTWlzYy9XZWJOU1VSTEV4dHJhcy5tbToKKyAgICAgICAgKCtbTlNVUkwgX3dlYl9V
UkxXaXRoVXNlclR5cGVkU3RyaW5nOl0pOgorICAgICAgICAoK1tOU1VSTCBfd2ViX1VSTFdpdGhE
YXRhQXNTdHJpbmc6cmVsYXRpdmVUb1VSTDpdKToKKyAgICAgICAgKCtbTlNVUkwgX3dlYl9VUkxX
aXRoRGF0YTpdKToKKyAgICAgICAgKCtbTlNVUkwgX3dlYl9VUkxXaXRoRGF0YTpyZWxhdGl2ZVRv
VVJMOl0pOgorICAgICAgICAoLVtOU1VSTCBfd2ViX29yaWdpbmFsRGF0YV0pOgorICAgICAgICAo
LVtOU1VSTCBfd2ViX29yaWdpbmFsRGF0YUFzU3RyaW5nXSk6CisgICAgICAgICgtW05TVVJMIF93
ZWJfdXNlclZpc2libGVTdHJpbmddKToKKyAgICAgICAgKC1bTlNVUkwgX3dlYl9pc0VtcHR5XSk6
CisgICAgICAgICgtW05TVVJMIF93ZWJfVVJMQ1N0cmluZ10pOgorICAgICAgICAoLVtOU1VSTCBf
d2ViX1VSTEJ5VHJ1bmNhdGluZ09uZUNoYXJhY3RlckJlZm9yZUNvbXBvbmVudDpdKToKKyAgICAg
ICAgKC1bTlNVUkwgX3dlYmtpdF9VUkxCeVJlbW92aW5nRnJhZ21lbnRdKToKKyAgICAgICAgKC1b
TlNVUkwgX3dlYmtpdF9VUkxCeVJlbW92aW5nUmVzb3VyY2VTcGVjaWZpZXJdKToKKyAgICAgICAg
KC1bTlNVUkwgX3dlYl9VUkxCeVJlbW92aW5nVXNlckluZm9dKToKKyAgICAgICAgKC1bTlNVUkwg
X3dlYl9kYXRhRm9yVVJMQ29tcG9uZW50VHlwZTpdKToKKyAgICAgICAgKC1bTlNVUkwgX3dlYl9z
Y2hlbWVEYXRhXSk6CisgICAgICAgICgtW05TVVJMIF93ZWJfaG9zdERhdGFdKToKKyAgICAgICAg
KC1bTlNTdHJpbmcgX3dlYl9pc1VzZXJWaXNpYmxlVVJMXSk6CisgICAgICAgICgtW05TU3RyaW5n
IF93ZWJfaG9zdE5hbWVOZWVkc0RlY29kaW5nV2l0aFJhbmdlOl0pOgorICAgICAgICAoLVtOU1N0
cmluZyBfd2ViX2hvc3ROYW1lTmVlZHNFbmNvZGluZ1dpdGhSYW5nZTpdKToKKyAgICAgICAgKC1b
TlNTdHJpbmcgX3dlYl9kZWNvZGVIb3N0TmFtZVdpdGhSYW5nZTpdKToKKyAgICAgICAgKC1bTlNT
dHJpbmcgX3dlYl9lbmNvZGVIb3N0TmFtZVdpdGhSYW5nZTpdKToKKyAgICAgICAgKC1bTlNTdHJp
bmcgX3dlYl9kZWNvZGVIb3N0TmFtZV0pOgorICAgICAgICAoLVtOU1N0cmluZyBfd2ViX2VuY29k
ZUhvc3ROYW1lXSk6CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2ViU3lzdGVtSW50ZXJmYWNl
Lm1tOgorICAgICAgICAoSW5pdFdlYkNvcmVTeXN0ZW1JbnRlcmZhY2UpOgorCiAyMDEyLTAzLTA3
ICBKb24gTGVlICA8am9ubGVlQGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQgc3VwcG9ydCBmb3Ig
RU5BQkxFKExFR0FDWV9OT1RJRklDQVRJT05TKQpJbmRleDogU291cmNlL1dlYktpdC9tYWMvTWlz
Yy9XZWJLaXROU1N0cmluZ0V4dHJhcy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L21h
Yy9NaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFzLm1tCShyZXZpc2lvbiAxMTAyMjYpCisrKyBTb3Vy
Y2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFzLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC0xODQsNyArMTg0LDcgQEAgLSAoQk9PTClfd2Via2l0X2lzQ2FzZUluc2Vuc2l0aXZlRXF1
YWxUbwogCiAtKEJPT0wpX3dlYmtpdF9oYXNDYXNlSW5zZW5zaXRpdmVQcmVmaXg6KE5TU3RyaW5n
ICopcHJlZml4CiB7Ci0gICAgcmV0dXJuIFtzZWxmIHJhbmdlT2ZTdHJpbmc6cHJlZml4IG9wdGlv
bnM6KE5TQ2FzZUluc2Vuc2l0aXZlU2VhcmNoIHwgTlNBbmNob3JlZFNlYXJjaCldLmxvY2F0aW9u
ICE9IE5TTm90Rm91bmQ7CisgICAgcmV0dXJuIGhhc0Nhc2VJbnNlbnNpdGl2ZVByZWZpeChzZWxm
LCBwcmVmaXgpOwogfQogCiAtKEJPT0wpX3dlYmtpdF9oYXNDYXNlSW5zZW5zaXRpdmVTdWZmaXg6
KE5TU3RyaW5nICopc3VmZml4CkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYk5TVVJM
RXh0cmFzLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViTlNVUkxF
eHRyYXMubW0JKHJldmlzaW9uIDExMDIyNikKKysrIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2Vi
TlNVUkxFeHRyYXMubW0JKHdvcmtpbmcgY29weSkKQEAgLTM3LDM2NiArMzcsMjcgQEAKICNpbXBv
cnQgPEZvdW5kYXRpb24vTlNVUkxSZXF1ZXN0Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL0tVUkwuaD4K
ICNpbXBvcnQgPFdlYkNvcmUvTG9hZGVyTlNVUkxFeHRyYXMuaD4KKyNpbXBvcnQgPFdlYkNvcmUv
V2ViQ29yZU5TVVJMRXh0cmFzLmg+CiAjaW1wb3J0IDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4K
ICNpbXBvcnQgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW1wb3J0IDx1bmljb2RlL3VjaGFyLmg+Ci0j
aW1wb3J0IDx1bmljb2RlL3VpZG5hLmg+CiAjaW1wb3J0IDx1bmljb2RlL3VzY3JpcHQuaD4KIAog
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiB1c2luZyBuYW1lc3BhY2UgV1RGOwogCi10eXBlZGVm
IHZvaWQgKCogU3RyaW5nUmFuZ2VBcHBsaWVyRnVuY3Rpb24pKE5TU3RyaW5nICpzdHJpbmcsIE5T
UmFuZ2UgcmFuZ2UsIHZvaWQgKmNvbnRleHQpOwotCi0vLyBOZWVkcyB0byBiZSBiaWcgZW5vdWdo
IHRvIGhvbGQgYW4gSUROLWVuY29kZWQgbmFtZS4KLS8vIEZvciBob3N0IG5hbWVzIGJpZ2dlciB0
aGFuIHRoaXMsIHdlIHdvbid0IGRvIElETiBlbmNvZGluZywgd2hpY2ggaXMgYWxtb3N0IGNlcnRh
aW5seSBPSy4KLSNkZWZpbmUgSE9TVF9OQU1FX0JVRkZFUl9MRU5HVEggMjA0OAotCiAjZGVmaW5l
IFVSTF9CWVRFU19CVUZGRVJfTEVOR1RIIDIwNDgKIAotc3RhdGljIHB0aHJlYWRfb25jZV90IElE
TlNjcmlwdFdoaXRlTGlzdEZpbGVSZWFkID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci1zdGF0aWMgdWlu
dDMyX3QgSUROU2NyaXB0V2hpdGVMaXN0WyhVU0NSSVBUX0NPREVfTElNSVQgKyAzMSkgLyAzMl07
Ci0KLXN0YXRpYyBpbmxpbmUgQk9PTCBpc0xvb2thbGlrZUNoYXJhY3RlcihpbnQgY2hhckNvZGUp
Ci17Ci0vLyBGSVhNRTogTW92ZSB0aGlzIGNvZGUgZG93biBpbnRvIFdlYkNvcmUgc28gaXQgY2Fu
IGJlIHNoYXJlZCB3aXRoIG90aGVyIHBsYXRmb3Jtcy4KLQotLy8gVGhpcyBmdW5jdGlvbiB0cmVh
dHMgdGhlIGZvbGxvd2luZyBhcyB1bnNhZmUsIGxvb2thbGlrZSBjaGFyYWN0ZXJzOgotLy8gYW55
IG5vbi1wcmludGFibGUgY2hhcmFjdGVyLCBhbnkgY2hhcmFjdGVyIGNvbnNpZGVyZWQgYXMgd2hp
dGVzcGFjZSB0aGF0IGlzbid0IGFscmVhZHkgY29udmVydGVkIHRvIGEgc3BhY2UgYnkgSUNVLCAK
LS8vIGFuZCBhbnkgaWdub3JhYmxlIGNoYXJhY3Rlci4KLQotLy8gV2UgYWxzbyBjb25zaWRlcmVk
IHRoZSBjaGFyYWN0ZXJzIGluIE1vemlsbGEncyBibGFja2xpc3QgKGh0dHA6Ly9rYi5tb3ppbGxh
emluZS5vcmcvTmV0d29yay5JRE4uYmxhY2tsaXN0X2NoYXJzKSwgCi0vLyBhbmQgaW5jbHVkZWQg
YWxsIG9mIHRoZXNlIGNoYXJhY3RlcnMgdGhhdCBJQ1UgY2FuIGVuY29kZS4KLQotICAgIGlmICgh
dV9pc3ByaW50KGNoYXJDb2RlKSB8fCB1X2lzVVdoaXRlU3BhY2UoY2hhckNvZGUpIHx8IHVfaGFz
QmluYXJ5UHJvcGVydHkoY2hhckNvZGUsIFVDSEFSX0RFRkFVTFRfSUdOT1JBQkxFX0NPREVfUE9J
TlQpKQotICAgICAgICByZXR1cm4gWUVTOwotCi0gICAgc3dpdGNoIChjaGFyQ29kZSkgewotICAg
ICAgICBjYXNlIDB4MDBFRDogLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwot
ICAgICAgICBjYXNlIDB4MDFDMzogLyogTEFUSU4gTEVUVEVSIFJFVFJPRkxFWCBDTElDSyAqLwot
ICAgICAgICBjYXNlIDB4MDI1MTogLyogTEFUSU4gU01BTEwgTEVUVEVSIEFMUEhBICovCi0gICAg
ICAgIGNhc2UgMHgwMjYxOiAvKiBMQVRJTiBTTUFMTCBMRVRURVIgU0NSSVBUIEcgKi8KLSAgICAg
ICAgY2FzZSAweDAzMzc6IC8qIENPTUJJTklORyBTSE9SVCBTT0xJRFVTIE9WRVJMQVkgKi8KLSAg
ICAgICAgY2FzZSAweDAzMzg6IC8qIENPTUJJTklORyBMT05HIFNPTElEVVMgT1ZFUkxBWSAqLwot
ICAgICAgICBjYXNlIDB4MDVCNDogLyogSEVCUkVXIFBPSU5UIEhJUklRICovCi0gICAgICAgIGNh
c2UgMHgwNUJDOiAvKiBIRUJSRVcgUE9JTlQgREFHRVNIIE9SIE1BUElRICovCi0gICAgICAgIGNh
c2UgMHgwNUMzOiAvKiBIRUJSRVcgUFVOQ1RVQVRJT04gU09GIFBBU1VRICovCi0gICAgICAgIGNh
c2UgMHgwNUY0OiAvKiBIRUJSRVcgUFVOQ1RVQVRJT04gR0VSU0hBWUlNICovCi0gICAgICAgIGNh
c2UgMHgwNjYwOiAvKiBBUkFCSUMgSU5ESUMgRElHSVQgWkVSTyAqLwotICAgICAgICBjYXNlIDB4
MDZENDogLyogQVJBQklDIEZVTEwgU1RPUCAqLwotICAgICAgICBjYXNlIDB4MDZGMDogLyogRVhU
RU5ERUQgQVJBQklDIElORElDIERJR0lUIFpFUk8gKi8KLSAgICAgICAgY2FzZSAweDIwMjc6IC8q
IEhZUEhFTkFUSU9OIFBPSU5UICovCi0gICAgICAgIGNhc2UgMHgyMDM5OiAvKiBTSU5HTEUgTEVG
VC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwotICAgICAgICBjYXNlIDB4MjAzQTog
LyogU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCi0gICAgICAg
IGNhc2UgMHgyMDQ0OiAvKiBGUkFDVElPTiBTTEFTSCAqLwotICAgICAgICBjYXNlIDB4MjIxNTog
LyogRElWSVNJT04gU0xBU0ggKi8KLSAgICAgICAgY2FzZSAweDIyMTY6IC8qIFNFVCBNSU5VUyAq
LwotICAgICAgICBjYXNlIDB4MjMzRjogLyogQVBMIEZVTkNUSU9OQUwgU1lNQk9MIFNMQVNIIEJB
UiAqLwotICAgICAgICBjYXNlIDB4MjNBRTogLyogSU5URUdSQUwgRVhURU5TSU9OICovCi0gICAg
ICAgIGNhc2UgMHgyNDRBOiAvKiBPQ1IgRE9VQkxFIEJBQ0tTTEFTSCAqLwotICAgICAgICBjYXNl
IDB4MjU3MTogLyogQk9YIERSQVdJTkdTIExJR0hUIERJQUdPTkFMIFVQUEVSIFJJR0hUIFRPIExP
V0VSIExFRlQgKi8KLSAgICAgICAgY2FzZSAweDI1NzI6IC8qIEJPWCBEUkFXSU5HUyBMSUdIVCBE
SUFHT05BTCBVUFBFUiBMRUZUIFRPIExPV0VSIFJJR0hUICovCi0gICAgICAgIGNhc2UgMHgyOUY4
OiAvKiBCSUcgU09MSURVUyAqLwotICAgICAgICBjYXNlIDB4MjlmNjogLyogU09MSURVUyBXSVRI
IE9WRVJCQVIgKi8KLSAgICAgICAgY2FzZSAweDJBRkI6IC8qIFRSSVBMRSBTT0xJRFVTIEJJTkFS
WSBSRUxBVElPTiAqLwotICAgICAgICBjYXNlIDB4MkFGRDogLyogRE9VQkxFIFNPTElEVVMgT1BF
UkFUT1IgKi8KLSAgICAgICAgY2FzZSAweDMwMDg6IC8qIExFRlQgQU5HTEUgQlJBQ0tFVCAqLwot
ICAgICAgICBjYXNlIDB4MzAxNDogLyogTEVGVCBUT1JUT0lTRSBTSEVMTCBCUkFDS0VUICovCi0g
ICAgICAgIGNhc2UgMHgzMDE1OiAvKiBSSUdIVCBUT1JUT0lTRSBTSEVMTCBCUkFDS0VUICovCi0g
ICAgICAgIGNhc2UgMHgzMDMzOiAvKiBWRVJUSUNBTCBLQU5BIFJFUEVBVCBNQVJLIFVQUEVSIEhB
TEYgKi8KLSAgICAgICAgY2FzZSAweDMwMzU6IC8qIFZFUlRJQ0FMIEtBTkEgUkVQRUFUIE1BUksg
TE9XRVIgSEFMRiAqLwotICAgICAgICBjYXNlIDB4MzIxRDogLyogUEFSRU5USEVTSVpFRCBLT1JF
QU4gQ0hBUkFDVEVSIE9KRU9OICovCi0gICAgICAgIGNhc2UgMHgzMjFFOiAvKiBQQVJFTlRIRVNJ
WkVEIEtPUkVBTiBDSEFSQUNURVIgTyBIVSAqLwotICAgICAgICBjYXNlIDB4MzNERjogLyogU1FV
QVJFIEEgT1ZFUiBNICovCi0gICAgICAgIGNhc2UgMHhGRTE0OiAvKiBQUkVTRU5UQVRJT04gRk9S
TSBGT1IgVkVSVElDQUwgU0VNSUNPTE9OICovCi0gICAgICAgIGNhc2UgMHhGRTE1OiAvKiBQUkVT
RU5UQVRJT04gRk9STSBGT1IgVkVSVElDQUwgRVhDTEFNQVRJT04gTUFSSyAqLwotICAgICAgICBj
YXNlIDB4RkUzRjogLyogUFJFU0VOVEFUSU9OIEZPUk0gRk9SIFZFUlRJQ0FMIExFRlQgQU5HTEUg
QlJBQ0tFVCAqLwotICAgICAgICBjYXNlIDB4RkU1RDogLyogU01BTEwgTEVGVCBUT1JUT0lTRSBT
SEVMTCBCUkFDS0VUICovCi0gICAgICAgIGNhc2UgMHhGRTVFOiAvKiBTTUFMTCBSSUdIVCBUT1JU
T0lTRSBTSEVMTCBCUkFDS0VUICovCi0gICAgICAgICAgICByZXR1cm4gWUVTOwotICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5POwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIg
aGV4RGlnaXQoaW50IGkpCi17Ci0gICAgaWYgKGkgPCAwIHx8IGkgPiAxNikgewotICAgICAgICBM
T0dfRVJST1IoImlsbGVnYWwgaGV4IGRpZ2l0Iik7Ci0gICAgICAgIHJldHVybiAnMCc7Ci0gICAg
fQotICAgIGludCBoID0gaTsKLSAgICBpZiAoaCA+PSAxMCkgewotICAgICAgICBoID0gaCAtIDEw
ICsgJ0EnOyAKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGggKz0gJzAnOwotICAgIH0KLSAg
ICByZXR1cm4gaDsKLX0KLQotc3RhdGljIEJPT0wgaXNIZXhEaWdpdChjaGFyIGMpCi17Ci0gICAg
cmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8
fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOwotfQotCi1zdGF0aWMgaW50IGhleERpZ2l0VmFsdWUo
Y2hhciBjKQotewotICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgewotICAgICAgICByZXR1
cm4gYyAtICcwJzsKLSAgICB9Ci0gICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB7Ci0gICAg
ICAgIHJldHVybiBjIC0gJ0EnICsgMTA7Ci0gICAgfQotICAgIGlmIChjID49ICdhJyAmJiBjIDw9
ICdmJykgewotICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICAgIH0KLSAgICBMT0dfRVJS
T1IoImlsbGVnYWwgaGV4IGRpZ2l0Iik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lk
IGFwcGx5SG9zdE5hbWVGdW5jdGlvblRvTWFpbFRvVVJMU3RyaW5nKE5TU3RyaW5nICpzdHJpbmcs
IFN0cmluZ1JhbmdlQXBwbGllckZ1bmN0aW9uIGYsIHZvaWQgKmNvbnRleHQpCi17Ci0gICAgLy8g
SW4gYSBtYWlsdG86IFVSTCwgaG9zdCBuYW1lcyBjb21lIGFmdGVyIGEgJ0AnIGNoYXJhY3RlciBh
bmQgZW5kIHdpdGggYSAnPicgb3IgJywnIG9yICc/JyBjaGFyYWN0ZXIuCi0gICAgLy8gU2tpcCBx
dW90ZWQgc3RyaW5ncyBzbyB0aGF0IGNoYXJhY3RlcnMgaW4gdGhlbSBkb24ndCBjb25mdXNlIHVz
LgotICAgIC8vIFdoZW4gd2UgZmluZCBhICc/JyBjaGFyYWN0ZXIsIHdlIGFyZSBwYXN0IHRoZSBw
YXJ0IG9mIHRoZSBVUkwgdGhhdCBjb250YWlucyBob3N0IG5hbWVzLgotCi0gICAgc3RhdGljIE5T
Q2hhcmFjdGVyU2V0ICpob3N0TmFtZU9yU3RyaW5nU3RhcnRDaGFyYWN0ZXJzOwotICAgIGlmICho
b3N0TmFtZU9yU3RyaW5nU3RhcnRDaGFyYWN0ZXJzID09IG5pbCkgewotICAgICAgICBob3N0TmFt
ZU9yU3RyaW5nU3RhcnRDaGFyYWN0ZXJzID0gW05TQ2hhcmFjdGVyU2V0IGNoYXJhY3RlclNldFdp
dGhDaGFyYWN0ZXJzSW5TdHJpbmc6QCJcIkA/Il07Ci0gICAgICAgIENGUmV0YWluKGhvc3ROYW1l
T3JTdHJpbmdTdGFydENoYXJhY3RlcnMpOwotICAgIH0KLSAgICBzdGF0aWMgTlNDaGFyYWN0ZXJT
ZXQgKmhvc3ROYW1lRW5kQ2hhcmFjdGVyczsKLSAgICBpZiAoaG9zdE5hbWVFbmRDaGFyYWN0ZXJz
ID09IG5pbCkgewotICAgICAgICBob3N0TmFtZUVuZENoYXJhY3RlcnMgPSBbTlNDaGFyYWN0ZXJT
ZXQgY2hhcmFjdGVyU2V0V2l0aENoYXJhY3RlcnNJblN0cmluZzpAIj4sPyJdOwotICAgICAgICBD
RlJldGFpbihob3N0TmFtZUVuZENoYXJhY3RlcnMpOwotICAgIH0KLSAgICBzdGF0aWMgTlNDaGFy
YWN0ZXJTZXQgKnF1b3RlZFN0cmluZ0NoYXJhY3RlcnM7Ci0gICAgaWYgKHF1b3RlZFN0cmluZ0No
YXJhY3RlcnMgPT0gbmlsKSB7Ci0gICAgICAgIHF1b3RlZFN0cmluZ0NoYXJhY3RlcnMgPSBbTlND
aGFyYWN0ZXJTZXQgY2hhcmFjdGVyU2V0V2l0aENoYXJhY3RlcnNJblN0cmluZzpAIlwiXFwiXTsK
LSAgICAgICAgQ0ZSZXRhaW4ocXVvdGVkU3RyaW5nQ2hhcmFjdGVycyk7Ci0gICAgfQotCi0gICAg
dW5zaWduZWQgc3RyaW5nTGVuZ3RoID0gW3N0cmluZyBsZW5ndGhdOwotICAgIE5TUmFuZ2UgcmVt
YWluaW5nID0gTlNNYWtlUmFuZ2UoMCwgc3RyaW5nTGVuZ3RoKTsKLSAgICAKLSAgICB3aGlsZSAo
MSkgewotICAgICAgICAvLyBGaW5kIHN0YXJ0IG9mIGhvc3QgbmFtZSBvciBvZiBxdW90ZWQgc3Ry
aW5nLgotICAgICAgICBOU1JhbmdlIGhvc3ROYW1lT3JTdHJpbmdTdGFydCA9IFtzdHJpbmcgcmFu
Z2VPZkNoYXJhY3RlckZyb21TZXQ6aG9zdE5hbWVPclN0cmluZ1N0YXJ0Q2hhcmFjdGVycyBvcHRp
b25zOjAgcmFuZ2U6cmVtYWluaW5nXTsKLSAgICAgICAgaWYgKGhvc3ROYW1lT3JTdHJpbmdTdGFy
dC5sb2NhdGlvbiA9PSBOU05vdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICAgICAgdW5pY2hhciBjID0gW3N0cmluZyBjaGFyYWN0ZXJBdEluZGV4Omhvc3ROYW1l
T3JTdHJpbmdTdGFydC5sb2NhdGlvbl07Ci0gICAgICAgIHJlbWFpbmluZy5sb2NhdGlvbiA9IE5T
TWF4UmFuZ2UoaG9zdE5hbWVPclN0cmluZ1N0YXJ0KTsKLSAgICAgICAgcmVtYWluaW5nLmxlbmd0
aCA9IHN0cmluZ0xlbmd0aCAtIHJlbWFpbmluZy5sb2NhdGlvbjsKLQotICAgICAgICBpZiAoYyA9
PSAnPycpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaWYgKGMgPT0gJ0AnKSB7Ci0gICAgICAgICAgICAvLyBGaW5kIGVuZCBvZiBob3N0IG5hbWUu
Ci0gICAgICAgICAgICB1bnNpZ25lZCBob3N0TmFtZVN0YXJ0ID0gcmVtYWluaW5nLmxvY2F0aW9u
OwotICAgICAgICAgICAgTlNSYW5nZSBob3N0TmFtZUVuZCA9IFtzdHJpbmcgcmFuZ2VPZkNoYXJh
Y3RlckZyb21TZXQ6aG9zdE5hbWVFbmRDaGFyYWN0ZXJzIG9wdGlvbnM6MCByYW5nZTpyZW1haW5p
bmddOwotICAgICAgICAgICAgQk9PTCBkb25lOwotICAgICAgICAgICAgaWYgKGhvc3ROYW1lRW5k
LmxvY2F0aW9uID09IE5TTm90Rm91bmQpIHsKLSAgICAgICAgICAgICAgICBob3N0TmFtZUVuZC5s
b2NhdGlvbiA9IHN0cmluZ0xlbmd0aDsKLSAgICAgICAgICAgICAgICBkb25lID0gWUVTOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZW1haW5pbmcubG9jYXRpb24gPSBo
b3N0TmFtZUVuZC5sb2NhdGlvbjsKLSAgICAgICAgICAgICAgICByZW1haW5pbmcubGVuZ3RoID0g
c3RyaW5nTGVuZ3RoIC0gcmVtYWluaW5nLmxvY2F0aW9uOwotICAgICAgICAgICAgICAgIGRvbmUg
PSBOTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBob3N0IG5hbWUg
cmFuZ2UuCi0gICAgICAgICAgICBmKHN0cmluZywgTlNNYWtlUmFuZ2UoaG9zdE5hbWVTdGFydCwg
aG9zdE5hbWVFbmQubG9jYXRpb24gLSBob3N0TmFtZVN0YXJ0KSwgY29udGV4dCk7Ci0KLSAgICAg
ICAgICAgIGlmIChkb25lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2tpcCBxdW90ZWQgc3RyaW5nLgot
ICAgICAgICAgICAgQVNTRVJUKGMgPT0gJyInKTsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0g
ICAgICAgICAgICAgICAgTlNSYW5nZSBlc2NhcGVkQ2hhcmFjdGVyT3JTdHJpbmdFbmQgPSBbc3Ry
aW5nIHJhbmdlT2ZDaGFyYWN0ZXJGcm9tU2V0OnF1b3RlZFN0cmluZ0NoYXJhY3RlcnMgb3B0aW9u
czowIHJhbmdlOnJlbWFpbmluZ107Ci0gICAgICAgICAgICAgICAgaWYgKGVzY2FwZWRDaGFyYWN0
ZXJPclN0cmluZ0VuZC5sb2NhdGlvbiA9PSBOU05vdEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYyA9IFtzdHJp
bmcgY2hhcmFjdGVyQXRJbmRleDplc2NhcGVkQ2hhcmFjdGVyT3JTdHJpbmdFbmQubG9jYXRpb25d
OwotICAgICAgICAgICAgICAgIHJlbWFpbmluZy5sb2NhdGlvbiA9IE5TTWF4UmFuZ2UoZXNjYXBl
ZENoYXJhY3Rlck9yU3RyaW5nRW5kKTsKLSAgICAgICAgICAgICAgICByZW1haW5pbmcubGVuZ3Ro
ID0gc3RyaW5nTGVuZ3RoIC0gcmVtYWluaW5nLmxvY2F0aW9uOwotICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHRoZW4g
YnJlYWsgZnJvbSB0aGUgc3RyaW5nIGxvb3AgYmFjayB0byB0aGUgaG9zdCBuYW1lIGxvb3AuCi0g
ICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAv
LyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgIEFTU0VSVChjID09ICdc
XCcpOwotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID09IDApIHsKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nLmxvY2F0aW9uICs9IDE7Ci0gICAgICAgICAgICAg
ICAgcmVtYWluaW5nLmxlbmd0aCAtPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotfQotCi1zdGF0aWMgdm9pZCBhcHBseUhvc3ROYW1lRnVuY3Rpb25Ub1VSTFN0cmluZyhOU1N0
cmluZyAqc3RyaW5nLCBTdHJpbmdSYW5nZUFwcGxpZXJGdW5jdGlvbiBmLCB2b2lkICpjb250ZXh0
KQotewotICAgIC8vIEZpbmQgaG9zdG5hbWVzLiBUb28gYmFkIHdlIGNhbid0IHVzZSBhbnkgcmVh
bCBVUkwtcGFyc2luZyBjb2RlIHRvIGRvIHRoaXMsCi0gICAgLy8gYnV0IHdlIGhhdmUgdG8gZG8g
aXQgYmVmb3JlIGRvaW5nIGFsbCB0aGUgJS1lc2NhcGluZywgYW5kIHRoaXMgaXMgdGhlIG9ubHkK
LSAgICAvLyBjb2RlIHdlIGhhdmUgdGhhdCBwYXJzZXMgbWFpbHRvIFVSTHMgYW55d2F5LgotCi0g
ICAgLy8gTWF5YmUgd2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIHVzaW5nIGEgY2hhcmFjdGVyIGJ1
ZmZlciBpbnN0ZWFkPwotCi0gICAgaWYgKFtzdHJpbmcgX3dlYmtpdF9oYXNDYXNlSW5zZW5zaXRp
dmVQcmVmaXg6QCJtYWlsdG86Il0pIHsKLSAgICAgICAgYXBwbHlIb3N0TmFtZUZ1bmN0aW9uVG9N
YWlsVG9VUkxTdHJpbmcoc3RyaW5nLCBmLCBjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIC8vIEZpbmQgdGhlIGhvc3QgbmFtZSBpbiBhIGhpZXJhcmNoaWNhbCBVUkwuCi0g
ICAgLy8gSXQgY29tZXMgYWZ0ZXIgYSAiOi8vIiBzZXF1ZW5jZSwgd2l0aCBzY2hlbWUgY2hhcmFj
dGVycyBwcmVjZWRpbmcuCi0gICAgLy8gSWYgZW5kcyB3aXRoIHRoZSBlbmQgb2YgdGhlIHN0cmlu
ZyBvciBhICI6IiwgIi8iLCBvciBhICI/Ii4KLSAgICAvLyBJZiB0aGVyZSBpcyBhICJAIiBjaGFy
YWN0ZXIsIHRoZSBob3N0IHBhcnQgaXMganVzdCB0aGUgcGFydCBhZnRlciB0aGUgIkAiLgotICAg
IE5TUmFuZ2Ugc2VwYXJhdG9yUmFuZ2UgPSBbc3RyaW5nIHJhbmdlT2ZTdHJpbmc6QCI6Ly8iXTsK
LSAgICBpZiAoc2VwYXJhdG9yUmFuZ2UubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkgewotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdGhhdCBhbGwgY2hhcmFjdGVycyBiZWZv
cmUgdGhlIDovLyBhcmUgdmFsaWQgc2NoZW1lIGNoYXJhY3RlcnMuCi0gICAgc3RhdGljIE5TQ2hh
cmFjdGVyU2V0ICpub25TY2hlbWVDaGFyYWN0ZXJzOwotICAgIGlmIChub25TY2hlbWVDaGFyYWN0
ZXJzID09IG5pbCkgewotICAgICAgICBub25TY2hlbWVDaGFyYWN0ZXJzID0gW1tOU0NoYXJhY3Rl
clNldCBjaGFyYWN0ZXJTZXRXaXRoQ2hhcmFjdGVyc0luU3RyaW5nOkAiQUJDREVGR0hJSktMTU5P
UFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLS4iXSBpbnZl
cnRlZFNldF07Ci0gICAgICAgIENGUmV0YWluKG5vblNjaGVtZUNoYXJhY3RlcnMpOwotICAgIH0K
LSAgICBpZiAoW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpub25TY2hlbWVDaGFyYWN0
ZXJzIG9wdGlvbnM6MCByYW5nZTpOU01ha2VSYW5nZSgwLCBzZXBhcmF0b3JSYW5nZS5sb2NhdGlv
bildLmxvY2F0aW9uICE9IE5TTm90Rm91bmQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIHVuc2lnbmVkIHN0cmluZ0xlbmd0aCA9IFtzdHJpbmcgbGVuZ3RoXTsKLQotICAgIHN0YXRp
YyBOU0NoYXJhY3RlclNldCAqaG9zdFRlcm1pbmF0b3JzOwotICAgIGlmIChob3N0VGVybWluYXRv
cnMgPT0gbmlsKSB7Ci0gICAgICAgIGhvc3RUZXJtaW5hdG9ycyA9IFtOU0NoYXJhY3RlclNldCBj
aGFyYWN0ZXJTZXRXaXRoQ2hhcmFjdGVyc0luU3RyaW5nOkAiOi8/IyJdOwotICAgICAgICBDRlJl
dGFpbihob3N0VGVybWluYXRvcnMpOwotICAgIH0KLQotICAgIC8vIFN0YXJ0IGFmdGVyIHRoZSBz
ZXBhcmF0b3IuCi0gICAgdW5zaWduZWQgYXV0aG9yaXR5U3RhcnQgPSBOU01heFJhbmdlKHNlcGFy
YXRvclJhbmdlKTsKLQotICAgIC8vIEZpbmQgdGVybWluYXRpbmcgY2hhcmFjdGVyLgotICAgIE5T
UmFuZ2UgaG9zdE5hbWVUZXJtaW5hdG9yID0gW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNl
dDpob3N0VGVybWluYXRvcnMgb3B0aW9uczowIHJhbmdlOk5TTWFrZVJhbmdlKGF1dGhvcml0eVN0
YXJ0LCBzdHJpbmdMZW5ndGggLSBhdXRob3JpdHlTdGFydCldOwotICAgIHVuc2lnbmVkIGhvc3RO
YW1lRW5kID0gaG9zdE5hbWVUZXJtaW5hdG9yLmxvY2F0aW9uID09IE5TTm90Rm91bmQgPyBzdHJp
bmdMZW5ndGggOiBob3N0TmFtZVRlcm1pbmF0b3IubG9jYXRpb247Ci0KLSAgICAvLyBGaW5kICJA
IiBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBob3N0IG5hbWUuCi0gICAgTlNSYW5nZSB1c2VySW5mb1Rl
cm1pbmF0b3IgPSBbc3RyaW5nIHJhbmdlT2ZTdHJpbmc6QCJAIiBvcHRpb25zOjAgcmFuZ2U6TlNN
YWtlUmFuZ2UoYXV0aG9yaXR5U3RhcnQsIGhvc3ROYW1lRW5kIC0gYXV0aG9yaXR5U3RhcnQpXTsK
LSAgICB1bnNpZ25lZCBob3N0TmFtZVN0YXJ0ID0gdXNlckluZm9UZXJtaW5hdG9yLmxvY2F0aW9u
ID09IE5TTm90Rm91bmQgPyBhdXRob3JpdHlTdGFydCA6IE5TTWF4UmFuZ2UodXNlckluZm9UZXJt
aW5hdG9yKTsKLQotICAgIGYoc3RyaW5nLCBOU01ha2VSYW5nZShob3N0TmFtZVN0YXJ0LCBob3N0
TmFtZUVuZCAtIGhvc3ROYW1lU3RhcnQpLCBjb250ZXh0KTsKLX0KLQogQGltcGxlbWVudGF0aW9u
IE5TVVJMIChXZWJOU1VSTEV4dHJhcykKIAotc3RhdGljIHZvaWQgY29sbGVjdFJhbmdlc1RoYXRO
ZWVkTWFwcGluZyhOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJhbmdlLCB2b2lkICpjb250ZXh0
LCBCT09MIGVuY29kZSkKLXsKLSAgICBCT09MIG5lZWRzTWFwcGluZyA9IGVuY29kZQotICAgICAg
ICA/IFtzdHJpbmcgX3dlYl9ob3N0TmFtZU5lZWRzRW5jb2RpbmdXaXRoUmFuZ2U6cmFuZ2VdCi0g
ICAgICAgIDogW3N0cmluZyBfd2ViX2hvc3ROYW1lTmVlZHNEZWNvZGluZ1dpdGhSYW5nZTpyYW5n
ZV07Ci0gICAgaWYgKCFuZWVkc01hcHBpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIE5TTXV0YWJsZUFycmF5ICoqYXJyYXkgPSAoTlNNdXRhYmxlQXJyYXkgKiopY29udGV4dDsK
LSAgICBpZiAoKmFycmF5ID09IG5pbCkgewotICAgICAgICAqYXJyYXkgPSBbW05TTXV0YWJsZUFy
cmF5IGFsbG9jXSBpbml0XTsKLSAgICB9Ci0KLSAgICBbKmFycmF5IGFkZE9iamVjdDpbTlNWYWx1
ZSB2YWx1ZVdpdGhSYW5nZTpyYW5nZV1dOwotfQotCi1zdGF0aWMgdm9pZCBjb2xsZWN0UmFuZ2Vz
VGhhdE5lZWRFbmNvZGluZyhOU1N0cmluZyAqc3RyaW5nLCBOU1JhbmdlIHJhbmdlLCB2b2lkICpj
b250ZXh0KQotewotICAgIHJldHVybiBjb2xsZWN0UmFuZ2VzVGhhdE5lZWRNYXBwaW5nKHN0cmlu
ZywgcmFuZ2UsIGNvbnRleHQsIFlFUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbGxlY3RSYW5nZXNU
aGF0TmVlZERlY29kaW5nKE5TU3RyaW5nICpzdHJpbmcsIE5TUmFuZ2UgcmFuZ2UsIHZvaWQgKmNv
bnRleHQpCi17Ci0gICAgcmV0dXJuIGNvbGxlY3RSYW5nZXNUaGF0TmVlZE1hcHBpbmcoc3RyaW5n
LCByYW5nZSwgY29udGV4dCwgTk8pOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKm1hcEhvc3ROYW1l
cyhOU1N0cmluZyAqc3RyaW5nLCBCT09MIGVuY29kZSkKLXsKLSAgICAvLyBHZW5lcmFsbHksIHdl
IHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9uZSBob3N0IG5h
bWUgdGhhdCBkb2VzIG5vdCBuZWVkIG1hcHBpbmcuCi0gICAgCi0gICAgaWYgKGVuY29kZSAmJiBb
c3RyaW5nIGNhbkJlQ29udmVydGVkVG9FbmNvZGluZzpOU0FTQ0lJU3RyaW5nRW5jb2RpbmddKQot
ICAgICAgICByZXR1cm4gc3RyaW5nOwotCi0gICAgLy8gTWFrZSBhIGxpc3Qgb2YgcmFuZ2VzIHRo
YXQgYWN0dWFsbHkgbmVlZCBtYXBwaW5nLgotICAgIE5TTXV0YWJsZUFycmF5ICpob3N0TmFtZVJh
bmdlcyA9IG5pbDsKLSAgICBTdHJpbmdSYW5nZUFwcGxpZXJGdW5jdGlvbiBmID0gZW5jb2RlCi0g
ICAgICAgID8gY29sbGVjdFJhbmdlc1RoYXROZWVkRW5jb2RpbmcKLSAgICAgICAgOiBjb2xsZWN0
UmFuZ2VzVGhhdE5lZWREZWNvZGluZzsKLSAgICBhcHBseUhvc3ROYW1lRnVuY3Rpb25Ub1VSTFN0
cmluZyhzdHJpbmcsIGYsICZob3N0TmFtZVJhbmdlcyk7Ci0gICAgaWYgKGhvc3ROYW1lUmFuZ2Vz
ID09IG5pbCkKLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLQotICAgIC8vIERvIHRoZSBtYXBwaW5n
LgotICAgIE5TTXV0YWJsZVN0cmluZyAqbXV0YWJsZUNvcHkgPSBbc3RyaW5nIG11dGFibGVDb3B5
XTsKLSAgICB1bnNpZ25lZCBpID0gW2hvc3ROYW1lUmFuZ2VzIGNvdW50XTsKLSAgICB3aGlsZSAo
aS0tICE9IDApIHsKLSAgICAgICAgTlNSYW5nZSBob3N0TmFtZVJhbmdlID0gW1tob3N0TmFtZVJh
bmdlcyBvYmplY3RBdEluZGV4OmldIHJhbmdlVmFsdWVdOwotICAgICAgICBOU1N0cmluZyAqbWFw
cGVkSG9zdE5hbWUgPSBlbmNvZGUKLSAgICAgICAgICAgID8gW3N0cmluZyBfd2ViX2VuY29kZUhv
c3ROYW1lV2l0aFJhbmdlOmhvc3ROYW1lUmFuZ2VdCi0gICAgICAgICAgICA6IFtzdHJpbmcgX3dl
Yl9kZWNvZGVIb3N0TmFtZVdpdGhSYW5nZTpob3N0TmFtZVJhbmdlXTsKLSAgICAgICAgW211dGFi
bGVDb3B5IHJlcGxhY2VDaGFyYWN0ZXJzSW5SYW5nZTpob3N0TmFtZVJhbmdlIHdpdGhTdHJpbmc6
bWFwcGVkSG9zdE5hbWVdOwotICAgIH0KLSAgICBbaG9zdE5hbWVSYW5nZXMgcmVsZWFzZV07Ci0g
ICAgcmV0dXJuIFttdXRhYmxlQ29weSBhdXRvcmVsZWFzZV07Ci19Ci0KICsgKE5TVVJMICopX3dl
Yl9VUkxXaXRoVXNlclR5cGVkU3RyaW5nOihOU1N0cmluZyAqKXN0cmluZyByZWxhdGl2ZVRvVVJM
OihOU1VSTCAqKVVSTAogewotICAgIGlmIChzdHJpbmcgPT0gbmlsKSB7Ci0gICAgICAgIHJldHVy
biBuaWw7Ci0gICAgfQotICAgIHN0cmluZyA9IG1hcEhvc3ROYW1lcyhbc3RyaW5nIF93ZWJraXRf
c3RyaW5nQnlUcmltbWluZ1doaXRlc3BhY2VdLCBZRVMpOwotCi0gICAgTlNEYXRhICp1c2VyVHlw
ZWREYXRhID0gW3N0cmluZyBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107
Ci0gICAgQVNTRVJUKHVzZXJUeXBlZERhdGEpOwotCi0gICAgY29uc3QgVUludDggKmluQnl0ZXMg
PSBzdGF0aWNfY2FzdDxjb25zdCBVSW50OCAqPihbdXNlclR5cGVkRGF0YSBieXRlc10pOwotICAg
IGludCBpbkxlbmd0aCA9IFt1c2VyVHlwZWREYXRhIGxlbmd0aF07Ci0gICAgaWYgKGluTGVuZ3Ro
ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFtOU1VSTCBVUkxXaXRoU3RyaW5nOkAiIl07Ci0gICAg
fQotICAgIAotICAgIGNoYXIgKm91dEJ5dGVzID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihtYWxsb2Mo
aW5MZW5ndGggKiAzKSk7IC8vIGxhcmdlIGVub3VnaCB0byAlLWVzY2FwZSBldmVyeSBjaGFyYWN0
ZXIKLSAgICBjaGFyICpwID0gb3V0Qnl0ZXM7Ci0gICAgaW50IG91dExlbmd0aCA9IDA7Ci0gICAg
aW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgVUlu
dDggYyA9IGluQnl0ZXNbaV07Ci0gICAgICAgIGlmIChjIDw9IDB4MjAgfHwgYyA+PSAweDdmKSB7
Ci0gICAgICAgICAgICAqcCsrID0gJyUnOwotICAgICAgICAgICAgKnArKyA9IGhleERpZ2l0KGMg
Pj4gNCk7Ci0gICAgICAgICAgICAqcCsrID0gaGV4RGlnaXQoYyAmIDB4Zik7Ci0gICAgICAgICAg
ICBvdXRMZW5ndGggKz0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICpwKysgPSBjOwotICAgICAgICAgICAgb3V0TGVuZ3RoKys7Ci0gICAgICAgIH0KLSAgICB9Ci0g
Ci0gICAgTlNEYXRhICpkYXRhID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5Om91dEJ5dGVz
IGxlbmd0aDpvdXRMZW5ndGhdOyAvLyBhZG9wdHMgb3V0Qnl0ZXMKLSAgICByZXR1cm4gW3NlbGYg
X3dlYl9VUkxXaXRoRGF0YTpkYXRhIHJlbGF0aXZlVG9VUkw6VVJMXTsKKyAgICByZXR1cm4gVVJM
V2l0aFVzZXJUeXBlZFN0cmluZyhzdHJpbmcsIFVSTCk7CiB9CiAKICsgKE5TVVJMICopX3dlYl9V
UkxXaXRoVXNlclR5cGVkU3RyaW5nOihOU1N0cmluZyAqKXN0cmluZwogewotICAgIHJldHVybiBb
c2VsZiBfd2ViX1VSTFdpdGhVc2VyVHlwZWRTdHJpbmc6c3RyaW5nIHJlbGF0aXZlVG9VUkw6bmls
XTsKKyAgICByZXR1cm4gVVJMV2l0aFVzZXJUeXBlZFN0cmluZyhzdHJpbmcsIG5pbCk7CiB9CiAK
ICsgKE5TVVJMICopX3dlYl9VUkxXaXRoRGF0YUFzU3RyaW5nOihOU1N0cmluZyAqKXN0cmluZwpA
QCAtNDE0LDE5MSArNzUsNDUgQEAgKyAoTlNVUkwgKilfd2ViX1VSTFdpdGhEYXRhQXNTdHJpbmc6
KE5TUwogICAgIH0KICAgICBzdHJpbmcgPSBbc3RyaW5nIF93ZWJraXRfc3RyaW5nQnlUcmltbWlu
Z1doaXRlc3BhY2VdOwogICAgIE5TRGF0YSAqZGF0YSA9IFtzdHJpbmcgZGF0YVVzaW5nRW5jb2Rp
bmc6TlNJU09MYXRpbjFTdHJpbmdFbmNvZGluZ107Ci0gICAgcmV0dXJuIFtzZWxmIF93ZWJfVVJM
V2l0aERhdGE6ZGF0YSByZWxhdGl2ZVRvVVJMOmJhc2VVUkxdOworICAgIHJldHVybiBVUkxXaXRo
RGF0YShkYXRhLCBiYXNlVVJMKTsKIH0KIAogKyAoTlNVUkwgKilfd2ViX1VSTFdpdGhEYXRhOihO
U0RhdGEgKilkYXRhCiB7Ci0gICAgcmV0dXJuIFtOU1VSTCBfd2ViX1VSTFdpdGhEYXRhOmRhdGEg
cmVsYXRpdmVUb1VSTDpuaWxdOworICAgIHJldHVybiBVUkxXaXRoRGF0YShkYXRhLCBuaWwpOwog
fSAgICAgIAogCiArIChOU1VSTCAqKV93ZWJfVVJMV2l0aERhdGE6KE5TRGF0YSAqKWRhdGEgcmVs
YXRpdmVUb1VSTDooTlNVUkwgKiliYXNlVVJMCiB7Ci0gICAgaWYgKGRhdGEgPT0gbmlsKQotICAg
ICAgICByZXR1cm4gbmlsOwotICAgIAotICAgIE5TVVJMICpyZXN1bHQgPSBuaWw7Ci0gICAgc2l6
ZV90IGxlbmd0aCA9IFtkYXRhIGxlbmd0aF07Ci0gICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAg
ICAgLy8gd29yayBhcm91bmQgPHJkYXI6Ly80NDcwNzcxPjogQ0ZVUkxDcmVhdGVBYnNvbHV0ZVVS
TFdpdGhCeXRlcyguLiwgVFJVRSkgZG9lc24ndCByZW1vdmUgbm9uLXBhdGggY29tcG9uZW50cy4K
LSAgICAgICAgYmFzZVVSTCA9IFtiYXNlVVJMIF93ZWJraXRfVVJMQnlSZW1vdmluZ1Jlc291cmNl
U3BlY2lmaWVyXTsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IFVJbnQ4ICpieXRlcyA9IHN0YXRp
Y19jYXN0PGNvbnN0IFVJbnQ4Kj4oW2RhdGEgYnl0ZXNdKTsKLQotICAgICAgICAvLyBDRlVSTENy
ZWF0ZUFic29sdXRlVVJMV2l0aEJ5dGVzIHdvdWxkIGNvbXBsYWluIHRvIGNvbnNvbGUgaWYgd2Ug
cGFzc2VkIGEgcGF0aCB0byBpdC4KLSAgICAgICAgaWYgKGJ5dGVzWzBdID09ICcvJyAmJiAhYmFz
ZVVSTCkKLSAgICAgICAgICAgIHJldHVybiBuaWw7Ci0KLSAgICAgICAgLy8gTk9URTogV2UgdXNl
IFVURi04IGhlcmUgc2luY2UgdGhpcyBlbmNvZGluZyBpcyB1c2VkIHdoZW4gY29tcHV0aW5nIHN0
cmluZ3Mgd2hlbiByZXR1cm5pbmcgVVJMIGNvbXBvbmVudHMKLSAgICAgICAgLy8gKGUuZyBjYWxs
cyB0byBOU1VSTCAtcGF0aCkuIEhvd2V2ZXIsIHRoaXMgZnVuY3Rpb24gaXMgbm90IHRvbGVyYW50
IG9mIGlsbGVnYWwgVVRGLTggc2VxdWVuY2VzLCB3aGljaAotICAgICAgICAvLyBjb3VsZCBlaXRo
ZXIgYmUgYSBtYWxmb3JtZWQgc3RyaW5nIG9yIGJ5dGVzIGluIGEgZGlmZmVyZW50IGVuY29kaW5n
LCBsaWtlIHNoaWZ0LWppcywgc28gd2UgZmFsbCBiYWNrCi0gICAgICAgIC8vIG9udG8gdXNpbmcg
SVNPIExhdGluIDEgaW4gdGhvc2UgY2FzZXMuCi0gICAgICAgIHJlc3VsdCA9IFdlYkNGQXV0b3Jl
bGVhc2UoQ0ZVUkxDcmVhdGVBYnNvbHV0ZVVSTFdpdGhCeXRlcyhOVUxMLCBieXRlcywgbGVuZ3Ro
LCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgsIChDRlVSTFJlZiliYXNlVVJMLCBZRVMpKTsKLSAgICAg
ICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICByZXN1bHQgPSBXZWJDRkF1dG9yZWxlYXNlKENG
VVJMQ3JlYXRlQWJzb2x1dGVVUkxXaXRoQnl0ZXMoTlVMTCwgYnl0ZXMsIGxlbmd0aCwga0NGU3Ry
aW5nRW5jb2RpbmdJU09MYXRpbjEsIChDRlVSTFJlZiliYXNlVVJMLCBZRVMpKTsKLSAgICB9IGVs
c2UKLSAgICAgICAgcmVzdWx0ID0gW05TVVJMIFVSTFdpdGhTdHJpbmc6QCIiXTsKLSAgICAKLSAg
ICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBVUkxXaXRoRGF0YShkYXRhLCBiYXNlVVJMKTsK
IH0KIAogLSAoTlNEYXRhICopX3dlYl9vcmlnaW5hbERhdGEKIHsKLSAgICBVSW50OCAqYnVmZmVy
ID0gKFVJbnQ4ICopbWFsbG9jKFVSTF9CWVRFU19CVUZGRVJfTEVOR1RIKTsKLSAgICBDRkluZGV4
IGJ5dGVzRmlsbGVkID0gQ0ZVUkxHZXRCeXRlcygoQ0ZVUkxSZWYpc2VsZiwgYnVmZmVyLCBVUkxf
QllURVNfQlVGRkVSX0xFTkdUSCk7Ci0gICAgaWYgKGJ5dGVzRmlsbGVkID09IC0xKSB7Ci0gICAg
ICAgIENGSW5kZXggYnl0ZXNUb0FsbG9jYXRlID0gQ0ZVUkxHZXRCeXRlcygoQ0ZVUkxSZWYpc2Vs
ZiwgTlVMTCwgMCk7Ci0gICAgICAgIGJ1ZmZlciA9IChVSW50OCAqKXJlYWxsb2MoYnVmZmVyLCBi
eXRlc1RvQWxsb2NhdGUpOwotICAgICAgICBieXRlc0ZpbGxlZCA9IENGVVJMR2V0Qnl0ZXMoKENG
VVJMUmVmKXNlbGYsIGJ1ZmZlciwgYnl0ZXNUb0FsbG9jYXRlKTsKLSAgICAgICAgQVNTRVJUKGJ5
dGVzRmlsbGVkID09IGJ5dGVzVG9BbGxvY2F0ZSk7Ci0gICAgfQotICAgIAotICAgIC8vIGJ1ZmZl
ciBpcyBhZG9wdGVkIGJ5IHRoZSBOU0RhdGEKLSAgICBOU0RhdGEgKmRhdGEgPSBbTlNEYXRhIGRh
dGFXaXRoQnl0ZXNOb0NvcHk6YnVmZmVyIGxlbmd0aDpieXRlc0ZpbGxlZCBmcmVlV2hlbkRvbmU6
WUVTXTsKLSAgICAKLSAgICBOU1VSTCAqYmFzZVVSTCA9IChOU1VSTCAqKUNGVVJMR2V0QmFzZVVS
TCgoQ0ZVUkxSZWYpc2VsZik7Ci0gICAgaWYgKGJhc2VVUkwpCi0gICAgICAgIHJldHVybiBbW05T
VVJMIF93ZWJfVVJMV2l0aERhdGE6ZGF0YSByZWxhdGl2ZVRvVVJMOmJhc2VVUkxdIF93ZWJfb3Jp
Z2luYWxEYXRhXTsKLSAgICByZXR1cm4gZGF0YTsKKyAgICByZXR1cm4gb3JpZ2luYWxEYXRhKHNl
bGYpOwogfQogCiAtIChOU1N0cmluZyAqKV93ZWJfb3JpZ2luYWxEYXRhQXNTdHJpbmcKIHsKLSAg
ICByZXR1cm4gW1tbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRGF0YTpbc2VsZiBfd2ViX29yaWdp
bmFsRGF0YV0gZW5jb2Rpbmc6TlNJU09MYXRpbjFTdHJpbmdFbmNvZGluZ10gYXV0b3JlbGVhc2Vd
OwotfQotCi1zdGF0aWMgQ0ZTdHJpbmdSZWYgY3JlYXRlU3RyaW5nV2l0aEVzY2FwZWRVbnNhZmVD
aGFyYWN0ZXJzKENGU3RyaW5nUmVmIHN0cmluZykKLXsKLSAgICBDRkluZGV4IGxlbmd0aCA9IENG
U3RyaW5nR2V0TGVuZ3RoKHN0cmluZyk7Ci0gICAgVmVjdG9yPFVDaGFyLCAyMDQ4PiBzb3VyY2VC
dWZmZXIobGVuZ3RoKTsKLSAgICBDRlN0cmluZ0dldENoYXJhY3RlcnMoc3RyaW5nLCBDRlJhbmdl
TWFrZSgwLCBsZW5ndGgpLCBzb3VyY2VCdWZmZXIuZGF0YSgpKTsKLQotICAgIFZlY3RvcjxVQ2hh
ciwgMjA0OD4gb3V0QnVmZmVyOwotCi0gICAgQ0ZJbmRleCBpID0gMDsKLSAgICB3aGlsZSAoaSA8
IGxlbmd0aCkgewotICAgICAgICBVQ2hhcjMyIGM7Ci0gICAgICAgIFUxNl9ORVhUKHNvdXJjZUJ1
ZmZlciwgaSwgbGVuZ3RoLCBjKQotCi0gICAgICAgIGlmIChpc0xvb2thbGlrZUNoYXJhY3Rlcihj
KSkgewotICAgICAgICAgICAgdWludDhfdCB1dGY4QnVmZmVyWzRdOwotICAgICAgICAgICAgQ0ZJ
bmRleCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgVUJvb2wgZmFpbHVyZSA9IGZhbHNlOwotICAg
ICAgICAgICAgVThfQVBQRU5EKHV0ZjhCdWZmZXIsIG9mZnNldCwgNCwgYywgZmFpbHVyZSkKLSAg
ICAgICAgICAgIEFTU0VSVCghZmFpbHVyZSk7Ci0KLSAgICAgICAgICAgIGZvciAoQ0ZJbmRleCBq
ID0gMDsgaiA8IG9mZnNldDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVu
ZCgnJScpOwotICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQoaGV4RGlnaXQodXRmOEJ1
ZmZlcltqXSA+PiA0KSk7Ci0gICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZChoZXhEaWdp
dCh1dGY4QnVmZmVyW2pdICYgMHhmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBVQ2hhciB1dGYxNkJ1ZmZlclsyXTsKLSAgICAgICAgICAgIENGSW5kZXgg
b2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIFVCb29sIGZhaWx1cmUgPSBmYWxzZTsKLSAgICAgICAg
ICAgIFUxNl9BUFBFTkQodXRmMTZCdWZmZXIsIG9mZnNldCwgMiwgYywgZmFpbHVyZSkKLSAgICAg
ICAgICAgIEFTU0VSVCghZmFpbHVyZSk7Ci0gICAgICAgICAgICBmb3IgKENGSW5kZXggaiA9IDA7
IGogPCBvZmZzZXQ7ICsraikKLSAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKHV0ZjE2
QnVmZmVyW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBDRlN0cmluZ0NyZWF0
ZVdpdGhDaGFyYWN0ZXJzKE5VTEwsIG91dEJ1ZmZlci5kYXRhKCksIG91dEJ1ZmZlci5zaXplKCkp
OworICAgIHJldHVybiBbW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOm9yaWdpbmFsRGF0
YShzZWxmKSBlbmNvZGluZzpOU0lTT0xhdGluMVN0cmluZ0VuY29kaW5nXSBhdXRvcmVsZWFzZV07
CiB9CiAKIC0gKE5TU3RyaW5nICopX3dlYl91c2VyVmlzaWJsZVN0cmluZwogewotICAgIE5TRGF0
YSAqZGF0YSA9IFtzZWxmIF93ZWJfb3JpZ2luYWxEYXRhXTsKLSAgICBjb25zdCB1bnNpZ25lZCBj
aGFyICpiZWZvcmUgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oW2RhdGEgYnl0
ZXNdKTsKLSAgICBpbnQgbGVuZ3RoID0gW2RhdGEgbGVuZ3RoXTsKLQotICAgIGJvb2wgbmVlZHNI
b3N0TmFtZURlY29kaW5nID0gZmFsc2U7Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0g
YmVmb3JlOwotICAgIGludCBidWZmZXJMZW5ndGggPSAobGVuZ3RoICogMykgKyAxOwotICAgIGNo
YXIgKmFmdGVyID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihtYWxsb2MoYnVmZmVyTGVuZ3RoKSk7IC8v
IGxhcmdlIGVub3VnaCB0byAlLWVzY2FwZSBldmVyeSBjaGFyYWN0ZXIKLSAgICBjaGFyICpxID0g
YWZ0ZXI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0g
ICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHBbaV07Ci0gICAgICAgIC8vIHVuZXNjYXBlIGVzY2Fw
ZSBzZXF1ZW5jZXMgdGhhdCBpbmRpY2F0ZSBieXRlcyBncmVhdGVyIHRoYW4gMHg3ZgotICAgICAg
ICBpZiAoYyA9PSAnJScgJiYgKGkgKyAxIDwgbGVuZ3RoICYmIGlzSGV4RGlnaXQocFtpICsgMV0p
KSAmJiBpICsgMiA8IGxlbmd0aCAmJiBpc0hleERpZ2l0KHBbaSArIDJdKSkgewotICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciB1ID0gKGhleERpZ2l0VmFsdWUocFtpICsgMV0pIDw8IDQpIHwgaGV4
RGlnaXRWYWx1ZShwW2kgKyAyXSk7Ci0gICAgICAgICAgICBpZiAodSA+IDB4N2YpIHsKLSAgICAg
ICAgICAgICAgICAvLyB1bmVzY2FwZQotICAgICAgICAgICAgICAgICpxKysgPSB1OwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgdW5lc2NhcGUKLSAgICAg
ICAgICAgICAgICAqcSsrID0gcFtpXTsKLSAgICAgICAgICAgICAgICAqcSsrID0gcFtpICsgMV07
Ci0gICAgICAgICAgICAgICAgKnErKyA9IHBbaSArIDJdOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnErKyA9IGM7Ci0K
LSAgICAgICAgICAgIC8vIENoZWNrIGZvciAieG4tLSIgaW4gYW4gZWZmaWNpZW50LCBub24tY2Fz
ZS1zZW5zaXRpdmUsIHdheS4KLSAgICAgICAgICAgIGlmIChjID09ICctJyAmJiBpID49IDMgJiYg
IW5lZWRzSG9zdE5hbWVEZWNvZGluZyAmJiAocVstNF0gfCAweDIwKSA9PSAneCcgJiYgKHFbLTNd
IHwgMHgyMCkgPT0gJ24nICYmIHFbLTJdID09ICctJykKLSAgICAgICAgICAgICAgICBuZWVkc0hv
c3ROYW1lRGVjb2RpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgICpxID0gJ1wwJzsK
LSAgICAKLSAgICAvLyBDaGVjayBzdHJpbmcgdG8gc2VlIGlmIGl0IGNhbiBiZSBjb252ZXJ0ZWQg
dG8gZGlzcGxheSB1c2luZyBVVEYtOCAgCi0gICAgTlNTdHJpbmcgKnJlc3VsdCA9IFtOU1N0cmlu
ZyBzdHJpbmdXaXRoVVRGOFN0cmluZzphZnRlcl07Ci0gICAgaWYgKCFyZXN1bHQpIHsKLSAgICAg
ICAgLy8gQ291bGQgbm90IGNvbnZlcnQgdG8gVVRGLTguCi0gICAgICAgIC8vIENvbnZlcnQgY2hh
cmFjdGVycyBncmVhdGVyIHRoYW4gMHg3ZiB0byBlc2NhcGUgc2VxdWVuY2VzLgotICAgICAgICAv
LyBTaGlmdCBjdXJyZW50IHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICAgICAg
Ly8gdGhlbiB3ZSB3aWxsIGNvcHkgYmFjayBieXRlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZl
ciAKLSAgICAgICAgLy8gYXMgd2UgY29udmVydC4KLSAgICAgICAgaW50IGFmdGVybGVuZ3RoID0g
cSAtIGFmdGVyOwotICAgICAgICBjaGFyICpwID0gYWZ0ZXIgKyBidWZmZXJMZW5ndGggLSBhZnRl
cmxlbmd0aCAtIDE7Ci0gICAgICAgIG1lbW1vdmUocCwgYWZ0ZXIsIGFmdGVybGVuZ3RoICsgMSk7
IC8vIGNvcGllcyB0cmFpbGluZyAnXDAnCi0gICAgICAgIGNoYXIgKnEgPSBhZnRlcjsKLSAgICAg
ICAgd2hpbGUgKCpwKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqcDsKLSAgICAg
ICAgICAgIGlmIChjID4gMHg3ZikgewotICAgICAgICAgICAgICAgICpxKysgPSAnJSc7Ci0gICAg
ICAgICAgICAgICAgKnErKyA9IGhleERpZ2l0KGMgPj4gNCk7Ci0gICAgICAgICAgICAgICAgKnEr
KyA9IGhleERpZ2l0KGMgJiAweGYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAqcSsrID0gKnA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAg
IH0KLSAgICAgICAgKnEgPSAnXDAnOwotICAgICAgICByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6YWZ0ZXJdOwotICAgIH0KLQotICAgIGZyZWUoYWZ0ZXIpOwotCi0gICAg
cmVzdWx0ID0gbWFwSG9zdE5hbWVzKHJlc3VsdCwgIW5lZWRzSG9zdE5hbWVEZWNvZGluZyk7Ci0g
ICAgcmVzdWx0ID0gW3Jlc3VsdCBwcmVjb21wb3NlZFN0cmluZ1dpdGhDYW5vbmljYWxNYXBwaW5n
XTsKLSAgICByZXR1cm4gV2ViQ0ZBdXRvcmVsZWFzZShjcmVhdGVTdHJpbmdXaXRoRXNjYXBlZFVu
c2FmZUNoYXJhY3RlcnMoKENGU3RyaW5nUmVmKXJlc3VsdCkpOworICAgIHJldHVybiB1c2VyVmlz
aWJsZVN0cmluZyhzZWxmKTsKIH0KIAogLSAoQk9PTClfd2ViX2lzRW1wdHkKIHsKICAgICBpZiAo
IUNGVVJMR2V0QmFzZVVSTCgoQ0ZVUkxSZWYpc2VsZikpCiAgICAgICAgIHJldHVybiBDRlVSTEdl
dEJ5dGVzKChDRlVSTFJlZilzZWxmLCBOVUxMLCAwKSA9PSAwOwotICAgIHJldHVybiBbW3NlbGYg
X3dlYl9vcmlnaW5hbERhdGFdIGxlbmd0aF0gPT0gMDsKKyAgICByZXR1cm4gW29yaWdpbmFsRGF0
YShzZWxmKSBsZW5ndGhdID09IDA7CiB9CiAKIC0gKGNvbnN0IGNoYXIgKilfd2ViX1VSTENTdHJp
bmcKIHsKICAgICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YV07Ci0g
ICAgW2RhdGEgYXBwZW5kRGF0YTpbc2VsZiBfd2ViX29yaWdpbmFsRGF0YV1dOworICAgIFtkYXRh
IGFwcGVuZERhdGE6b3JpZ2luYWxEYXRhKHNlbGYpXTsKICAgICBbZGF0YSBhcHBlbmRCeXRlczoi
XDAiIGxlbmd0aDoxXTsKICAgICByZXR1cm4gKGNvbnN0IGNoYXIgKilbZGF0YSBieXRlc107CiAg
fQpAQCAtNjI2LDc2ICsxNDEsMjIgQEAgLSAoTlNVUkwgKilfd2Via2l0X2Nhbm9uaWNhbGl6ZQog
CiAtIChOU1VSTCAqKV93ZWJfVVJMQnlUcnVuY2F0aW5nT25lQ2hhcmFjdGVyQmVmb3JlQ29tcG9u
ZW50OihDRlVSTENvbXBvbmVudFR5cGUpY29tcG9uZW50CiB7Ci0gICAgQ0ZSYW5nZSBmcmFnUmcg
PSBDRlVSTEdldEJ5dGVSYW5nZUZvckNvbXBvbmVudCgoQ0ZVUkxSZWYpc2VsZiwgY29tcG9uZW50
LCBOVUxMKTsKLSAgICBpZiAoZnJhZ1JnLmxvY2F0aW9uID09IGtDRk5vdEZvdW5kKQotICAgICAg
ICByZXR1cm4gc2VsZjsKLSAKLSAgICBVSW50OCAqdXJsQnl0ZXMsIGJ1ZmZlclsyMDQ4XTsKLSAg
ICBDRkluZGV4IG51bUJ5dGVzID0gQ0ZVUkxHZXRCeXRlcygoQ0ZVUkxSZWYpc2VsZiwgYnVmZmVy
LCAyMDQ4KTsKLSAgICBpZiAobnVtQnl0ZXMgPT0gLTEpIHsKLSAgICAgICAgbnVtQnl0ZXMgPSBD
RlVSTEdldEJ5dGVzKChDRlVSTFJlZilzZWxmLCBOVUxMLCAwKTsKLSAgICAgICAgdXJsQnl0ZXMg
PSBzdGF0aWNfY2FzdDxVSW50OCo+KG1hbGxvYyhudW1CeXRlcykpOwotICAgICAgICBDRlVSTEdl
dEJ5dGVzKChDRlVSTFJlZilzZWxmLCB1cmxCeXRlcywgbnVtQnl0ZXMpOwotICAgIH0gZWxzZQot
ICAgICAgICB1cmxCeXRlcyA9IGJ1ZmZlcjsKLSAgICAgCi0gICAgTlNVUkwgKnJlc3VsdCA9IChO
U1VSTCAqKUNGTWFrZUNvbGxlY3RhYmxlKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIHVybEJ5
dGVzLCBmcmFnUmcubG9jYXRpb24gLSAxLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgsIE5VTEwpKTsK
LSAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgcmVzdWx0ID0gKE5TVVJMICopQ0ZNYWtlQ29sbGVj
dGFibGUoQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoTlVMTCwgdXJsQnl0ZXMsIGZyYWdSZy5sb2NhdGlv
biAtIDEsIGtDRlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xLCBOVUxMKSk7Ci0gICAgIAotICAgIGlm
ICh1cmxCeXRlcyAhPSBidWZmZXIpIGZyZWUodXJsQnl0ZXMpOwotICAgIHJldHVybiByZXN1bHQg
PyBbcmVzdWx0IGF1dG9yZWxlYXNlXSA6IHNlbGY7CisgICAgcmV0dXJuIFVSTEJ5VHJ1bmNhdGlu
Z09uZUNoYXJhY3RlckJlZm9yZUNvbXBvbmVudChzZWxmLCBjb21wb25lbnQpOwogfQogCiAtIChO
U1VSTCAqKV93ZWJraXRfVVJMQnlSZW1vdmluZ0ZyYWdtZW50CiB7Ci0gICAgcmV0dXJuIFtzZWxm
IF93ZWJfVVJMQnlUcnVuY2F0aW5nT25lQ2hhcmFjdGVyQmVmb3JlQ29tcG9uZW50OmtDRlVSTENv
bXBvbmVudEZyYWdtZW50XTsKKyAgICByZXR1cm4gVVJMQnlUcnVuY2F0aW5nT25lQ2hhcmFjdGVy
QmVmb3JlQ29tcG9uZW50KHNlbGYsIGtDRlVSTENvbXBvbmVudEZyYWdtZW50KTsKIH0KIAogLSAo
TlNVUkwgKilfd2Via2l0X1VSTEJ5UmVtb3ZpbmdSZXNvdXJjZVNwZWNpZmllcgogewotICAgIHJl
dHVybiBbc2VsZiBfd2ViX1VSTEJ5VHJ1bmNhdGluZ09uZUNoYXJhY3RlckJlZm9yZUNvbXBvbmVu
dDprQ0ZVUkxDb21wb25lbnRSZXNvdXJjZVNwZWNpZmllcl07Ci19Ci0KLS0gKE5TVVJMICopX3dl
Yl9VUkxCeVJlbW92aW5nQ29tcG9uZW50QW5kU3Vic2VxdWVudENoYXJhY3RlcjooQ0ZVUkxDb21w
b25lbnRUeXBlKWNvbXBvbmVudAotewotICAgIENGUmFuZ2UgcmFuZ2UgPSBDRlVSTEdldEJ5dGVS
YW5nZUZvckNvbXBvbmVudCgoQ0ZVUkxSZWYpc2VsZiwgY29tcG9uZW50LCAwKTsKLSAgICBpZiAo
cmFuZ2UubG9jYXRpb24gPT0ga0NGTm90Rm91bmQpCi0gICAgICAgIHJldHVybiBzZWxmOwotCi0g
ICAgLy8gUmVtb3ZlIG9uZSBzdWJzZXF1ZW50IGNoYXJhY3Rlci4KLSAgICArK3JhbmdlLmxlbmd0
aDsKLQotICAgIFVJbnQ4KiB1cmxCeXRlczsKLSAgICBVSW50OCBidWZmZXJbMjA0OF07Ci0gICAg
Q0ZJbmRleCBudW1CeXRlcyA9IENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVmKXNlbGYsIGJ1ZmZlciwg
MjA0OCk7Ci0gICAgaWYgKG51bUJ5dGVzID09IC0xKSB7Ci0gICAgICAgIG51bUJ5dGVzID0gQ0ZV
UkxHZXRCeXRlcygoQ0ZVUkxSZWYpc2VsZiwgTlVMTCwgMCk7Ci0gICAgICAgIHVybEJ5dGVzID0g
c3RhdGljX2Nhc3Q8VUludDgqPihtYWxsb2MobnVtQnl0ZXMpKTsKLSAgICAgICAgQ0ZVUkxHZXRC
eXRlcygoQ0ZVUkxSZWYpc2VsZiwgdXJsQnl0ZXMsIG51bUJ5dGVzKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgdXJsQnl0ZXMgPSBidWZmZXI7Ci0KLSAgICBpZiAobnVtQnl0ZXMgPCByYW5nZS5sb2Nh
dGlvbikKLSAgICAgICAgcmV0dXJuIHNlbGY7Ci0gICAgaWYgKG51bUJ5dGVzIDwgcmFuZ2UubG9j
YXRpb24gKyByYW5nZS5sZW5ndGgpCi0gICAgICAgIHJhbmdlLmxlbmd0aCA9IG51bUJ5dGVzIC0g
cmFuZ2UubG9jYXRpb247Ci0KLSAgICBtZW1tb3ZlKHVybEJ5dGVzICsgcmFuZ2UubG9jYXRpb24s
IHVybEJ5dGVzICsgcmFuZ2UubG9jYXRpb24gKyByYW5nZS5sZW5ndGgsIG51bUJ5dGVzIC0gcmFu
Z2UubG9jYXRpb24gKyByYW5nZS5sZW5ndGgpOwotCi0gICAgTlNVUkwgKnJlc3VsdCA9IChOU1VS
TCAqKUNGTWFrZUNvbGxlY3RhYmxlKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIHVybEJ5dGVz
LCBudW1CeXRlcyAtIHJhbmdlLmxlbmd0aCwga0NGU3RyaW5nRW5jb2RpbmdVVEY4LCBOVUxMKSk7
Ci0gICAgaWYgKCFyZXN1bHQpCi0gICAgICAgIHJlc3VsdCA9IChOU1VSTCAqKUNGTWFrZUNvbGxl
Y3RhYmxlKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIHVybEJ5dGVzLCBudW1CeXRlcyAtIHJh
bmdlLmxlbmd0aCwga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEsIE5VTEwpKTsKLQotICAgIGlm
ICh1cmxCeXRlcyAhPSBidWZmZXIpCi0gICAgICAgIGZyZWUodXJsQnl0ZXMpOwotCi0gICAgcmV0
dXJuIHJlc3VsdCA/IFtyZXN1bHQgYXV0b3JlbGVhc2VdIDogc2VsZjsKKyAgICByZXR1cm4gVVJM
QnlUcnVuY2F0aW5nT25lQ2hhcmFjdGVyQmVmb3JlQ29tcG9uZW50KHNlbGYsIGtDRlVSTENvbXBv
bmVudFJlc291cmNlU3BlY2lmaWVyKTsKIH0KIAogLSAoTlNVUkwgKilfd2ViX1VSTEJ5UmVtb3Zp
bmdVc2VySW5mbwogewotICAgIHJldHVybiBbc2VsZiBfd2ViX1VSTEJ5UmVtb3ZpbmdDb21wb25l
bnRBbmRTdWJzZXF1ZW50Q2hhcmFjdGVyOmtDRlVSTENvbXBvbmVudFVzZXJJbmZvXTsKKyAgICBy
ZXR1cm4gVVJMQnlSZW1vdmluZ1VzZXJJbmZvKHNlbGYpOwogfQogCiAtIChCT09MKV93ZWJraXRf
aXNKYXZhU2NyaXB0VVJMCkBAIC03NjQsMTYgKzIyNSw2IEBAIC0gKE5TVVJMICopX3dlYl9VUkxX
aXRoTG93ZXJjYXNlZFNjaGVtZQogfQogCiAKLS0oQk9PTClfd2ViX2hhc1F1ZXN0aW9uTWFya09u
bHlRdWVyeVN0cmluZwotewotICAgIENGUmFuZ2UgcmFuZ2VXaXRoU2VwYXJhdG9yczsKLSAgICBD
RlVSTEdldEJ5dGVSYW5nZUZvckNvbXBvbmVudCgoQ0ZVUkxSZWYpc2VsZiwga0NGVVJMQ29tcG9u
ZW50UXVlcnksICZyYW5nZVdpdGhTZXBhcmF0b3JzKTsKLSAgICBpZiAocmFuZ2VXaXRoU2VwYXJh
dG9ycy5sb2NhdGlvbiAhPSBrQ0ZOb3RGb3VuZCAmJiByYW5nZVdpdGhTZXBhcmF0b3JzLmxlbmd0
aCA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICAgIHJldHVybiBOTzsKLX0K
LQogLShOU0RhdGEgKilfd2ViX3NjaGVtZVNlcGFyYXRvcldpdGhvdXRDb2xvbgogewogICAgIE5T
RGF0YSAqcmVzdWx0ID0gbmlsOwpAQCAtNzkwLDc3ICsyNDEsMTkgQEAgLShOU0RhdGEgKilfd2Vi
X3NjaGVtZVNlcGFyYXRvcldpdGhvdXRDbwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNkZWZp
bmUgY29tcGxldGVVUkwgKENGVVJMQ29tcG9uZW50VHlwZSktMQotCiAtKE5TRGF0YSAqKV93ZWJf
ZGF0YUZvclVSTENvbXBvbmVudFR5cGU6KENGVVJMQ29tcG9uZW50VHlwZSljb21wb25lbnRUeXBl
CiB7Ci0gICAgc3RhdGljIGludCBVUkxDb21wb25lbnRUeXBlQnVmZmVyTGVuZ3RoID0gMjA0ODsK
LSAgICAKLSAgICBVSW50OCBzdGF0aWNBbGxCeXRlc0J1ZmZlcltVUkxDb21wb25lbnRUeXBlQnVm
ZmVyTGVuZ3RoXTsKLSAgICBVSW50OCAqYWxsQnl0ZXNCdWZmZXIgPSBzdGF0aWNBbGxCeXRlc0J1
ZmZlcjsKLSAgICAKLSAgICBDRkluZGV4IGJ5dGVzRmlsbGVkID0gQ0ZVUkxHZXRCeXRlcygoQ0ZV
UkxSZWYpc2VsZiwgYWxsQnl0ZXNCdWZmZXIsIFVSTENvbXBvbmVudFR5cGVCdWZmZXJMZW5ndGgp
OwotICAgIGlmIChieXRlc0ZpbGxlZCA9PSAtMSkgewotICAgICAgICBDRkluZGV4IGJ5dGVzVG9B
bGxvY2F0ZSA9IENGVVJMR2V0Qnl0ZXMoKENGVVJMUmVmKXNlbGYsIE5VTEwsIDApOwotICAgICAg
ICBhbGxCeXRlc0J1ZmZlciA9IHN0YXRpY19jYXN0PFVJbnQ4ICo+KG1hbGxvYyhieXRlc1RvQWxs
b2NhdGUpKTsKLSAgICAgICAgYnl0ZXNGaWxsZWQgPSBDRlVSTEdldEJ5dGVzKChDRlVSTFJlZilz
ZWxmLCBhbGxCeXRlc0J1ZmZlciwgYnl0ZXNUb0FsbG9jYXRlKTsKLSAgICB9Ci0gICAgCi0gICAg
Q0ZSYW5nZSByYW5nZTsKLSAgICBpZiAoY29tcG9uZW50VHlwZSAhPSBjb21wbGV0ZVVSTCkgewot
ICAgICAgICByYW5nZSA9IENGVVJMR2V0Qnl0ZVJhbmdlRm9yQ29tcG9uZW50KChDRlVSTFJlZilz
ZWxmLCBjb21wb25lbnRUeXBlLCBOVUxMKTsKLSAgICAgICAgaWYgKHJhbmdlLmxvY2F0aW9uID09
IGtDRk5vdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmlsOwotICAgICAgICB9Ci0gICAg
fQotICAgIGVsc2UgewotICAgICAgICByYW5nZS5sb2NhdGlvbiA9IDA7Ci0gICAgICAgIHJhbmdl
Lmxlbmd0aCA9IGJ5dGVzRmlsbGVkOwotICAgIH0KLSAgICAKLSAgICBOU0RhdGEgKmNvbXBvbmVu
dERhdGEgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6YWxsQnl0ZXNCdWZmZXIgKyByYW5nZS5sb2Nh
dGlvbiBsZW5ndGg6cmFuZ2UubGVuZ3RoXTsgCi0gICAgCi0gICAgY29uc3QgdW5zaWduZWQgY2hh
ciAqYnl0ZXMgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KFtjb21wb25lbnRE
YXRhIGJ5dGVzXSk7Ci0gICAgTlNNdXRhYmxlRGF0YSAqcmVzdWx0RGF0YSA9IFtOU011dGFibGVE
YXRhIGRhdGFdOwotICAgIC8vIE5PVEU6IGFkZCBsZWFkaW5nICc/JyB0byBxdWVyeSBzdHJpbmdz
IG5vbi16ZXJvIGxlbmd0aCBxdWVyeSBzdHJpbmdzLgotICAgIC8vIE5PVEU6IHJldGFpbiBxdWVz
dGlvbi1tYXJrIG9ubHkgcXVlcnkgc3RyaW5ncy4KLSAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBr
Q0ZVUkxDb21wb25lbnRRdWVyeSkgewotICAgICAgICBpZiAocmFuZ2UubGVuZ3RoID4gMCB8fCBb
c2VsZiBfd2ViX2hhc1F1ZXN0aW9uTWFya09ubHlRdWVyeVN0cmluZ10pIHsKLSAgICAgICAgICAg
IFtyZXN1bHREYXRhIGFwcGVuZEJ5dGVzOiI/IiBsZW5ndGg6MV07ICAgIAotICAgICAgICB9Ci0g
ICAgfQotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykg
ewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBieXRlc1tpXTsKLSAgICAgICAgaWYgKGMgPD0g
MHgyMCB8fCBjID49IDB4N2YpIHsKLSAgICAgICAgICAgIGNoYXIgZXNjYXBlZFszXTsKLSAgICAg
ICAgICAgIGVzY2FwZWRbMF0gPSAnJSc7Ci0gICAgICAgICAgICBlc2NhcGVkWzFdID0gaGV4RGln
aXQoYyA+PiA0KTsKLSAgICAgICAgICAgIGVzY2FwZWRbMl0gPSBoZXhEaWdpdChjICYgMHhmKTsK
LSAgICAgICAgICAgIFtyZXN1bHREYXRhIGFwcGVuZEJ5dGVzOmVzY2FwZWQgbGVuZ3RoOjNdOyAg
ICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgYlsxXTsKLSAg
ICAgICAgICAgIGJbMF0gPSBjOwotICAgICAgICAgICAgW3Jlc3VsdERhdGEgYXBwZW5kQnl0ZXM6
YiBsZW5ndGg6MV07ICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAot
ICAgIGlmIChzdGF0aWNBbGxCeXRlc0J1ZmZlciAhPSBhbGxCeXRlc0J1ZmZlcikgewotICAgICAg
ICBmcmVlKGFsbEJ5dGVzQnVmZmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdERh
dGE7CisgICAgcmV0dXJuIGRhdGFGb3JVUkxDb21wb25lbnRUeXBlKHNlbGYsIGNvbXBvbmVudFR5
cGUpOwogfQogCiAtKE5TRGF0YSAqKV93ZWJfc2NoZW1lRGF0YQogewotICAgIHJldHVybiBbc2Vs
ZiBfd2ViX2RhdGFGb3JVUkxDb21wb25lbnRUeXBlOmtDRlVSTENvbXBvbmVudFNjaGVtZV07Cisg
ICAgcmV0dXJuIGRhdGFGb3JVUkxDb21wb25lbnRUeXBlKHNlbGYsIGtDRlVSTENvbXBvbmVudFNj
aGVtZSk7CiB9CiAKIC0oTlNEYXRhICopX3dlYl9ob3N0RGF0YQogewotICAgIE5TRGF0YSAqcmVz
dWx0ID0gW3NlbGYgX3dlYl9kYXRhRm9yVVJMQ29tcG9uZW50VHlwZTprQ0ZVUkxDb21wb25lbnRI
b3N0XTsKKyAgICBOU0RhdGEgKnJlc3VsdCA9IGRhdGFGb3JVUkxDb21wb25lbnRUeXBlKHNlbGYs
IGtDRlVSTENvbXBvbmVudEhvc3QpOwogICAgIE5TRGF0YSAqc2NoZW1lID0gW3NlbGYgX3dlYl9z
Y2hlbWVEYXRhXTsKICAgICAvLyBUYWtlIG9mZiBsb2NhbGhvc3QgZm9yIGZpbGUKICAgICBpZiAo
W3NjaGVtZSBfd2ViX2lzQ2FzZUluc2Vuc2l0aXZlRXF1YWxUb0NTdHJpbmc6ImZpbGUiXSkgewpA
QCAtODk3LDQ5ICsyOTAsOSBAQCAtIChOU1VSTCAqKV93ZWJraXRfVVJMRnJvbVVSTE9yUGF0aAog
CiAtIChCT09MKV93ZWJfaXNVc2VyVmlzaWJsZVVSTAogewotICAgIEJPT0wgdmFsaWQgPSBZRVM7
Ci0gICAgLy8gZ2V0IGJ1ZmZlcgotCi0gICAgY2hhciBzdGF0aWNfYnVmZmVyWzEwMjRdOwotICAg
IGNvbnN0IGNoYXIgKnA7Ci0gICAgQk9PTCBzdWNjZXNzID0gQ0ZTdHJpbmdHZXRDU3RyaW5nKChD
RlN0cmluZ1JlZilzZWxmLCBzdGF0aWNfYnVmZmVyLCAxMDIzLCBrQ0ZTdHJpbmdFbmNvZGluZ1VU
RjgpOwotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIHAgPSBzdGF0aWNfYnVmZmVyOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIHAgPSBbc2VsZiBVVEY4U3RyaW5nXTsKLSAgICB9Ci0KLSAgICBp
bnQgbGVuZ3RoID0gc3RybGVuKHApOwotCi0gICAgLy8gY2hlY2sgZm9yIGNoYXJhY3RlcnMgPD0g
MHgyMCBvciA+PTB4N2YsICUtZXNjYXBlIHNlcXVlbmNlcyBvZiAlN2YsIGFuZCB4bi0tLCB0aGVz
ZQotICAgIC8vIGFyZSB0aGUgdGhpbmdzIHRoYXQgd2lsbCBsZWFkIF93ZWJfdXNlclZpc2libGVT
dHJpbmcgdG8gYWN0dWFsbHkgY2hhbmdlIHRoaW5ncy4KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkg
PSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gcFtpXTsK
LSAgICAgICAgLy8gZXNjYXBlIGNvbnRyb2wgY2hhcmFjdGVycywgc3BhY2UsIGFuZCBkZWxldGUK
LSAgICAgICAgaWYgKGMgPD0gMHgyMCB8fCBjID09IDB4N2YpIHsKLSAgICAgICAgICAgIHZhbGlk
ID0gTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChjID09ICclJyAm
JiAoaSArIDEgPCBsZW5ndGggJiYgaXNIZXhEaWdpdChwW2kgKyAxXSkpICYmIGkgKyAyIDwgbGVu
Z3RoICYmIGlzSGV4RGlnaXQocFtpICsgMl0pKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFy
IHUgPSAoaGV4RGlnaXRWYWx1ZShwW2kgKyAxXSkgPDwgNCkgfCBoZXhEaWdpdFZhbHVlKHBbaSAr
IDJdKTsKLSAgICAgICAgICAgIGlmICh1ID4gMHg3ZikgewotICAgICAgICAgICAgICAgIHZhbGlk
ID0gTk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBmb3IgInhu
LS0iIGluIGFuIGVmZmljaWVudCwgbm9uLWNhc2Utc2Vuc2l0aXZlLCB3YXkuCi0gICAgICAgICAg
ICBpZiAoYyA9PSAnLScgJiYgaSA+PSAzICYmIChwW2kgLSAzXSB8IDB4MjApID09ICd4JyAmJiAo
cFtpIC0gMl0gfCAweDIwKSA9PSAnbicgJiYgcFtpIC0gMV0gPT0gJy0nKSB7Ci0gICAgICAgICAg
ICAgICAgdmFsaWQgPSBOTzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YWxpZDsKKyAgICByZXR1cm4gaXNVc2Vy
VmlzaWJsZVVSTChzZWxmKTsKIH0KIAotCiAtIChCT09MKV93ZWJraXRfaXNKYXZhU2NyaXB0VVJM
CiB7CiAgICAgcmV0dXJuIFtzZWxmIF93ZWJraXRfaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4OkAi
amF2YXNjcmlwdDoiXTsKQEAgLTk3MywyMDQgKzMyNiwzNCBAQCAtIChCT09MKV93ZWJraXRfaXNG
VFBEaXJlY3RvcnlVUkwKICAgICByZXR1cm4gbGFzdENoYXIgPT0gJy8nICYmIFtzZWxmIF93ZWJr
aXRfaGFzQ2FzZUluc2Vuc2l0aXZlUHJlZml4OkAiZnRwOiJdOwogfQogCi0KLXN0YXRpYyBCT09M
IHJlYWRJRE5TY3JpcHRXaGl0ZUxpc3RGaWxlKE5TU3RyaW5nICpmaWxlbmFtZSkKLXsKLSAgICBp
ZiAoIWZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBOTzsKLSAgICB9Ci0gICAgRklMRSAqZmls
ZSA9IGZvcGVuKFtmaWxlbmFtZSBmaWxlU3lzdGVtUmVwcmVzZW50YXRpb25dLCAiciIpOwotICAg
IGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5POwotICAgIH0KLQotICAgIC8v
IFJlYWQgYSB3b3JkIGF0IGEgdGltZS4KLSAgICAvLyBBbGxvdyBjb21tZW50cywgc3RhcnRpbmcg
d2l0aCAjIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotICAgIHdoaWxlICgxKSB7
Ci0gICAgICAgIC8vIFNraXAgYSBjb21tZW50IGlmIHByZXNlbnQuCi0gICAgICAgIGludCByZXN1
bHQgPSBmc2NhbmYoZmlsZSwgIiAjJSpbXlxuXHJdJSpbXG5ccl0iKTsKLSAgICAgICAgaWYgKHJl
c3VsdCA9PSBFT0YpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gUmVhZCBhIHNjcmlwdCBuYW1lIGlmIHByZXNlbnQuCi0gICAgICAgIGNoYXIgd29yZFszM107
Ci0gICAgICAgIHJlc3VsdCA9IGZzY2FuZihmaWxlLCAiICUzMlteIyBcdFxuXHJdJSpbXiMgXHRc
blxyXSAiLCB3b3JkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBFT0YpIHsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gMSkgewotICAgICAgICAg
ICAgLy8gR290IGEgd29yZCwgbWFwIHRvIHNjcmlwdCBjb2RlIGFuZCBwdXQgaXQgaW50byB0aGUg
YXJyYXkuCi0gICAgICAgICAgICBpbnQzMl90IHNjcmlwdCA9IHVfZ2V0UHJvcGVydHlWYWx1ZUVu
dW0oVUNIQVJfU0NSSVBULCB3b3JkKTsKLSAgICAgICAgICAgIGlmIChzY3JpcHQgPj0gMCAmJiBz
Y3JpcHQgPCBVU0NSSVBUX0NPREVfTElNSVQpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgaW5k
ZXggPSBzY3JpcHQgLyAzMjsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gMSA8PCAo
c2NyaXB0ICUgMzIpOwotICAgICAgICAgICAgICAgIElETlNjcmlwdFdoaXRlTGlzdFtpbmRleF0g
fD0gbWFzazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmY2xvc2UoZmls
ZSk7Ci0gICAgcmV0dXJuIFlFUzsKLX0KLQotc3RhdGljIHZvaWQgcmVhZElETlNjcmlwdFdoaXRl
TGlzdCh2b2lkKQotewotICAgIC8vIFJlYWQgd2hpdGUgbGlzdCBmcm9tIGxpYnJhcnkuCi0gICAg
TlNBcnJheSAqZGlycyA9IE5TU2VhcmNoUGF0aEZvckRpcmVjdG9yaWVzSW5Eb21haW5zKE5TTGli
cmFyeURpcmVjdG9yeSwgTlNBbGxEb21haW5zTWFzaywgWUVTKTsKLSAgICBpbnQgaSwgbnVtRGly
cyA9IFtkaXJzIGNvdW50XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRGlyczsgaSsrKSB7Ci0g
ICAgICAgIE5TU3RyaW5nICpkaXIgPSBbZGlycyBvYmplY3RBdEluZGV4OmldOwotICAgICAgICBp
ZiAocmVhZElETlNjcmlwdFdoaXRlTGlzdEZpbGUoW2RpciBzdHJpbmdCeUFwcGVuZGluZ1BhdGhD
b21wb25lbnQ6QCJJRE5TY3JpcHRXaGl0ZUxpc3QudHh0Il0pKSB7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGYWxsIGJhY2sgb24gd2hpdGUgbGlzdCBp
bnNpZGUgYnVuZGxlLgotICAgIE5TQnVuZGxlICpidW5kbGUgPSBbTlNCdW5kbGUgYnVuZGxlV2l0
aElkZW50aWZpZXI6QCJjb20uYXBwbGUuV2ViS2l0Il07Ci0gICAgcmVhZElETlNjcmlwdFdoaXRl
TGlzdEZpbGUoW2J1bmRsZSBwYXRoRm9yUmVzb3VyY2U6QCJJRE5TY3JpcHRXaGl0ZUxpc3QiIG9m
VHlwZTpAInR4dCJdKTsKLX0KLQotc3RhdGljIEJPT0wgYWxsQ2hhcmFjdGVyc0luSUROU2NyaXB0
V2hpdGVMaXN0KGNvbnN0IFVDaGFyICpidWZmZXIsIGludDMyX3QgbGVuZ3RoKQotewotICAgIHB0
aHJlYWRfb25jZSgmSUROU2NyaXB0V2hpdGVMaXN0RmlsZVJlYWQsIHJlYWRJRE5TY3JpcHRXaGl0
ZUxpc3QpOwotCi0gICAgaW50MzJfdCBpID0gMDsKLSAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewot
ICAgICAgICBVQ2hhcjMyIGM7Ci0gICAgICAgIFUxNl9ORVhUKGJ1ZmZlciwgaSwgbGVuZ3RoLCBj
KQotICAgICAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOwotICAgICAgICBVU2Ny
aXB0Q29kZSBzY3JpcHQgPSB1c2NyaXB0X2dldFNjcmlwdChjLCAmZXJyb3IpOwotICAgICAgICBp
ZiAoZXJyb3IgIT0gVV9aRVJPX0VSUk9SKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoImdvdCBJ
Q1UgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGxvb2sgYXQgc2NyaXB0czogJWQiLCBlcnJvcik7Ci0g
ICAgICAgICAgICByZXR1cm4gTk87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjcmlwdCA8IDAp
IHsKLSAgICAgICAgICAgIExPR19FUlJPUigiZ290IG5lZ2F0aXZlIG51bWJlciBmb3Igc2NyaXB0
IGNvZGUgZnJvbSBJQ1U6ICVkIiwgc2NyaXB0KTsKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAg
ICAgICAgfQotICAgICAgICBpZiAoc2NyaXB0ID49IFVTQ1JJUFRfQ09ERV9MSU1JVCkgewotICAg
ICAgICAgICAgcmV0dXJuIE5POwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBpbmRleCA9IHNj
cmlwdCAvIDMyOwotICAgICAgICB1aW50MzJfdCBtYXNrID0gMSA8PCAoc2NyaXB0ICUgMzIpOwot
ICAgICAgICBpZiAoIShJRE5TY3JpcHRXaGl0ZUxpc3RbaW5kZXhdICYgbWFzaykpIHsKLSAgICAg
ICAgICAgIHJldHVybiBOTzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0xvb2thbGlrZUNo
YXJhY3RlcihjKSkKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAgICB9Ci0gICAgcmV0dXJuIFlF
UzsKLX0KLQotc3RhdGljIEJPT0wgYWxsQ2hhcmFjdGVyc0FsbG93ZWRCeVRMRFJ1bGVzKGNvbnN0
IFVDaGFyKiBidWZmZXIsIGludDMyX3QgbGVuZ3RoKQotewotICAgIC8vIFNraXAgdHJhaWxpbmcg
ZG90IGZvciByb290IGRvbWFpbi4KLSAgICBpZiAoYnVmZmVyW2xlbmd0aCAtIDFdID09ICcuJykK
LSAgICAgICAgLS1sZW5ndGg7Ci0KLSAgICBpZiAobGVuZ3RoID4gMwotICAgICAgICAmJiBidWZm
ZXJbbGVuZ3RoIC0gM10gPT0gJy4nCi0gICAgICAgICYmIGJ1ZmZlcltsZW5ndGggLSAyXSA9PSAw
eDA0NDAgLy8gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCi0gICAgICAgICYmIGJ1ZmZlcltsZW5n
dGggLSAxXSA9PSAweDA0NDQpIC8vIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgotICAgIHsKLSAg
ICAgICAgLy8gUnVsZXMgZGVmaW5lZCBieSA8aHR0cDovL3d3dy5jY3RsZC5ydS9ydS9kb2NzL3J1
bGVzcmYucGhwPi4gVGhpcyBjb2RlIG9ubHkgY2hlY2tzIHJlcXVpcmVtZW50cyB0aGF0IG1hdHRl
ciBmb3IgcHJlc2VudGF0aW9uIHB1cnBvc2VzLgotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGxl
bmd0aCAtIDQ7IGk7IC0taSkgewotICAgICAgICAgICAgVUNoYXIgY2ggPSBidWZmZXJbaV07Ci0K
LSAgICAgICAgICAgIC8vIE9ubHkgbW9kZXJuIFJ1c3NpYW4gbGV0dGVycywgZGlnaXRzIGFuZCBk
YXNoZXMgYXJlIGFsbG93ZWQuCi0gICAgICAgICAgICBpZiAoKGNoID49IDB4MDQzMCAmJiBjaCA8
PSAweDA0NGYpCi0gICAgICAgICAgICAgICAgfHwgY2ggPT0gMHgwNDUxCi0gICAgICAgICAgICAg
ICAgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCi0gICAgICAgICAgICAgICAgfHwgY2ggPT0g
Jy0nKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBPbmx5IGNo
ZWNrIHRvcCBsZXZlbCBkb21haW4uIExvd2VyIGxldmVsIHJlZ2lzdHJhcnMgbWF5IGhhdmUgZGlm
ZmVyZW50IHJ1bGVzLgotICAgICAgICAgICAgaWYgKGNoID09ICcuJykKLSAgICAgICAgICAgICAg
ICBicmVhazsKLQotICAgICAgICAgICAgcmV0dXJuIE5POwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiBZRVM7Ci0gICAgfQotCi0gICAgLy8gTm90IGEga25vd24gdG9wIGxldmVsIGRvbWFpbiB3
aXRoIHNwZWNpYWwgcnVsZXMuCi0gICAgcmV0dXJuIE5POwotfQotCi0vLyBSZXR1cm4gdmFsdWUg
b2YgbmlsIG1lYW5zIG5vIG1hcHBpbmcgaXMgbmVjZXNzYXJ5LgotLy8gSWYgbWFrZVN0cmluZyBp
cyBOTywgdGhlbiByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG5pbCBvciBzZWxmIHRvIGluZGljYXRl
IG1hcHBpbmcgaXMgbmVjZXNzYXJ5LgotLy8gSWYgbWFrZVN0cmluZyBpcyBZRVMsIHRoZW4gcmV0
dXJuIHZhbHVlIGlzIGVpdGhlciBuaWwgb3IgdGhlIG1hcHBlZCBzdHJpbmcuCi0tIChOU1N0cmlu
ZyAqKV93ZWJfbWFwSG9zdE5hbWVXaXRoUmFuZ2U6KE5TUmFuZ2UpcmFuZ2UgZW5jb2RlOihCT09M
KWVuY29kZSBtYWtlU3RyaW5nOihCT09MKW1ha2VTdHJpbmcKLXsKLSAgICBpZiAocmFuZ2UubGVu
Z3RoID4gSE9TVF9OQU1FX0JVRkZFUl9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIG5pbDsKLSAg
ICB9Ci0KLSAgICBpZiAoW3NlbGYgbGVuZ3RoXSA9PSAwKQotICAgICAgICByZXR1cm4gbmlsOwot
ICAgIAotICAgIFVDaGFyIHNvdXJjZUJ1ZmZlcltIT1NUX05BTUVfQlVGRkVSX0xFTkdUSF07Ci0g
ICAgVUNoYXIgZGVzdGluYXRpb25CdWZmZXJbSE9TVF9OQU1FX0JVRkZFUl9MRU5HVEhdOwotICAg
IAotICAgIE5TU3RyaW5nICpzdHJpbmcgPSBzZWxmOwotICAgIGlmIChlbmNvZGUgJiYgW3NlbGYg
cmFuZ2VPZlN0cmluZzpAIiUiIG9wdGlvbnM6TlNMaXRlcmFsU2VhcmNoIHJhbmdlOnJhbmdlXS5s
b2NhdGlvbiAhPSBOU05vdEZvdW5kKSB7Ci0gICAgICAgIE5TU3RyaW5nICpzdWJzdHJpbmcgPSBb
c2VsZiBzdWJzdHJpbmdXaXRoUmFuZ2U6cmFuZ2VdOwotICAgICAgICBzdWJzdHJpbmcgPSBXZWJD
RkF1dG9yZWxlYXNlKENGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcyhO
VUxMLCAoQ0ZTdHJpbmdSZWYpc3Vic3RyaW5nLCBDRlNUUigiIikpKTsKLSAgICAgICAgaWYgKHN1
YnN0cmluZyAhPSBuaWwpIHsKLSAgICAgICAgICAgIHN0cmluZyA9IHN1YnN0cmluZzsKLSAgICAg
ICAgICAgIHJhbmdlID0gTlNNYWtlUmFuZ2UoMCwgW3N0cmluZyBsZW5ndGhdKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICAKLSAgICBpbnQgbGVuZ3RoID0gcmFuZ2UubGVuZ3RoOwotICAgIFtzdHJp
bmcgZ2V0Q2hhcmFjdGVyczpzb3VyY2VCdWZmZXIgcmFuZ2U6cmFuZ2VdOwotCi0gICAgVUVycm9y
Q29kZSBlcnJvciA9IFVfWkVST19FUlJPUjsKLSAgICBpbnQzMl90IG51bUNoYXJhY3RlcnNDb252
ZXJ0ZWQgPSAoZW5jb2RlID8gdWlkbmFfSUROVG9BU0NJSSA6IHVpZG5hX0lETlRvVW5pY29kZSkK
LSAgICAgICAgKHNvdXJjZUJ1ZmZlciwgbGVuZ3RoLCBkZXN0aW5hdGlvbkJ1ZmZlciwgSE9TVF9O
QU1FX0JVRkZFUl9MRU5HVEgsIFVJRE5BX0FMTE9XX1VOQVNTSUdORUQsIE5VTEwsICZlcnJvcik7
Ci0gICAgaWYgKGVycm9yICE9IFVfWkVST19FUlJPUikgewotICAgICAgICByZXR1cm4gbmlsOwot
ICAgIH0KLSAgICBpZiAobnVtQ2hhcmFjdGVyc0NvbnZlcnRlZCA9PSBsZW5ndGggJiYgbWVtY21w
KHNvdXJjZUJ1ZmZlciwgZGVzdGluYXRpb25CdWZmZXIsIGxlbmd0aCAqIHNpemVvZihVQ2hhcikp
ID09IDApIHsKLSAgICAgICAgcmV0dXJuIG5pbDsKLSAgICB9Ci0gICAgaWYgKCFlbmNvZGUgJiYg
IWFsbENoYXJhY3RlcnNJbklETlNjcmlwdFdoaXRlTGlzdChkZXN0aW5hdGlvbkJ1ZmZlciwgbnVt
Q2hhcmFjdGVyc0NvbnZlcnRlZCkgJiYgIWFsbENoYXJhY3RlcnNBbGxvd2VkQnlUTERSdWxlcyhk
ZXN0aW5hdGlvbkJ1ZmZlciwgbnVtQ2hhcmFjdGVyc0NvbnZlcnRlZCkpIHsKLSAgICAgICAgcmV0
dXJuIG5pbDsKLSAgICB9Ci0gICAgcmV0dXJuIG1ha2VTdHJpbmcgPyAoTlNTdHJpbmcgKilbTlNT
dHJpbmcgc3RyaW5nV2l0aENoYXJhY3RlcnM6ZGVzdGluYXRpb25CdWZmZXIgbGVuZ3RoOm51bUNo
YXJhY3RlcnNDb252ZXJ0ZWRdIDogKE5TU3RyaW5nICopc2VsZjsKLX0KLQogLSAoQk9PTClfd2Vi
X2hvc3ROYW1lTmVlZHNEZWNvZGluZ1dpdGhSYW5nZTooTlNSYW5nZSlyYW5nZQogewotICAgIHJl
dHVybiBbc2VsZiBfd2ViX21hcEhvc3ROYW1lV2l0aFJhbmdlOnJhbmdlIGVuY29kZTpOTyBtYWtl
U3RyaW5nOk5PXSAhPSBuaWw7CisgICAgcmV0dXJuIGhvc3ROYW1lTmVlZHNEZWNvZGluZ1dpdGhS
YW5nZShzZWxmLCByYW5nZSk7CiB9CiAKIC0gKEJPT0wpX3dlYl9ob3N0TmFtZU5lZWRzRW5jb2Rp
bmdXaXRoUmFuZ2U6KE5TUmFuZ2UpcmFuZ2UKIHsKLSAgICByZXR1cm4gW3NlbGYgX3dlYl9tYXBI
b3N0TmFtZVdpdGhSYW5nZTpyYW5nZSBlbmNvZGU6WUVTIG1ha2VTdHJpbmc6Tk9dICE9IG5pbDsK
KyAgICByZXR1cm4gaG9zdE5hbWVOZWVkc0VuY29kaW5nV2l0aFJhbmdlKHNlbGYsIHJhbmdlKTsK
IH0KIAogLSAoTlNTdHJpbmcgKilfd2ViX2RlY29kZUhvc3ROYW1lV2l0aFJhbmdlOihOU1Jhbmdl
KXJhbmdlCiB7Ci0gICAgcmV0dXJuIFtzZWxmIF93ZWJfbWFwSG9zdE5hbWVXaXRoUmFuZ2U6cmFu
Z2UgZW5jb2RlOk5PIG1ha2VTdHJpbmc6WUVTXTsKKyAgICByZXR1cm4gZGVjb2RlSG9zdE5hbWVX
aXRoUmFuZ2Uoc2VsZiwgcmFuZ2UpOwogfQogCiAtIChOU1N0cmluZyAqKV93ZWJfZW5jb2RlSG9z
dE5hbWVXaXRoUmFuZ2U6KE5TUmFuZ2UpcmFuZ2UKIHsKLSAgICByZXR1cm4gW3NlbGYgX3dlYl9t
YXBIb3N0TmFtZVdpdGhSYW5nZTpyYW5nZSBlbmNvZGU6WUVTIG1ha2VTdHJpbmc6WUVTXTsKKyAg
ICByZXR1cm4gZW5jb2RlSG9zdE5hbWVXaXRoUmFuZ2Uoc2VsZiwgcmFuZ2UpOwogfQogCiAtIChO
U1N0cmluZyAqKV93ZWJfZGVjb2RlSG9zdE5hbWUKIHsKLSAgICBOU1N0cmluZyAqbmFtZSA9IFtz
ZWxmIF93ZWJfbWFwSG9zdE5hbWVXaXRoUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3NlbGYgbGVuZ3Ro
XSkgZW5jb2RlOk5PIG1ha2VTdHJpbmc6WUVTXTsKLSAgICByZXR1cm4gbmFtZSA9PSBuaWwgPyBz
ZWxmIDogbmFtZTsKKyAgICByZXR1cm4gZGVjb2RlSG9zdE5hbWUoc2VsZik7CiB9CiAKIC0gKE5T
U3RyaW5nICopX3dlYl9lbmNvZGVIb3N0TmFtZQogewotICAgIE5TU3RyaW5nICpuYW1lID0gW3Nl
bGYgX3dlYl9tYXBIb3N0TmFtZVdpdGhSYW5nZTpOU01ha2VSYW5nZSgwLCBbc2VsZiBsZW5ndGhd
KSBlbmNvZGU6WUVTIG1ha2VTdHJpbmc6WUVTXTsKLSAgICByZXR1cm4gbmFtZSA9PSBuaWwgPyBz
ZWxmIDogbmFtZTsKKyAgICByZXR1cm4gZW5jb2RlSG9zdE5hbWUoc2VsZik7CiB9CiAKIC0oTlNS
YW5nZSlfd2Via2l0X3JhbmdlT2ZVUkxTY2hlbWUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL1dl
YkNvcmVTdXBwb3J0L1dlYlN5c3RlbUludGVyZmFjZS5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L21hYy9XZWJDb3JlU3VwcG9ydC9XZWJTeXN0ZW1JbnRlcmZhY2UubW0JKHJldmlzaW9u
IDExMDIyNikKKysrIFNvdXJjZS9XZWJLaXQvbWFjL1dlYkNvcmVTdXBwb3J0L1dlYlN5c3RlbUlu
dGVyZmFjZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMTY5LDYgKzE2OSw4IEBAIHZvaWQgSW5pdFdl
YkNvcmVTeXN0ZW1JbnRlcmZhY2Uodm9pZCkKICAgICBJTklUKENvcHlDRlVSTFJlc3BvbnNlU3Vn
Z2VzdGVkRmlsZW5hbWUpOwogICAgIElOSVQoU2V0Q0ZVUkxSZXNwb25zZU1JTUVUeXBlKTsKIAor
ICAgIElOSVQoU2V0TWV0YWRhdGFVUkwpOworICAgIAogI2lmICFkZWZpbmVkKEJVSUxESU5HX09O
X0xFT1BBUkQpICYmICFkZWZpbmVkKEJVSUxESU5HX09OX1NOT1dfTEVPUEFSRCkKICAgICBJTklU
KENyZWF0ZVZNUHJlc3N1cmVEaXNwYXRjaE9uTWFpblF1ZXVlKTsKICNlbmRpZgo=
</data>
<flag name="review"
          id="134088"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>