<?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>145109</bug_id>
          
          <creation_ts>2015-05-17 12:34:56 -0700</creation_ts>
          <short_desc>Move AtomicStringImpl table related operations from AtomicString to AtomicStringImpl</short_desc>
          <delta_ts>2015-05-19 21:19:25 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</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>
          
          <blocked>144848</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>kling</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1095514</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-17 12:34:56 -0700</bug_when>
    <thetext>Move AtomicStringImpl table related operations from AtomicString to AtomicStringImpl</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095515</commentid>
    <comment_count>1</comment_count>
      <attachid>253292</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-17 12:36:52 -0700</bug_when>
    <thetext>Created attachment 253292
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095516</commentid>
    <comment_count>2</comment_count>
      <attachid>253293</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-17 12:37:53 -0700</bug_when>
    <thetext>Created attachment 253293
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095517</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-05-17 12:39:34 -0700</bug_when>
    <thetext>Attachment 253293 did not pass style-queue:


ERROR: Source/WTF/wtf/text/AtomicString.h:45:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:46:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:47:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:48:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:49:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:50:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:61:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:164:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/AtomicString.h:167:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/WTFString.h:121:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/WTFString.h:122:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
ERROR: Source/WTF/wtf/text/WTFString.h:123:  Should be indented on a separate line, with the colon or comma first on that line.  [whitespace/indent] [4]
Total errors found: 12 in 29 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>1095619</commentid>
    <comment_count>4</comment_count>
      <attachid>253293</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-18 08:53:55 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

Added comments

&gt; Source/WTF/wtf/text/AtomicString.h:50
&gt; +    AtomicString(const UChar* s) : m_string(AtomicStringImpl::add(s)) { }

These follow the original code&apos;s style. And it causes cpplint&apos;s warnings.
Is it better to change it to the following?
AtomicString(const LChar* s)
    : m_string(AtomicStringImpl::add(s))
{
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095954</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-19 08:56:29 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; These follow the original code&apos;s style. And it causes cpplint&apos;s warnings.
&gt; Is it better to change it to the following?
&gt; AtomicString(const LChar* s)
&gt;     : m_string(AtomicStringImpl::add(s))
&gt; {
&gt; }

I like that style and yes that’s how I would do it. But, better, I would not put the function definition into the class definition. I would declare it in the class and define it after the class. The class definition itself is more readable if it’s not full of function bodies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095956</commentid>
    <comment_count>6</comment_count>
      <attachid>253293</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-19 09:06:30 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

&gt; Source/JavaScriptCore/runtime/TypeSet.cpp:355
&gt; -        String property = String((*iter));
&gt; +        String property = String(iter-&gt;get());

I don’t understand this change.

&gt; Source/WTF/wtf/text/AtomicString.cpp:108
&gt; +    if (RefPtr&lt;AtomicStringImpl&gt; impl = AtomicStringImpl::addFromUTF8(charactersStart, charactersEnd)) {

Should use auto here instead of writing out the RefPtr type.

&gt; Source/WTF/wtf/text/AtomicString.cpp:110
&gt; +        AtomicString atomicString(impl.get());
&gt; +        return atomicString;

I don’t understand the reason for the local variable here. I would write:

    return impl.get();

Or if that doesn’t work:

    return AtomicString { impl.get() };

&gt; Source/WTF/wtf/text/AtomicString.cpp:112
&gt; +    return nullAtom;

I prefer early return for the error case, although that gets rid of the scoping.

&gt;&gt; Source/WTF/wtf/text/AtomicString.h:50
&gt;&gt; +    AtomicString(const UChar* s) : m_string(AtomicStringImpl::add(s)) { }
&gt; 
&gt; These follow the original code&apos;s style. And it causes cpplint&apos;s warnings.
&gt; Is it better to change it to the following?
&gt; AtomicString(const LChar* s)
&gt;     : m_string(AtomicStringImpl::add(s))
&gt; {
&gt; }

I like that style and yes that’s how I would do it. But, better, I would not put the function definition into the class definition. I would declare it in the class and define it after the class. The class definition itself is more readable if it’s not full of function bodies.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:33
&gt; +private:
&gt; +    AtomicStringImpl() = delete;

I suggest putting this down in the private section below.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:39
&gt; +    static AtomicStringImpl* lookup(LChar* characters, unsigned length)
&gt; +    {
&gt; +        return lookupInternal(characters, length);
&gt; +    }

The verb &quot;look up&quot; is two words. So the function name should be lookUp. Not &quot;lookup&quot;, which is a noun, not a verb. Should return a reference, not a pointer.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:43
&gt; +    static AtomicStringImpl* lookup(UChar* characters, unsigned length)
&gt; +    {
&gt; +        return lookupInternal(characters, length);
&gt; +    }

The verb &quot;look up&quot; is two words. So the function name should be lookUp. Not &quot;lookup&quot;, which is a noun, not a verb. Should return a reference, not a pointer.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:49
&gt; +    static AtomicStringImpl* lookup(StringImpl* string)
&gt; +    {
&gt; +        if (!string || string-&gt;isAtomic())
&gt; +            return static_cast&lt;AtomicStringImpl*&gt;(string);
&gt; +        return lookupSlowCase(*string);
&gt; +    }

The verb &quot;look up&quot; is two words. So the function name should be lookUp. Not &quot;lookup&quot;, which is a noun, not a verb. Should return a reference, not a pointer. Can we have one that takes and returns a reference? The one that takes and returns a pointer can call the one that takes and returns a reference after doing the null check.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:60
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(const LChar*);
&gt; +    ALWAYS_INLINE static RefPtr&lt;AtomicStringImpl&gt; add(const char* s) { return add(reinterpret_cast&lt;const LChar*&gt;(s)); };
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(const LChar*, unsigned length);
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(const UChar*, unsigned length);
&gt; +    ALWAYS_INLINE static RefPtr&lt;AtomicStringImpl&gt; add(const char* s, unsigned length) { return add(reinterpret_cast&lt;const LChar*&gt;(s), length); };
&gt; +    WTF_EXPORT_STRING_API static Ref&lt;AtomicStringImpl&gt; add(const UChar*, unsigned length, unsigned existingHash);
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(const UChar*);
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(StringImpl*, unsigned offset, unsigned length);

Any of these that can’t return null should be returning Ref, not RefPtr. I guess maybe they already are.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:67
&gt; +    WTF_EXPORT_STRING_API static Ref&lt;AtomicStringImpl&gt; addFromLiteralData(const char* characters, unsigned length);

I’m not sure “add from” is the best naming here. Maybe just addLiteralData. But I’m also not sure what “literal data” is. I think maybe addLiteral is the best name.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:70
&gt; +    // AtomicStringImpl::addFromUTF8 will return a nullptr if
&gt; +    // the input data contains invalid UTF-8 sequences.

Don’t need to say the name of the function in the comment:

    // Returns null if the input data contains an invalid UTF-8 sequence.

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:71
&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; addFromUTF8(const char* start, const char* end);

This should be addUTF8, because from doesn’t really make sense. I don’t understand why we use a start and end pointer here, though!

&gt; Source/WTF/wtf/text/AtomicStringImpl.h:80
&gt; +            return static_cast&lt;AtomicStringImpl*&gt;(string);

This should just be:

    return nullptr;

&gt; Source/WTF/wtf/text/StringImpl.h:333
&gt; +    // To allow generating the destructor in the base classes, we expose the destructor as protected.

Don’t need that comment. That’s what protected means.

Should move this down because we try to organize our classes with public first, then protected, then private, without interleaving them.

&gt; Source/WTF/wtf/text/WTFString.h:119
&gt;      String(Ref&lt;StringImpl&gt;&amp;&amp; impl) : m_impl(WTF::move(impl)) { }
&gt;      String(RefPtr&lt;StringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }

Doesn’t make sense that one of these uses WTF::move and the other does not!

&gt; Source/WTF/wtf/text/WTFString.h:121
&gt; +    String(PassRefPtr&lt;AtomicStringImpl&gt; impl) : m_impl(impl) { }

Do we really need to add this one? PassRefPtr is deprecated. Can we just fix all the call sites, or are there too many?

&gt; Source/WTF/wtf/text/WTFString.h:123
&gt; +    String(Ref&lt;AtomicStringImpl&gt;&amp;&amp; impl) : m_impl(WTF::move(impl)) { }
&gt; +    String(RefPtr&lt;AtomicStringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }

Doesn’t make sense that one of these uses WTF::move and the other does not!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095969</commentid>
    <comment_count>7</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-19 09:33:57 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; These follow the original code&apos;s style. And it causes cpplint&apos;s warnings.
&gt; &gt; Is it better to change it to the following?
&gt; &gt; AtomicString(const LChar* s)
&gt; &gt;     : m_string(AtomicStringImpl::add(s))
&gt; &gt; {
&gt; &gt; }
&gt; 
&gt; I like that style and yes that’s how I would do it. But, better, I would not
&gt; put the function definition into the class definition. I would declare it in
&gt; the class and define it after the class. The class definition itself is more
&gt; readable if it’s not full of function bodies.

OK. So following the style, declaring the prototype in class body and define it with `inline` in the header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095982</commentid>
    <comment_count>8</comment_count>
      <attachid>253293</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-19 11:18:26 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

Thank you for your review!

&gt;&gt; Source/JavaScriptCore/runtime/TypeSet.cpp:355
&gt;&gt; +        String property = String(iter-&gt;get());
&gt; 
&gt; I don’t understand this change.

This is due to ambiguity of the following things.
     String(RefPtr&lt;AtomicStringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }
     String(PassRefPtr&lt;AtomicStringImpl&gt; impl) : m_impl(impl) { }
     String(PassRefPtr&lt;StringImpl&gt; impl) : m_impl(impl) { }

OK, so in this time, I&apos;ve just changed it to `**iter` to extract StringImpl&amp; reference.

&gt;&gt; Source/WTF/wtf/text/AtomicString.cpp:108
&gt;&gt; +    if (RefPtr&lt;AtomicStringImpl&gt; impl = AtomicStringImpl::addFromUTF8(charactersStart, charactersEnd)) {
&gt; 
&gt; Should use auto here instead of writing out the RefPtr type.

Make sense! Changed.

&gt;&gt; Source/WTF/wtf/text/AtomicString.cpp:110
&gt;&gt; +        return atomicString;
&gt; 
&gt; I don’t understand the reason for the local variable here. I would write:
&gt; 
&gt;     return impl.get();
&gt; 
&gt; Or if that doesn’t work:
&gt; 
&gt;     return AtomicString { impl.get() };

`return impl.get();` works. Fixed.

&gt;&gt; Source/WTF/wtf/text/AtomicString.cpp:112
&gt;&gt; +    return nullAtom;
&gt; 
&gt; I prefer early return for the error case, although that gets rid of the scoping.

OK, rewrite it to

auto impl = ...
if (!impl)
    return nullAtom;
return impl.get();

&gt;&gt;&gt; Source/WTF/wtf/text/AtomicString.h:50
&gt;&gt;&gt; +    AtomicString(const UChar* s) : m_string(AtomicStringImpl::add(s)) { }
&gt;&gt; 
&gt;&gt; These follow the original code&apos;s style. And it causes cpplint&apos;s warnings.
&gt;&gt; Is it better to change it to the following?
&gt;&gt; AtomicString(const LChar* s)
&gt;&gt;     : m_string(AtomicStringImpl::add(s))
&gt;&gt; {
&gt;&gt; }
&gt; 
&gt; I like that style and yes that’s how I would do it. But, better, I would not put the function definition into the class definition. I would declare it in the class and define it after the class. The class definition itself is more readable if it’s not full of function bodies.

Fixed :D

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:33
&gt;&gt; +    AtomicStringImpl() = delete;
&gt; 
&gt; I suggest putting this down in the private section below.

Fixed.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:39
&gt;&gt; +    }
&gt; 
&gt; The verb &quot;look up&quot; is two words. So the function name should be lookUp. Not &quot;lookup&quot;, which is a noun, not a verb. Should return a reference, not a pointer.

Ah, but, when the AtomicStringImpl&apos;s table doesn&apos;t contain AtomicStringImpl* for the given string, it returns nullptr.
Changed `lookup` to `lookUp`.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:43
&gt;&gt; +    }
&gt; 
&gt; The verb &quot;look up&quot; is two words. So the function name should be lookUp. Not &quot;lookup&quot;, which is a noun, not a verb. Should return a reference, not a pointer.

Fixed the name.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:60
&gt;&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; add(StringImpl*, unsigned offset, unsigned length);
&gt; 
&gt; Any of these that can’t return null should be returning Ref, not RefPtr. I guess maybe they already are.

Seeing the implementation, when the given char* (const UChar* etc.) is null, it returns nullptr.
Some (like `add(const UChar*, unsigned length, unsigned existingHash);`) returns Ref, because they require the given pointer is not nullptr. (since there&apos;s existingHash value, it is not nullptr in the used context I guess.)

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:67
&gt;&gt; +    WTF_EXPORT_STRING_API static Ref&lt;AtomicStringImpl&gt; addFromLiteralData(const char* characters, unsigned length);
&gt; 
&gt; I’m not sure “add from” is the best naming here. Maybe just addLiteralData. But I’m also not sure what “literal data” is. I think maybe addLiteral is the best name.

Changed to `addLiteral`.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:70
&gt;&gt; +    // the input data contains invalid UTF-8 sequences.
&gt; 
&gt; Don’t need to say the name of the function in the comment:
&gt; 
&gt;     // Returns null if the input data contains an invalid UTF-8 sequence.

Fixed.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:71
&gt;&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; addFromUTF8(const char* start, const char* end);
&gt; 
&gt; This should be addUTF8, because from doesn’t really make sense. I don’t understand why we use a start and end pointer here, though!

I&apos;ve changed the API name to addUTF8.
Haha, I guess that the given UTF8 is user-input; it may contain \0 and to avoid performing strlen(str) accidentally, we manage the range with pointers.
But it&apos;s my guess.

&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:80
&gt;&gt; +            return static_cast&lt;AtomicStringImpl*&gt;(string);
&gt; 
&gt; This should just be:
&gt; 
&gt;     return nullptr;

Fixed.

&gt;&gt; Source/WTF/wtf/text/StringImpl.h:333
&gt;&gt; +    // To allow generating the destructor in the base classes, we expose the destructor as protected.
&gt; 
&gt; Don’t need that comment. That’s what protected means.
&gt; 
&gt; Should move this down because we try to organize our classes with public first, then protected, then private, without interleaving them.

OK, removed the comment and moved it down.

&gt;&gt; Source/WTF/wtf/text/WTFString.h:119
&gt;&gt;      String(RefPtr&lt;StringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }
&gt; 
&gt; Doesn’t make sense that one of these uses WTF::move and the other does not!

OK, use WTF::move.

&gt;&gt; Source/WTF/wtf/text/WTFString.h:121
&gt;&gt; +    String(PassRefPtr&lt;AtomicStringImpl&gt; impl) : m_impl(impl) { }
&gt; 
&gt; Do we really need to add this one? PassRefPtr is deprecated. Can we just fix all the call sites, or are there too many?

At least, dropping this can be done!

&gt;&gt; Source/WTF/wtf/text/WTFString.h:123
&gt;&gt; +    String(RefPtr&lt;AtomicStringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }
&gt; 
&gt; Doesn’t make sense that one of these uses WTF::move and the other does not!

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095983</commentid>
    <comment_count>9</comment_count>
      <attachid>253293</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-19 11:22:46 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

&gt;&gt;&gt; Source/JavaScriptCore/runtime/TypeSet.cpp:355
&gt;&gt;&gt; +        String property = String(iter-&gt;get());
&gt;&gt; 
&gt;&gt; I don’t understand this change.
&gt; 
&gt; This is due to ambiguity of the following things.
&gt;      String(RefPtr&lt;AtomicStringImpl&gt;&amp;&amp; impl) : m_impl(impl) { }
&gt;      String(PassRefPtr&lt;AtomicStringImpl&gt; impl) : m_impl(impl) { }
&gt;      String(PassRefPtr&lt;StringImpl&gt; impl) : m_impl(impl) { }
&gt; 
&gt; OK, so in this time, I&apos;ve just changed it to `**iter` to extract StringImpl&amp; reference.

Ah, it may be null, so use `String property = iter-&gt;get();`</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1096023</commentid>
    <comment_count>10</comment_count>
      <attachid>253293</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-19 13:39:33 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

&gt;&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:71
&gt;&gt;&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; addFromUTF8(const char* start, const char* end);
&gt;&gt; 
&gt;&gt; This should be addUTF8, because from doesn’t really make sense. I don’t understand why we use a start and end pointer here, though!
&gt; 
&gt; I&apos;ve changed the API name to addUTF8.
&gt; Haha, I guess that the given UTF8 is user-input; it may contain \0 and to avoid performing strlen(str) accidentally, we manage the range with pointers.
&gt; But it&apos;s my guess.

I was wondering more about why two pointers rather than start and length. We almost always use pointer and length for this kind of thing, as in addFromLiteralData above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1096132</commentid>
    <comment_count>11</comment_count>
      <attachid>253293</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-19 19:01:29 -0700</bug_when>
    <thetext>Comment on attachment 253293
Patch

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

&gt;&gt;&gt;&gt; Source/WTF/wtf/text/AtomicStringImpl.h:71
&gt;&gt;&gt;&gt; +    WTF_EXPORT_STRING_API static RefPtr&lt;AtomicStringImpl&gt; addFromUTF8(const char* start, const char* end);
&gt;&gt;&gt; 
&gt;&gt;&gt; This should be addUTF8, because from doesn’t really make sense. I don’t understand why we use a start and end pointer here, though!
&gt;&gt; 
&gt;&gt; I&apos;ve changed the API name to addUTF8.
&gt;&gt; Haha, I guess that the given UTF8 is user-input; it may contain \0 and to avoid performing strlen(str) accidentally, we manage the range with pointers.
&gt;&gt; But it&apos;s my guess.
&gt; 
&gt; I was wondering more about why two pointers rather than start and length. We almost always use pointer and length for this kind of thing, as in addFromLiteralData above.

Ah, seeing the caller side of this function, I&apos;ve found the edge case.
In AtomicString::fromUTF8(const char* characters), we call it with the form,

fromUTF8Internal(characters, 0);

Here, 0 means nullptr.
When the end is nullptr, this `addUTF8` works specially.
(`calculateStringHashAndLengthFromUTF8MaskingTop8Bits` handles this)

This is a little bit error prone design. In the meantime, I&apos;ll fix it in the separate patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1096154</commentid>
    <comment_count>12</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2015-05-19 21:19:25 -0700</bug_when>
    <thetext>Committed r184612: &lt;http://trac.webkit.org/changeset/184612&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>253292</attachid>
            <date>2015-05-17 12:36:52 -0700</date>
            <delta_ts>2015-05-17 12:37:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-145109-20150518043650.patch</filename>
            <type>text/plain</type>
            <size>84777</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg0NDQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA2
ZTYzMTY5NDJhNDc4ODIwOTJmNWU5MmNmMTViNzhjMzBmYTlmODA5Li40MDlmYzNiM2Q0NzE2YjRm
OWFlZmI2N2JhMjFmMmEzMTdiZTA4MWE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyOSBAQAorMjAxNS0wNS0xNyAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWls
LmNvbT4KKworICAgICAgICBNb3ZlIEF0b21pY1N0cmluZ0ltcGwgdGFibGUgcmVsYXRlZCBvcGVy
YXRpb25zIGZyb20gQXRvbWljU3RyaW5nIHRvIEF0b21pY1N0cmluZ0ltcGwKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTEwOQorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2Nr
LmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpuYW1lRm9yUmVnaXN0ZXIpOgorICAgICAg
ICAqIHJ1bnRpbWUvSWRlbnRpZmllci5jcHA6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFk
ZCk6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZDgpOgorICAgICAgICAqIHJ1bnRpbWUv
SWRlbnRpZmllci5oOgorICAgICAgICAoSlNDOjpJZGVudGlmaWVyOjphZGQpOgorICAgICAgICAq
IHJ1bnRpbWUvSWRlbnRpZmllcklubGluZXMuaDoKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6
SWRlbnRpZmllcik6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZCk6CisgICAgICAgICog
cnVudGltZS9KU1N0cmluZy5jcHA6CisgICAgICAgIChKU0M6OkpTUm9wZVN0cmluZzo6cmVzb2x2
ZVJvcGVUb0V4aXN0aW5nQXRvbWljU3RyaW5nKToKKyAgICAgICAgKiBydW50aW1lL0pTU3RyaW5n
Lmg6CisgICAgICAgIChKU0M6OkpTU3RyaW5nOjp0b0V4aXN0aW5nQXRvbWljU3RyaW5nKToKKyAg
ICAgICAgKiBydW50aW1lL1NtYWxsU3RyaW5ncy5jcHA6CisgICAgICAgIChKU0M6OlNtYWxsU3Ry
aW5nc1N0b3JhZ2U6OlNtYWxsU3RyaW5nc1N0b3JhZ2UpOgorICAgICAgICAqIHJ1bnRpbWUvVHlw
ZVNldC5jcHA6CisgICAgICAgIChKU0M6OlN0cnVjdHVyZVNoYXBlOjpwcm9wZXJ0eUhhc2gpOgor
CiAyMDE1LTA1LTE2ICBDb21taXQgUXVldWUgIDxjb21taXQtcXVldWVAd2Via2l0Lm9yZz4KIAog
ICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMTg0NDE1LgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCAzNTUyNjI3MjY1
Mzc5ODRkYTNiZjFjOTU2OGIzNmQ2ZmVjZTM2MDJkLi4wMjM2OGNhNDMwOTRhNzQ3NTZjZjlkYTRh
MTgzZjM3NDJhYWFmYjljIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9T
b3VyY2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExNCBAQAorMjAxNS0wNS0xNyAgWXVzdWtl
IFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KKworICAgICAgICBNb3ZlIEF0b21pY1N0
cmluZ0ltcGwgdGFibGUgcmVsYXRlZCBvcGVyYXRpb25zIGZyb20gQXRvbWljU3RyaW5nIHRvIEF0
b21pY1N0cmluZ0ltcGwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NTEwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIE5vdyBBdG9taWNTdHJpbmdJbXBsIHRhYmxlIG9wZXJhdGlvbnMgYXJlIGxvY2F0ZWQg
aW4gQXRvbWljU3RyaW5nLgorICAgICAgICBCdXQgdGhleSBzaG91bGQgYmUgdW5kZXIgQXRvbWlj
U3RyaW5nSW1wbC4KKyAgICAgICAgVGhpcyBwYXRjaCBzaW1wbHkgbW92ZXMgdGhlc2Ugb3BlcmF0
aW9ucyB0byBBdG9taWNTdHJpbmdJbXBsLgorCisgICAgICAgIEFuZCB0aGlzIHBhdGNoIHJlbmFt
ZXMgc3RhdGljIEF0b21pY1N0cmluZzo6ZmluZCB0byBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbDo6
bG9va3VwCisgICAgICAgIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggQXRvbWljU3RyaW5nSW1w
bCdzIG1lbWJlciBmdW5jdGlvbiBuYW1lLgorCisgICAgICAgICogV1RGLnZjeHByb2ovV1RGLnZj
eHByb2o6CisgICAgICAgICogV1RGLnZjeHByb2ovV1RGLnZjeHByb2ouZmlsdGVyczoKKyAgICAg
ICAgKiBXVEYudmN4cHJvai9jb3B5LWZpbGVzLmNtZDoKKyAgICAgICAgKiBXVEYueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiB3dGYvQ01ha2VMaXN0cy50eHQ6CisgICAgICAg
ICogd3RmL1BsYXRmb3JtTWFjLmNtYWtlOgorICAgICAgICAqIHd0Zi9QbGF0Zm9ybVdpbi5jbWFr
ZToKKyAgICAgICAgKiB3dGYvdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAgICAgICAoV1RGOjpB
dG9taWNTdHJpbmc6Omxvd2VyKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjpjb252ZXJ0
VG9BU0NJSUxvd2VyY2FzZSk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6ZnJvbVVURjhJ
bnRlcm5hbCk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZ1RhYmxlTG9ja2VyOjpBdG9taWNT
dHJpbmdUYWJsZUxvY2tlcik6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OnN0cmluZ1RhYmxlKTog
RGVsZXRlZC4KKyAgICAgICAgKFdURjo6YWRkVG9TdHJpbmdUYWJsZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdU
Rjo6Q1N0cmluZ1RyYW5zbGF0b3I6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6Q1N0
cmluZ1RyYW5zbGF0b3I6OnRyYW5zbGF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21p
Y1N0cmluZzo6YWRkKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xh
dG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9y
OjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6
dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFu
c2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNU
cmFuc2xhdG9yOjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6Okhhc2hBbmRDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFu
ZFVURjhDaGFyYWN0ZXJzVHJhbnNsYXRvcjo6aGFzaCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6
Okhhc2hBbmRVVEY4Q2hhcmFjdGVyc1RyYW5zbGF0b3I6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdURjo6SGFzaEFuZFVURjhDaGFyYWN0ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjg6Omhhc2gpOiBEZWxldGVk
LgorICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yODo6ZXF1YWwpOiBEZWxldGVkLgor
ICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6Omhhc2gpOiBEZWxldGVkLgorICAg
ICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAg
KFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChX
VEY6OkxDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAg
KFdURjo6Q2hhckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I6Omhhc2gpOiBEZWxldGVk
LgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6ZXF1
YWwpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJh
bnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5n
OjphZGRGcm9tTGl0ZXJhbERhdGEpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpBdG9taWNTdHJp
bmc6OmFkZFNsb3dDYXNlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjpy
ZW1vdmUpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmc6OmZpbmRTbG93Q2Fz
ZSk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6ZmluZEludGVybmFsKTog
RGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjppc0luQXRvbWljU3RyaW5nVGFi
bGUpOiBEZWxldGVkLgorICAgICAgICAqIHd0Zi90ZXh0L0F0b21pY1N0cmluZy5oOgorICAgICAg
ICAoV1RGOjpBdG9taWNTdHJpbmc6OkF0b21pY1N0cmluZyk6CisgICAgICAgIChXVEY6OkF0b21p
Y1N0cmluZzo6ZmluZCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6YWRk
KTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjphZGRXaXRoU3RyaW5nVGFi
bGVQcm92aWRlcik6IERlbGV0ZWQuCisgICAgICAgICogd3RmL3RleHQvQXRvbWljU3RyaW5nSW1w
bC5jcHA6IENvcGllZCBmcm9tIFNvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nLmNwcC4K
KyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nVGFibGVMb2NrZXI6OkF0b21pY1N0cmluZ1RhYmxl
TG9ja2VyKToKKyAgICAgICAgKFdURjo6c3RyaW5nVGFibGUpOgorICAgICAgICAoV1RGOjphZGRU
b1N0cmluZ1RhYmxlKToKKyAgICAgICAgKFdURjo6Q1N0cmluZ1RyYW5zbGF0b3I6Omhhc2gpOgor
ICAgICAgICAoV1RGOjpDU3RyaW5nVHJhbnNsYXRvcjo6ZXF1YWwpOgorICAgICAgICAoV1RGOjpD
U3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5n
SW1wbDo6YWRkKToKKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9yOjpoYXNoKToK
KyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVhbCk6CisgICAgICAgIChX
VEY6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6SGFz
aEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yOjpoYXNoKToKKyAgICAgICAgKFdURjo6SGFzaEFuZENo
YXJhY3RlcnNUcmFuc2xhdG9yOjplcXVhbCk6CisgICAgICAgIChXVEY6Okhhc2hBbmRDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6SGFzaEFuZFVURjhDaGFy
YWN0ZXJzVHJhbnNsYXRvcjo6aGFzaCk6CisgICAgICAgIChXVEY6Okhhc2hBbmRVVEY4Q2hhcmFj
dGVyc1RyYW5zbGF0b3I6OmVxdWFsKToKKyAgICAgICAgKFdURjo6SGFzaEFuZFVURjhDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNs
YXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjg6Omhh
c2gpOgorICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yODo6ZXF1YWwpOgorICAgICAg
ICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6Omhhc2gpOgorICAgICAgICAoV1RGOjpTdWJz
dHJpbmdUcmFuc2xhdG9yMTY6OmVxdWFsKToKKyAgICAgICAgKFdURjo6TENoYXJCdWZmZXJUcmFu
c2xhdG9yOjpoYXNoKToKKyAgICAgICAgKFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVh
bCk6CisgICAgICAgIChXVEY6OkxDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAg
ICAgICAgKFdURjo6Q2hhckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I6Omhhc2gpOgor
ICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6ZXF1YWwp
OgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6dHJh
bnNsYXRlKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbUxpdGVyYWxE
YXRhKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRkU2xvd0Nhc2UpOgorICAg
ICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBsOjpyZW1vdmUpOgorICAgICAgICAoV1RGOjpBdG9t
aWNTdHJpbmdJbXBsOjpsb29rdXBTbG93Q2FzZSk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmlu
Z0ltcGw6OmFkZEZyb21VVEY4KToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6bG9v
a3VwSW50ZXJuYWwpOgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBsOjppc0luQXRvbWlj
U3RyaW5nVGFibGUpOgorICAgICAgICAqIHd0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuaDoKKyAg
ICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6bG9va3VwKToKKyAgICAgICAgKFdURjo6QXRv
bWljU3RyaW5nSW1wbDo6YWRkKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRk
V2l0aFN0cmluZ1RhYmxlUHJvdmlkZXIpOgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBs
OjpBdG9taWNTdHJpbmdJbXBsKTogRGVsZXRlZC4KKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdJ
bXBsLmNwcDoKKyAgICAgICAgKFdURjo6U3RyaW5nSW1wbDo6flN0cmluZ0ltcGwpOgorICAgICAg
ICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAgKiB3dGYvdGV4dC9XVEZTdHJpbmcu
aDoKKyAgICAgICAgKFdURjo6U3RyaW5nOjpTdHJpbmcpOgorICAgICAgICAqIHd0Zi90ZXh0L2Nm
L0F0b21pY1N0cmluZ0ltcGxDRi5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV1RGL3d0Zi90ZXh0
L2NmL0F0b21pY1N0cmluZ0NGLmNwcC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6
YWRkKToKKwogMjAxNS0wNS0xNSAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAg
ICAgICAgIEJ1aWxkIGZpeCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBjbGFuZy4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRl
eCAxMDJkMTg1MzA5Y2VkZDhkM2JkMDYwNDdkYjMxYzNjMjBkMjI1MGVhLi5jODA4MGFiOTQ5MjUz
ZTJmOTBhMDFmOWRjZjgwZGQxN2I2MWQzYmFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAK
KzIwMTUtMDUtMTcgIFl1c3VrZSBTdXp1a2kgIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+CisKKyAg
ICAgICAgTW92ZSBBdG9taWNTdHJpbmdJbXBsIHRhYmxlIHJlbGF0ZWQgb3BlcmF0aW9ucyBmcm9t
IEF0b21pY1N0cmluZyB0byBBdG9taWNTdHJpbmdJbXBsCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDUxMDkKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMgKE9PUFMhKS4KKworICAgICAg
ICAqIGRvbS9UcmVlU2NvcGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VHJlZVNjb3BlOjpnZXRF
bGVtZW50QnlJZCk6CisKIDIwMTUtMDUtMTcgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBs
ZS5jb20+CiAKICAgICAgICAgQ3Jhc2ggd2hlbiB1cGxvYWRpbmcgaHVnZSBmaWxlcyB0byBZb3VU
dWJlIG9yIEdvb2dsZSBEcml2ZQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL0NvZGVCbG9jay5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29k
ZUJsb2NrLmNwcAppbmRleCBlZGNiYzc1YzMyNmRiMmFlYjgxMWQ2MTBjOWM3ZWI1NmJmZDVlODNl
Li5mODY5M2E5NmQ2MmZmMTJiYjlkMGZmZDIzYjVjMGYzZjBjYmZiNWI2IDEwMDY0NAotLS0gYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAorKysgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcApAQCAtMzgzOSw3ICszODM5LDcg
QEAgU3RyaW5nIENvZGVCbG9jazo6bmFtZUZvclJlZ2lzdGVyKFZpcnR1YWxSZWdpc3RlciB2aXJ0
dWFsUmVnaXN0ZXIpCiAgICAgICAgIGlmIChwdHItPnZhbHVlLnZhck9mZnNldCgpID09IFZhck9m
ZnNldCh2aXJ0dWFsUmVnaXN0ZXIpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3b24n
dCB3b3JrIGZyb20gdGhlIGNvbXBpbGF0aW9uIHRocmVhZC4KICAgICAgICAgICAgIC8vIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUzMDAKLSAgICAgICAgICAgIHJl
dHVybiBTdHJpbmcocHRyLT5rZXkpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhwdHItPmtl
eS5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHZpcnR1YWxSZWdpc3RlciA9PSB0
aGlzUmVnaXN0ZXIoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0lkZW50aWZpZXIuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmll
ci5jcHAKaW5kZXggZTA4MTZkMjE3MzBmZjI1NThjZTZlYzFlNzY2MDg3ZTUwZDIyZTAzZS4uZDI2
ZDk1NjdjNjgzMGZlN2YzMWVmMTJhN2E0NWMwMTEyNDdmODZkZiAxMDA2NDQKLS0tIGEvU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAKKysrIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBp
ZiAoIWNbMV0pCiAgICAgICAgIHJldHVybiAqdm0tPnNtYWxsU3RyaW5ncy5zaW5nbGVDaGFyYWN0
ZXJTdHJpbmdSZXAoY1swXSk7CiAKLSAgICByZXR1cm4gKkF0b21pY1N0cmluZzo6YWRkKGMpOwor
ICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRkKGMpOwogfQogCiBSZWY8U3RyaW5nSW1w
bD4gSWRlbnRpZmllcjo6YWRkKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgY2hhciogYykKQEAgLTY0
LDcgKzY0LDcgQEAKICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgcmV0dXJuICpTdHJpbmdJbXBs
OjplbXB0eSgpOwogCi0gICAgcmV0dXJuICpBdG9taWNTdHJpbmc6OmFkZChzLCBsZW5ndGgpOwor
ICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRkKHMsIGxlbmd0aCk7CiB9CiAKIElkZW50
aWZpZXIgSWRlbnRpZmllcjo6ZnJvbShFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHZhbHVlKQpk
aWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5oIGIv
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5oCmluZGV4IGUyOWM0OTc3
NGI1M2U4MzM0NTcxZDkzNWVhMjRlM2E5Y2EyZTRhZGIuLjI5MWNkYmUxOTA3NjczOWQ3YmVmMTk4
ZTliNjc4Mjg1ZDEwMWRjNzcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0lkZW50aWZpZXIuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVu
dGlmaWVyLmgKQEAgLTIyMSw3ICsyMjEsNyBAQCBjbGFzcyBJZGVudGlmaWVyIHsKICAgICBpZiAo
IWxlbmd0aCkKICAgICAgICAgcmV0dXJuICpTdHJpbmdJbXBsOjplbXB0eSgpOwogCi0gICAgcmV0
dXJuICpBdG9taWNTdHJpbmc6OmFkZChzLCBsZW5ndGgpOworICAgIHJldHVybiAqQXRvbWljU3Ry
aW5nSW1wbDo6YWRkKHMsIGxlbmd0aCk7CiB9CiAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29u
c3QgSWRlbnRpZmllciYgYSwgY29uc3QgSWRlbnRpZmllciYgYikKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXJJbmxpbmVzLmggYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVySW5saW5lcy5oCmluZGV4IDQwNjIyMWE2M2Fh
ZDk2NWY0NzMwZTQ2ODgzNDczNjdjM2IyNjcwNGIuLjUwNmZhN2EyMTZhZTlhOTk4MTMzYzI5NmE0
MTQ2ZmNhN2U3NmRkYTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0lkZW50aWZpZXJJbmxpbmVzLmgKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SWRlbnRpZmllcklubGluZXMuaApAQCAtMzcsNyArMzcsNyBAQCBpbmxpbmUgSWRlbnRpZmllcjo6
SWRlbnRpZmllcihFeGVjU3RhdGUqIGV4ZWMsIEF0b21pY1N0cmluZ0ltcGwqIHN0cmluZykKICNp
Zm5kZWYgTkRFQlVHCiAgICAgY2hlY2tDdXJyZW50QXRvbWljU3RyaW5nVGFibGUoZXhlYyk7CiAg
ICAgaWYgKHN0cmluZykKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghc3RyaW5nLT5sZW5n
dGgoKSB8fCBzdHJpbmctPmlzU3ltYm9sKCkgfHwgQXRvbWljU3RyaW5nOjppc0luQXRvbWljU3Ry
aW5nVGFibGUoc3RyaW5nKSwgIlRoZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZyb20gYW4gb3RoZXIg
dGhyZWFkISIpOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFzdHJpbmctPmxlbmd0aCgp
IHx8IHN0cmluZy0+aXNTeW1ib2woKSB8fCBBdG9taWNTdHJpbmdJbXBsOjppc0luQXRvbWljU3Ry
aW5nVGFibGUoc3RyaW5nKSwgIlRoZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZyb20gYW4gb3RoZXIg
dGhyZWFkISIpOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZXhlYyk7CiAjZW5kaWYKQEAgLTQ5
LDcgKzQ5LDcgQEAgaW5saW5lIElkZW50aWZpZXI6OklkZW50aWZpZXIoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBBdG9taWNTdHJpbmcmIHN0cmluZykKICNpZm5kZWYgTkRFQlVHCiAgICAgY2hlY2tD
dXJyZW50QXRvbWljU3RyaW5nVGFibGUoZXhlYyk7CiAgICAgaWYgKCFzdHJpbmcuaXNOdWxsKCkp
Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0cmluZy5sZW5ndGgoKSB8fCBzdHJpbmcu
aW1wbCgpLT5pc1N5bWJvbCgpIHx8IEF0b21pY1N0cmluZzo6aXNJbkF0b21pY1N0cmluZ1RhYmxl
KHN0cmluZy5pbXBsKCkpLCAiVGhlIGF0b21pYyBzdHJpbmcgY29tZXMgZnJvbSBhbiBvdGhlciB0
aHJlYWQhIik7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0cmluZy5sZW5ndGgoKSB8
fCBzdHJpbmcuaW1wbCgpLT5pc1N5bWJvbCgpIHx8IEF0b21pY1N0cmluZ0ltcGw6OmlzSW5BdG9t
aWNTdHJpbmdUYWJsZShzdHJpbmcuaW1wbCgpKSwgIlRoZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZy
b20gYW4gb3RoZXIgdGhyZWFkISIpOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZXhlYyk7CiAj
ZW5kaWYKQEAgLTYwLDE0ICs2MCwxNCBAQCBpbmxpbmUgSWRlbnRpZmllcjo6SWRlbnRpZmllcihF
eGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEF0b21pY1N0cmluZyYgc3RyaW5nKQogI2lmbmRlZiBOREVC
VUcKICAgICBjaGVja0N1cnJlbnRBdG9taWNTdHJpbmdUYWJsZShleGVjKTsKICNlbmRpZgotICAg
IHJldHVybiAqQXRvbWljU3RyaW5nOjphZGRXaXRoU3RyaW5nVGFibGVQcm92aWRlcigqZXhlYywg
cik7CisgICAgcmV0dXJuICpBdG9taWNTdHJpbmdJbXBsOjphZGRXaXRoU3RyaW5nVGFibGVQcm92
aWRlcigqZXhlYywgcik7CiB9CiBpbmxpbmUgUmVmPFN0cmluZ0ltcGw+IElkZW50aWZpZXI6OmFk
ZChWTSogdm0sIFN0cmluZ0ltcGwqIHIpCiB7CiAjaWZuZGVmIE5ERUJVRwogICAgIGNoZWNrQ3Vy
cmVudEF0b21pY1N0cmluZ1RhYmxlKHZtKTsKICNlbmRpZgotICAgIHJldHVybiAqQXRvbWljU3Ry
aW5nOjphZGRXaXRoU3RyaW5nVGFibGVQcm92aWRlcigqdm0sIHIpOworICAgIHJldHVybiAqQXRv
bWljU3RyaW5nSW1wbDo6YWRkV2l0aFN0cmluZ1RhYmxlUHJvdmlkZXIoKnZtLCByKTsKIH0KIAog
aW5saW5lIElkZW50aWZpZXIgSWRlbnRpZmllcjo6ZnJvbVVpZChWTSogdm0sIFN0cmluZ0ltcGwq
IHVpZCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5n
LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmNwcAppbmRleCAx
M2I5MGVmYTY2N2Q0OTIwNzkwYTIzMzE5YTVlOGZjNzc0MWRkOThkLi5mOWQwZjQzNDYxNWU3MjU3
NjJjMTFjN2U4MmUzOTVlZGQxMjliMzQ0IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU1N0cmluZy5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSlNTdHJpbmcuY3BwCkBAIC0xOTQsNyArMTk0LDcgQEAgQXRvbWljU3RyaW5nSW1wbCogSlNS
b3BlU3RyaW5nOjpyZXNvbHZlUm9wZVRvRXhpc3RpbmdBdG9taWNTdHJpbmcoRXhlY1N0YXRlKiBl
eGUKIHsKICAgICBpZiAobV9sZW5ndGggPiBtYXhMZW5ndGhGb3JPblN0YWNrUmVzb2x2ZSkgewog
ICAgICAgICByZXNvbHZlUm9wZShleGVjKTsKLSAgICAgICAgaWYgKEF0b21pY1N0cmluZ0ltcGwq
IGV4aXN0aW5nQXRvbWljU3RyaW5nID0gQXRvbWljU3RyaW5nOjpmaW5kKG1fdmFsdWUuaW1wbCgp
KSkgeworICAgICAgICBpZiAoQXRvbWljU3RyaW5nSW1wbCogZXhpc3RpbmdBdG9taWNTdHJpbmcg
PSBBdG9taWNTdHJpbmdJbXBsOjpsb29rdXAobV92YWx1ZS5pbXBsKCkpKSB7CiAgICAgICAgICAg
ICBtX3ZhbHVlID0gKmV4aXN0aW5nQXRvbWljU3RyaW5nOwogICAgICAgICAgICAgc2V0SXM4Qml0
KG1fdmFsdWUuaW1wbCgpLT5pczhCaXQoKSk7CiAgICAgICAgICAgICBjbGVhckZpYmVycygpOwpA
QCAtMjA2LDcgKzIwNiw3IEBAIEF0b21pY1N0cmluZ0ltcGwqIEpTUm9wZVN0cmluZzo6cmVzb2x2
ZVJvcGVUb0V4aXN0aW5nQXRvbWljU3RyaW5nKEV4ZWNTdGF0ZSogZXhlCiAgICAgaWYgKGlzOEJp
dCgpKSB7CiAgICAgICAgIExDaGFyIGJ1ZmZlclttYXhMZW5ndGhGb3JPblN0YWNrUmVzb2x2ZV07
CiAgICAgICAgIHJlc29sdmVSb3BlSW50ZXJuYWw4KGJ1ZmZlcik7Ci0gICAgICAgIGlmIChBdG9t
aWNTdHJpbmdJbXBsKiBleGlzdGluZ0F0b21pY1N0cmluZyA9IEF0b21pY1N0cmluZzo6ZmluZChi
dWZmZXIsIG1fbGVuZ3RoKSkgeworICAgICAgICBpZiAoQXRvbWljU3RyaW5nSW1wbCogZXhpc3Rp
bmdBdG9taWNTdHJpbmcgPSBBdG9taWNTdHJpbmdJbXBsOjpsb29rdXAoYnVmZmVyLCBtX2xlbmd0
aCkpIHsKICAgICAgICAgICAgIG1fdmFsdWUgPSAqZXhpc3RpbmdBdG9taWNTdHJpbmc7CiAgICAg
ICAgICAgICBzZXRJczhCaXQobV92YWx1ZS5pbXBsKCktPmlzOEJpdCgpKTsKICAgICAgICAgICAg
IGNsZWFyRmliZXJzKCk7CkBAIC0yMTUsNyArMjE1LDcgQEAgQXRvbWljU3RyaW5nSW1wbCogSlNS
b3BlU3RyaW5nOjpyZXNvbHZlUm9wZVRvRXhpc3RpbmdBdG9taWNTdHJpbmcoRXhlY1N0YXRlKiBl
eGUKICAgICB9IGVsc2UgewogICAgICAgICBVQ2hhciBidWZmZXJbbWF4TGVuZ3RoRm9yT25TdGFj
a1Jlc29sdmVdOwogICAgICAgICByZXNvbHZlUm9wZUludGVybmFsMTYoYnVmZmVyKTsKLSAgICAg
ICAgaWYgKEF0b21pY1N0cmluZ0ltcGwqIGV4aXN0aW5nQXRvbWljU3RyaW5nID0gQXRvbWljU3Ry
aW5nOjpmaW5kKGJ1ZmZlciwgbV9sZW5ndGgpKSB7CisgICAgICAgIGlmIChBdG9taWNTdHJpbmdJ
bXBsKiBleGlzdGluZ0F0b21pY1N0cmluZyA9IEF0b21pY1N0cmluZ0ltcGw6Omxvb2t1cChidWZm
ZXIsIG1fbGVuZ3RoKSkgewogICAgICAgICAgICAgbV92YWx1ZSA9ICpleGlzdGluZ0F0b21pY1N0
cmluZzsKICAgICAgICAgICAgIHNldElzOEJpdChtX3ZhbHVlLmltcGwoKS0+aXM4Qml0KCkpOwog
ICAgICAgICAgICAgY2xlYXJGaWJlcnMoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTU3RyaW5nLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9K
U1N0cmluZy5oCmluZGV4IGEyMmU2ZmJkNzRlMWNlYmQxNzc3ZDRmZGNhZjk4MzYzNzdkNDA0ZTYu
LjIxZjg2Mzk5MTk1NWMxN2E4MzE1MzE4ZmQ1M2IwZGY2NjIzNGRlMjcgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmgKKysrIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuaApAQCAtNDgxLDcgKzQ4MSw3IEBAIEFMV0FZU19J
TkxJTkUgQXRvbWljU3RyaW5nSW1wbCogSlNTdHJpbmc6OnRvRXhpc3RpbmdBdG9taWNTdHJpbmco
RXhlY1N0YXRlKiBleGVjCiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBKU1JvcGVT
dHJpbmcqPih0aGlzKS0+cmVzb2x2ZVJvcGVUb0V4aXN0aW5nQXRvbWljU3RyaW5nKGV4ZWMpOwog
ICAgIGlmIChtX3ZhbHVlLmltcGwoKS0+aXNBdG9taWMoKSkKICAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPihtX3ZhbHVlLmltcGwoKSk7Ci0gICAgcmV0dXJuIEF0
b21pY1N0cmluZzo6ZmluZChtX3ZhbHVlLmltcGwoKSk7CisgICAgcmV0dXJuIEF0b21pY1N0cmlu
Z0ltcGw6Omxvb2t1cChtX3ZhbHVlLmltcGwoKSk7CiB9CiAKIGlubGluZSBjb25zdCBTdHJpbmcm
IEpTU3RyaW5nOjp2YWx1ZShFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TbWFsbFN0cmluZ3MuY3BwIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvU21hbGxTdHJpbmdzLmNwcAppbmRleCA5MWEzMzY4NDY0Y2U2ODc5
OWM1OTkzN2M4MTBmNzhmZTgwNmRkYmNjLi45YzZhNDNhZTIxMzhmNGVlZmViYTZlMWQwMmJjMmVh
ZDE5ZTRkZTUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TbWFs
bFN0cmluZ3MuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1NtYWxsU3Ry
aW5ncy5jcHAKQEAgLTU3LDcgKzU3LDcgQEAgY2xhc3MgU21hbGxTdHJpbmdzU3RvcmFnZSB7CiAg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IGJhc2VTdHJpbmcgPSBTdHJpbmdJbXBsOjpjcmVhdGVVbmlu
aXRpYWxpemVkKHNpbmdsZUNoYXJhY3RlclN0cmluZ0NvdW50LCBjaGFyYWN0ZXJCdWZmZXIpOwog
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaW5nbGVDaGFyYWN0ZXJTdHJpbmdDb3VudDsg
KytpKSB7CiAgICAgICAgIGNoYXJhY3RlckJ1ZmZlcltpXSA9IGk7Ci0gICAgICAgIG1fcmVwc1tp
XSA9IEF0b21pY1N0cmluZzo6YWRkKFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4oU3RyaW5nSW1wbDo6
Y3JlYXRlU3Vic3RyaW5nU2hhcmluZ0ltcGwoYmFzZVN0cmluZywgaSwgMSkpLmdldCgpKTsKKyAg
ICAgICAgbV9yZXBzW2ldID0gQXRvbWljU3RyaW5nSW1wbDo6YWRkKFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4oU3RyaW5nSW1wbDo6Y3JlYXRlU3Vic3RyaW5nU2hhcmluZ0ltcGwoYmFzZVN0cmluZywg
aSwgMSkpLmdldCgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL1R5cGVTZXQuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
VHlwZVNldC5jcHAKaW5kZXggMGY1N2VjNGI1ZWRiYjFiOWY3OGRhZTY5Y2Q3NGUxYzY3YzM3M2M1
NS4uYjYyNDg4NzUyMmNlOTY3ZmI1YzM2MjdlYTgwNjQ5Mzk3M2IyYWU1YyAxMDA2NDQKLS0tIGEv
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAKKysrIGIvU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAKQEAgLTM1Miw3ICszNTIsNyBAQCBTdHJp
bmcgU3RydWN0dXJlU2hhcGU6OnByb3BlcnR5SGFzaCgpCiAgICAgYnVpbGRlci5hcHBlbmQoJzon
KTsKICAgICAKICAgICBmb3IgKGF1dG8gaXRlciA9IG1fZmllbGRzLmJlZ2luKCksIGVuZCA9IG1f
ZmllbGRzLmVuZCgpOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7Ci0gICAgICAgIFN0cmluZyBwcm9w
ZXJ0eSA9IFN0cmluZygoKml0ZXIpKTsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gU3RyaW5n
KGl0ZXItPmdldCgpKTsKICAgICAgICAgcHJvcGVydHkucmVwbGFjZSgiOiIsICJcXDoiKTsgLy8g
RW5zdXJlIHRoYXQgaGFzaCh7ImZvbzoiLCAiYmFyIn0pICE9IGhhc2goeyJmb28iLCAiOmJhciJ9
KSBiZWNhdXNlIHdlJ3JlIHVzaW5nIGNvbG9ucyBhcyBhIHNlcGFyYXRvciBhbmQgY29sb25zIGFy
ZSBsZWdhbCBjaGFyYWN0ZXJzIGluIGZpZWxkIG5hbWVzIGluIEpTLgogICAgICAgICBidWlsZGVy
LmFwcGVuZChwcm9wZXJ0eSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi9XVEYudmN4
cHJvai9XVEYudmN4cHJvaiBiL1NvdXJjZS9XVEYvV1RGLnZjeHByb2ovV1RGLnZjeHByb2oKaW5k
ZXggNDY2OTBiOGM2Mjc0YTFhNzRkMmY2ZWQyNmFkMTkwZDcyMmFlMTA5ZS4uNmMwMjZkZGMyZjhj
NmZkMTQyNDVjMzc3ZmVjZjYzZTAzYzUzOTU2YiAxMDA2NDQKLS0tIGEvU291cmNlL1dURi9XVEYu
dmN4cHJvai9XVEYudmN4cHJvagorKysgYi9Tb3VyY2UvV1RGL1dURi52Y3hwcm9qL1dURi52Y3hw
cm9qCkBAIC0xMjcsNiArMTI3LDcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0ZlxT
dGFja0JvdW5kcy5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcU3RyaW5n
UHJpbnRTdHJlYW0uY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRc
QXRvbWljU3RyaW5nLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0
XEF0b21pY1N0cmluZ0ltcGwuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3Rm
XHRleHRcQXRvbWljU3RyaW5nVGFibGUuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0i
Li5cd3RmXHRleHRcQmFzZTY0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0
Zlx0ZXh0XENTdHJpbmcuY3BwIiAvPgpAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgPENsQ29tcGls
ZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxTdHJpbmdWaWV3LmNwcCIgLz4KICAgICA8Q2xDb21waWxl
IEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XFN5bWJvbFJlZ2lzdHJ5LmNwcCIgLz4KICAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XFdURlN0cmluZy5jcHAiIC8+Ci0gICAgPENsQ29tcGls
ZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxjZlxBdG9taWNTdHJpbmdDRi5jcHAiIC8+CisgICAgPENs
Q29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxjZlxBdG9taWNTdHJpbmdJbXBsQ0YuY3BwIiAv
PgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcY2ZcU3RyaW5nQ0YuY3BwIiAv
PgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcY2ZcU3RyaW5nSW1wbENGLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XGNmXFN0cmluZ1ZpZXdD
Ri5jcHAiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL1dURi52Y3hwcm9qL1dURi52Y3hwcm9q
LmZpbHRlcnMgYi9Tb3VyY2UvV1RGL1dURi52Y3hwcm9qL1dURi52Y3hwcm9qLmZpbHRlcnMKaW5k
ZXggY2Q5MmEzMWNkN2I3YmI0NGRhZjE1ZGZhZDhkM2U1MTljYmYyODIxZS4uNjQ4YTZhMDkxMGNk
Njc1MmU3MGQyY2Q4MDFlMTkxN2IzOTZmZmI3YSAxMDA2NDQKLS0tIGEvU291cmNlL1dURi9XVEYu
dmN4cHJvai9XVEYudmN4cHJvai5maWx0ZXJzCisrKyBiL1NvdXJjZS9XVEYvV1RGLnZjeHByb2ov
V1RGLnZjeHByb2ouZmlsdGVycwpAQCAtNjYsNiArNjYsOSBAQAogICAgIDxDbENvbXBpbGUgSW5j
bHVkZT0iLi5cd3RmXHRleHRcQXRvbWljU3RyaW5nLmNwcCI+CiAgICAgICA8RmlsdGVyPnRleHQ8
L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0
Zlx0ZXh0XEF0b21pY1N0cmluZ0ltcGwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dGV4dDwvRmlsdGVy
PgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRc
QmFzZTY0LmNwcCI+CiAgICAgICA8RmlsdGVyPnRleHQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGls
ZT4KQEAgLTg0LDcgKzg3LDcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0
XFdURlN0cmluZy5jcHAiPgogICAgICAgPEZpbHRlcj50ZXh0PC9GaWx0ZXI+CiAgICAgPC9DbENv
bXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxjZlxBdG9taWNTdHJp
bmdDRi5jcHAiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcY2ZcQXRvbWlj
U3RyaW5nSW1wbENGLmNwcCI+CiAgICAgICA8RmlsdGVyPnRleHQ8L0ZpbHRlcj4KICAgICA8L0Ns
Q29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XGNmXFN0cmluZ0NG
LmNwcCI+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL1dURi52Y3hwcm9qL2NvcHktZmlsZXMuY21k
IGIvU291cmNlL1dURi9XVEYudmN4cHJvai9jb3B5LWZpbGVzLmNtZAppbmRleCBlZDdiYWFmODZl
OTNmMDM3MWQ0OTU1YzgzYzAwMGFmZGY2OTJkMGQ2Li5lN2U2NTllOGZmNjc3YTU2MGFmN2Q3MDM5
OTM0YmQzMTgzMTc4YTRlIDEwMDc1NQotLS0gYS9Tb3VyY2UvV1RGL1dURi52Y3hwcm9qL2NvcHkt
ZmlsZXMuY21kCisrKyBiL1NvdXJjZS9XVEYvV1RGLnZjeHByb2ovY29weS1maWxlcy5jbWQKQEAg
LTI4LDYgKzI4LDcgQEAgZWNobyBDb3B5aW5nIG90aGVyIGZpbGVzLi4uCiBmb3IgJSVmIGluICgN
CiAgICAgLi5cSmF2YVNjcmlwdENvcmVcY3JlYXRlX2hhc2hfdGFibGUNCiAgICAgd3RmXHRleHRc
QXRvbWljU3RyaW5nLmNwcA0KKyAgICB3dGZcdGV4dFxBdG9taWNTdHJpbmdJbXBsLmNwcA0KICAg
ICB3dGZcdGV4dFxTdHJpbmdCdWlsZGVyLmNwcA0KICAgICB3dGZcdGV4dFxTdHJpbmdJbXBsLmNw
cA0KICAgICB3dGZcdGV4dFxXVEZTdHJpbmcuY3BwDQpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi9X
VEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XVEYvV1RGLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKaW5kZXggMjIwZDU4ZDNmYmUyYzc5NGJmYmQ0MDZkYjJjNDQ1YTJiODA5
ZGY5MC4uZDVkNDY4NDcyNjE0MjllNzZkMTVjMzgzOTBjMWE5ODA3YWUxYjNiYiAxMDA2NDQKLS0t
IGEvU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2Uv
V1RGL1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC03Niw2ICs3Niw3IEBACiAJCTQz
MEI0Nzg5MUFBQUFDMUEwMDEyMjNEQSAvKiBTdHJpbmdDb21tb24uaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQzMEI0Nzg3MUFBQUFDMUEwMDEyMjNEQSAv
KiBTdHJpbmdDb21tb24uaCAqLzsgfTsKIAkJNzBBOTkzRkUxQUQ3MTUxMzAwRkE2MTVCIC8qIFN5
bWJvbFJlZ2lzdHJ5LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDcwQTk5M0ZDMUFENzE1MTMwMEZBNjE1QiAvKiBTeW1ib2xSZWdpc3RyeS5jcHAgKi87
IH07CiAJCTcwQTk5M0ZGMUFENzE1MTMwMEZBNjE1QiAvKiBTeW1ib2xSZWdpc3RyeS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzBBOTkzRkQxQUQ3MTUx
MzAwRkE2MTVCIC8qIFN5bWJvbFJlZ2lzdHJ5LmggKi87IH07CisJCTcwRUNBNjBEMUIwMjQyNjgw
MDQ0OTczOSAvKiBBdG9taWNTdHJpbmdJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcwRUNBNjBBMUIwMjQyNjgwMDQ0OTczOSAvKiBBdG9taWNT
dHJpbmdJbXBsLmNwcCAqLzsgfTsKIAkJN0NCQkEwNzQxOUJCN0ZEQzAwQkJGMDI1IC8qIE9TT2Jq
ZWN0UHRyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3
Q0JCQTA3MzE5QkI3RkRDMDBCQkYwMjUgLyogT1NPYmplY3RQdHIuaCAqLzsgfTsKIAkJN0NERDdG
RjgxODZEMjkxRTAwNzQzM0NEIC8qIEl0ZXJhdG9yQWRhcHRvcnMuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdDREQ3RkY3MTg2RDI5MUUwMDc0MzNDRCAv
KiBJdGVyYXRvckFkYXB0b3JzLmggKi87IH07CiAJCTdDREQ3RkZBMTg2RDJBNTQwMDc0MzNDRCAv
KiBJdGVyYXRvclJhbmdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA3Q0REN0ZGOTE4NkQyQTU0MDA3NDMzQ0QgLyogSXRlcmF0b3JSYW5nZS5oICovOyB9
OwpAQCAtOTQsNyArOTUsNyBAQAogCQk5QkQ4RjQwQjE3NkMyQjQ3MDAwMkQ4NjUgLyogQXRvbWlj
U3RyaW5nVGFibGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDlCRDhGNDBBMTc2QzJBRDgwMDAyRDg2NSAvKiBBdG9taWNTdHJpbmdUYWJsZS5oICovOyB9
OwogCQlBNUJBMTVGMzE4MjQzM0E5MDBBODJFNjkgLyogU3RyaW5nTWFjLm1tIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTVCQTE1RjIxODI0MzNBOTAwQTgy
RTY5IC8qIFN0cmluZ01hYy5tbSAqLzsgfTsKIAkJQTVCQTE1RjUxODI0MzQ4MDAwQTgyRTY5IC8q
IFN0cmluZ0ltcGxNYWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBNUJBMTVGNDE4MjQzNDgwMDBBODJFNjkgLyogU3RyaW5nSW1wbE1hYy5tbSAqLzsg
fTsKLQkJQTVCQTE1RkExODI0MzVBNjAwQTgyRTY5IC8qIEF0b21pY1N0cmluZ0NGLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE1QkExNUY3MTgyNDM1
QTYwMEE4MkU2OSAvKiBBdG9taWNTdHJpbmdDRi5jcHAgKi87IH07CisJCUE1QkExNUZBMTgyNDM1
QTYwMEE4MkU2OSAvKiBBdG9taWNTdHJpbmdJbXBsQ0YuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTVCQTE1RjcxODI0MzVBNjAwQTgyRTY5IC8qIEF0
b21pY1N0cmluZ0ltcGxDRi5jcHAgKi87IH07CiAJCUE1QkExNUZCMTgyNDM1QTYwMEE4MkU2OSAv
KiBTdHJpbmdDRi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBNUJBMTVGODE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nQ0YuY3BwICovOyB9OwogCQlB
NUJBMTVGQzE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nSW1wbENGLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE1QkExNUY5MTgyNDM1QTYwMEE4MkU2
OSAvKiBTdHJpbmdJbXBsQ0YuY3BwICovOyB9OwogCQlBNzBEQTA4NDE3OTlGMDREMDA1MjlBOUIg
LyogSW5zZXJ0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBNzBEQTA4MjE3OTlGMDREMDA1MjlBOUIgLyogSW5zZXJ0aW9uLmggKi87IH07CkBAIC0z
NjAsNiArMzYxLDcgQEAKIAkJNjU0MUNBRjQxNjMwREIyNjAwNkQwREVDIC8qIENvcHlXVEZIZWFk
ZXJzLnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgcGF0aCA9IENvcHlXVEZIZWFk
ZXJzLnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3MEE5OTNGQzFBRDcx
NTEzMDBGQTYxNUIgLyogU3ltYm9sUmVnaXN0cnkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gU3ltYm9sUmVnaXN0cnkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQk3MEE5OTNGRDFBRDcxNTEzMDBGQTYxNUIgLyogU3ltYm9sUmVnaXN0cnkuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3ltYm9sUmVnaXN0cnkuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNzBFQ0E2MEExQjAyNDI2ODAwNDQ5NzM5IC8qIEF0b21pY1N0
cmluZ0ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQXRvbWlj
U3RyaW5nSW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDQkJBMDczMTlC
QjdGREMwMEJCRjAyNSAvKiBPU09iamVjdFB0ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBPU09iamVjdFB0ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3Q0RE
N0ZGNzE4NkQyOTFFMDA3NDMzQ0QgLyogSXRlcmF0b3JBZGFwdG9ycy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBJdGVyYXRvckFkYXB0b3JzLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTdDREQ3RkY5MTg2RDJBNTQwMDc0MzNDRCAvKiBJdGVyYXRvclJhbmdlLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEl0ZXJhdG9yUmFuZ2UuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTM3OCw3ICszODAsNyBAQAogCQk5QkQ4RjQwQTE3NkMy
QUQ4MDAwMkQ4NjUgLyogQXRvbWljU3RyaW5nVGFibGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQXRvbWlj
U3RyaW5nVGFibGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTVCQTE1RjIxODI0
MzNBOTAwQTgyRTY5IC8qIFN0cmluZ01hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9i
amNwcDsgbmFtZSA9IFN0cmluZ01hYy5tbTsgcGF0aCA9IG1hYy9TdHJpbmdNYWMubW07IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE1QkExNUY0MTgyNDM0ODAwMEE4MkU2OSAvKiBTdHJp
bmdJbXBsTWFjLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBuYW1lID0gU3Ry
aW5nSW1wbE1hYy5tbTsgcGF0aCA9IG1hYy9TdHJpbmdJbXBsTWFjLm1tOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwotCQlBNUJBMTVGNzE4MjQzNUE2MDBBODJFNjkgLyogQXRvbWljU3RyaW5n
Q0YuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQXRvbWljU3RyaW5n
Q0YuY3BwOyBwYXRoID0gY2YvQXRvbWljU3RyaW5nQ0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQlBNUJBMTVGNzE4MjQzNUE2MDBBODJFNjkgLyogQXRvbWljU3RyaW5nSW1wbENG
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEF0b21pY1N0cmluZ0lt
cGxDRi5jcHA7IHBhdGggPSBjZi9BdG9taWNTdHJpbmdJbXBsQ0YuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlBNUJBMTVGODE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nQ0YuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gU3RyaW5nQ0YuY3BwOyBwYXRo
ID0gY2YvU3RyaW5nQ0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBNUJBMTVG
OTE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nSW1wbENGLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgbmFtZSA9IFN0cmluZ0ltcGxDRi5jcHA7IHBhdGggPSBjZi9TdHJpbmdJbXBs
Q0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBNzBEQTA4MjE3OTlGMDREMDA1
MjlBOUIgLyogSW5zZXJ0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IElu
c2VydGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNjY4LDcgKzY3MCw3IEBA
CiAJCUE1QkExNUY2MTgyNDM1OUUwMEE4MkU2OSAvKiBjZiAqLyA9IHsKIAkJCWlzYSA9IFBCWEdy
b3VwOwogCQkJY2hpbGRyZW4gPSAoCi0JCQkJQTVCQTE1RjcxODI0MzVBNjAwQTgyRTY5IC8qIEF0
b21pY1N0cmluZ0NGLmNwcCAqLywKKwkJCQlBNUJBMTVGNzE4MjQzNUE2MDBBODJFNjkgLyogQXRv
bWljU3RyaW5nSW1wbENGLmNwcCAqLywKIAkJCQlBNUJBMTVGODE4MjQzNUE2MDBBODJFNjkgLyog
U3RyaW5nQ0YuY3BwICovLAogCQkJCUE1QkExNUY5MTgyNDM1QTYwMEE4MkU2OSAvKiBTdHJpbmdJ
bXBsQ0YuY3BwICovLAogCQkJCTkzOTM0QkQ0MThBMUYxNjkwMEQwRDZBMSAvKiBTdHJpbmdWaWV3
Q0YuY3BwICovLApAQCAtOTE4LDYgKzkyMCw3IEBACiAJCQkJQThBNDczMUQxNTFBODI1QjAwNDEy
M0ZGIC8qIEF0b21pY1N0cmluZy5jcHAgKi8sCiAJCQkJQThBNDczMUUxNTFBODI1QjAwNDEyM0ZG
IC8qIEF0b21pY1N0cmluZy5oICovLAogCQkJCUE4QTQ3MzFGMTUxQTgyNUIwMDQxMjNGRiAvKiBB
dG9taWNTdHJpbmdIYXNoLmggKi8sCisJCQkJNzBFQ0E2MEExQjAyNDI2ODAwNDQ5NzM5IC8qIEF0
b21pY1N0cmluZ0ltcGwuY3BwICovLAogCQkJCUE4QTQ3MzIwMTUxQTgyNUIwMDQxMjNGRiAvKiBB
dG9taWNTdHJpbmdJbXBsLmggKi8sCiAJCQkJOUJDNzBGMDQxNzZDMzc5RDAwMTAxREVDIC8qIEF0
b21pY1N0cmluZ1RhYmxlLmNwcCAqLywKIAkJCQk5QkQ4RjQwQTE3NkMyQUQ4MDAwMkQ4NjUgLyog
QXRvbWljU3RyaW5nVGFibGUuaCAqLywKQEAgLTEzMjQsNyArMTMyNyw3IEBACiAJCQkJRTRBMEFE
M0QxQTk2MjUzQzAwNTM2REY2IC8qIFdvcmtRdWV1ZUNvY29hLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUE4QTQ3M0IzMTUxQTgyNUIwMDQxMjNGRiAvKiBmYXN0LWR0b2EuY2MgaW4gU291cmNlcyAq
LywKIAkJCQlBOEE0NzNDMzE1MUE4MjVCMDA0MTIzRkYgLyogRmFzdE1hbGxvYy5jcHAgaW4gU291
cmNlcyAqLywKLQkJCQlBNUJBMTVGQTE4MjQzNUE2MDBBODJFNjkgLyogQXRvbWljU3RyaW5nQ0Yu
Y3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTVCQTE1RkExODI0MzVBNjAwQTgyRTY5IC8qIEF0b21p
Y1N0cmluZ0ltcGxDRi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlFMTU1NTZGNTE4QTBDQzE4MDA2
RjQ4RkIgLyogQ3J5cHRvZ3JhcGhpY1V0aWxpdGllcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkw
RjlEMzM2MDE2NURCQTczMDA1QUQzODcgLyogRmlsZVByaW50U3RyZWFtLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUE4QTQ3M0I1MTUxQTgyNUIwMDQxMjNGRiAvKiBmaXhlZC1kdG9hLmNjIGluIFNv
dXJjZXMgKi8sCkBAIC0xMzU1LDYgKzEzNTgsNyBAQAogCQkJCUE3NDg3NDUyMTdBMEJEQUUwMEZB
MDRDQiAvKiBTaXhDaGFyYWN0ZXJIYXNoLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4QTQ3NDI1
MTUxQTgyNUIwMDQxMjNGRiAvKiBTaXplTGltaXRzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4
QTQ3NDI3MTUxQTgyNUIwMDQxMjNGRiAvKiBTdGFja0JvdW5kcy5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQk3MEVDQTYwRDFCMDI0MjY4MDA0NDk3MzkgLyogQXRvbWljU3RyaW5nSW1wbC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQlGRURBQ0QzRDE2MzBGODNGMDBDNjk2MzQgLyogU3RhY2tTdGF0cy5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlBOEE0NzQzQzE1MUE4MjVCMDA0MTIzRkYgLyogU3RyaW5n
QnVpbGRlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOEE0NzQ0MDE1MUE4MjVCMDA0MTIzRkYg
LyogU3RyaW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYv
d3RmL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQKaW5kZXgg
MjM2NGRjZTI5NDIxNGY1ODJlZjkwZTg0MTM3MDk1ODc0MGNhYTE4ZC4uMzUzZjJjMzRlN2EwOGM0
MTI3NTNmYzg3ODRlMjhhNmU0ZTBkZTI3ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvQ01h
a2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQKQEAgLTE4Nyw2
ICsxODcsNyBAQCBzZXQoV1RGX1NPVVJDRVMKICAgICBkdG9hL3N0cnRvZC5jYwogCiAgICAgdGV4
dC9BdG9taWNTdHJpbmcuY3BwCisgICAgdGV4dC9BdG9taWNTdHJpbmdJbXBsLmNwcAogICAgIHRl
eHQvQXRvbWljU3RyaW5nVGFibGUuY3BwCiAgICAgdGV4dC9CYXNlNjQuY3BwCiAgICAgdGV4dC9D
U3RyaW5nLmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvUGxhdGZvcm1NYWMuY21ha2Ug
Yi9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybU1hYy5jbWFrZQppbmRleCA4ZDEwN2M3MzBlYWFjMzcx
NWM5MjkwZTU3NTUzNTI5YWQzMjkyOTk1Li5mNjEwNjE5YjE4NWQzNjcwY2U3MjFmNDlhMDAyNmRm
ZGZkNzkwNGM5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybU1hYy5jbWFrZQor
KysgYi9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybU1hYy5jbWFrZQpAQCAtMTEsNyArMTEsNyBAQCBs
aXN0KEFQUEVORCBXVEZfU09VUkNFUwogICAgIG1hYy9EZXByZWNhdGVkU3ltYm9sc1VzZWRCeVNh
ZmFyaS5tbQogICAgIG1hYy9NYWluVGhyZWFkTWFjLm1tCiAKLSAgICB0ZXh0L2NmL0F0b21pY1N0
cmluZ0NGLmNwcAorICAgIHRleHQvY2YvQXRvbWljU3RyaW5nSW1wbENGLmNwcAogICAgIHRleHQv
Y2YvU3RyaW5nQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJpbmdJbXBsQ0YuY3BwCiAgICAgdGV4dC9j
Zi9TdHJpbmdWaWV3Q0YuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybVdp
bi5jbWFrZSBiL1NvdXJjZS9XVEYvd3RmL1BsYXRmb3JtV2luLmNtYWtlCmluZGV4IGY3MzdiOGNh
YmM1ZWY5NGU4MzQ4YmYzOGZiZDZlYzc3Nzg4OGRhYTYuLjk3ZjczOTk1ZWQ0ODkyYmNjYTBiYzBm
YWFjOWM5NTExODQ0M2RkMWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL1BsYXRmb3JtV2lu
LmNtYWtlCisrKyBiL1NvdXJjZS9XVEYvd3RmL1BsYXRmb3JtV2luLmNtYWtlCkBAIC0xLDUgKzEs
NSBAQAogbGlzdChBUFBFTkQgV1RGX1NPVVJDRVMKLSAgICB0ZXh0L2NmL0F0b21pY1N0cmluZ0NG
LmNwcAorICAgIHRleHQvY2YvQXRvbWljU3RyaW5nSW1wbENGLmNwcAogICAgIHRleHQvY2YvU3Ry
aW5nQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJpbmdJbXBsQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJp
bmdWaWV3Q0YuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmlu
Zy5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZy5jcHAKaW5kZXggNWFiNGUx
ZWI3ZGJlZGE2ZWEzNzM1ZDU0ZDJjNTA2Nzg1MjczMjg0Ny4uMGM0MmU1YzZjMmIwZTM5YzE4ODhk
ZWRjZTg0NzViODQ4Yjc5ZTExNyAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9BdG9t
aWNTdHJpbmcuY3BwCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nLmNwcApA
QCAtMjMsMTQgKzIzLDggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJBdG9taWNT
dHJpbmcuaCIKIAotI2luY2x1ZGUgIkF0b21pY1N0cmluZ1RhYmxlLmgiCi0jaW5jbHVkZSAiSGFz
aFNldC5oIgogI2luY2x1ZGUgIkludGVnZXJUb1N0cmluZ0NvbnZlcnNpb24uaCIKLSNpbmNsdWRl
ICJTdHJpbmdIYXNoLmgiCi0jaW5jbHVkZSAiVGhyZWFkaW5nLmgiCi0jaW5jbHVkZSAiV1RGVGhy
ZWFkRGF0YS5oIgogI2luY2x1ZGUgImR0b2EuaCIKLSNpbmNsdWRlIDx3dGYvdW5pY29kZS9VVEY4
Lmg+CiAKICNpZiBVU0UoV0VCX1RIUkVBRCkKICNpbmNsdWRlICJTcGluTG9jay5oIgpAQCAtMzgs
NDI0ICszMiw2IEBACiAKIG5hbWVzcGFjZSBXVEYgewogCi11c2luZyBuYW1lc3BhY2UgVW5pY29k
ZTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoQXRvbWljU3RyaW5nKSA9PSBzaXplb2YoU3RyaW5n
KSwgIkF0b21pY1N0cmluZyBhbmQgU3RyaW5nIG11c3QgYmUgc2FtZSBzaXplISIpOwotCi0jaWYg
VVNFKFdFQl9USFJFQUQpCi0KLWNsYXNzIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyIDogcHVibGlj
IFNwaW5Mb2NrSG9sZGVyIHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShBdG9taWNTdHJpbmdU
YWJsZUxvY2tlcik7Ci0KLSAgICBzdGF0aWMgU3RhdGljU3BpbkxvY2sgc19zdHJpbmdUYWJsZUxv
Y2s7Ci1wdWJsaWM6Ci0gICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIoKQotICAgICAgICA6IFNw
aW5Mb2NrSG9sZGVyKCZzX3N0cmluZ1RhYmxlTG9jaykKLSAgICB7Ci0gICAgfQotfTsKLQotU3Rh
dGljU3BpbkxvY2sgQXRvbWljU3RyaW5nVGFibGVMb2NrZXI6OnNfc3RyaW5nVGFibGVMb2NrOwot
Ci0jZWxzZQotCi1jbGFzcyBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciB7Ci0gICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoQXRvbWljU3RyaW5nVGFibGVMb2NrZXIpOwotcHVibGljOgotICAgIEF0b21p
Y1N0cmluZ1RhYmxlTG9ja2VyKCkgeyB9Ci19OwotCi0jZW5kaWYgLy8gVVNFKFdFQl9USFJFQUQp
Ci0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIEhhc2hTZXQ8U3RyaW5nSW1wbCo+JiBzdHJpbmdUYWJs
ZSgpCi17Ci0gICAgcmV0dXJuIHd0ZlRocmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpLT50
YWJsZSgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRv
cj4KLXN0YXRpYyBpbmxpbmUgUmVmPFN0cmluZ0ltcGw+IGFkZFRvU3RyaW5nVGFibGUoY29uc3Qg
VCYgdmFsdWUpCi17Ci0gICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOwotCi0gICAg
SGFzaFNldDxTdHJpbmdJbXBsKj46OkFkZFJlc3VsdCBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgp
LmFkZDxIYXNoVHJhbnNsYXRvcj4odmFsdWUpOwotCi0gICAgLy8gSWYgdGhlIHN0cmluZyBpcyBu
ZXdseS10cmFuc2xhdGVkLCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCi0gICAgLy8gVGhlIGJv
b2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KLSAgICBpZiAoYWRkUmVz
dWx0LmlzTmV3RW50cnkpCi0gICAgICAgIHJldHVybiBhZG9wdFJlZigqKmFkZFJlc3VsdC5pdGVy
YXRvcik7Ci0gICAgcmV0dXJuICoqYWRkUmVzdWx0Lml0ZXJhdG9yOwotfQotCi1zdHJ1Y3QgQ1N0
cmluZ1RyYW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IExDaGFyKiBj
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNr
VG9wOEJpdHMoYyk7Ci0gICAgfQotCi0gICAgc3RhdGljIGlubGluZSBib29sIGVxdWFsKFN0cmlu
Z0ltcGwqIHIsIGNvbnN0IExDaGFyKiBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdURjo6ZXF1
YWwociwgcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwq
JiBsb2NhdGlvbiwgY29uc3QgTENoYXIqIGNvbnN0JiBjLCB1bnNpZ25lZCBoYXNoKQotICAgIHsK
LSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlKGMpLmxlYWtSZWYoKTsKLSAg
ICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0
b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1SZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5n
OjphZGQoY29uc3QgTENoYXIqIGMpCi17Ci0gICAgaWYgKCFjKQotICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICBpZiAoISpjKQotICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsK
LQotICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPGNvbnN0IExDaGFyKiwgQ1N0cmluZ1RyYW5z
bGF0b3I+KGMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPgotc3RydWN0
IEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlciB7Ci0gICAgY29uc3QgQ2hhcmFjdGVyVHlwZSogczsK
LSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19OwotCi10eXBlZGVmIEhhc2hUcmFuc2xhdG9yQ2hhckJ1
ZmZlcjxVQ2hhcj4gVUNoYXJCdWZmZXI7Ci1zdHJ1Y3QgVUNoYXJCdWZmZXJUcmFuc2xhdG9yIHsK
LSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBVQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMo
YnVmLnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmlu
Z0ltcGwqIGNvbnN0JiBzdHIsIGNvbnN0IFVDaGFyQnVmZmVyJiBidWYpCi0gICAgewotICAgICAg
ICByZXR1cm4gV1RGOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAg
ICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hh
ckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSAm
U3RyaW5nSW1wbDo6Y3JlYXRlOEJpdElmUG9zc2libGUoYnVmLnMsIGJ1Zi5sZW5ndGgpLmxlYWtS
ZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0gICAgICAgIGxvY2F0aW9u
LT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFy
YWN0ZXJUeXBlPgotc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJzIHsKLSAgICB1bnNpZ25lZCBoYXNo
OwotICAgIGNvbnN0IENoYXJhY3RlclR5cGUqIGNoYXJhY3RlcnM7Ci0gICAgdW5zaWduZWQgbGVu
Z3RoOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4KLXN0cnVjdCBIYXNo
QW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0
IEhhc2hBbmRDaGFyYWN0ZXJzPENoYXJhY3RlclR5cGU+JiBidWZmZXIpCi0gICAgewotICAgICAg
ICBBU1NFUlQoYnVmZmVyLmhhc2ggPT0gU3RyaW5nSGFzaGVyOjpjb21wdXRlSGFzaEFuZE1hc2tU
b3A4Qml0cyhidWZmZXIuY2hhcmFjdGVycywgYnVmZmVyLmxlbmd0aCkpOwotICAgICAgICByZXR1
cm4gYnVmZmVyLmhhc2g7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1w
bCogY29uc3QmIHN0cmluZywgY29uc3QgSGFzaEFuZENoYXJhY3RlcnM8Q2hhcmFjdGVyVHlwZT4m
IGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBXVEY6OmVxdWFsKHN0cmluZywgYnVmZmVy
LmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRy
YW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzPENo
YXJhY3RlclR5cGU+JiBidWZmZXIsIHVuc2lnbmVkIGhhc2gpCi0gICAgewotICAgICAgICBsb2Nh
dGlvbiA9ICZTdHJpbmdJbXBsOjpjcmVhdGUoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5n
dGgpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0gICAgICAg
IGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgSGFzaEFu
ZFVURjhDaGFyYWN0ZXJzIHsKLSAgICB1bnNpZ25lZCBoYXNoOwotICAgIGNvbnN0IGNoYXIqIGNo
YXJhY3RlcnM7Ci0gICAgdW5zaWduZWQgbGVuZ3RoOwotICAgIHVuc2lnbmVkIHV0ZjE2TGVuZ3Ro
OwotfTsKLQotc3RydWN0IEhhc2hBbmRVVEY4Q2hhcmFjdGVyc1RyYW5zbGF0b3IgewotICAgIHN0
YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEhhc2hBbmRVVEY4Q2hhcmFjdGVycyYgYnVmZmVyKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5oYXNoOwotICAgIH0KLQotICAgIHN0YXRpYyBi
b29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHJpbmcsIGNvbnN0IEhhc2hBbmRVVEY4Q2hh
cmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAgaWYgKGJ1ZmZlci51dGYxNkxlbmd0aCAh
PSBzdHJpbmctPmxlbmd0aCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAg
IC8vIElmIGJ1ZmZlciBjb250YWlucyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgVVRGLTggYW5kIFVU
RjE2IGxlbmd0aCBhcmUgdGhlIHNhbWUuCi0gICAgICAgIGlmIChidWZmZXIudXRmMTZMZW5ndGgg
IT0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgaWYgKHN0cmluZy0+aXM4Qml0KCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsTGF0aW4xV2l0aFVURjgoc3RyaW5nLT5jaGFyYWN0
ZXJzOCgpLCBidWZmZXIuY2hhcmFjdGVycywgYnVmZmVyLmNoYXJhY3RlcnMgKyBidWZmZXIubGVu
Z3RoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVxdWFsVVRGMTZXaXRoVVRGOChzdHJpbmctPmNo
YXJhY3RlcnMxNigpLCBidWZmZXIuY2hhcmFjdGVycywgYnVmZmVyLmNoYXJhY3RlcnMgKyBidWZm
ZXIubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJpbmctPmlzOEJpdCgpKSB7
Ci0gICAgICAgICAgICBjb25zdCBMQ2hhciogc3RyaW5nQ2hhcmFjdGVycyA9IHN0cmluZy0+Y2hh
cmFjdGVyczgoKTsKLQotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJ1ZmZl
ci5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChpc0FTQ0lJKGJ1ZmZlci5j
aGFyYWN0ZXJzW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZ0NoYXJhY3RlcnNbaV0g
IT0gYnVmZmVyLmNoYXJhY3RlcnNbaV0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBjb25zdCBVQ2hhciogc3RyaW5nQ2hhcmFjdGVycyA9IHN0cmluZy0+Y2hhcmFj
dGVyczE2KCk7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5n
dGg7ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKGlzQVNDSUkoYnVmZmVyLmNoYXJhY3RlcnNb
aV0pKTsKLSAgICAgICAgICAgIGlmIChzdHJpbmdDaGFyYWN0ZXJzW2ldICE9IGJ1ZmZlci5jaGFy
YWN0ZXJzW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShT
dHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IEhhc2hBbmRVVEY4Q2hhcmFjdGVycyYgYnVmZmVy
LCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgVUNoYXIqIHRhcmdldDsKLSAgICAgICAg
UmVmUHRyPFN0cmluZ0ltcGw+IG5ld1N0cmluZyA9IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlh
bGl6ZWQoYnVmZmVyLnV0ZjE2TGVuZ3RoLCB0YXJnZXQpOwotCi0gICAgICAgIGJvb2wgaXNBbGxB
U0NJSTsKLSAgICAgICAgY29uc3QgY2hhciogc291cmNlID0gYnVmZmVyLmNoYXJhY3RlcnM7Ci0g
ICAgICAgIGlmIChjb252ZXJ0VVRGOFRvVVRGMTYoJnNvdXJjZSwgc291cmNlICsgYnVmZmVyLmxl
bmd0aCwgJnRhcmdldCwgdGFyZ2V0ICsgYnVmZmVyLnV0ZjE2TGVuZ3RoLCAmaXNBbGxBU0NJSSkg
IT0gY29udmVyc2lvbk9LKQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAg
ICAgICAgaWYgKGlzQWxsQVNDSUkpCi0gICAgICAgICAgICBuZXdTdHJpbmcgPSBTdHJpbmdJbXBs
OjpjcmVhdGUoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOwotCi0gICAgICAgIGxv
Y2F0aW9uID0gbmV3U3RyaW5nLnJlbGVhc2UoKS5sZWFrUmVmKCk7Ci0gICAgICAgIGxvY2F0aW9u
LT5zZXRIYXNoKGhhc2gpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7Ci0g
ICAgfQotfTsKLQotUmVmUHRyPFN0cmluZ0ltcGw+IEF0b21pY1N0cmluZzo6YWRkKGNvbnN0IFVD
aGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4g
bnVsbHB0cjsKLQotICAgIGlmICghbGVuZ3RoKQotICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6
ZW1wdHkoKTsKLSAgICAKLSAgICBVQ2hhckJ1ZmZlciBidWZmZXIgPSB7IHMsIGxlbmd0aCB9Owot
ICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5z
bGF0b3I+KGJ1ZmZlcik7Ci19Ci0KLVJlZjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChj
b25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpCi17
Ci0gICAgQVNTRVJUKHMpOwotICAgIEFTU0VSVChleGlzdGluZ0hhc2gpOwotCi0gICAgaWYgKCFs
ZW5ndGgpCi0gICAgICAgIHJldHVybiAqU3RyaW5nSW1wbDo6ZW1wdHkoKTsKLQotICAgIEhhc2hB
bmRDaGFyYWN0ZXJzPFVDaGFyPiBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07
Ci0gICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8SGFzaEFuZENoYXJhY3RlcnM8VUNoYXI+LCBI
YXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I8VUNoYXI+PihidWZmZXIpOwotfQotCi1SZWZQdHI8
U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoY29uc3QgVUNoYXIqIHMpCi17Ci0gICAgaWYg
KCFzKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHVuc2lnbmVkIGxlbmd0aCA9IDA7
Ci0gICAgd2hpbGUgKHNbbGVuZ3RoXSAhPSBVQ2hhcigwKSkKLSAgICAgICAgKytsZW5ndGg7Ci0K
LSAgICBpZiAoIWxlbmd0aCkKLSAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmVtcHR5KCk7Ci0K
LSAgICBVQ2hhckJ1ZmZlciBidWZmZXIgPSB7IHMsIGxlbmd0aCB9OwotICAgIHJldHVybiBhZGRU
b1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7
Ci19Ci0KLXN0cnVjdCBTdWJzdHJpbmdMb2NhdGlvbiB7Ci0gICAgU3RyaW5nSW1wbCogYmFzZVN0
cmluZzsKLSAgICB1bnNpZ25lZCBzdGFydDsKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19OwotCi1z
dHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvciB7Ci0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0
cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlciwgdW5z
aWduZWQgaGFzaCkKLSAgICB7Ci0gICAgICAgIGxvY2F0aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0
ZVN1YnN0cmluZ1NoYXJpbmdJbXBsKGJ1ZmZlci5iYXNlU3RyaW5nLCBidWZmZXIuc3RhcnQsIGJ1
ZmZlci5sZW5ndGgpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7
Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1zdHJ1
Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjggOiBTdWJzdHJpbmdUcmFuc2xhdG9yIHsKLSAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChjb25zdCBTdWJzdHJpbmdMb2NhdGlvbiYgYnVmZmVyKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMo
YnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnM4KCkgKyBidWZmZXIuc3RhcnQsIGJ1ZmZlci5s
ZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0
JiBzdHJpbmcsIGNvbnN0IFN1YnN0cmluZ0xvY2F0aW9uJiBidWZmZXIpCi0gICAgewotICAgICAg
ICByZXR1cm4gV1RGOjplcXVhbChzdHJpbmcsIGJ1ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJz
OCgpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3RoKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3Qg
U3Vic3RyaW5nVHJhbnNsYXRvcjE2IDogU3Vic3RyaW5nVHJhbnNsYXRvciB7Ci0gICAgc3RhdGlj
IHVuc2lnbmVkIGhhc2goY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlcikKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1
ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJzMTYoKSArIGJ1ZmZlci5zdGFydCwgYnVmZmVyLmxl
bmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3Qm
IHN0cmluZywgY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlcikKLSAgICB7Ci0gICAgICAg
IHJldHVybiBXVEY6OmVxdWFsKHN0cmluZywgYnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnMx
NigpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3RoKTsKLSAgICB9Ci19OwotCi1SZWZQdHI8
U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoU3RyaW5nSW1wbCogYmFzZVN0cmluZywgdW5z
aWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAoIWJhc2VTdHJpbmcpCi0g
ICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgaWYgKCFsZW5ndGggfHwgc3RhcnQgPj0gYmFz
ZVN0cmluZy0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwot
Ci0gICAgdW5zaWduZWQgbWF4TGVuZ3RoID0gYmFzZVN0cmluZy0+bGVuZ3RoKCkgLSBzdGFydDsK
LSAgICBpZiAobGVuZ3RoID49IG1heExlbmd0aCkgewotICAgICAgICBpZiAoIXN0YXJ0KQotICAg
ICAgICAgICAgcmV0dXJuIGFkZChiYXNlU3RyaW5nKTsKLSAgICAgICAgbGVuZ3RoID0gbWF4TGVu
Z3RoOwotICAgIH0KLQotICAgIFN1YnN0cmluZ0xvY2F0aW9uIGJ1ZmZlciA9IHsgYmFzZVN0cmlu
Zywgc3RhcnQsIGxlbmd0aCB9OwotICAgIGlmIChiYXNlU3RyaW5nLT5pczhCaXQoKSkKLSAgICAg
ICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8U3Vic3RyaW5nTG9jYXRpb24sIFN1YnN0cmluZ1Ry
YW5zbGF0b3I4PihidWZmZXIpOwotICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFN1YnN0cmlu
Z0xvY2F0aW9uLCBTdWJzdHJpbmdUcmFuc2xhdG9yMTY+KGJ1ZmZlcik7Ci19Ci0gICAgCi10eXBl
ZGVmIEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlcjxMQ2hhcj4gTENoYXJCdWZmZXI7Ci1zdHJ1Y3Qg
TENoYXJCdWZmZXJUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBM
Q2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29t
cHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmLnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQotICAg
IHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHIsIGNvbnN0IExDaGFyQnVm
ZmVyJiBidWYpCi0gICAgewotICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHIsIGJ1Zi5zLCBi
dWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1w
bComIGxvY2F0aW9uLCBjb25zdCBMQ2hhckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQotICAg
IHsKLSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlKGJ1Zi5zLCBidWYubGVu
Z3RoKS5sZWFrUmVmKCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOwotICAgICAg
ICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7Ci0gICAgfQotfTsKLQotdHlwZWRlZiBIYXNo
VHJhbnNsYXRvckNoYXJCdWZmZXI8Y2hhcj4gQ2hhckJ1ZmZlcjsKLXN0cnVjdCBDaGFyQnVmZmVy
RnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvciB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29u
c3QgQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6
Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+
KGJ1Zi5zKSwgYnVmLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgZXF1YWwoU3Ry
aW5nSW1wbCogY29uc3QmIHN0ciwgY29uc3QgQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIFdURjo6ZXF1YWwoc3RyLCBidWYucywgYnVmLmxlbmd0aCk7Ci0gICAgfQotCi0g
ICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgQ2hh
ckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSAm
U3RyaW5nSW1wbDo6Y3JlYXRlRnJvbUxpdGVyYWwoYnVmLnMsIGJ1Zi5sZW5ndGgpLmxlYWtSZWYo
KTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0gICAgICAgIGxvY2F0aW9uLT5z
ZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1SZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWlj
U3RyaW5nOjphZGQoY29uc3QgTENoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAo
IXMpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgaWYgKCFsZW5ndGgpCi0gICAgICAg
IHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwotCi0gICAgTENoYXJCdWZmZXIgYnVmZmVyID0g
eyBzLCBsZW5ndGggfTsKLSAgICByZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxMQ2hhckJ1ZmZlciwg
TENoYXJCdWZmZXJUcmFuc2xhdG9yPihidWZmZXIpOwotfQotCi1SZWY8U3RyaW5nSW1wbD4gQXRv
bWljU3RyaW5nOjphZGRGcm9tTGl0ZXJhbERhdGEoY29uc3QgY2hhciogY2hhcmFjdGVycywgdW5z
aWduZWQgbGVuZ3RoKQotewotICAgIEFTU0VSVChjaGFyYWN0ZXJzKTsKLSAgICBBU1NFUlQobGVu
Z3RoKTsKLQotICAgIENoYXJCdWZmZXIgYnVmZmVyID0geyBjaGFyYWN0ZXJzLCBsZW5ndGggfTsK
LSAgICByZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxDaGFyQnVmZmVyLCBDaGFyQnVmZmVyRnJvbUxp
dGVyYWxEYXRhVHJhbnNsYXRvcj4oYnVmZmVyKTsKLX0KLQotUmVmPFN0cmluZ0ltcGw+IEF0b21p
Y1N0cmluZzo6YWRkU2xvd0Nhc2UoU3RyaW5nSW1wbCYgc3RyaW5nKQotewotICAgIGlmICghc3Ry
aW5nLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gKlN0cmluZ0ltcGw6OmVtcHR5KCk7Ci0KLSAg
ICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKLSAgICAgICAgaWYgKHN0cmluZy5pczhCaXQoKSkK
LSAgICAgICAgICAgIHJldHVybiAqYWRkKHN0cmluZy5jaGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVu
Z3RoKCkpOwotICAgICAgICByZXR1cm4gKmFkZChzdHJpbmcuY2hhcmFjdGVyczE2KCksIHN0cmlu
Zy5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghc3RyaW5nLmlz
QXRvbWljKCksICJBdG9taWNTdHJpbmcgc2hvdWxkIG5vdCBoaXQgdGhlIHNsb3cgY2FzZSBpZiB0
aGUgc3RyaW5nIGlzIGFscmVhZHkgYXRvbWljLiIpOwotCi0gICAgQXRvbWljU3RyaW5nVGFibGVM
b2NrZXIgbG9ja2VyOwotICAgIGF1dG8gYWRkUmVzdWx0ID0gc3RyaW5nVGFibGUoKS5hZGQoJnN0
cmluZyk7Ci0KLSAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkpIHsKLSAgICAgICAgQVNTRVJU
KCphZGRSZXN1bHQuaXRlcmF0b3IgPT0gJnN0cmluZyk7Ci0gICAgICAgIHN0cmluZy5zZXRJc0F0
b21pYyh0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKiphZGRSZXN1bHQuaXRlcmF0b3I7Ci19
Ci0KLVJlZjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZFNsb3dDYXNlKEF0b21pY1N0cmlu
Z1RhYmxlJiBzdHJpbmdUYWJsZSwgU3RyaW5nSW1wbCYgc3RyaW5nKQotewotICAgIGlmICghc3Ry
aW5nLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gKlN0cmluZ0ltcGw6OmVtcHR5KCk7Ci0KLSAg
ICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKLSAgICAgICAgaWYgKHN0cmluZy5pczhCaXQoKSkK
LSAgICAgICAgICAgIHJldHVybiAqYWRkKHN0cmluZy5jaGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVu
Z3RoKCkpOwotICAgICAgICByZXR1cm4gKmFkZChzdHJpbmcuY2hhcmFjdGVyczE2KCksIHN0cmlu
Zy5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghc3RyaW5nLmlz
QXRvbWljKCksICJBdG9taWNTdHJpbmcgc2hvdWxkIG5vdCBoaXQgdGhlIHNsb3cgY2FzZSBpZiB0
aGUgc3RyaW5nIGlzIGFscmVhZHkgYXRvbWljLiIpOwotCi0gICAgQXRvbWljU3RyaW5nVGFibGVM
b2NrZXIgbG9ja2VyOwotICAgIGF1dG8gYWRkUmVzdWx0ID0gc3RyaW5nVGFibGUudGFibGUoKS5h
ZGQoJnN0cmluZyk7Ci0KLSAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkpIHsKLSAgICAgICAg
QVNTRVJUKCphZGRSZXN1bHQuaXRlcmF0b3IgPT0gJnN0cmluZyk7Ci0gICAgICAgIHN0cmluZy5z
ZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKiphZGRSZXN1bHQuaXRlcmF0
b3I7Ci19Ci0KLXZvaWQgQXRvbWljU3RyaW5nOjpyZW1vdmUoU3RyaW5nSW1wbCogc3RyaW5nKQot
ewotICAgIEFTU0VSVChzdHJpbmctPmlzQXRvbWljKCkpOwotICAgIEF0b21pY1N0cmluZ1RhYmxl
TG9ja2VyIGxvY2tlcjsKLSAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPiYgYXRvbWljU3RyaW5nVGFi
bGUgPSBzdHJpbmdUYWJsZSgpOwotICAgIEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciBp
dGVyYXRvciA9IGF0b21pY1N0cmluZ1RhYmxlLmZpbmQoc3RyaW5nKTsKLSAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKGl0ZXJhdG9yICE9IGF0b21pY1N0cmluZ1RhYmxlLmVuZCgpLCAiVGhlIHN0cmlu
ZyBiZWluZyByZW1vdmVkIGlzIGF0b21pYyBpbiB0aGUgc3RyaW5nIHRhYmxlIG9mIGFuIG90aGVy
IHRocmVhZCEiKTsKLSAgICBhdG9taWNTdHJpbmdUYWJsZS5yZW1vdmUoaXRlcmF0b3IpOwotfQot
CiBBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpsb3dlcigpIGNvbnN0CiB7CiAgICAgLy8gTm90
ZTogVGhpcyBpcyBhIGhvdCBmdW5jdGlvbiBpbiB0aGUgRHJvbWFlbyBiZW5jaG1hcmsuCkBAIC00
NjgsNyArNDQsNyBAQCBBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpsb3dlcigpIGNvbnN0CiAg
ICAgICAgIHJldHVybiAqdGhpczsKIAogICAgIEF0b21pY1N0cmluZyByZXN1bHQ7Ci0gICAgcmVz
dWx0Lm1fc3RyaW5nID0gYWRkU2xvd0Nhc2UoKmxvd2VyY2FzZWRTdHJpbmcpOworICAgIHJlc3Vs
dC5tX3N0cmluZyA9IEF0b21pY1N0cmluZ0ltcGw6OmFkZChsb3dlcmNhc2VkU3RyaW5nLmdldCgp
KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC01MDcsNDUgKzgzLDEwIEBAIEF0b21pY1N0
cmluZyBBdG9taWNTdHJpbmc6OmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkgY29uc3QKICAgICAg
ICAgcmV0dXJuICp0aGlzOwogCiAgICAgQXRvbWljU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQu
bV9zdHJpbmcgPSBhZGRTbG93Q2FzZSgqY29udmVydGVkU3RyaW5nKTsKKyAgICByZXN1bHQubV9z
dHJpbmcgPSBBdG9taWNTdHJpbmdJbXBsOjphZGQoY29udmVydGVkU3RyaW5nLmdldCgpKTsKICAg
ICByZXR1cm4gcmVzdWx0OwogfQogCi1BdG9taWNTdHJpbmdJbXBsKiBBdG9taWNTdHJpbmc6OmZp
bmRTbG93Q2FzZShTdHJpbmdJbXBsJiBzdHJpbmcpCi17Ci0gICAgQVNTRVJUX1dJVEhfTUVTU0FH
RSghc3RyaW5nLmlzQXRvbWljKCksICJBdG9taWNTdHJpbmdJbXBscyBzaG91bGQgcmV0dXJuIGZy
b20gdGhlIGZhc3QgY2FzZS4iKTsKLQotICAgIGlmICghc3RyaW5nLmxlbmd0aCgpKQotICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5
KCkpOwotCi0gICAgaWYgKHN0cmluZy5pc1N5bWJvbCgpKSB7Ci0gICAgICAgIGlmIChzdHJpbmcu
aXM4Qml0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmluZEludGVybmFsKHN0cmluZy5jaGFyYWN0
ZXJzOCgpLCBzdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4gZmluZEludGVybmFsKHN0
cmluZy5jaGFyYWN0ZXJzMTYoKSwgc3RyaW5nLmxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBBdG9t
aWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7Ci0gICAgSGFzaFNldDxTdHJpbmdJbXBsKj4mIGF0
b21pY1N0cmluZ1RhYmxlID0gc3RyaW5nVGFibGUoKTsKLSAgICBhdXRvIGl0ZXJhdG9yID0gYXRv
bWljU3RyaW5nVGFibGUuZmluZCgmc3RyaW5nKTsKLSAgICBpZiAoaXRlcmF0b3IgIT0gYXRvbWlj
U3RyaW5nVGFibGUuZW5kKCkpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJp
bmdJbXBsKj4oKml0ZXJhdG9yKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQXRvbWljU3Ry
aW5nIEF0b21pY1N0cmluZzo6ZnJvbVVURjhJbnRlcm5hbChjb25zdCBjaGFyKiBjaGFyYWN0ZXJz
U3RhcnQsIGNvbnN0IGNoYXIqIGNoYXJhY3RlcnNFbmQpCi17Ci0gICAgSGFzaEFuZFVURjhDaGFy
YWN0ZXJzIGJ1ZmZlcjsKLSAgICBidWZmZXIuY2hhcmFjdGVycyA9IGNoYXJhY3RlcnNTdGFydDsK
LSAgICBidWZmZXIuaGFzaCA9IGNhbGN1bGF0ZVN0cmluZ0hhc2hBbmRMZW5ndGhGcm9tVVRGOE1h
c2tpbmdUb3A4Qml0cyhjaGFyYWN0ZXJzU3RhcnQsIGNoYXJhY3RlcnNFbmQsIGJ1ZmZlci5sZW5n
dGgsIGJ1ZmZlci51dGYxNkxlbmd0aCk7Ci0KLSAgICBpZiAoIWJ1ZmZlci5oYXNoKQotICAgICAg
ICByZXR1cm4gbnVsbEF0b207Ci0KLSAgICBBdG9taWNTdHJpbmcgYXRvbWljU3RyaW5nOwotICAg
IGF0b21pY1N0cmluZy5tX3N0cmluZyA9IGFkZFRvU3RyaW5nVGFibGU8SGFzaEFuZFVURjhDaGFy
YWN0ZXJzLCBIYXNoQW5kVVRGOENoYXJhY3RlcnNUcmFuc2xhdG9yPihidWZmZXIpOwotICAgIHJl
dHVybiBhdG9taWNTdHJpbmc7Ci19Ci0KIEF0b21pY1N0cmluZyBBdG9taWNTdHJpbmc6Om51bWJl
cihpbnQgbnVtYmVyKQogewogICAgIHJldHVybiBudW1iZXJUb1N0cmluZ1NpZ25lZDxBdG9taWNT
dHJpbmc+KG51bWJlcik7CkBAIC01NjIsMzcgKzEwMywxNCBAQCBBdG9taWNTdHJpbmcgQXRvbWlj
U3RyaW5nOjpudW1iZXIoZG91YmxlIG51bWJlcikKICAgICByZXR1cm4gU3RyaW5nKG51bWJlclRv
Rml4ZWRQcmVjaXNpb25TdHJpbmcobnVtYmVyLCA2LCBidWZmZXIsIHRydWUpKTsKIH0KIAotQXRv
bWljU3RyaW5nSW1wbCogQXRvbWljU3RyaW5nOjpmaW5kSW50ZXJuYWwoY29uc3QgTENoYXIqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tl
ciBsb2NrZXI7Ci0gICAgYXV0byYgdGFibGUgPSBzdHJpbmdUYWJsZSgpOwotCi0gICAgTENoYXJC
dWZmZXIgYnVmZmVyID0geyBjaGFyYWN0ZXJzLCBsZW5ndGggfTsKLSAgICBhdXRvIGl0ZXJhdG9y
ID0gdGFibGUuZmluZDxMQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7Ci0gICAgaWYgKGl0
ZXJhdG9yICE9IHRhYmxlLmVuZCgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWlj
U3RyaW5nSW1wbCo+KCppdGVyYXRvcik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUF0b21p
Y1N0cmluZ0ltcGwqIEF0b21pY1N0cmluZzo6ZmluZEludGVybmFsKGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIg
bG9ja2VyOwotICAgIGF1dG8mIHRhYmxlID0gc3RyaW5nVGFibGUoKTsKLQotICAgIFVDaGFyQnVm
ZmVyIGJ1ZmZlciA9IHsgY2hhcmFjdGVycywgbGVuZ3RoIH07Ci0gICAgYXV0byBpdGVyYXRvciA9
IHRhYmxlLmZpbmQ8VUNoYXJCdWZmZXJUcmFuc2xhdG9yPihidWZmZXIpOwotICAgIGlmIChpdGVy
YXRvciAhPSB0YWJsZS5lbmQoKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0
cmluZ0ltcGwqPigqaXRlcmF0b3IpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCi0jaWYgIUFT
U0VSVF9ESVNBQkxFRAotYm9vbCBBdG9taWNTdHJpbmc6OmlzSW5BdG9taWNTdHJpbmdUYWJsZShT
dHJpbmdJbXBsKiBzdHJpbmcpCitBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpmcm9tVVRGOElu
dGVybmFsKGNvbnN0IGNoYXIqIGNoYXJhY3RlcnNTdGFydCwgY29uc3QgY2hhciogY2hhcmFjdGVy
c0VuZCkKIHsKLSAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7Ci0gICAgcmV0dXJu
IHN0cmluZ1RhYmxlKCkuY29udGFpbnMoc3RyaW5nKTsKKyAgICBpZiAoUmVmUHRyPEF0b21pY1N0
cmluZ0ltcGw+IGltcGwgPSBBdG9taWNTdHJpbmdJbXBsOjphZGRGcm9tVVRGOChjaGFyYWN0ZXJz
U3RhcnQsIGNoYXJhY3RlcnNFbmQpKSB7CisgICAgICAgIEF0b21pY1N0cmluZyBhdG9taWNTdHJp
bmcoaW1wbC5nZXQoKSk7CisgICAgICAgIHJldHVybiBhdG9taWNTdHJpbmc7CisgICAgfQorICAg
IHJldHVybiBudWxsQXRvbTsKIH0KLSNlbmRpZgogCiAjaWZuZGVmIE5ERUJVRwogdm9pZCBBdG9t
aWNTdHJpbmc6OnNob3coKSBjb25zdApkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9B
dG9taWNTdHJpbmcuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nLmgKaW5kZXgg
Y2JmZGM4OTQ3MzA4ZTcyMDgyN2E3OWI1MTg2NTY4ZWNjNTUzODE1Mi4uMmFmMDcwNTgzZTNiODBh
N2RhYzE0YjU3NTBjYTM0MWQ2ZGRlZWEzZCAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvdGV4
dC9BdG9taWNTdHJpbmcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZy5o
CkBAIC0zNSw3ICszNSw2IEBACiAKIG5hbWVzcGFjZSBXVEYgewogCi1jbGFzcyBBdG9taWNTdHJp
bmdUYWJsZTsKIHN0cnVjdCBBdG9taWNTdHJpbmdIYXNoOwogCiBjbGFzcyBBdG9taWNTdHJpbmcg
ewpAQCAtNDMsMzMgKzQyLDMzIEBAIGNsYXNzIEF0b21pY1N0cmluZyB7CiAgICAgV1RGX0VYUE9S
VF9QUklWQVRFIHN0YXRpYyB2b2lkIGluaXQoKTsKIAogICAgIEF0b21pY1N0cmluZygpIHsgfQot
ICAgIEF0b21pY1N0cmluZyhjb25zdCBMQ2hhciogcykgOiBtX3N0cmluZyhhZGQocykpIHsgfQot
ICAgIEF0b21pY1N0cmluZyhjb25zdCBjaGFyKiBzKSA6IG1fc3RyaW5nKGFkZChzKSkgeyB9Ci0g
ICAgQXRvbWljU3RyaW5nKGNvbnN0IExDaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIDogbV9zdHJp
bmcoYWRkKHMsIGxlbmd0aCkpIHsgfQotICAgIEF0b21pY1N0cmluZyhjb25zdCBVQ2hhciogcywg
dW5zaWduZWQgbGVuZ3RoKSA6IG1fc3RyaW5nKGFkZChzLCBsZW5ndGgpKSB7IH0KLSAgICBBdG9t
aWNTdHJpbmcoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZXhpc3Rp
bmdIYXNoKSA6IG1fc3RyaW5nKGFkZChzLCBsZW5ndGgsIGV4aXN0aW5nSGFzaCkpIHsgfQotICAg
IEF0b21pY1N0cmluZyhjb25zdCBVQ2hhciogcykgOiBtX3N0cmluZyhhZGQocykpIHsgfQorICAg
IEF0b21pY1N0cmluZyhjb25zdCBMQ2hhciogcykgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBs
OjphZGQocykpIHsgfQorICAgIEF0b21pY1N0cmluZyhjb25zdCBjaGFyKiBzKSA6IG1fc3RyaW5n
KEF0b21pY1N0cmluZ0ltcGw6OmFkZChzKSkgeyB9CisgICAgQXRvbWljU3RyaW5nKGNvbnN0IExD
aGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIDogbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRk
KHMsIGxlbmd0aCkpIHsgfQorICAgIEF0b21pY1N0cmluZyhjb25zdCBVQ2hhciogcywgdW5zaWdu
ZWQgbGVuZ3RoKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChzLCBsZW5ndGgpKSB7
IH0KKyAgICBBdG9taWNTdHJpbmcoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5z
aWduZWQgZXhpc3RpbmdIYXNoKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChzLCBs
ZW5ndGgsIGV4aXN0aW5nSGFzaCkpIHsgfQorICAgIEF0b21pY1N0cmluZyhjb25zdCBVQ2hhciog
cykgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjphZGQocykpIHsgfQogCiAgICAgdGVtcGxh
dGU8c2l6ZV90IGlubGluZUNhcGFjaXR5PgogICAgIGV4cGxpY2l0IEF0b21pY1N0cmluZyhjb25z
dCBWZWN0b3I8VUNoYXIsIGlubGluZUNhcGFjaXR5PiYgY2hhcmFjdGVycykKLSAgICAgICAgOiBt
X3N0cmluZyhhZGQoY2hhcmFjdGVycy5kYXRhKCksIGNoYXJhY3RlcnMuc2l6ZSgpKSkKKyAgICAg
ICAgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjphZGQoY2hhcmFjdGVycy5kYXRhKCksIGNo
YXJhY3RlcnMuc2l6ZSgpKSkKICAgICB7CiAgICAgfQogCi0gICAgQVRPTUlDU1RSSU5HX0NPTlZF
UlNJT04gQXRvbWljU3RyaW5nKFN0cmluZ0ltcGwqIGltcCkgOiBtX3N0cmluZyhhZGQoaW1wKSkg
eyB9CiAgICAgQXRvbWljU3RyaW5nKEF0b21pY1N0cmluZ0ltcGwqIGltcCkgOiBtX3N0cmluZyhp
bXApIHsgfQotICAgIEFUT01JQ1NUUklOR19DT05WRVJTSU9OIEF0b21pY1N0cmluZyhjb25zdCBT
dHJpbmcmIHMpIDogbV9zdHJpbmcoYWRkKHMuaW1wbCgpKSkgeyB9Ci0gICAgQXRvbWljU3RyaW5n
KFN0cmluZ0ltcGwqIGJhc2VTdHJpbmcsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgp
IDogbV9zdHJpbmcoYWRkKGJhc2VTdHJpbmcsIHN0YXJ0LCBsZW5ndGgpKSB7IH0KKyAgICBBVE9N
SUNTVFJJTkdfQ09OVkVSU0lPTiBBdG9taWNTdHJpbmcoU3RyaW5nSW1wbCogaW1wKSA6IG1fc3Ry
aW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChpbXApKSB7IH0KKyAgICBBVE9NSUNTVFJJTkdfQ09O
VkVSU0lPTiBBdG9taWNTdHJpbmcoY29uc3QgU3RyaW5nJiBzKSA6IG1fc3RyaW5nKEF0b21pY1N0
cmluZ0ltcGw6OmFkZChzLmltcGwoKSkpIHsgfQorICAgIEF0b21pY1N0cmluZyhTdHJpbmdJbXBs
KiBiYXNlU3RyaW5nLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoKSA6IG1fc3RyaW5n
KEF0b21pY1N0cmluZ0ltcGw6OmFkZChiYXNlU3RyaW5nLCBzdGFydCwgbGVuZ3RoKSkgeyB9CiAK
ICAgICBlbnVtIENvbnN0cnVjdEZyb21MaXRlcmFsVGFnIHsgQ29uc3RydWN0RnJvbUxpdGVyYWwg
fTsKICAgICBBdG9taWNTdHJpbmcoY29uc3QgY2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVu
Z3RoLCBDb25zdHJ1Y3RGcm9tTGl0ZXJhbFRhZykKLSAgICAgICAgOiBtX3N0cmluZyhhZGRGcm9t
TGl0ZXJhbERhdGEoY2hhcmFjdGVycywgbGVuZ3RoKSkKKyAgICAgICAgOiBtX3N0cmluZyhBdG9t
aWNTdHJpbmdJbXBsOjphZGRGcm9tTGl0ZXJhbERhdGEoY2hhcmFjdGVycywgbGVuZ3RoKSkKICAg
ICB7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dW5zaWduZWQgY2hhcmFjdGVyc0NvdW50PgogICAg
IEFMV0FZU19JTkxJTkUgQXRvbWljU3RyaW5nKGNvbnN0IGNoYXIgKCZjaGFyYWN0ZXJzKVtjaGFy
YWN0ZXJzQ291bnRdLCBDb25zdHJ1Y3RGcm9tTGl0ZXJhbFRhZykKLSAgICAgICAgOiBtX3N0cmlu
ZyhhZGRGcm9tTGl0ZXJhbERhdGEoY2hhcmFjdGVycywgY2hhcmFjdGVyc0NvdW50IC0gMSkpCisg
ICAgICAgIDogbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbUxpdGVyYWxEYXRhKGNo
YXJhY3RlcnMsIGNoYXJhY3RlcnNDb3VudCAtIDEpKQogICAgIHsKICAgICAgICAgQ09NUElMRV9B
U1NFUlQoY2hhcmFjdGVyc0NvdW50ID4gMSwgQXRvbWljU3RyaW5nRnJvbUxpdGVyYWxOb3RFbXB0
eSk7CiAgICAgICAgIENPTVBJTEVfQVNTRVJUKChjaGFyYWN0ZXJzQ291bnQgLSAxIDw9ICgodW5z
aWduZWQofjApIC0gc2l6ZW9mKFN0cmluZ0ltcGwpKSAvIHNpemVvZihMQ2hhcikpKSwgQXRvbWlj
U3RyaW5nRnJvbUxpdGVyYWxDYW5ub3RPdmVyZmxvdyk7CkBAIC04NiwyMSArODUsNiBAQCBjbGFz
cyBBdG9taWNTdHJpbmcgewogICAgIEF0b21pY1N0cmluZyhXVEY6Okhhc2hUYWJsZURlbGV0ZWRW
YWx1ZVR5cGUpIDogbV9zdHJpbmcoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpIHsgfQogICAg
IGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3N0cmluZy5p
c0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpOyB9CiAKLSAgICBzdGF0aWMgQXRvbWljU3RyaW5nSW1w
bCogZmluZChMQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGZpbmRJbnRlcm5hbChjaGFyYWN0ZXJzLCBsZW5ndGgpOwotICAgIH0KLSAgICBz
dGF0aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZChVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQg
bGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmRJbnRlcm5hbChjaGFyYWN0ZXJzLCBs
ZW5ndGgpOwotICAgIH0KLSAgICBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZChTdHJpbmdJ
bXBsKiBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoIXN0cmluZyB8fCBzdHJpbmctPmlzQXRv
bWljKCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+
KHN0cmluZyk7Ci0gICAgICAgIHJldHVybiBmaW5kU2xvd0Nhc2UoKnN0cmluZyk7Ci0gICAgfQot
CiAgICAgb3BlcmF0b3IgY29uc3QgU3RyaW5nJigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nOyB9
CiAgICAgY29uc3QgU3RyaW5nJiBzdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX3N0cmluZzsgfTsK
IApAQCAtMTEwLDcgKzk0LDcgQEAgY2xhc3MgQXRvbWljU3RyaW5nIHsKICAgICBjb25zdCBMQ2hh
ciogY2hhcmFjdGVyczgoKSBjb25zdCB7IHJldHVybiBtX3N0cmluZy5jaGFyYWN0ZXJzOCgpOyB9
CiAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMxNigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5n
LmNoYXJhY3RlcnMxNigpOyB9CiAgICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4g
bV9zdHJpbmcubGVuZ3RoKCk7IH0KLSAgICAKKwogICAgIFVDaGFyIG9wZXJhdG9yW10odW5zaWdu
ZWQgaW50IGkpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nW2ldOyB9CiAKICAgICBXVEZfRVhQT1JU
X1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0cmluZyBudW1iZXIoaW50KTsKQEAgLTE2Myw3ICsx
NDcsNyBAQCBjbGFzcyBBdG9taWNTdHJpbmcgewogICAgIHRlbXBsYXRlPHVuc2lnbmVkIG1hdGNo
TGVuZ3RoPgogICAgIGJvb2wgZW5kc1dpdGgoY29uc3QgY2hhciAoJnByZWZpeClbbWF0Y2hMZW5n
dGhdLCBib29sIGNhc2VTZW5zaXRpdmUgPSB0cnVlKSBjb25zdAogICAgICAgICB7IHJldHVybiBt
X3N0cmluZy5lbmRzV2l0aDxtYXRjaExlbmd0aD4ocHJlZml4LCBjYXNlU2Vuc2l0aXZlKTsgfQot
ICAgIAorCiAgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIEF0b21pY1N0cmluZyBjb252ZXJ0VG9B
U0NJSUxvd2VyY2FzZSgpIGNvbnN0OwogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBBdG9taWNT
dHJpbmcgbG93ZXIoKSBjb25zdDsKICAgICBBdG9taWNTdHJpbmcgdXBwZXIoKSBjb25zdCB7IHJl
dHVybiBBdG9taWNTdHJpbmcoaW1wbCgpLT51cHBlcigpKTsgfQpAQCAtMTc2LDEzICsxNjAsMTEg
QEAgY2xhc3MgQXRvbWljU3RyaW5nIHsKICAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJu
IG1fc3RyaW5nLmlzTnVsbCgpOyB9CiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4g
bV9zdHJpbmcuaXNFbXB0eSgpOyB9CiAKLSAgICBzdGF0aWMgdm9pZCByZW1vdmUoU3RyaW5nSW1w
bCopOwotICAgIAogI2lmIFVTRShDRikKLSAgICBBdG9taWNTdHJpbmcoQ0ZTdHJpbmdSZWYgcykg
OiAgbV9zdHJpbmcoYWRkKHMpKSB7IH0KKyAgICBBdG9taWNTdHJpbmcoQ0ZTdHJpbmdSZWYgcykg
OiAgbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRkKHMpKSB7IH0KICNlbmRpZiAgICAKICNp
ZmRlZiBfX09CSkNfXwotICAgIEF0b21pY1N0cmluZyhOU1N0cmluZyogcykgOiBtX3N0cmluZyhh
ZGQoKENGU3RyaW5nUmVmKXMpKSB7IH0KKyAgICBBdG9taWNTdHJpbmcoTlNTdHJpbmcqIHMpIDog
bV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRkKChDRlN0cmluZ1JlZilzKSkgeyB9CiAgICAg
b3BlcmF0b3IgTlNTdHJpbmcqKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmc7IH0KICNlbmRpZgog
CkBAIC0xOTUsNzEgKzE3NywxNyBAQCBjbGFzcyBBdG9taWNTdHJpbmcgewogICAgIHZvaWQgc2hv
dygpIGNvbnN0OwogI2VuZGlmCiAKLSAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJl
ZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgTENoYXIqKTsKLSAgICBBTFdBWVNfSU5MSU5FIHN0
YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIGFkZChy
ZWludGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4ocykpOyB9OwotICAgIFdURl9FWFBPUlRfU1RS
SU5HX0FQSSBzdGF0aWMgUmVmUHRyPFN0cmluZ0ltcGw+IGFkZChjb25zdCBMQ2hhciosIHVuc2ln
bmVkIGxlbmd0aCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWZQdHI8U3Ry
aW5nSW1wbD4gYWRkKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoKTsKLSAgICBBTFdBWVNf
SU5MSU5FIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKGNvbnN0IGNoYXIqIHMsIHVuc2ln
bmVkIGxlbmd0aCkgeyByZXR1cm4gYWRkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTENoYXIqPihz
KSwgbGVuZ3RoKTsgfTsKLSAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJlZjxTdHJp
bmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGV4aXN0
aW5nSGFzaCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWZQdHI8U3RyaW5n
SW1wbD4gYWRkKGNvbnN0IFVDaGFyKik7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRp
YyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKFN0cmluZ0ltcGwqLCB1bnNpZ25lZCBvZmZzZXQsIHVu
c2lnbmVkIGxlbmd0aCk7Ci0gICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRyPFN0cmluZ0lt
cGw+IGFkZChTdHJpbmdJbXBsKiBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoIXN0cmluZykK
LSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgICAgIHJldHVybiBhZGQoKnN0cmluZyk7
Ci0gICAgfQotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmPFN0cmluZ0ltcGw+
IGFkZEZyb21MaXRlcmFsRGF0YShjb25zdCBjaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5n
dGgpOwotI2lmIFVTRShDRikKLSAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJlZlB0
cjxTdHJpbmdJbXBsPiBhZGQoQ0ZTdHJpbmdSZWYpOwotI2VuZGlmCi0KLSAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBTdHJpbmdUYWJsZVByb3ZpZGVyPgotICAgIEFMV0FZU19JTkxJTkUgc3RhdGljIFJl
ZlB0cjxTdHJpbmdJbXBsPiBhZGRXaXRoU3RyaW5nVGFibGVQcm92aWRlcihTdHJpbmdUYWJsZVBy
b3ZpZGVyJiBzdHJpbmdUYWJsZVByb3ZpZGVyLCBTdHJpbmdJbXBsKiBzdHJpbmcpCi0gICAgewot
ICAgICAgICBpZiAoIXN0cmluZykKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgICAg
IHJldHVybiBhZGQoKnN0cmluZ1RhYmxlUHJvdmlkZXIuYXRvbWljU3RyaW5nVGFibGUoKSwgKnN0
cmluZyk7Ci0gICAgfQotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIFdURl9FWFBPUlRfU1RS
SU5HX0FQSSBzdGF0aWMgYm9vbCBpc0luQXRvbWljU3RyaW5nVGFibGUoU3RyaW5nSW1wbCopOwot
I2VuZGlmCi0KIHByaXZhdGU6CiAgICAgLy8gVGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9ycyB3aXRo
IEF0b21pY1N0cmluZzo6Q29uc3RydWN0RnJvbUxpdGVyYWwgbXVzdCBiZSB1c2VkIGZvciBsaXRl
cmFscy4KICAgICBBdG9taWNTdHJpbmcoQVNDSUlMaXRlcmFsKTsKIAotICAgIFN0cmluZyBtX3N0
cmluZzsKLQotICAgIEFMV0FZU19JTkxJTkUgc3RhdGljIFJlZjxTdHJpbmdJbXBsPiBhZGQoU3Ry
aW5nSW1wbCYgc3RyaW5nKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmluZy5pc0F0b21pYygpKSB7
Ci0gICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFzdHJpbmcubGVuZ3RoKCkgfHwgaXNJ
bkF0b21pY1N0cmluZ1RhYmxlKCZzdHJpbmcpLCAiVGhlIGF0b21pYyBzdHJpbmcgY29tZXMgZnJv
bSBhbiBvdGhlciB0aHJlYWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBhZGRTbG93Q2FzZShzdHJpbmcpOwotICAgIH0KLQotICAgIEFM
V0FZU19JTkxJTkUgc3RhdGljIFJlZjxTdHJpbmdJbXBsPiBhZGQoQXRvbWljU3RyaW5nVGFibGUm
IHN0cmluZ1RhYmxlLCBTdHJpbmdJbXBsJiBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoc3Ry
aW5nLmlzQXRvbWljKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0cmlu
Zy5sZW5ndGgoKSB8fCBpc0luQXRvbWljU3RyaW5nVGFibGUoJnN0cmluZyksICJUaGUgYXRvbWlj
IHN0cmluZyBjb21lcyBmcm9tIGFuIG90aGVyIHRocmVhZCEiKTsKLSAgICAgICAgICAgIHJldHVy
biBzdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkZFNsb3dDYXNlKHN0cmluZ1Rh
YmxlLCBzdHJpbmcpOwotICAgIH0KLQotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMg
UmVmPFN0cmluZ0ltcGw+IGFkZFNsb3dDYXNlKFN0cmluZ0ltcGwmKTsKLSAgICBXVEZfRVhQT1JU
X1NUUklOR19BUEkgc3RhdGljIFJlZjxTdHJpbmdJbXBsPiBhZGRTbG93Q2FzZShBdG9taWNTdHJp
bmdUYWJsZSYsIFN0cmluZ0ltcGwmKTsKLQotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0
aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZFNsb3dDYXNlKFN0cmluZ0ltcGwmKTsKICAgICBXVEZf
RVhQT1JUX1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0cmluZyBmcm9tVVRGOEludGVybmFsKGNv
bnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CiAKLSAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3Rh
dGljIEF0b21pY1N0cmluZ0ltcGwqIGZpbmRJbnRlcm5hbChjb25zdCBMQ2hhciosIHVuc2lnbmVk
IGxlbmd0aCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBBdG9taWNTdHJpbmdJ
bXBsKiBmaW5kSW50ZXJuYWwoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIFN0
cmluZyBtX3N0cmluZzsKIH07CiAKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEF0b21pY1N0cmluZykg
PT0gc2l6ZW9mKFN0cmluZyksICJBdG9taWNTdHJpbmcgYW5kIFN0cmluZyBtdXN0IGJlIHNhbWUg
c2l6ZSEiKTsKKwogaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdG9taWNTdHJpbmcmIGEs
IGNvbnN0IEF0b21pY1N0cmluZyYgYikgeyByZXR1cm4gYS5pbXBsKCkgPT0gYi5pbXBsKCk7IH0K
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdG9taWNTdHJpbmcmLCBjb25zdCBMQ2hhciopOwogaW5s
aW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdG9taWNTdHJpbmcmIGEsIGNvbnN0IGNoYXIqIGIp
IHsgcmV0dXJuIFdURjo6ZXF1YWwoYS5pbXBsKCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTENo
YXIqPihiKSk7IH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5n
SW1wbC5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjRlNTQ1OTRiM2U3MjMxNDQxZDg1ZWEyOTU5Y2Q4M2I4YmZhYjU1ZjMKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuY3BwCkBAIC0w
LDAgKzEsNTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDgsIDIwMTMtMjAxNCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUGF0
cmljayBHYW5zdGVyZXIgPHBhcm9nYUBwYXJvZ2EuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUg
WXVzdWtlIFN1enVraTx1dGF0YW5lLnRlYUBnbWFpbC5jb20+LiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkF0b21pY1N0cmluZ0ltcGwuaCIK
KworI2luY2x1ZGUgIkF0b21pY1N0cmluZ1RhYmxlLmgiCisjaW5jbHVkZSAiSGFzaFNldC5oIgor
I2luY2x1ZGUgIkludGVnZXJUb1N0cmluZ0NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJTdHJpbmdI
YXNoLmgiCisjaW5jbHVkZSAiVGhyZWFkaW5nLmgiCisjaW5jbHVkZSAiV1RGVGhyZWFkRGF0YS5o
IgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VURjguaD4KKworI2lmIFVTRShXRUJfVEhSRUFEKQor
I2luY2x1ZGUgIlNwaW5Mb2NrLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdURiB7CisKK3VzaW5n
IG5hbWVzcGFjZSBVbmljb2RlOworCisjaWYgVVNFKFdFQl9USFJFQUQpCisKK2NsYXNzIEF0b21p
Y1N0cmluZ1RhYmxlTG9ja2VyIDogcHVibGljIFNwaW5Mb2NrSG9sZGVyIHsKKyAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShBdG9taWNTdHJpbmdUYWJsZUxvY2tlcik7CisKKyAgICBzdGF0aWMgU3Rh
dGljU3BpbkxvY2sgc19zdHJpbmdUYWJsZUxvY2s7CitwdWJsaWM6CisgICAgQXRvbWljU3RyaW5n
VGFibGVMb2NrZXIoKQorICAgICAgICA6IFNwaW5Mb2NrSG9sZGVyKCZzX3N0cmluZ1RhYmxlTG9j
aykKKyAgICB7CisgICAgfQorfTsKKworU3RhdGljU3BpbkxvY2sgQXRvbWljU3RyaW5nVGFibGVM
b2NrZXI6OnNfc3RyaW5nVGFibGVMb2NrOworCisjZWxzZQorCitjbGFzcyBBdG9taWNTdHJpbmdU
YWJsZUxvY2tlciB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQXRvbWljU3RyaW5nVGFibGVM
b2NrZXIpOworcHVibGljOgorICAgIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyKCkgeyB9Cit9Owor
CisjZW5kaWYgLy8gVVNFKFdFQl9USFJFQUQpCisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIEhhc2hT
ZXQ8U3RyaW5nSW1wbCo+JiBzdHJpbmdUYWJsZSgpCit7CisgICAgcmV0dXJuIHd0ZlRocmVhZERh
dGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpLT50YWJsZSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFt
ZSBULCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4KK3N0YXRpYyBpbmxpbmUgUmVmPEF0b21pY1N0
cmluZ0ltcGw+IGFkZFRvU3RyaW5nVGFibGUoY29uc3QgVCYgdmFsdWUpCit7CisgICAgQXRvbWlj
U3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOworCisgICAgSGFzaFNldDxTdHJpbmdJbXBsKj46OkFk
ZFJlc3VsdCBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgpLmFkZDxIYXNoVHJhbnNsYXRvcj4odmFs
dWUpOworCisgICAgLy8gSWYgdGhlIHN0cmluZyBpcyBuZXdseS10cmFuc2xhdGVkLCB0aGVuIHdl
IG5lZWQgdG8gYWRvcHQgaXQuCisgICAgLy8gVGhlIGJvb2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMg
dXMgaWYgdGhhdCBpcyBzby4KKyAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkpCisgICAgICAg
IHJldHVybiBhZG9wdFJlZihzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsJj4oKiphZGRSZXN1
bHQuaXRlcmF0b3IpKTsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwq
PigqYWRkUmVzdWx0Lml0ZXJhdG9yKTsKK30KKworc3RydWN0IENTdHJpbmdUcmFuc2xhdG9yIHsK
KyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBMQ2hhciogYykKKyAgICB7CisgICAgICAg
IHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGMpOworICAg
IH0KKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiByLCBjb25zdCBM
Q2hhciogcykKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6OmVxdWFsKHIsIHMpOworICAgIH0K
KworICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0
IExDaGFyKiBjb25zdCYgYywgdW5zaWduZWQgaGFzaCkKKyAgICB7CisgICAgICAgIGxvY2F0aW9u
ID0gJlN0cmluZ0ltcGw6OmNyZWF0ZShjKS5sZWFrUmVmKCk7CisgICAgICAgIGxvY2F0aW9uLT5z
ZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAg
fQorfTsKKworUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IEF0b21pY1N0cmluZ0ltcGw6OmFkZChj
b25zdCBMQ2hhciogYykKK3sKKyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiBudWxscHRyOwor
ICAgIGlmICghKmMpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBs
Kj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICByZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxj
b25zdCBMQ2hhciosIENTdHJpbmdUcmFuc2xhdG9yPihjKTsKK30KKwordGVtcGxhdGU8dHlwZW5h
bWUgQ2hhcmFjdGVyVHlwZT4KK3N0cnVjdCBIYXNoVHJhbnNsYXRvckNoYXJCdWZmZXIgeworICAg
IGNvbnN0IENoYXJhY3RlclR5cGUqIHM7CisgICAgdW5zaWduZWQgbGVuZ3RoOworfTsKKwordHlw
ZWRlZiBIYXNoVHJhbnNsYXRvckNoYXJCdWZmZXI8VUNoYXI+IFVDaGFyQnVmZmVyOworc3RydWN0
IFVDaGFyQnVmZmVyVHJhbnNsYXRvciB7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3Qg
VUNoYXJCdWZmZXImIGJ1ZikKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNv
bXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBjb25zdCYgc3RyLCBjb25zdCBVQ2hhckJ1
ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdURjo6ZXF1YWwoc3RyLCBidWYucywg
YnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0lt
cGwqJiBsb2NhdGlvbiwgY29uc3QgVUNoYXJCdWZmZXImIGJ1ZiwgdW5zaWduZWQgaGFzaCkKKyAg
ICB7CisgICAgICAgIGxvY2F0aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0ZThCaXRJZlBvc3NpYmxl
KGJ1Zi5zLCBidWYubGVuZ3RoKS5sZWFrUmVmKCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRIYXNo
KGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAgfQorfTsK
KwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4KK3N0cnVjdCBIYXNoQW5kQ2hhcmFj
dGVycyB7CisgICAgdW5zaWduZWQgaGFzaDsKKyAgICBjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFy
YWN0ZXJzOworICAgIHVuc2lnbmVkIGxlbmd0aDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIENo
YXJhY3RlclR5cGU+CitzdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yIHsKKyAgICBz
dGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBIYXNoQW5kQ2hhcmFjdGVyczxDaGFyYWN0ZXJUeXBl
PiYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJ1ZmZlci5oYXNoID09IFN0cmluZ0hh
c2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZl
ci5sZW5ndGgpKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5oYXNoOworICAgIH0KKworICAgIHN0
YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHJpbmcsIGNvbnN0IEhhc2hBbmRD
aGFyYWN0ZXJzPENoYXJhY3RlclR5cGU+JiBidWZmZXIpCisgICAgeworICAgICAgICByZXR1cm4g
V1RGOjplcXVhbChzdHJpbmcsIGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBj
b25zdCBIYXNoQW5kQ2hhcmFjdGVyczxDaGFyYWN0ZXJUeXBlPiYgYnVmZmVyLCB1bnNpZ25lZCBo
YXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlKGJ1ZmZl
ci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKS5sZWFrUmVmKCk7CisgICAgICAgIGxvY2F0aW9u
LT5zZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7Cisg
ICAgfQorfTsKKworc3RydWN0IEhhc2hBbmRVVEY4Q2hhcmFjdGVycyB7CisgICAgdW5zaWduZWQg
aGFzaDsKKyAgICBjb25zdCBjaGFyKiBjaGFyYWN0ZXJzOworICAgIHVuc2lnbmVkIGxlbmd0aDsK
KyAgICB1bnNpZ25lZCB1dGYxNkxlbmd0aDsKK307CisKK3N0cnVjdCBIYXNoQW5kVVRGOENoYXJh
Y3RlcnNUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBIYXNoQW5k
VVRGOENoYXJhY3RlcnMmIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXIuaGFz
aDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBjb25zdCYgc3Ry
aW5nLCBjb25zdCBIYXNoQW5kVVRGOENoYXJhY3RlcnMmIGJ1ZmZlcikKKyAgICB7CisgICAgICAg
IGlmIChidWZmZXIudXRmMTZMZW5ndGggIT0gc3RyaW5nLT5sZW5ndGgoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJZiBidWZmZXIgY29udGFpbnMgb25seSBBU0NJ
SSBjaGFyYWN0ZXJzIFVURi04IGFuZCBVVEYxNiBsZW5ndGggYXJlIHRoZSBzYW1lLgorICAgICAg
ICBpZiAoYnVmZmVyLnV0ZjE2TGVuZ3RoICE9IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAg
IGlmIChzdHJpbmctPmlzOEJpdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcXVhbExhdGlu
MVdpdGhVVEY4KHN0cmluZy0+Y2hhcmFjdGVyczgoKSwgYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZl
ci5jaGFyYWN0ZXJzICsgYnVmZmVyLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHJldHVybiBlcXVh
bFVURjE2V2l0aFVURjgoc3RyaW5nLT5jaGFyYWN0ZXJzMTYoKSwgYnVmZmVyLmNoYXJhY3RlcnMs
IGJ1ZmZlci5jaGFyYWN0ZXJzICsgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoc3RyaW5nLT5pczhCaXQoKSkgeworICAgICAgICAgICAgY29uc3QgTENoYXIqIHN0cmlu
Z0NoYXJhY3RlcnMgPSBzdHJpbmctPmNoYXJhY3RlcnM4KCk7CisKKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoaXNBU0NJSShidWZmZXIuY2hhcmFjdGVyc1tpXSkpOworICAgICAgICAgICAgICAg
IGlmIChzdHJpbmdDaGFyYWN0ZXJzW2ldICE9IGJ1ZmZlci5jaGFyYWN0ZXJzW2ldKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVUNoYXIqIHN0cmluZ0No
YXJhY3RlcnMgPSBzdHJpbmctPmNoYXJhY3RlcnMxNigpOworCisgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIEFTU0VSVChp
c0FTQ0lJKGJ1ZmZlci5jaGFyYWN0ZXJzW2ldKSk7CisgICAgICAgICAgICBpZiAoc3RyaW5nQ2hh
cmFjdGVyc1tpXSAhPSBidWZmZXIuY2hhcmFjdGVyc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBIYXNo
QW5kVVRGOENoYXJhY3RlcnMmIGJ1ZmZlciwgdW5zaWduZWQgaGFzaCkKKyAgICB7CisgICAgICAg
IFVDaGFyKiB0YXJnZXQ7CisgICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBuZXdTdHJpbmcgPSBT
dHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKGJ1ZmZlci51dGYxNkxlbmd0aCwgdGFyZ2V0
KTsKKworICAgICAgICBib29sIGlzQWxsQVNDSUk7CisgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJj
ZSA9IGJ1ZmZlci5jaGFyYWN0ZXJzOworICAgICAgICBpZiAoY29udmVydFVURjhUb1VURjE2KCZz
b3VyY2UsIHNvdXJjZSArIGJ1ZmZlci5sZW5ndGgsICZ0YXJnZXQsIHRhcmdldCArIGJ1ZmZlci51
dGYxNkxlbmd0aCwgJmlzQWxsQVNDSUkpICE9IGNvbnZlcnNpb25PSykKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworCisgICAgICAgIGlmIChpc0FsbEFTQ0lJKQorICAgICAgICAg
ICAgbmV3U3RyaW5nID0gU3RyaW5nSW1wbDo6Y3JlYXRlKGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZm
ZXIubGVuZ3RoKTsKKworICAgICAgICBsb2NhdGlvbiA9IG5ld1N0cmluZy5yZWxlYXNlKCkubGVh
a1JlZigpOworICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaChoYXNoKTsKKyAgICAgICAgbG9jYXRp
b24tPnNldElzQXRvbWljKHRydWUpOworICAgIH0KK307CisKK1JlZlB0cjxBdG9taWNTdHJpbmdJ
bXBsPiBBdG9taWNTdHJpbmdJbXBsOjphZGQoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0
aCkKK3sKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaWYgKCFs
ZW5ndGgpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oU3Ry
aW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICBVQ2hhckJ1ZmZlciBidWZmZXIgPSB7IHMsIGxlbmd0
aCB9OworICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZl
clRyYW5zbGF0b3I+KGJ1ZmZlcik7Cit9CisKK1JlZjxBdG9taWNTdHJpbmdJbXBsPiBBdG9taWNT
dHJpbmdJbXBsOjphZGQoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQg
ZXhpc3RpbmdIYXNoKQoreworICAgIEFTU0VSVChzKTsKKyAgICBBU1NFUlQoZXhpc3RpbmdIYXNo
KTsKKworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PEF0b21p
Y1N0cmluZ0ltcGwqPihTdHJpbmdJbXBsOjplbXB0eSgpKTsKKworICAgIEhhc2hBbmRDaGFyYWN0
ZXJzPFVDaGFyPiBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07CisgICAgcmV0
dXJuIGFkZFRvU3RyaW5nVGFibGU8SGFzaEFuZENoYXJhY3RlcnM8VUNoYXI+LCBIYXNoQW5kQ2hh
cmFjdGVyc1RyYW5zbGF0b3I8VUNoYXI+PihidWZmZXIpOworfQorCitSZWZQdHI8QXRvbWljU3Ry
aW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkKGNvbnN0IFVDaGFyKiBzKQoreworICAgIGlm
ICghcykKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICB1bnNpZ25lZCBsZW5ndGggPSAw
OworICAgIHdoaWxlIChzW2xlbmd0aF0gIT0gVUNoYXIoMCkpCisgICAgICAgICsrbGVuZ3RoOwor
CisgICAgaWYgKCFsZW5ndGgpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJp
bmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICBVQ2hhckJ1ZmZlciBidWZmZXIg
PSB7IHMsIGxlbmd0aCB9OworICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVy
LCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7Cit9CisKK3N0cnVjdCBTdWJzdHJpbmdM
b2NhdGlvbiB7CisgICAgU3RyaW5nSW1wbCogYmFzZVN0cmluZzsKKyAgICB1bnNpZ25lZCBzdGFy
dDsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRv
ciB7CisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29u
c3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlciwgdW5zaWduZWQgaGFzaCkKKyAgICB7CisgICAg
ICAgIGxvY2F0aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0ZVN1YnN0cmluZ1NoYXJpbmdJbXBsKGJ1
ZmZlci5iYXNlU3RyaW5nLCBidWZmZXIuc3RhcnQsIGJ1ZmZlci5sZW5ndGgpLmxlYWtSZWYoKTsK
KyAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJ
c0F0b21pYyh0cnVlKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjgg
OiBTdWJzdHJpbmdUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBT
dWJzdHJpbmdMb2NhdGlvbiYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0hh
c2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmZmVyLmJhc2VTdHJpbmctPmNoYXJh
Y3RlcnM4KCkgKyBidWZmZXIuc3RhcnQsIGJ1ZmZlci5sZW5ndGgpOworICAgIH0KKworICAgIHN0
YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHJpbmcsIGNvbnN0IFN1YnN0cmlu
Z0xvY2F0aW9uJiBidWZmZXIpCisgICAgeworICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHJp
bmcsIGJ1ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJzOCgpICsgYnVmZmVyLnN0YXJ0LCBidWZm
ZXIubGVuZ3RoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjE2IDog
U3Vic3RyaW5nVHJhbnNsYXRvciB7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgU3Vi
c3RyaW5nTG9jYXRpb24mIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdIYXNo
ZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0
ZXJzMTYoKSArIGJ1ZmZlci5zdGFydCwgYnVmZmVyLmxlbmd0aCk7CisgICAgfQorCisgICAgc3Rh
dGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3QmIHN0cmluZywgY29uc3QgU3Vic3RyaW5n
TG9jYXRpb24mIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBXVEY6OmVxdWFsKHN0cmlu
ZywgYnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnMxNigpICsgYnVmZmVyLnN0YXJ0LCBidWZm
ZXIubGVuZ3RoKTsKKyAgICB9Cit9OworCitSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gQXRvbWlj
U3RyaW5nSW1wbDo6YWRkKFN0cmluZ0ltcGwqIGJhc2VTdHJpbmcsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKCFiYXNlU3RyaW5nKQorICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKworICAgIGlmICghbGVuZ3RoIHx8IHN0YXJ0ID49IGJhc2VTdHJpbmctPmxlbmd0
aCgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmlu
Z0ltcGw6OmVtcHR5KCkpOworCisgICAgdW5zaWduZWQgbWF4TGVuZ3RoID0gYmFzZVN0cmluZy0+
bGVuZ3RoKCkgLSBzdGFydDsKKyAgICBpZiAobGVuZ3RoID49IG1heExlbmd0aCkgeworICAgICAg
ICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIGFkZChiYXNlU3RyaW5nKTsKKyAgICAg
ICAgbGVuZ3RoID0gbWF4TGVuZ3RoOworICAgIH0KKworICAgIFN1YnN0cmluZ0xvY2F0aW9uIGJ1
ZmZlciA9IHsgYmFzZVN0cmluZywgc3RhcnQsIGxlbmd0aCB9OworICAgIGlmIChiYXNlU3RyaW5n
LT5pczhCaXQoKSkKKyAgICAgICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8U3Vic3RyaW5nTG9j
YXRpb24sIFN1YnN0cmluZ1RyYW5zbGF0b3I4PihidWZmZXIpOworICAgIHJldHVybiBhZGRUb1N0
cmluZ1RhYmxlPFN1YnN0cmluZ0xvY2F0aW9uLCBTdWJzdHJpbmdUcmFuc2xhdG9yMTY+KGJ1ZmZl
cik7Cit9CisgICAgCit0eXBlZGVmIEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlcjxMQ2hhcj4gTENo
YXJCdWZmZXI7CitzdHJ1Y3QgTENoYXJCdWZmZXJUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBMQ2hhckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmLnMsIGJ1Zi5sZW5n
dGgpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBz
dHIsIGNvbnN0IExDaGFyQnVmZmVyJiBidWYpCisgICAgeworICAgICAgICByZXR1cm4gV1RGOjpl
cXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0
cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBMQ2hhckJ1ZmZlciYgYnVmLCB1
bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3Jl
YXRlKGJ1Zi5zLCBidWYubGVuZ3RoKS5sZWFrUmVmKCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRI
YXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAgfQor
fTsKKwordHlwZWRlZiBIYXNoVHJhbnNsYXRvckNoYXJCdWZmZXI8Y2hhcj4gQ2hhckJ1ZmZlcjsK
K3N0cnVjdCBDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvciB7CisgICAgc3RhdGlj
IHVuc2lnbmVkIGhhc2goY29uc3QgQ2hhckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBMQ2hhcio+KGJ1Zi5zKSwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgc3Rh
dGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3QmIHN0ciwgY29uc3QgQ2hhckJ1ZmZlciYg
YnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdURjo6ZXF1YWwoc3RyLCBidWYucywgYnVmLmxl
bmd0aCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBs
b2NhdGlvbiwgY29uc3QgQ2hhckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAg
ICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlRnJvbUxpdGVyYWwoYnVmLnMsIGJ1
Zi5sZW5ndGgpLmxlYWtSZWYoKTsKKyAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Cisg
ICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICB9Cit9OworCitSZWZQdHI8
QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkKGNvbnN0IExDaGFyKiBzLCB1
bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsK
KworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3Ry
aW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOworCisgICAgTENoYXJCdWZmZXIgYnVmZmVy
ID0geyBzLCBsZW5ndGggfTsKKyAgICByZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxMQ2hhckJ1ZmZl
ciwgTENoYXJCdWZmZXJUcmFuc2xhdG9yPihidWZmZXIpOworfQorCitSZWY8QXRvbWljU3RyaW5n
SW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbUxpdGVyYWxEYXRhKGNvbnN0IGNoYXIqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoY2hhcmFjdGVycyk7Cisg
ICAgQVNTRVJUKGxlbmd0aCk7CisKKyAgICBDaGFyQnVmZmVyIGJ1ZmZlciA9IHsgY2hhcmFjdGVy
cywgbGVuZ3RoIH07CisgICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8Q2hhckJ1ZmZlciwgQ2hh
ckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I+KGJ1ZmZlcik7Cit9CisKK1JlZjxBdG9t
aWNTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmdJbXBsOjphZGRTbG93Q2FzZShTdHJpbmdJbXBsJiBz
dHJpbmcpCit7CisgICAgaWYgKCFzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAqc3Rh
dGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOworCisgICAg
aWYgKHN0cmluZy5pc1N5bWJvbCgpKSB7CisgICAgICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpCisg
ICAgICAgICAgICByZXR1cm4gKmFkZChzdHJpbmcuY2hhcmFjdGVyczgoKSwgc3RyaW5nLmxlbmd0
aCgpKTsKKyAgICAgICAgcmV0dXJuICphZGQoc3RyaW5nLmNoYXJhY3RlcnMxNigpLCBzdHJpbmcu
bGVuZ3RoKCkpOworICAgIH0KKworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0cmluZy5pc0F0
b21pYygpLCAiQXRvbWljU3RyaW5nSW1wbCBzaG91bGQgbm90IGhpdCB0aGUgc2xvdyBjYXNlIGlm
IHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBhdG9taWMuIik7CisKKyAgICBBdG9taWNTdHJpbmdUYWJs
ZUxvY2tlciBsb2NrZXI7CisgICAgYXV0byBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgpLmFkZCgm
c3RyaW5nKTsKKworICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSkgeworICAgICAgICBBU1NF
UlQoKmFkZFJlc3VsdC5pdGVyYXRvciA9PSAmc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nLnNldElz
QXRvbWljKHRydWUpOworICAgIH0KKworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXRvbWljU3Ry
aW5nSW1wbCo+KCphZGRSZXN1bHQuaXRlcmF0b3IpOworfQorCitSZWY8QXRvbWljU3RyaW5nSW1w
bD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkU2xvd0Nhc2UoQXRvbWljU3RyaW5nVGFibGUmIHN0cmlu
Z1RhYmxlLCBTdHJpbmdJbXBsJiBzdHJpbmcpCit7CisgICAgaWYgKCFzdHJpbmcubGVuZ3RoKCkp
CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmluZ0lt
cGw6OmVtcHR5KCkpOworCisgICAgaWYgKHN0cmluZy5pc1N5bWJvbCgpKSB7CisgICAgICAgIGlm
IChzdHJpbmcuaXM4Qml0KCkpCisgICAgICAgICAgICByZXR1cm4gKmFkZChzdHJpbmcuY2hhcmFj
dGVyczgoKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuICphZGQoc3RyaW5nLmNo
YXJhY3RlcnMxNigpLCBzdHJpbmcubGVuZ3RoKCkpOworICAgIH0KKworICAgIEFTU0VSVF9XSVRI
X01FU1NBR0UoIXN0cmluZy5pc0F0b21pYygpLCAiQXRvbWljU3RyaW5nSW1wbCBzaG91bGQgbm90
IGhpdCB0aGUgc2xvdyBjYXNlIGlmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBhdG9taWMuIik7CisK
KyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7CisgICAgYXV0byBhZGRSZXN1bHQg
PSBzdHJpbmdUYWJsZS50YWJsZSgpLmFkZCgmc3RyaW5nKTsKKworICAgIGlmIChhZGRSZXN1bHQu
aXNOZXdFbnRyeSkgeworICAgICAgICBBU1NFUlQoKmFkZFJlc3VsdC5pdGVyYXRvciA9PSAmc3Ry
aW5nKTsKKyAgICAgICAgc3RyaW5nLnNldElzQXRvbWljKHRydWUpOworICAgIH0KKworICAgIHJl
dHVybiAqc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCphZGRSZXN1bHQuaXRlcmF0b3Ip
OworfQorCit2b2lkIEF0b21pY1N0cmluZ0ltcGw6OnJlbW92ZShBdG9taWNTdHJpbmdJbXBsKiBz
dHJpbmcpCit7CisgICAgQVNTRVJUKHN0cmluZy0+aXNBdG9taWMoKSk7CisgICAgQXRvbWljU3Ry
aW5nVGFibGVMb2NrZXIgbG9ja2VyOworICAgIEhhc2hTZXQ8U3RyaW5nSW1wbCo+JiBhdG9taWNT
dHJpbmdUYWJsZSA9IHN0cmluZ1RhYmxlKCk7CisgICAgSGFzaFNldDxTdHJpbmdJbXBsKj46Oml0
ZXJhdG9yIGl0ZXJhdG9yID0gYXRvbWljU3RyaW5nVGFibGUuZmluZChzdHJpbmcpOworICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gYXRvbWljU3RyaW5nVGFibGUuZW5kKCksICJU
aGUgc3RyaW5nIGJlaW5nIHJlbW92ZWQgaXMgYXRvbWljIGluIHRoZSBzdHJpbmcgdGFibGUgb2Yg
YW4gb3RoZXIgdGhyZWFkISIpOworICAgIGF0b21pY1N0cmluZ1RhYmxlLnJlbW92ZShpdGVyYXRv
cik7Cit9CisKK0F0b21pY1N0cmluZ0ltcGwqIEF0b21pY1N0cmluZ0ltcGw6Omxvb2t1cFNsb3dD
YXNlKFN0cmluZ0ltcGwmIHN0cmluZykKK3sKKyAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFzdHJp
bmcuaXNBdG9taWMoKSwgIkF0b21pY1N0cmluZ0ltcGxzIHNob3VsZCByZXR1cm4gZnJvbSB0aGUg
ZmFzdCBjYXNlLiIpOworCisgICAgaWYgKCFzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisK
KyAgICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKKyAgICAgICAgaWYgKHN0cmluZy5pczhCaXQo
KSkKKyAgICAgICAgICAgIHJldHVybiBsb29rdXBJbnRlcm5hbChzdHJpbmcuY2hhcmFjdGVyczgo
KSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIGxvb2t1cEludGVybmFsKHN0cmlu
Zy5jaGFyYWN0ZXJzMTYoKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBBdG9taWNT
dHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7CisgICAgSGFzaFNldDxTdHJpbmdJbXBsKj4mIGF0b21p
Y1N0cmluZ1RhYmxlID0gc3RyaW5nVGFibGUoKTsKKyAgICBhdXRvIGl0ZXJhdG9yID0gYXRvbWlj
U3RyaW5nVGFibGUuZmluZCgmc3RyaW5nKTsKKyAgICBpZiAoaXRlcmF0b3IgIT0gYXRvbWljU3Ry
aW5nVGFibGUuZW5kKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJ
bXBsKj4oKml0ZXJhdG9yKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworUmVmUHRyPEF0b21p
Y1N0cmluZ0ltcGw+IEF0b21pY1N0cmluZ0ltcGw6OmFkZEZyb21VVEY4KGNvbnN0IGNoYXIqIGNo
YXJhY3RlcnNTdGFydCwgY29uc3QgY2hhciogY2hhcmFjdGVyc0VuZCkKK3sKKyAgICBIYXNoQW5k
VVRGOENoYXJhY3RlcnMgYnVmZmVyOworICAgIGJ1ZmZlci5jaGFyYWN0ZXJzID0gY2hhcmFjdGVy
c1N0YXJ0OworICAgIGJ1ZmZlci5oYXNoID0gY2FsY3VsYXRlU3RyaW5nSGFzaEFuZExlbmd0aEZy
b21VVEY4TWFza2luZ1RvcDhCaXRzKGNoYXJhY3RlcnNTdGFydCwgY2hhcmFjdGVyc0VuZCwgYnVm
ZmVyLmxlbmd0aCwgYnVmZmVyLnV0ZjE2TGVuZ3RoKTsKKworICAgIGlmICghYnVmZmVyLmhhc2gp
CisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8
SGFzaEFuZFVURjhDaGFyYWN0ZXJzLCBIYXNoQW5kVVRGOENoYXJhY3RlcnNUcmFuc2xhdG9yPihi
dWZmZXIpOworfQorCitBdG9taWNTdHJpbmdJbXBsKiBBdG9taWNTdHJpbmdJbXBsOjpsb29rdXBJ
bnRlcm5hbChjb25zdCBMQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQoreworICAg
IEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyIGxvY2tlcjsKKyAgICBhdXRvJiB0YWJsZSA9IHN0cmlu
Z1RhYmxlKCk7CisKKyAgICBMQ2hhckJ1ZmZlciBidWZmZXIgPSB7IGNoYXJhY3RlcnMsIGxlbmd0
aCB9OworICAgIGF1dG8gaXRlcmF0b3IgPSB0YWJsZS5maW5kPExDaGFyQnVmZmVyVHJhbnNsYXRv
cj4oYnVmZmVyKTsKKyAgICBpZiAoaXRlcmF0b3IgIT0gdGFibGUuZW5kKCkpCisgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oKml0ZXJhdG9yKTsKKyAgICByZXR1
cm4gbnVsbHB0cjsKK30KKworQXRvbWljU3RyaW5nSW1wbCogQXRvbWljU3RyaW5nSW1wbDo6bG9v
a3VwSW50ZXJuYWwoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sK
KyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7CisgICAgYXV0byYgdGFibGUgPSBz
dHJpbmdUYWJsZSgpOworCisgICAgVUNoYXJCdWZmZXIgYnVmZmVyID0geyBjaGFyYWN0ZXJzLCBs
ZW5ndGggfTsKKyAgICBhdXRvIGl0ZXJhdG9yID0gdGFibGUuZmluZDxVQ2hhckJ1ZmZlclRyYW5z
bGF0b3I+KGJ1ZmZlcik7CisgICAgaWYgKGl0ZXJhdG9yICE9IHRhYmxlLmVuZCgpKQorICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCppdGVyYXRvcik7CisgICAg
cmV0dXJuIG51bGxwdHI7Cit9CisKKyNpZiAhQVNTRVJUX0RJU0FCTEVECitib29sIEF0b21pY1N0
cmluZ0ltcGw6OmlzSW5BdG9taWNTdHJpbmdUYWJsZShTdHJpbmdJbXBsKiBzdHJpbmcpCit7Cisg
ICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOworICAgIHJldHVybiBzdHJpbmdUYWJs
ZSgpLmNvbnRhaW5zKHN0cmluZyk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV1RGCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuaCBiL1NvdXJj
ZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5oCmluZGV4IDYyYTkwZTA2ZTUzOGY2NjNl
NGJmMGUwM2JlMzJlYjY0MDE3YzIyYzIuLmI4MzE3ZGEzZGYyZjY0OTU3MWMxOTNmYmNlZTk2NzBi
MDBiZjliMzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nSW1w
bC5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5oCkBAIC0yNSwx
MCArMjUsOTIgQEAKIAogbmFtZXNwYWNlIFdURiB7CiAKK2NsYXNzIEF0b21pY1N0cmluZ1RhYmxl
OworCiBjbGFzcyBBdG9taWNTdHJpbmdJbXBsIDogcHVibGljIFN0cmluZ0ltcGwKIHsKK3ByaXZh
dGU6CisgICAgQXRvbWljU3RyaW5nSW1wbCgpID0gZGVsZXRlOworCiBwdWJsaWM6Ci0gICAgQXRv
bWljU3RyaW5nSW1wbCgpIDogU3RyaW5nSW1wbCgwKSB7fQorICAgIHN0YXRpYyBBdG9taWNTdHJp
bmdJbXBsKiBsb29rdXAoTENoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKKyAgICB7
CisgICAgICAgIHJldHVybiBsb29rdXBJbnRlcm5hbChjaGFyYWN0ZXJzLCBsZW5ndGgpOworICAg
IH0KKyAgICBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogbG9va3VwKFVDaGFyKiBjaGFyYWN0ZXJz
LCB1bnNpZ25lZCBsZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gbG9va3VwSW50ZXJuYWwo
Y2hhcmFjdGVycywgbGVuZ3RoKTsKKyAgICB9CisgICAgc3RhdGljIEF0b21pY1N0cmluZ0ltcGwq
IGxvb2t1cChTdHJpbmdJbXBsKiBzdHJpbmcpCisgICAgeworICAgICAgICBpZiAoIXN0cmluZyB8
fCBzdHJpbmctPmlzQXRvbWljKCkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRv
bWljU3RyaW5nSW1wbCo+KHN0cmluZyk7CisgICAgICAgIHJldHVybiBsb29rdXBTbG93Q2FzZSgq
c3RyaW5nKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCByZW1vdmUoQXRvbWljU3RyaW5nSW1w
bCopOworCisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWZQdHI8QXRvbWljU3Ry
aW5nSW1wbD4gYWRkKGNvbnN0IExDaGFyKik7CisgICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVm
UHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBjaGFyKiBzKSB7IHJldHVybiBhZGQocmVp
bnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KHMpKTsgfTsKKyAgICBXVEZfRVhQT1JUX1NUUklO
R19BUEkgc3RhdGljIFJlZlB0cjxBdG9taWNTdHJpbmdJbXBsPiBhZGQoY29uc3QgTENoYXIqLCB1
bnNpZ25lZCBsZW5ndGgpOworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRy
PEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7Cisg
ICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25z
dCBjaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0dXJuIGFkZChyZWludGVycHJldF9jYXN0
PGNvbnN0IExDaGFyKj4ocyksIGxlbmd0aCk7IH07CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJ
IHN0YXRpYyBSZWY8QXRvbWljU3RyaW5nSW1wbD4gYWRkKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQg
bGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpOworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQ
SSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBVQ2hhciopOworICAg
IFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFk
ZChTdHJpbmdJbXBsKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpOworICAgIEFM
V0FZU19JTkxJTkUgc3RhdGljIFJlZlB0cjxBdG9taWNTdHJpbmdJbXBsPiBhZGQoU3RyaW5nSW1w
bCogc3RyaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJpbmcpCisgICAgICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KHN0cmluZyk7CisgICAgICAgIHJldHVy
biBhZGQoKnN0cmluZyk7CisgICAgfQorICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMg
UmVmPEF0b21pY1N0cmluZ0ltcGw+IGFkZEZyb21MaXRlcmFsRGF0YShjb25zdCBjaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpOworCisgICAgLy8gQXRvbWljU3RyaW5nSW1wbDo6YWRk
RnJvbVVURjggd2lsbCByZXR1cm4gYSBudWxscHRyIGlmCisgICAgLy8gdGhlIGlucHV0IGRhdGEg
Y29udGFpbnMgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZXMuCisgICAgV1RGX0VYUE9SVF9TVFJJTkdf
QVBJIHN0YXRpYyBSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gYWRkRnJvbVVURjgoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCk7CisjaWYgVVNFKENGKQorICAgIFdURl9FWFBPUlRf
U1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChDRlN0cmluZ1Jl
Zik7CisjZW5kaWYKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1RhYmxlUHJvdmlkZXI+
CisgICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZFdp
dGhTdHJpbmdUYWJsZVByb3ZpZGVyKFN0cmluZ1RhYmxlUHJvdmlkZXImIHN0cmluZ1RhYmxlUHJv
dmlkZXIsIFN0cmluZ0ltcGwqIHN0cmluZykKKyAgICB7CisgICAgICAgIGlmICghc3RyaW5nKQor
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPihzdHJpbmcp
OworICAgICAgICByZXR1cm4gYWRkKCpzdHJpbmdUYWJsZVByb3ZpZGVyLmF0b21pY1N0cmluZ1Rh
YmxlKCksICpzdHJpbmcpOworICAgIH0KKworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBXVEZf
RVhQT1JUX1NUUklOR19BUEkgc3RhdGljIGJvb2wgaXNJbkF0b21pY1N0cmluZ1RhYmxlKFN0cmlu
Z0ltcGwqKTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIEFMV0FZU19JTkxJTkUgc3RhdGljIFJl
ZjxBdG9taWNTdHJpbmdJbXBsPiBhZGQoU3RyaW5nSW1wbCYgc3RyaW5nKQorICAgIHsKKyAgICAg
ICAgaWYgKHN0cmluZy5pc0F0b21pYygpKSB7CisgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNT
QUdFKCFzdHJpbmcubGVuZ3RoKCkgfHwgaXNJbkF0b21pY1N0cmluZ1RhYmxlKCZzdHJpbmcpLCAi
VGhlIGF0b21pYyBzdHJpbmcgY29tZXMgZnJvbSBhbiBvdGhlciB0aHJlYWQhIik7CisgICAgICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCY+KHN0cmluZyk7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFNsb3dDYXNlKHN0cmluZyk7CisgICAgfQorCisgICAg
QUxXQVlTX0lOTElORSBzdGF0aWMgUmVmPEF0b21pY1N0cmluZ0ltcGw+IGFkZChBdG9taWNTdHJp
bmdUYWJsZSYgc3RyaW5nVGFibGUsIFN0cmluZ0ltcGwmIHN0cmluZykKKyAgICB7CisgICAgICAg
IGlmIChzdHJpbmcuaXNBdG9taWMoKSkgeworICAgICAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FH
RSghc3RyaW5nLmxlbmd0aCgpIHx8IGlzSW5BdG9taWNTdHJpbmdUYWJsZSgmc3RyaW5nKSwgIlRo
ZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZyb20gYW4gb3RoZXIgdGhyZWFkISIpOworICAgICAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwmPihzdHJpbmcpOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiBhZGRTbG93Q2FzZShzdHJpbmdUYWJsZSwgc3RyaW5nKTsKKyAg
ICB9CisKKyAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJlZjxBdG9taWNTdHJpbmdJ
bXBsPiBhZGRTbG93Q2FzZShTdHJpbmdJbXBsJik7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJ
IHN0YXRpYyBSZWY8QXRvbWljU3RyaW5nSW1wbD4gYWRkU2xvd0Nhc2UoQXRvbWljU3RyaW5nVGFi
bGUmLCBTdHJpbmdJbXBsJik7CisKKyAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIEF0
b21pY1N0cmluZ0ltcGwqIGxvb2t1cFNsb3dDYXNlKFN0cmluZ0ltcGwmKTsKKworICAgIFdURl9F
WFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogbG9va3VwSW50ZXJuYWwo
Y29uc3QgTENoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQ
SSBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogbG9va3VwSW50ZXJuYWwoY29uc3QgVUNoYXIqLCB1
bnNpZ25lZCBsZW5ndGgpOwogfTsKIAogI2lmICFBU1NFUlRfRElTQUJMRUQKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0
L1N0cmluZ0ltcGwuY3BwCmluZGV4IGIwMTk3YjI0YWFlMGU3MDhmNmUyNDQwYzFhZWQ3ZDg5ZjA4
MmY5MGQuLjhmZjNmOGJiN2M5NjcyNTU4ZDU4YTIzZWQwMjNlMjE1YWNlMThhYTkgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAKKysrIGIvU291cmNlL1dURi93
dGYvdGV4dC9TdHJpbmdJbXBsLmNwcApAQCAtMTExLDcgKzExMSw3IEBAIHZvaWQgU3RyaW5nU3Rh
dHM6OnByaW50U3RhdHMoKQogICAgIFNUUklOR19TVEFUU19SRU1PVkVfU1RSSU5HKCp0aGlzKTsK
IAogICAgIGlmIChpc0F0b21pYygpICYmIGxlbmd0aCgpICYmICFpc1N5bWJvbCgpKQotICAgICAg
ICBBdG9taWNTdHJpbmc6OnJlbW92ZSh0aGlzKTsKKyAgICAgICAgQXRvbWljU3RyaW5nSW1wbDo6
cmVtb3ZlKHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPih0aGlzKSk7CiAKICAgICBpZiAo
aXNTeW1ib2woKSAmJiBzeW1ib2xSZWdpc3RyeSgpKQogICAgICAgICBzeW1ib2xSZWdpc3RyeSgp
LT5yZW1vdmUodGhpcyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0lt
cGwuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5oCmluZGV4IGRhMjlmYmFjMjQy
N2E0YzljYmZjMGUyNDg2YzBiOWE3NzZiYWQ2ZmMuLmNmNzYwMTBiODM2MWJjM2JjMjAyMmY1ZDQy
OTg5NjMxNTY4YjljNDkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1w
bC5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5oCkBAIC0xMzEsNyArMTMx
LDYgQEAgY2xhc3MgU3RyaW5nSW1wbCB7CiAgICAgZnJpZW5kIHN0cnVjdCBXVEY6OkxDaGFyQnVm
ZmVyVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IFdURjo6U3Vic3RyaW5nVHJhbnNsYXRv
cjsKICAgICBmcmllbmQgc3RydWN0IFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9yOwotICAgIGZy
aWVuZCBjbGFzcyBBdG9taWNTdHJpbmdJbXBsOwogICAgIGZyaWVuZCBjbGFzcyBKU0M6OkxMSW50
OjpEYXRhOwogICAgIGZyaWVuZCBjbGFzcyBKU0M6OkxMSW50T2Zmc2V0c0V4dHJhY3RvcjsKICAg
ICAKQEAgLTMzMCw2ICszMjksOCBAQCBjbGFzcyBTdHJpbmdJbXBsIHsKICAgICAgICAgU1RSSU5H
X1NUQVRTX0FERF8xNkJJVF9TVFJJTkcyKG1fbGVuZ3RoLCB0cnVlKTsKICAgICB9CiAKK3Byb3Rl
Y3RlZDoKKyAgICAvLyBUbyBhbGxvdyBnZW5lcmF0aW5nIHRoZSBkZXN0cnVjdG9yIGluIHRoZSBi
YXNlIGNsYXNzZXMsIHdlIGV4cG9zZSB0aGUgZGVzdHJ1Y3RvciBhcyBwcm90ZWN0ZWQuCiAgICAg
flN0cmluZ0ltcGwoKTsKIAogcHVibGljOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4
dC9XVEZTdHJpbmcuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3RyaW5nLmgKaW5kZXggNTMy
M2IyNzdhZDljODc0ZDFjNDZiYzIxNDEwMjNiNmU4N2M5NDAwYy4uMTAxNTY4N2MyNDliZWFiNzVh
N2YxNzM2ZGY5NjEwZDI5Yzc0MGI5MSAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9X
VEZTdHJpbmcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCkBAIC0xMTgs
NiArMTE4LDEwIEBAIGNsYXNzIFN0cmluZyB7CiAgICAgU3RyaW5nKFJlZjxTdHJpbmdJbXBsPiYm
IGltcGwpIDogbV9pbXBsKFdURjo6bW92ZShpbXBsKSkgeyB9CiAgICAgU3RyaW5nKFJlZlB0cjxT
dHJpbmdJbXBsPiYmIGltcGwpIDogbV9pbXBsKGltcGwpIHsgfQogCisgICAgU3RyaW5nKFBhc3NS
ZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gaW1wbCkgOiBtX2ltcGwoaW1wbCkgeyB9CisgICAgU3Ry
aW5nKFJlZjxBdG9taWNTdHJpbmdJbXBsPiYmIGltcGwpIDogbV9pbXBsKFdURjo6bW92ZShpbXBs
KSkgeyB9CisgICAgU3RyaW5nKFJlZlB0cjxBdG9taWNTdHJpbmdJbXBsPiYmIGltcGwpIDogbV9p
bXBsKGltcGwpIHsgfQorCiAgICAgLy8gQ29uc3RydWN0IGEgc3RyaW5nIGZyb20gYSBjb25zdGFu
dCBzdHJpbmcgbGl0ZXJhbC4KICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgU3RyaW5nKEFTQ0lJ
TGl0ZXJhbCBjaGFyYWN0ZXJzKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9j
Zi9BdG9taWNTdHJpbmdDRi5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L2NmL0F0b21pY1N0cmlu
Z0NGLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljODJiZjNjNDkyNzhkMWUw
MjIzZDI1OTUzZWRmNzFmMmNkNGI0ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L2NmL0F0b21pY1N0cmluZ0NGLmNwcAor
KysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nLmg+Ci0KLSNpZiBVU0UoQ0Yp
Ci0KLSNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgotI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotbmFtZXNwYWNlIFdURiB7Ci0KLVJlZlB0cjxTdHJpbmdJ
bXBsPiBBdG9taWNTdHJpbmc6OmFkZChDRlN0cmluZ1JlZiBzdHJpbmcpCi17Ci0gICAgaWYgKCFz
dHJpbmcpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQ0ZJbmRleCBsZW5ndGggPSBD
RlN0cmluZ0dldExlbmd0aChzdHJpbmcpOwotCi0gICAgaWYgKGNvbnN0IExDaGFyKiBwdHIgPSBy
ZWludGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4oQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyKHN0cmlu
Zywga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEpKSkKLSAgICAgICAgcmV0dXJuIGFkZChwdHIs
IGxlbmd0aCk7Ci0KLSAgICBpZiAoY29uc3QgVW5pQ2hhciogcHRyID0gQ0ZTdHJpbmdHZXRDaGFy
YWN0ZXJzUHRyKHN0cmluZykpCi0gICAgICAgIHJldHVybiBhZGQocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBVQ2hhcio+KHB0ciksIGxlbmd0aCk7Ci0KLSAgICBWZWN0b3I8VW5pQ2hhciwgMTAyND4g
dWNoYXJCdWZmZXIobGVuZ3RoKTsKLSAgICBDRlN0cmluZ0dldENoYXJhY3RlcnMoc3RyaW5nLCBD
RlJhbmdlTWFrZSgwLCBsZW5ndGgpLCB1Y2hhckJ1ZmZlci5kYXRhKCkpOwotICAgIHJldHVybiBh
ZGQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHVjaGFyQnVmZmVyLmRhdGEoKSksIGxl
bmd0aCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdURgotCi0jZW5kaWYgLy8gVVNFKENGKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9jZi9BdG9taWNTdHJpbmdJbXBsQ0YuY3BwIGIv
U291cmNlL1dURi93dGYvdGV4dC9jZi9BdG9taWNTdHJpbmdJbXBsQ0YuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjRhM2YxNWRhZTQ5ODQ3YWE4ZmYyOGRjM2E3NzZiNjc1YzUxZjkwYzcKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L2NmL0F0b21pY1N0cmluZ0ltcGxDRi5jcHAKQEAgLTAs
MCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx3
dGYvdGV4dC9BdG9taWNTdHJpbmdJbXBsLmg+CisKKyNpZiBVU0UoQ0YpCisKKyNpbmNsdWRlIDxD
b3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJp
bmcuaD4KKworbmFtZXNwYWNlIFdURiB7CisKK1JlZlB0cjxBdG9taWNTdHJpbmdJbXBsPiBBdG9t
aWNTdHJpbmdJbXBsOjphZGQoQ0ZTdHJpbmdSZWYgc3RyaW5nKQoreworICAgIGlmICghc3RyaW5n
KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENGSW5kZXggbGVuZ3RoID0gQ0ZTdHJp
bmdHZXRMZW5ndGgoc3RyaW5nKTsKKworICAgIGlmIChjb25zdCBMQ2hhciogcHRyID0gcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KENGU3RyaW5nR2V0Q1N0cmluZ1B0cihzdHJpbmcsIGtD
RlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xKSkpCisgICAgICAgIHJldHVybiBhZGQocHRyLCBsZW5n
dGgpOworCisgICAgaWYgKGNvbnN0IFVuaUNoYXIqIHB0ciA9IENGU3RyaW5nR2V0Q2hhcmFjdGVy
c1B0cihzdHJpbmcpKQorICAgICAgICByZXR1cm4gYWRkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
VUNoYXIqPihwdHIpLCBsZW5ndGgpOworCisgICAgVmVjdG9yPFVuaUNoYXIsIDEwMjQ+IHVjaGFy
QnVmZmVyKGxlbmd0aCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHN0cmluZywgQ0ZSYW5n
ZU1ha2UoMCwgbGVuZ3RoKSwgdWNoYXJCdWZmZXIuZGF0YSgpKTsKKyAgICByZXR1cm4gYWRkKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPih1Y2hhckJ1ZmZlci5kYXRhKCkpLCBsZW5ndGgp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFVTRShDRikKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9UcmVlU2NvcGUuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9t
L1RyZWVTY29wZS5jcHAKaW5kZXggNDJhZDkyMWE0YTQxMGNiODUyNDQzNmMxMTg1NGRjZThkNWFi
NmUxYi4uMzY2MTZmOGE4ZTFkOTVlNjYwNDk3ZTVjYmQ4MTE3NzRiMTc2YzM2ZiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvZG9tL1RyZWVTY29wZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
ZG9tL1RyZWVTY29wZS5jcHAKQEAgLTExMiw3ICsxMTIsNyBAQCBFbGVtZW50KiBUcmVlU2NvcGU6
OmdldEVsZW1lbnRCeUlkKGNvbnN0IFN0cmluZyYgZWxlbWVudElkKSBjb25zdAogICAgIGlmICgh
bV9lbGVtZW50c0J5SWQpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgaWYgKEF0b21p
Y1N0cmluZ0ltcGwqIGF0b21pY0VsZW1lbnRJZCA9IEF0b21pY1N0cmluZzo6ZmluZChlbGVtZW50
SWQuaW1wbCgpKSkKKyAgICBpZiAoQXRvbWljU3RyaW5nSW1wbCogYXRvbWljRWxlbWVudElkID0g
QXRvbWljU3RyaW5nSW1wbDo6bG9va3VwKGVsZW1lbnRJZC5pbXBsKCkpKQogICAgICAgICByZXR1
cm4gbV9lbGVtZW50c0J5SWQtPmdldEVsZW1lbnRCeUlkKCphdG9taWNFbGVtZW50SWQsICp0aGlz
KTsKIAogICAgIHJldHVybiBudWxscHRyOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIv
VG9vbHMvQ2hhbmdlTG9nCmluZGV4IGViYzJjZTljMjUxNzk5NjIzNjMyNDczODg4MDk1MTEwZTNk
ZmFiNTIuLjI0YjUzMTA4NWQ1ZTE1ZGQ5YmRmMzJhYTczMjIzMzU3MTdkNzg4MDUgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBA
QAorMjAxNS0wNS0xNyAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KKwor
ICAgICAgICBNb3ZlIEF0b21pY1N0cmluZ0ltcGwgdGFibGUgcmVsYXRlZCBvcGVyYXRpb25zIGZy
b20gQXRvbWljU3RyaW5nIHRvIEF0b21pY1N0cmluZ0ltcGwKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTEwOQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvU3Ry
aW5nSW1wbC5jcHA6CisgICAgICAgIChUZXN0V2ViS2l0QVBJOjpURVNUKToKKwogMjAxNS0wNS0x
NyAgRGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIGJpc2VjdC1i
dWlsZHM6IEFkZCAncmV0cnknIG9wdGlvbiB3aGVuIHByb21wdGluZyB3aGV0aGVyIHRoZSBidWcg
cmVwcm9kdWNlZApkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvU3Ry
aW5nSW1wbC5jcHAgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNw
cAppbmRleCA4MzMyMmM5YzJiYzkzNTY3Y2Q2ODg5MWY0NWU0OTA2MDk2ODQyZGNkLi42ZGM5OTM0
MDk4YmQ3ZDE1NTA3YzEyYWVhNzlkZDRmYTg1YjAxOTcxIDEwMDY0NAotLS0gYS9Ub29scy9UZXN0
V2ViS2l0QVBJL1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNwcAorKysgYi9Ub29scy9UZXN0V2ViS2l0
QVBJL1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNwcApAQCAtNTI1LDcgKzUyNSw3IEBACiAgICAgQVNT
RVJUX1RSVUUocmVmZXJlbmNlLT5pc1N5bWJvbCgpKTsKICAgICBBU1NFUlRfRkFMU0UocmVmZXJl
bmNlLT5pc0F0b21pYygpKTsKIAotICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBhdG9taWMgPSBBdG9t
aWNTdHJpbmc6OmFkZChyZWZlcmVuY2UuZ2V0KCkpOworICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBh
dG9taWMgPSBBdG9taWNTdHJpbmdJbXBsOjphZGQocmVmZXJlbmNlLmdldCgpKTsKICAgICBBU1NF
UlRfVFJVRShhdG9taWMtPmlzQXRvbWljKCkpOwogICAgIEFTU0VSVF9GQUxTRShhdG9taWMtPmlz
U3ltYm9sKCkpOwogICAgIEFTU0VSVF9UUlVFKHJlZmVyZW5jZS0+aXNTeW1ib2woKSk7CkBAIC01
MzgsNyArNTM4LDcgQEAKICAgICBBU1NFUlRfVFJVRShyZWZlcmVuY2UtPmlzU3ltYm9sKCkpOwog
ICAgIEFTU0VSVF9GQUxTRShyZWZlcmVuY2UtPmlzQXRvbWljKCkpOwogCi0gICAgUmVmUHRyPFN0
cmluZ0ltcGw+IGF0b21pYyA9IEF0b21pY1N0cmluZzo6YWRkKHJlZmVyZW5jZS5nZXQoKSk7Cisg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IGF0b21pYyA9IEF0b21pY1N0cmluZ0ltcGw6OmFkZChyZWZl
cmVuY2UuZ2V0KCkpOwogICAgIEFTU0VSVF9UUlVFKGF0b21pYy0+aXNBdG9taWMoKSk7CiAgICAg
QVNTRVJUX0ZBTFNFKGF0b21pYy0+aXNTeW1ib2woKSk7CiAgICAgQVNTRVJUX1RSVUUocmVmZXJl
bmNlLT5pc1N5bWJvbCgpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>253293</attachid>
            <date>2015-05-17 12:37:53 -0700</date>
            <delta_ts>2015-05-19 09:06:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-145109-20150518043752.patch</filename>
            <type>text/plain</type>
            <size>84744</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg0NDQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA2
ZTYzMTY5NDJhNDc4ODIwOTJmNWU5MmNmMTViNzhjMzBmYTlmODA5Li40MDlmYzNiM2Q0NzE2YjRm
OWFlZmI2N2JhMjFmMmEzMTdiZTA4MWE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyOSBAQAorMjAxNS0wNS0xNyAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWls
LmNvbT4KKworICAgICAgICBNb3ZlIEF0b21pY1N0cmluZ0ltcGwgdGFibGUgcmVsYXRlZCBvcGVy
YXRpb25zIGZyb20gQXRvbWljU3RyaW5nIHRvIEF0b21pY1N0cmluZ0ltcGwKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTEwOQorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2Nr
LmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpuYW1lRm9yUmVnaXN0ZXIpOgorICAgICAg
ICAqIHJ1bnRpbWUvSWRlbnRpZmllci5jcHA6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFk
ZCk6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZDgpOgorICAgICAgICAqIHJ1bnRpbWUv
SWRlbnRpZmllci5oOgorICAgICAgICAoSlNDOjpJZGVudGlmaWVyOjphZGQpOgorICAgICAgICAq
IHJ1bnRpbWUvSWRlbnRpZmllcklubGluZXMuaDoKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6
SWRlbnRpZmllcik6CisgICAgICAgIChKU0M6OklkZW50aWZpZXI6OmFkZCk6CisgICAgICAgICog
cnVudGltZS9KU1N0cmluZy5jcHA6CisgICAgICAgIChKU0M6OkpTUm9wZVN0cmluZzo6cmVzb2x2
ZVJvcGVUb0V4aXN0aW5nQXRvbWljU3RyaW5nKToKKyAgICAgICAgKiBydW50aW1lL0pTU3RyaW5n
Lmg6CisgICAgICAgIChKU0M6OkpTU3RyaW5nOjp0b0V4aXN0aW5nQXRvbWljU3RyaW5nKToKKyAg
ICAgICAgKiBydW50aW1lL1NtYWxsU3RyaW5ncy5jcHA6CisgICAgICAgIChKU0M6OlNtYWxsU3Ry
aW5nc1N0b3JhZ2U6OlNtYWxsU3RyaW5nc1N0b3JhZ2UpOgorICAgICAgICAqIHJ1bnRpbWUvVHlw
ZVNldC5jcHA6CisgICAgICAgIChKU0M6OlN0cnVjdHVyZVNoYXBlOjpwcm9wZXJ0eUhhc2gpOgor
CiAyMDE1LTA1LTE2ICBDb21taXQgUXVldWUgIDxjb21taXQtcXVldWVAd2Via2l0Lm9yZz4KIAog
ICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMTg0NDE1LgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCAzNTUyNjI3MjY1
Mzc5ODRkYTNiZjFjOTU2OGIzNmQ2ZmVjZTM2MDJkLi4wMjM2OGNhNDMwOTRhNzQ3NTZjZjlkYTRh
MTgzZjM3NDJhYWFmYjljIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9T
b3VyY2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExNCBAQAorMjAxNS0wNS0xNyAgWXVzdWtl
IFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KKworICAgICAgICBNb3ZlIEF0b21pY1N0
cmluZ0ltcGwgdGFibGUgcmVsYXRlZCBvcGVyYXRpb25zIGZyb20gQXRvbWljU3RyaW5nIHRvIEF0
b21pY1N0cmluZ0ltcGwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NTEwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIE5vdyBBdG9taWNTdHJpbmdJbXBsIHRhYmxlIG9wZXJhdGlvbnMgYXJlIGxvY2F0ZWQg
aW4gQXRvbWljU3RyaW5nLgorICAgICAgICBCdXQgdGhleSBzaG91bGQgYmUgdW5kZXIgQXRvbWlj
U3RyaW5nSW1wbC4KKyAgICAgICAgVGhpcyBwYXRjaCBzaW1wbHkgbW92ZXMgdGhlc2Ugb3BlcmF0
aW9ucyB0byBBdG9taWNTdHJpbmdJbXBsLgorCisgICAgICAgIEFuZCB0aGlzIHBhdGNoIHJlbmFt
ZXMgc3RhdGljIEF0b21pY1N0cmluZzo6ZmluZCB0byBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbDo6
bG9va3VwCisgICAgICAgIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggQXRvbWljU3RyaW5nSW1w
bCdzIG1lbWJlciBmdW5jdGlvbiBuYW1lLgorCisgICAgICAgICogV1RGLnZjeHByb2ovV1RGLnZj
eHByb2o6CisgICAgICAgICogV1RGLnZjeHByb2ovV1RGLnZjeHByb2ouZmlsdGVyczoKKyAgICAg
ICAgKiBXVEYudmN4cHJvai9jb3B5LWZpbGVzLmNtZDoKKyAgICAgICAgKiBXVEYueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiB3dGYvQ01ha2VMaXN0cy50eHQ6CisgICAgICAg
ICogd3RmL1BsYXRmb3JtTWFjLmNtYWtlOgorICAgICAgICAqIHd0Zi9QbGF0Zm9ybVdpbi5jbWFr
ZToKKyAgICAgICAgKiB3dGYvdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAgICAgICAoV1RGOjpB
dG9taWNTdHJpbmc6Omxvd2VyKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjpjb252ZXJ0
VG9BU0NJSUxvd2VyY2FzZSk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6ZnJvbVVURjhJ
bnRlcm5hbCk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZ1RhYmxlTG9ja2VyOjpBdG9taWNT
dHJpbmdUYWJsZUxvY2tlcik6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OnN0cmluZ1RhYmxlKTog
RGVsZXRlZC4KKyAgICAgICAgKFdURjo6YWRkVG9TdHJpbmdUYWJsZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdU
Rjo6Q1N0cmluZ1RyYW5zbGF0b3I6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6Q1N0
cmluZ1RyYW5zbGF0b3I6OnRyYW5zbGF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21p
Y1N0cmluZzo6YWRkKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xh
dG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9y
OjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6
dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFu
c2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNU
cmFuc2xhdG9yOjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6Okhhc2hBbmRDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6SGFzaEFu
ZFVURjhDaGFyYWN0ZXJzVHJhbnNsYXRvcjo6aGFzaCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6
Okhhc2hBbmRVVEY4Q2hhcmFjdGVyc1RyYW5zbGF0b3I6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdURjo6SGFzaEFuZFVURjhDaGFyYWN0ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjg6Omhhc2gpOiBEZWxldGVk
LgorICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yODo6ZXF1YWwpOiBEZWxldGVkLgor
ICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6Omhhc2gpOiBEZWxldGVkLgorICAg
ICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6OmVxdWFsKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjpoYXNoKTogRGVsZXRlZC4KKyAgICAgICAg
KFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVhbCk6IERlbGV0ZWQuCisgICAgICAgIChX
VEY6OkxDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAg
KFdURjo6Q2hhckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I6Omhhc2gpOiBEZWxldGVk
LgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6ZXF1
YWwpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJh
bnNsYXRvcjo6dHJhbnNsYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5n
OjphZGRGcm9tTGl0ZXJhbERhdGEpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpBdG9taWNTdHJp
bmc6OmFkZFNsb3dDYXNlKTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjpy
ZW1vdmUpOiBEZWxldGVkLgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmc6OmZpbmRTbG93Q2Fz
ZSk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6ZmluZEludGVybmFsKTog
RGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjppc0luQXRvbWljU3RyaW5nVGFi
bGUpOiBEZWxldGVkLgorICAgICAgICAqIHd0Zi90ZXh0L0F0b21pY1N0cmluZy5oOgorICAgICAg
ICAoV1RGOjpBdG9taWNTdHJpbmc6OkF0b21pY1N0cmluZyk6CisgICAgICAgIChXVEY6OkF0b21p
Y1N0cmluZzo6ZmluZCk6IERlbGV0ZWQuCisgICAgICAgIChXVEY6OkF0b21pY1N0cmluZzo6YWRk
KTogRGVsZXRlZC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nOjphZGRXaXRoU3RyaW5nVGFi
bGVQcm92aWRlcik6IERlbGV0ZWQuCisgICAgICAgICogd3RmL3RleHQvQXRvbWljU3RyaW5nSW1w
bC5jcHA6IENvcGllZCBmcm9tIFNvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nLmNwcC4K
KyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nVGFibGVMb2NrZXI6OkF0b21pY1N0cmluZ1RhYmxl
TG9ja2VyKToKKyAgICAgICAgKFdURjo6c3RyaW5nVGFibGUpOgorICAgICAgICAoV1RGOjphZGRU
b1N0cmluZ1RhYmxlKToKKyAgICAgICAgKFdURjo6Q1N0cmluZ1RyYW5zbGF0b3I6Omhhc2gpOgor
ICAgICAgICAoV1RGOjpDU3RyaW5nVHJhbnNsYXRvcjo6ZXF1YWwpOgorICAgICAgICAoV1RGOjpD
U3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5n
SW1wbDo6YWRkKToKKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9yOjpoYXNoKToK
KyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVhbCk6CisgICAgICAgIChX
VEY6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6SGFz
aEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yOjpoYXNoKToKKyAgICAgICAgKFdURjo6SGFzaEFuZENo
YXJhY3RlcnNUcmFuc2xhdG9yOjplcXVhbCk6CisgICAgICAgIChXVEY6Okhhc2hBbmRDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6SGFzaEFuZFVURjhDaGFy
YWN0ZXJzVHJhbnNsYXRvcjo6aGFzaCk6CisgICAgICAgIChXVEY6Okhhc2hBbmRVVEY4Q2hhcmFj
dGVyc1RyYW5zbGF0b3I6OmVxdWFsKToKKyAgICAgICAgKFdURjo6SGFzaEFuZFVURjhDaGFyYWN0
ZXJzVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNs
YXRvcjo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjg6Omhh
c2gpOgorICAgICAgICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yODo6ZXF1YWwpOgorICAgICAg
ICAoV1RGOjpTdWJzdHJpbmdUcmFuc2xhdG9yMTY6Omhhc2gpOgorICAgICAgICAoV1RGOjpTdWJz
dHJpbmdUcmFuc2xhdG9yMTY6OmVxdWFsKToKKyAgICAgICAgKFdURjo6TENoYXJCdWZmZXJUcmFu
c2xhdG9yOjpoYXNoKToKKyAgICAgICAgKFdURjo6TENoYXJCdWZmZXJUcmFuc2xhdG9yOjplcXVh
bCk6CisgICAgICAgIChXVEY6OkxDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKToKKyAg
ICAgICAgKFdURjo6Q2hhckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I6Omhhc2gpOgor
ICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6ZXF1YWwp
OgorICAgICAgICAoV1RGOjpDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcjo6dHJh
bnNsYXRlKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbUxpdGVyYWxE
YXRhKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRkU2xvd0Nhc2UpOgorICAg
ICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBsOjpyZW1vdmUpOgorICAgICAgICAoV1RGOjpBdG9t
aWNTdHJpbmdJbXBsOjpsb29rdXBTbG93Q2FzZSk6CisgICAgICAgIChXVEY6OkF0b21pY1N0cmlu
Z0ltcGw6OmFkZEZyb21VVEY4KToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6bG9v
a3VwSW50ZXJuYWwpOgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBsOjppc0luQXRvbWlj
U3RyaW5nVGFibGUpOgorICAgICAgICAqIHd0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuaDoKKyAg
ICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6bG9va3VwKToKKyAgICAgICAgKFdURjo6QXRv
bWljU3RyaW5nSW1wbDo6YWRkKToKKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6YWRk
V2l0aFN0cmluZ1RhYmxlUHJvdmlkZXIpOgorICAgICAgICAoV1RGOjpBdG9taWNTdHJpbmdJbXBs
OjpBdG9taWNTdHJpbmdJbXBsKTogRGVsZXRlZC4KKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdJ
bXBsLmNwcDoKKyAgICAgICAgKFdURjo6U3RyaW5nSW1wbDo6flN0cmluZ0ltcGwpOgorICAgICAg
ICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAgKiB3dGYvdGV4dC9XVEZTdHJpbmcu
aDoKKyAgICAgICAgKFdURjo6U3RyaW5nOjpTdHJpbmcpOgorICAgICAgICAqIHd0Zi90ZXh0L2Nm
L0F0b21pY1N0cmluZ0ltcGxDRi5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV1RGL3d0Zi90ZXh0
L2NmL0F0b21pY1N0cmluZ0NGLmNwcC4KKyAgICAgICAgKFdURjo6QXRvbWljU3RyaW5nSW1wbDo6
YWRkKToKKwogMjAxNS0wNS0xNSAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAg
ICAgICAgIEJ1aWxkIGZpeCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBjbGFuZy4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRl
eCAxMDJkMTg1MzA5Y2VkZDhkM2JkMDYwNDdkYjMxYzNjMjBkMjI1MGVhLi5kYjU4NWZlYWFmMTk4
ZTk3ZDNlODRhOGNkMzBiM2RlNTZkMzYxNjNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAK
KzIwMTUtMDUtMTcgIFl1c3VrZSBTdXp1a2kgIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+CisKKyAg
ICAgICAgTW92ZSBBdG9taWNTdHJpbmdJbXBsIHRhYmxlIHJlbGF0ZWQgb3BlcmF0aW9ucyBmcm9t
IEF0b21pY1N0cmluZyB0byBBdG9taWNTdHJpbmdJbXBsCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDUxMDkKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGRvbS9UcmVlU2NvcGUuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6VHJlZVNjb3BlOjpnZXRFbGVtZW50QnlJZCk6CisKIDIwMTUtMDUtMTcgIEFsZXhl
eSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAgICAgQ3Jhc2ggd2hlbiB1cGxv
YWRpbmcgaHVnZSBmaWxlcyB0byBZb3VUdWJlIG9yIEdvb2dsZSBEcml2ZQpkaWZmIC0tZ2l0IGEv
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAppbmRleCBlZGNiYzc1YzMyNmRiMmFl
YjgxMWQ2MTBjOWM3ZWI1NmJmZDVlODNlLi5mODY5M2E5NmQ2MmZmMTJiYjlkMGZmZDIzYjVjMGYz
ZjBjYmZiNWI2IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29k
ZUJsb2NrLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2Nr
LmNwcApAQCAtMzgzOSw3ICszODM5LDcgQEAgU3RyaW5nIENvZGVCbG9jazo6bmFtZUZvclJlZ2lz
dGVyKFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIpCiAgICAgICAgIGlmIChwdHItPnZh
bHVlLnZhck9mZnNldCgpID09IFZhck9mZnNldCh2aXJ0dWFsUmVnaXN0ZXIpKSB7CiAgICAgICAg
ICAgICAvLyBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZyb20gdGhlIGNvbXBpbGF0aW9uIHRocmVh
ZC4KICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xMTUzMDAKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcocHRyLT5rZXkpOworICAgICAgICAg
ICAgcmV0dXJuIFN0cmluZyhwdHItPmtleS5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAg
aWYgKHZpcnR1YWxSZWdpc3RlciA9PSB0aGlzUmVnaXN0ZXIoKSkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuY3BwIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAKaW5kZXggZTA4MTZkMjE3MzBmZjI1NThjZTZl
YzFlNzY2MDg3ZTUwZDIyZTAzZS4uZDI2ZDk1NjdjNjgzMGZlN2YzMWVmMTJhN2E0NWMwMTEyNDdm
ODZkZiAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmll
ci5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAK
QEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiAoIWNbMV0pCiAgICAgICAgIHJldHVybiAqdm0tPnNt
YWxsU3RyaW5ncy5zaW5nbGVDaGFyYWN0ZXJTdHJpbmdSZXAoY1swXSk7CiAKLSAgICByZXR1cm4g
KkF0b21pY1N0cmluZzo6YWRkKGMpOworICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRk
KGMpOwogfQogCiBSZWY8U3RyaW5nSW1wbD4gSWRlbnRpZmllcjo6YWRkKEV4ZWNTdGF0ZSogZXhl
YywgY29uc3QgY2hhciogYykKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBpZiAoIWxlbmd0aCkKICAg
ICAgICAgcmV0dXJuICpTdHJpbmdJbXBsOjplbXB0eSgpOwogCi0gICAgcmV0dXJuICpBdG9taWNT
dHJpbmc6OmFkZChzLCBsZW5ndGgpOworICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRk
KHMsIGxlbmd0aCk7CiB9CiAKIElkZW50aWZpZXIgSWRlbnRpZmllcjo6ZnJvbShFeGVjU3RhdGUq
IGV4ZWMsIHVuc2lnbmVkIHZhbHVlKQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvSWRlbnRpZmllci5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRl
bnRpZmllci5oCmluZGV4IGUyOWM0OTc3NGI1M2U4MzM0NTcxZDkzNWVhMjRlM2E5Y2EyZTRhZGIu
LjI5MWNkYmUxOTA3NjczOWQ3YmVmMTk4ZTliNjc4Mjg1ZDEwMWRjNzcgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuaAorKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmgKQEAgLTIyMSw3ICsyMjEsNyBAQCBjbGFz
cyBJZGVudGlmaWVyIHsKICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgcmV0dXJuICpTdHJpbmdJ
bXBsOjplbXB0eSgpOwogCi0gICAgcmV0dXJuICpBdG9taWNTdHJpbmc6OmFkZChzLCBsZW5ndGgp
OworICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRkKHMsIGxlbmd0aCk7CiB9CiAKIGlu
bGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSWRlbnRpZmllciYgYSwgY29uc3QgSWRlbnRpZmll
ciYgYikKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZp
ZXJJbmxpbmVzLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVySW5s
aW5lcy5oCmluZGV4IDQwNjIyMWE2M2FhZDk2NWY0NzMwZTQ2ODgzNDczNjdjM2IyNjcwNGIuLjUw
NmZhN2EyMTZhZTlhOTk4MTMzYzI5NmE0MTQ2ZmNhN2U3NmRkYTAgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXJJbmxpbmVzLmgKKysrIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllcklubGluZXMuaApAQCAtMzcsNyArMzcs
NyBAQCBpbmxpbmUgSWRlbnRpZmllcjo6SWRlbnRpZmllcihFeGVjU3RhdGUqIGV4ZWMsIEF0b21p
Y1N0cmluZ0ltcGwqIHN0cmluZykKICNpZm5kZWYgTkRFQlVHCiAgICAgY2hlY2tDdXJyZW50QXRv
bWljU3RyaW5nVGFibGUoZXhlYyk7CiAgICAgaWYgKHN0cmluZykKLSAgICAgICAgQVNTRVJUX1dJ
VEhfTUVTU0FHRSghc3RyaW5nLT5sZW5ndGgoKSB8fCBzdHJpbmctPmlzU3ltYm9sKCkgfHwgQXRv
bWljU3RyaW5nOjppc0luQXRvbWljU3RyaW5nVGFibGUoc3RyaW5nKSwgIlRoZSBhdG9taWMgc3Ry
aW5nIGNvbWVzIGZyb20gYW4gb3RoZXIgdGhyZWFkISIpOworICAgICAgICBBU1NFUlRfV0lUSF9N
RVNTQUdFKCFzdHJpbmctPmxlbmd0aCgpIHx8IHN0cmluZy0+aXNTeW1ib2woKSB8fCBBdG9taWNT
dHJpbmdJbXBsOjppc0luQXRvbWljU3RyaW5nVGFibGUoc3RyaW5nKSwgIlRoZSBhdG9taWMgc3Ry
aW5nIGNvbWVzIGZyb20gYW4gb3RoZXIgdGhyZWFkISIpOwogI2Vsc2UKICAgICBVTlVTRURfUEFS
QU0oZXhlYyk7CiAjZW5kaWYKQEAgLTQ5LDcgKzQ5LDcgQEAgaW5saW5lIElkZW50aWZpZXI6Oklk
ZW50aWZpZXIoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBBdG9taWNTdHJpbmcmIHN0cmluZykKICNp
Zm5kZWYgTkRFQlVHCiAgICAgY2hlY2tDdXJyZW50QXRvbWljU3RyaW5nVGFibGUoZXhlYyk7CiAg
ICAgaWYgKCFzdHJpbmcuaXNOdWxsKCkpCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0
cmluZy5sZW5ndGgoKSB8fCBzdHJpbmcuaW1wbCgpLT5pc1N5bWJvbCgpIHx8IEF0b21pY1N0cmlu
Zzo6aXNJbkF0b21pY1N0cmluZ1RhYmxlKHN0cmluZy5pbXBsKCkpLCAiVGhlIGF0b21pYyBzdHJp
bmcgY29tZXMgZnJvbSBhbiBvdGhlciB0aHJlYWQhIik7CisgICAgICAgIEFTU0VSVF9XSVRIX01F
U1NBR0UoIXN0cmluZy5sZW5ndGgoKSB8fCBzdHJpbmcuaW1wbCgpLT5pc1N5bWJvbCgpIHx8IEF0
b21pY1N0cmluZ0ltcGw6OmlzSW5BdG9taWNTdHJpbmdUYWJsZShzdHJpbmcuaW1wbCgpKSwgIlRo
ZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZyb20gYW4gb3RoZXIgdGhyZWFkISIpOwogI2Vsc2UKICAg
ICBVTlVTRURfUEFSQU0oZXhlYyk7CiAjZW5kaWYKQEAgLTYwLDE0ICs2MCwxNCBAQCBpbmxpbmUg
SWRlbnRpZmllcjo6SWRlbnRpZmllcihFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgc3RyaW5nKQogI2lmbmRlZiBOREVCVUcKICAgICBjaGVja0N1cnJlbnRBdG9taWNTdHJpbmdU
YWJsZShleGVjKTsKICNlbmRpZgotICAgIHJldHVybiAqQXRvbWljU3RyaW5nOjphZGRXaXRoU3Ry
aW5nVGFibGVQcm92aWRlcigqZXhlYywgcik7CisgICAgcmV0dXJuICpBdG9taWNTdHJpbmdJbXBs
OjphZGRXaXRoU3RyaW5nVGFibGVQcm92aWRlcigqZXhlYywgcik7CiB9CiBpbmxpbmUgUmVmPFN0
cmluZ0ltcGw+IElkZW50aWZpZXI6OmFkZChWTSogdm0sIFN0cmluZ0ltcGwqIHIpCiB7CiAjaWZu
ZGVmIE5ERUJVRwogICAgIGNoZWNrQ3VycmVudEF0b21pY1N0cmluZ1RhYmxlKHZtKTsKICNlbmRp
ZgotICAgIHJldHVybiAqQXRvbWljU3RyaW5nOjphZGRXaXRoU3RyaW5nVGFibGVQcm92aWRlcigq
dm0sIHIpOworICAgIHJldHVybiAqQXRvbWljU3RyaW5nSW1wbDo6YWRkV2l0aFN0cmluZ1RhYmxl
UHJvdmlkZXIoKnZtLCByKTsKIH0KIAogaW5saW5lIElkZW50aWZpZXIgSWRlbnRpZmllcjo6ZnJv
bVVpZChWTSogdm0sIFN0cmluZ0ltcGwqIHVpZCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTU3RyaW5nLmNwcAppbmRleCAxM2I5MGVmYTY2N2Q0OTIwNzkwYTIzMzE5YTVlOGZjNzc0
MWRkOThkLi5mOWQwZjQzNDYxNWU3MjU3NjJjMTFjN2U4MmUzOTVlZGQxMjliMzQ0IDEwMDY0NAot
LS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1N0cmluZy5jcHAKKysrIGIvU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuY3BwCkBAIC0xOTQsNyArMTk0LDcg
QEAgQXRvbWljU3RyaW5nSW1wbCogSlNSb3BlU3RyaW5nOjpyZXNvbHZlUm9wZVRvRXhpc3RpbmdB
dG9taWNTdHJpbmcoRXhlY1N0YXRlKiBleGUKIHsKICAgICBpZiAobV9sZW5ndGggPiBtYXhMZW5n
dGhGb3JPblN0YWNrUmVzb2x2ZSkgewogICAgICAgICByZXNvbHZlUm9wZShleGVjKTsKLSAgICAg
ICAgaWYgKEF0b21pY1N0cmluZ0ltcGwqIGV4aXN0aW5nQXRvbWljU3RyaW5nID0gQXRvbWljU3Ry
aW5nOjpmaW5kKG1fdmFsdWUuaW1wbCgpKSkgeworICAgICAgICBpZiAoQXRvbWljU3RyaW5nSW1w
bCogZXhpc3RpbmdBdG9taWNTdHJpbmcgPSBBdG9taWNTdHJpbmdJbXBsOjpsb29rdXAobV92YWx1
ZS5pbXBsKCkpKSB7CiAgICAgICAgICAgICBtX3ZhbHVlID0gKmV4aXN0aW5nQXRvbWljU3RyaW5n
OwogICAgICAgICAgICAgc2V0SXM4Qml0KG1fdmFsdWUuaW1wbCgpLT5pczhCaXQoKSk7CiAgICAg
ICAgICAgICBjbGVhckZpYmVycygpOwpAQCAtMjA2LDcgKzIwNiw3IEBAIEF0b21pY1N0cmluZ0lt
cGwqIEpTUm9wZVN0cmluZzo6cmVzb2x2ZVJvcGVUb0V4aXN0aW5nQXRvbWljU3RyaW5nKEV4ZWNT
dGF0ZSogZXhlCiAgICAgaWYgKGlzOEJpdCgpKSB7CiAgICAgICAgIExDaGFyIGJ1ZmZlclttYXhM
ZW5ndGhGb3JPblN0YWNrUmVzb2x2ZV07CiAgICAgICAgIHJlc29sdmVSb3BlSW50ZXJuYWw4KGJ1
ZmZlcik7Ci0gICAgICAgIGlmIChBdG9taWNTdHJpbmdJbXBsKiBleGlzdGluZ0F0b21pY1N0cmlu
ZyA9IEF0b21pY1N0cmluZzo6ZmluZChidWZmZXIsIG1fbGVuZ3RoKSkgeworICAgICAgICBpZiAo
QXRvbWljU3RyaW5nSW1wbCogZXhpc3RpbmdBdG9taWNTdHJpbmcgPSBBdG9taWNTdHJpbmdJbXBs
Ojpsb29rdXAoYnVmZmVyLCBtX2xlbmd0aCkpIHsKICAgICAgICAgICAgIG1fdmFsdWUgPSAqZXhp
c3RpbmdBdG9taWNTdHJpbmc7CiAgICAgICAgICAgICBzZXRJczhCaXQobV92YWx1ZS5pbXBsKCkt
PmlzOEJpdCgpKTsKICAgICAgICAgICAgIGNsZWFyRmliZXJzKCk7CkBAIC0yMTUsNyArMjE1LDcg
QEAgQXRvbWljU3RyaW5nSW1wbCogSlNSb3BlU3RyaW5nOjpyZXNvbHZlUm9wZVRvRXhpc3RpbmdB
dG9taWNTdHJpbmcoRXhlY1N0YXRlKiBleGUKICAgICB9IGVsc2UgewogICAgICAgICBVQ2hhciBi
dWZmZXJbbWF4TGVuZ3RoRm9yT25TdGFja1Jlc29sdmVdOwogICAgICAgICByZXNvbHZlUm9wZUlu
dGVybmFsMTYoYnVmZmVyKTsKLSAgICAgICAgaWYgKEF0b21pY1N0cmluZ0ltcGwqIGV4aXN0aW5n
QXRvbWljU3RyaW5nID0gQXRvbWljU3RyaW5nOjpmaW5kKGJ1ZmZlciwgbV9sZW5ndGgpKSB7Cisg
ICAgICAgIGlmIChBdG9taWNTdHJpbmdJbXBsKiBleGlzdGluZ0F0b21pY1N0cmluZyA9IEF0b21p
Y1N0cmluZ0ltcGw6Omxvb2t1cChidWZmZXIsIG1fbGVuZ3RoKSkgewogICAgICAgICAgICAgbV92
YWx1ZSA9ICpleGlzdGluZ0F0b21pY1N0cmluZzsKICAgICAgICAgICAgIHNldElzOEJpdChtX3Zh
bHVlLmltcGwoKS0+aXM4Qml0KCkpOwogICAgICAgICAgICAgY2xlYXJGaWJlcnMoKTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmggYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1N0cmluZy5oCmluZGV4IGEyMmU2ZmJkNzRlMWNlYmQx
Nzc3ZDRmZGNhZjk4MzYzNzdkNDA0ZTYuLjIxZjg2Mzk5MTk1NWMxN2E4MzE1MzE4ZmQ1M2IwZGY2
NjIzNGRlMjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3Ry
aW5nLmgKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuaApAQCAt
NDgxLDcgKzQ4MSw3IEBAIEFMV0FZU19JTkxJTkUgQXRvbWljU3RyaW5nSW1wbCogSlNTdHJpbmc6
OnRvRXhpc3RpbmdBdG9taWNTdHJpbmcoRXhlY1N0YXRlKiBleGVjCiAgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxjb25zdCBKU1JvcGVTdHJpbmcqPih0aGlzKS0+cmVzb2x2ZVJvcGVUb0V4aXN0
aW5nQXRvbWljU3RyaW5nKGV4ZWMpOwogICAgIGlmIChtX3ZhbHVlLmltcGwoKS0+aXNBdG9taWMo
KSkKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPihtX3ZhbHVl
LmltcGwoKSk7Ci0gICAgcmV0dXJuIEF0b21pY1N0cmluZzo6ZmluZChtX3ZhbHVlLmltcGwoKSk7
CisgICAgcmV0dXJuIEF0b21pY1N0cmluZ0ltcGw6Omxvb2t1cChtX3ZhbHVlLmltcGwoKSk7CiB9
CiAKIGlubGluZSBjb25zdCBTdHJpbmcmIEpTU3RyaW5nOjp2YWx1ZShFeGVjU3RhdGUqIGV4ZWMp
IGNvbnN0CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TbWFsbFN0
cmluZ3MuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU21hbGxTdHJpbmdzLmNw
cAppbmRleCA5MWEzMzY4NDY0Y2U2ODc5OWM1OTkzN2M4MTBmNzhmZTgwNmRkYmNjLi45YzZhNDNh
ZTIxMzhmNGVlZmViYTZlMWQwMmJjMmVhZDE5ZTRkZTUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9TbWFsbFN0cmluZ3MuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL1NtYWxsU3RyaW5ncy5jcHAKQEAgLTU3LDcgKzU3LDcgQEAgY2xhc3Mg
U21hbGxTdHJpbmdzU3RvcmFnZSB7CiAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IGJhc2VTdHJpbmcg
PSBTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKHNpbmdsZUNoYXJhY3RlclN0cmluZ0Nv
dW50LCBjaGFyYWN0ZXJCdWZmZXIpOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaW5n
bGVDaGFyYWN0ZXJTdHJpbmdDb3VudDsgKytpKSB7CiAgICAgICAgIGNoYXJhY3RlckJ1ZmZlcltp
XSA9IGk7Ci0gICAgICAgIG1fcmVwc1tpXSA9IEF0b21pY1N0cmluZzo6YWRkKFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4oU3RyaW5nSW1wbDo6Y3JlYXRlU3Vic3RyaW5nU2hhcmluZ0ltcGwoYmFzZVN0
cmluZywgaSwgMSkpLmdldCgpKTsKKyAgICAgICAgbV9yZXBzW2ldID0gQXRvbWljU3RyaW5nSW1w
bDo6YWRkKFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4oU3RyaW5nSW1wbDo6Y3JlYXRlU3Vic3RyaW5n
U2hhcmluZ0ltcGwoYmFzZVN0cmluZywgaSwgMSkpLmdldCgpKTsKICAgICB9CiB9CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1R5cGVTZXQuY3BwIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAKaW5kZXggMGY1N2VjNGI1ZWRiYjFi
OWY3OGRhZTY5Y2Q3NGUxYzY3YzM3M2M1NS4uYjYyNDg4NzUyMmNlOTY3ZmI1YzM2MjdlYTgwNjQ5
Mzk3M2IyYWU1YyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlw
ZVNldC5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAK
QEAgLTM1Miw3ICszNTIsNyBAQCBTdHJpbmcgU3RydWN0dXJlU2hhcGU6OnByb3BlcnR5SGFzaCgp
CiAgICAgYnVpbGRlci5hcHBlbmQoJzonKTsKICAgICAKICAgICBmb3IgKGF1dG8gaXRlciA9IG1f
ZmllbGRzLmJlZ2luKCksIGVuZCA9IG1fZmllbGRzLmVuZCgpOyBpdGVyICE9IGVuZDsgKytpdGVy
KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IFN0cmluZygoKml0ZXIpKTsKKyAgICAgICAg
U3RyaW5nIHByb3BlcnR5ID0gU3RyaW5nKGl0ZXItPmdldCgpKTsKICAgICAgICAgcHJvcGVydHku
cmVwbGFjZSgiOiIsICJcXDoiKTsgLy8gRW5zdXJlIHRoYXQgaGFzaCh7ImZvbzoiLCAiYmFyIn0p
ICE9IGhhc2goeyJmb28iLCAiOmJhciJ9KSBiZWNhdXNlIHdlJ3JlIHVzaW5nIGNvbG9ucyBhcyBh
IHNlcGFyYXRvciBhbmQgY29sb25zIGFyZSBsZWdhbCBjaGFyYWN0ZXJzIGluIGZpZWxkIG5hbWVz
IGluIEpTLgogICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wZXJ0eSk7CiAgICAgfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4cHJvaiBiL1NvdXJjZS9XVEYvV1RG
LnZjeHByb2ovV1RGLnZjeHByb2oKaW5kZXggNDY2OTBiOGM2Mjc0YTFhNzRkMmY2ZWQyNmFkMTkw
ZDcyMmFlMTA5ZS4uNmMwMjZkZGMyZjhjNmZkMTQyNDVjMzc3ZmVjZjYzZTAzYzUzOTU2YiAxMDA2
NDQKLS0tIGEvU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4cHJvagorKysgYi9Tb3VyY2Uv
V1RGL1dURi52Y3hwcm9qL1dURi52Y3hwcm9qCkBAIC0xMjcsNiArMTI3LDcgQEAKICAgICA8Q2xD
b21waWxlIEluY2x1ZGU9Ii4uXHd0ZlxTdGFja0JvdW5kcy5jcHAiIC8+CiAgICAgPENsQ29tcGls
ZSBJbmNsdWRlPSIuLlx3dGZcU3RyaW5nUHJpbnRTdHJlYW0uY3BwIiAvPgogICAgIDxDbENvbXBp
bGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcQXRvbWljU3RyaW5nLmNwcCIgLz4KKyAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XEF0b21pY1N0cmluZ0ltcGwuY3BwIiAvPgogICAgIDxD
bENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcQXRvbWljU3RyaW5nVGFibGUuY3BwIiAvPgog
ICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcQmFzZTY0LmNwcCIgLz4KICAgICA8
Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XENTdHJpbmcuY3BwIiAvPgpAQCAtMTM2LDcg
KzEzNyw3IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxTdHJpbmdWaWV3
LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XFN5bWJvbFJlZ2lz
dHJ5LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XFdURlN0cmlu
Zy5jcHAiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxjZlxBdG9taWNT
dHJpbmdDRi5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlx3dGZcdGV4dFxjZlxB
dG9taWNTdHJpbmdJbXBsQ0YuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3Rm
XHRleHRcY2ZcU3RyaW5nQ0YuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3Rm
XHRleHRcY2ZcU3RyaW5nSW1wbENGLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4u
XHd0Zlx0ZXh0XGNmXFN0cmluZ1ZpZXdDRi5jcHAiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RG
L1dURi52Y3hwcm9qL1dURi52Y3hwcm9qLmZpbHRlcnMgYi9Tb3VyY2UvV1RGL1dURi52Y3hwcm9q
L1dURi52Y3hwcm9qLmZpbHRlcnMKaW5kZXggY2Q5MmEzMWNkN2I3YmI0NGRhZjE1ZGZhZDhkM2U1
MTljYmYyODIxZS4uNjQ4YTZhMDkxMGNkNjc1MmU3MGQyY2Q4MDFlMTkxN2IzOTZmZmI3YSAxMDA2
NDQKLS0tIGEvU291cmNlL1dURi9XVEYudmN4cHJvai9XVEYudmN4cHJvai5maWx0ZXJzCisrKyBi
L1NvdXJjZS9XVEYvV1RGLnZjeHByb2ovV1RGLnZjeHByb2ouZmlsdGVycwpAQCAtNjYsNiArNjYs
OSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcQXRvbWljU3RyaW5nLmNw
cCI+CiAgICAgICA8RmlsdGVyPnRleHQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8
Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XEF0b21pY1N0cmluZ0ltcGwuY3BwIj4KKyAg
ICAgIDxGaWx0ZXI+dGV4dDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBp
bGUgSW5jbHVkZT0iLi5cd3RmXHRleHRcQmFzZTY0LmNwcCI+CiAgICAgICA8RmlsdGVyPnRleHQ8
L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTg0LDcgKzg3LDcgQEAKICAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXHd0Zlx0ZXh0XFdURlN0cmluZy5jcHAiPgogICAgICAgPEZpbHRlcj50
ZXh0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIu
Llx3dGZcdGV4dFxjZlxBdG9taWNTdHJpbmdDRi5jcHAiPgorICAgIDxDbENvbXBpbGUgSW5jbHVk
ZT0iLi5cd3RmXHRleHRcY2ZcQXRvbWljU3RyaW5nSW1wbENGLmNwcCI+CiAgICAgICA8RmlsdGVy
PnRleHQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9
Ii4uXHd0Zlx0ZXh0XGNmXFN0cmluZ0NGLmNwcCI+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL1dU
Ri52Y3hwcm9qL2NvcHktZmlsZXMuY21kIGIvU291cmNlL1dURi9XVEYudmN4cHJvai9jb3B5LWZp
bGVzLmNtZAppbmRleCBlZDdiYWFmODZlOTNmMDM3MWQ0OTU1YzgzYzAwMGFmZGY2OTJkMGQ2Li5l
N2U2NTllOGZmNjc3YTU2MGFmN2Q3MDM5OTM0YmQzMTgzMTc4YTRlIDEwMDc1NQotLS0gYS9Tb3Vy
Y2UvV1RGL1dURi52Y3hwcm9qL2NvcHktZmlsZXMuY21kCisrKyBiL1NvdXJjZS9XVEYvV1RGLnZj
eHByb2ovY29weS1maWxlcy5jbWQKQEAgLTI4LDYgKzI4LDcgQEAgZWNobyBDb3B5aW5nIG90aGVy
IGZpbGVzLi4uCiBmb3IgJSVmIGluICgNCiAgICAgLi5cSmF2YVNjcmlwdENvcmVcY3JlYXRlX2hh
c2hfdGFibGUNCiAgICAgd3RmXHRleHRcQXRvbWljU3RyaW5nLmNwcA0KKyAgICB3dGZcdGV4dFxB
dG9taWNTdHJpbmdJbXBsLmNwcA0KICAgICB3dGZcdGV4dFxTdHJpbmdCdWlsZGVyLmNwcA0KICAg
ICB3dGZcdGV4dFxTdHJpbmdJbXBsLmNwcA0KICAgICB3dGZcdGV4dFxXVEZTdHJpbmcuY3BwDQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1Nv
dXJjZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggMjIwZDU4ZDNmYmUy
Yzc5NGJmYmQ0MDZkYjJjNDQ1YTJiODA5ZGY5MC4uZDVkNDY4NDcyNjE0MjllNzZkMTVjMzgzOTBj
MWE5ODA3YWUxYjNiYiAxMDA2NDQKLS0tIGEvU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV1RGL1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CkBAIC03Niw2ICs3Niw3IEBACiAJCTQzMEI0Nzg5MUFBQUFDMUEwMDEyMjNEQSAvKiBTdHJpbmdD
b21tb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQz
MEI0Nzg3MUFBQUFDMUEwMDEyMjNEQSAvKiBTdHJpbmdDb21tb24uaCAqLzsgfTsKIAkJNzBBOTkz
RkUxQUQ3MTUxMzAwRkE2MTVCIC8qIFN5bWJvbFJlZ2lzdHJ5LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcwQTk5M0ZDMUFENzE1MTMwMEZBNjE1QiAv
KiBTeW1ib2xSZWdpc3RyeS5jcHAgKi87IH07CiAJCTcwQTk5M0ZGMUFENzE1MTMwMEZBNjE1QiAv
KiBTeW1ib2xSZWdpc3RyeS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNzBBOTkzRkQxQUQ3MTUxMzAwRkE2MTVCIC8qIFN5bWJvbFJlZ2lzdHJ5LmggKi87
IH07CisJCTcwRUNBNjBEMUIwMjQyNjgwMDQ0OTczOSAvKiBBdG9taWNTdHJpbmdJbXBsLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcwRUNBNjBBMUIw
MjQyNjgwMDQ0OTczOSAvKiBBdG9taWNTdHJpbmdJbXBsLmNwcCAqLzsgfTsKIAkJN0NCQkEwNzQx
OUJCN0ZEQzAwQkJGMDI1IC8qIE9TT2JqZWN0UHRyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3Q0JCQTA3MzE5QkI3RkRDMDBCQkYwMjUgLyogT1NPYmpl
Y3RQdHIuaCAqLzsgfTsKIAkJN0NERDdGRjgxODZEMjkxRTAwNzQzM0NEIC8qIEl0ZXJhdG9yQWRh
cHRvcnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdD
REQ3RkY3MTg2RDI5MUUwMDc0MzNDRCAvKiBJdGVyYXRvckFkYXB0b3JzLmggKi87IH07CiAJCTdD
REQ3RkZBMTg2RDJBNTQwMDc0MzNDRCAvKiBJdGVyYXRvclJhbmdlLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3Q0REN0ZGOTE4NkQyQTU0MDA3NDMzQ0Qg
LyogSXRlcmF0b3JSYW5nZS5oICovOyB9OwpAQCAtOTQsNyArOTUsNyBAQAogCQk5QkQ4RjQwQjE3
NkMyQjQ3MDAwMkQ4NjUgLyogQXRvbWljU3RyaW5nVGFibGUuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDlCRDhGNDBBMTc2QzJBRDgwMDAyRDg2NSAvKiBB
dG9taWNTdHJpbmdUYWJsZS5oICovOyB9OwogCQlBNUJBMTVGMzE4MjQzM0E5MDBBODJFNjkgLyog
U3RyaW5nTWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTVCQTE1RjIxODI0MzNBOTAwQTgyRTY5IC8qIFN0cmluZ01hYy5tbSAqLzsgfTsKIAkJQTVC
QTE1RjUxODI0MzQ4MDAwQTgyRTY5IC8qIFN0cmluZ0ltcGxNYWMubW0gaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBNUJBMTVGNDE4MjQzNDgwMDBBODJFNjkg
LyogU3RyaW5nSW1wbE1hYy5tbSAqLzsgfTsKLQkJQTVCQTE1RkExODI0MzVBNjAwQTgyRTY5IC8q
IEF0b21pY1N0cmluZ0NGLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEE1QkExNUY3MTgyNDM1QTYwMEE4MkU2OSAvKiBBdG9taWNTdHJpbmdDRi5jcHAg
Ki87IH07CisJCUE1QkExNUZBMTgyNDM1QTYwMEE4MkU2OSAvKiBBdG9taWNTdHJpbmdJbXBsQ0Yu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTVCQTE1
RjcxODI0MzVBNjAwQTgyRTY5IC8qIEF0b21pY1N0cmluZ0ltcGxDRi5jcHAgKi87IH07CiAJCUE1
QkExNUZCMTgyNDM1QTYwMEE4MkU2OSAvKiBTdHJpbmdDRi5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBNUJBMTVGODE4MjQzNUE2MDBBODJFNjkgLyog
U3RyaW5nQ0YuY3BwICovOyB9OwogCQlBNUJBMTVGQzE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5n
SW1wbENGLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEE1QkExNUY5MTgyNDM1QTYwMEE4MkU2OSAvKiBTdHJpbmdJbXBsQ0YuY3BwICovOyB9OwogCQlB
NzBEQTA4NDE3OTlGMDREMDA1MjlBOUIgLyogSW5zZXJ0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBNzBEQTA4MjE3OTlGMDREMDA1MjlBOUIgLyog
SW5zZXJ0aW9uLmggKi87IH07CkBAIC0zNjAsNiArMzYxLDcgQEAKIAkJNjU0MUNBRjQxNjMwREIy
NjAwNkQwREVDIC8qIENvcHlXVEZIZWFkZXJzLnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2Nv
bmZpZzsgcGF0aCA9IENvcHlXVEZIZWFkZXJzLnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk3MEE5OTNGQzFBRDcxNTEzMDBGQTYxNUIgLyogU3ltYm9sUmVnaXN0cnkuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3ltYm9sUmVnaXN0cnkuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3MEE5OTNGRDFBRDcxNTEzMDBGQTYxNUIg
LyogU3ltYm9sUmVnaXN0cnkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3lt
Ym9sUmVnaXN0cnkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNzBFQ0E2MEExQjAy
NDI2ODAwNDQ5NzM5IC8qIEF0b21pY1N0cmluZ0ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gQXRvbWljU3RyaW5nSW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTdDQkJBMDczMTlCQjdGREMwMEJCRjAyNSAvKiBPU09iamVjdFB0ci5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBPU09iamVjdFB0ci5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk3Q0REN0ZGNzE4NkQyOTFFMDA3NDMzQ0QgLyogSXRlcmF0b3JB
ZGFwdG9ycy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJdGVyYXRvckFkYXB0
b3JzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDREQ3RkY5MTg2RDJBNTQwMDc0
MzNDRCAvKiBJdGVyYXRvclJhbmdlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEl0ZXJhdG9yUmFuZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTM3OCw3ICsz
ODAsNyBAQAogCQk5QkQ4RjQwQTE3NkMyQUQ4MDAwMkQ4NjUgLyogQXRvbWljU3RyaW5nVGFibGUu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gQXRvbWljU3RyaW5nVGFibGUuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJQTVCQTE1RjIxODI0MzNBOTAwQTgyRTY5IC8qIFN0cmluZ01hYy5tbSAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IFN0cmluZ01hYy5tbTsgcGF0aCA9
IG1hYy9TdHJpbmdNYWMubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE1QkExNUY0
MTgyNDM0ODAwMEE4MkU2OSAvKiBTdHJpbmdJbXBsTWFjLm1tICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAub2JqY3BwOyBuYW1lID0gU3RyaW5nSW1wbE1hYy5tbTsgcGF0aCA9IG1hYy9TdHJpbmdJ
bXBsTWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlBNUJBMTVGNzE4MjQzNUE2
MDBBODJFNjkgLyogQXRvbWljU3RyaW5nQ0YuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBuYW1lID0gQXRvbWljU3RyaW5nQ0YuY3BwOyBwYXRoID0gY2YvQXRvbWljU3RyaW5nQ0Yu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBNUJBMTVGNzE4MjQzNUE2MDBBODJF
NjkgLyogQXRvbWljU3RyaW5nSW1wbENGLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IEF0b21pY1N0cmluZ0ltcGxDRi5jcHA7IHBhdGggPSBjZi9BdG9taWNTdHJpbmdJ
bXBsQ0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBNUJBMTVGODE4MjQzNUE2
MDBBODJFNjkgLyogU3RyaW5nQ0YuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gU3RyaW5nQ0YuY3BwOyBwYXRoID0gY2YvU3RyaW5nQ0YuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlBNUJBMTVGOTE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nSW1wbENG
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFN0cmluZ0ltcGxDRi5j
cHA7IHBhdGggPSBjZi9TdHJpbmdJbXBsQ0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlBNzBEQTA4MjE3OTlGMDREMDA1MjlBOUIgLyogSW5zZXJ0aW9uLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc2VydGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNjY4LDcgKzY3MCw3IEBACiAJCUE1QkExNUY2MTgyNDM1OUUwMEE4MkU2OSAvKiBj
ZiAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCi0JCQkJQTVCQTE1
RjcxODI0MzVBNjAwQTgyRTY5IC8qIEF0b21pY1N0cmluZ0NGLmNwcCAqLywKKwkJCQlBNUJBMTVG
NzE4MjQzNUE2MDBBODJFNjkgLyogQXRvbWljU3RyaW5nSW1wbENGLmNwcCAqLywKIAkJCQlBNUJB
MTVGODE4MjQzNUE2MDBBODJFNjkgLyogU3RyaW5nQ0YuY3BwICovLAogCQkJCUE1QkExNUY5MTgy
NDM1QTYwMEE4MkU2OSAvKiBTdHJpbmdJbXBsQ0YuY3BwICovLAogCQkJCTkzOTM0QkQ0MThBMUYx
NjkwMEQwRDZBMSAvKiBTdHJpbmdWaWV3Q0YuY3BwICovLApAQCAtOTE4LDYgKzkyMCw3IEBACiAJ
CQkJQThBNDczMUQxNTFBODI1QjAwNDEyM0ZGIC8qIEF0b21pY1N0cmluZy5jcHAgKi8sCiAJCQkJ
QThBNDczMUUxNTFBODI1QjAwNDEyM0ZGIC8qIEF0b21pY1N0cmluZy5oICovLAogCQkJCUE4QTQ3
MzFGMTUxQTgyNUIwMDQxMjNGRiAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi8sCisJCQkJNzBFQ0E2
MEExQjAyNDI2ODAwNDQ5NzM5IC8qIEF0b21pY1N0cmluZ0ltcGwuY3BwICovLAogCQkJCUE4QTQ3
MzIwMTUxQTgyNUIwMDQxMjNGRiAvKiBBdG9taWNTdHJpbmdJbXBsLmggKi8sCiAJCQkJOUJDNzBG
MDQxNzZDMzc5RDAwMTAxREVDIC8qIEF0b21pY1N0cmluZ1RhYmxlLmNwcCAqLywKIAkJCQk5QkQ4
RjQwQTE3NkMyQUQ4MDAwMkQ4NjUgLyogQXRvbWljU3RyaW5nVGFibGUuaCAqLywKQEAgLTEzMjQs
NyArMTMyNyw3IEBACiAJCQkJRTRBMEFEM0QxQTk2MjUzQzAwNTM2REY2IC8qIFdvcmtRdWV1ZUNv
Y29hLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4QTQ3M0IzMTUxQTgyNUIwMDQxMjNGRiAvKiBm
YXN0LWR0b2EuY2MgaW4gU291cmNlcyAqLywKIAkJCQlBOEE0NzNDMzE1MUE4MjVCMDA0MTIzRkYg
LyogRmFzdE1hbGxvYy5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlBNUJBMTVGQTE4MjQzNUE2MDBB
ODJFNjkgLyogQXRvbWljU3RyaW5nQ0YuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTVCQTE1RkEx
ODI0MzVBNjAwQTgyRTY5IC8qIEF0b21pY1N0cmluZ0ltcGxDRi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQlFMTU1NTZGNTE4QTBDQzE4MDA2RjQ4RkIgLyogQ3J5cHRvZ3JhcGhpY1V0aWxpdGllcy5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjlEMzM2MDE2NURCQTczMDA1QUQzODcgLyogRmlsZVBy
aW50U3RyZWFtLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4QTQ3M0I1MTUxQTgyNUIwMDQxMjNG
RiAvKiBmaXhlZC1kdG9hLmNjIGluIFNvdXJjZXMgKi8sCkBAIC0xMzU1LDYgKzEzNTgsNyBAQAog
CQkJCUE3NDg3NDUyMTdBMEJEQUUwMEZBMDRDQiAvKiBTaXhDaGFyYWN0ZXJIYXNoLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUE4QTQ3NDI1MTUxQTgyNUIwMDQxMjNGRiAvKiBTaXplTGltaXRzLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUE4QTQ3NDI3MTUxQTgyNUIwMDQxMjNGRiAvKiBTdGFja0Jv
dW5kcy5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk3MEVDQTYwRDFCMDI0MjY4MDA0NDk3MzkgLyog
QXRvbWljU3RyaW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlGRURBQ0QzRDE2MzBGODNG
MDBDNjk2MzQgLyogU3RhY2tTdGF0cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOEE0NzQzQzE1
MUE4MjVCMDA0MTIzRkYgLyogU3RyaW5nQnVpbGRlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlB
OEE0NzQ0MDE1MUE4MjVCMDA0MTIzRkYgLyogU3RyaW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLywK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dURi93
dGYvQ01ha2VMaXN0cy50eHQKaW5kZXggMjM2NGRjZTI5NDIxNGY1ODJlZjkwZTg0MTM3MDk1ODc0
MGNhYTE4ZC4uMzUzZjJjMzRlN2EwOGM0MTI3NTNmYzg3ODRlMjhhNmU0ZTBkZTI3ZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dURi93dGYv
Q01ha2VMaXN0cy50eHQKQEAgLTE4Nyw2ICsxODcsNyBAQCBzZXQoV1RGX1NPVVJDRVMKICAgICBk
dG9hL3N0cnRvZC5jYwogCiAgICAgdGV4dC9BdG9taWNTdHJpbmcuY3BwCisgICAgdGV4dC9BdG9t
aWNTdHJpbmdJbXBsLmNwcAogICAgIHRleHQvQXRvbWljU3RyaW5nVGFibGUuY3BwCiAgICAgdGV4
dC9CYXNlNjQuY3BwCiAgICAgdGV4dC9DU3RyaW5nLmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dU
Ri93dGYvUGxhdGZvcm1NYWMuY21ha2UgYi9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybU1hYy5jbWFr
ZQppbmRleCA4ZDEwN2M3MzBlYWFjMzcxNWM5MjkwZTU3NTUzNTI5YWQzMjkyOTk1Li5mNjEwNjE5
YjE4NWQzNjcwY2U3MjFmNDlhMDAyNmRmZGZkNzkwNGM5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RG
L3d0Zi9QbGF0Zm9ybU1hYy5jbWFrZQorKysgYi9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybU1hYy5j
bWFrZQpAQCAtMTEsNyArMTEsNyBAQCBsaXN0KEFQUEVORCBXVEZfU09VUkNFUwogICAgIG1hYy9E
ZXByZWNhdGVkU3ltYm9sc1VzZWRCeVNhZmFyaS5tbQogICAgIG1hYy9NYWluVGhyZWFkTWFjLm1t
CiAKLSAgICB0ZXh0L2NmL0F0b21pY1N0cmluZ0NGLmNwcAorICAgIHRleHQvY2YvQXRvbWljU3Ry
aW5nSW1wbENGLmNwcAogICAgIHRleHQvY2YvU3RyaW5nQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJp
bmdJbXBsQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJpbmdWaWV3Q0YuY3BwCmRpZmYgLS1naXQgYS9T
b3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybVdpbi5jbWFrZSBiL1NvdXJjZS9XVEYvd3RmL1BsYXRmb3Jt
V2luLmNtYWtlCmluZGV4IGY3MzdiOGNhYmM1ZWY5NGU4MzQ4YmYzOGZiZDZlYzc3Nzg4OGRhYTYu
Ljk3ZjczOTk1ZWQ0ODkyYmNjYTBiYzBmYWFjOWM5NTExODQ0M2RkMWUgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XVEYvd3RmL1BsYXRmb3JtV2luLmNtYWtlCisrKyBiL1NvdXJjZS9XVEYvd3RmL1BsYXRm
b3JtV2luLmNtYWtlCkBAIC0xLDUgKzEsNSBAQAogbGlzdChBUFBFTkQgV1RGX1NPVVJDRVMKLSAg
ICB0ZXh0L2NmL0F0b21pY1N0cmluZ0NGLmNwcAorICAgIHRleHQvY2YvQXRvbWljU3RyaW5nSW1w
bENGLmNwcAogICAgIHRleHQvY2YvU3RyaW5nQ0YuY3BwCiAgICAgdGV4dC9jZi9TdHJpbmdJbXBs
Q0YuY3BwCiAgICAgdGV4dC9jZi9TdHJpbmdWaWV3Q0YuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V1RGL3d0Zi90ZXh0L0F0b21pY1N0cmluZy5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0b21p
Y1N0cmluZy5jcHAKaW5kZXggNWFiNGUxZWI3ZGJlZGE2ZWEzNzM1ZDU0ZDJjNTA2Nzg1MjczMjg0
Ny4uMGM0MmU1YzZjMmIwZTM5YzE4ODhkZWRjZTg0NzViODQ4Yjc5ZTExNyAxMDA2NDQKLS0tIGEv
U291cmNlL1dURi93dGYvdGV4dC9BdG9taWNTdHJpbmcuY3BwCisrKyBiL1NvdXJjZS9XVEYvd3Rm
L3RleHQvQXRvbWljU3RyaW5nLmNwcApAQCAtMjMsMTQgKzIzLDggQEAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIKIAotI2luY2x1ZGUgIkF0b21pY1N0cmlu
Z1RhYmxlLmgiCi0jaW5jbHVkZSAiSGFzaFNldC5oIgogI2luY2x1ZGUgIkludGVnZXJUb1N0cmlu
Z0NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCi0jaW5jbHVkZSAiVGhyZWFk
aW5nLmgiCi0jaW5jbHVkZSAiV1RGVGhyZWFkRGF0YS5oIgogI2luY2x1ZGUgImR0b2EuaCIKLSNp
bmNsdWRlIDx3dGYvdW5pY29kZS9VVEY4Lmg+CiAKICNpZiBVU0UoV0VCX1RIUkVBRCkKICNpbmNs
dWRlICJTcGluTG9jay5oIgpAQCAtMzgsNDI0ICszMiw2IEBACiAKIG5hbWVzcGFjZSBXVEYgewog
Ci11c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoQXRvbWlj
U3RyaW5nKSA9PSBzaXplb2YoU3RyaW5nKSwgIkF0b21pY1N0cmluZyBhbmQgU3RyaW5nIG11c3Qg
YmUgc2FtZSBzaXplISIpOwotCi0jaWYgVVNFKFdFQl9USFJFQUQpCi0KLWNsYXNzIEF0b21pY1N0
cmluZ1RhYmxlTG9ja2VyIDogcHVibGljIFNwaW5Mb2NrSG9sZGVyIHsKLSAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShBdG9taWNTdHJpbmdUYWJsZUxvY2tlcik7Ci0KLSAgICBzdGF0aWMgU3RhdGlj
U3BpbkxvY2sgc19zdHJpbmdUYWJsZUxvY2s7Ci1wdWJsaWM6Ci0gICAgQXRvbWljU3RyaW5nVGFi
bGVMb2NrZXIoKQotICAgICAgICA6IFNwaW5Mb2NrSG9sZGVyKCZzX3N0cmluZ1RhYmxlTG9jaykK
LSAgICB7Ci0gICAgfQotfTsKLQotU3RhdGljU3BpbkxvY2sgQXRvbWljU3RyaW5nVGFibGVMb2Nr
ZXI6OnNfc3RyaW5nVGFibGVMb2NrOwotCi0jZWxzZQotCi1jbGFzcyBBdG9taWNTdHJpbmdUYWJs
ZUxvY2tlciB7Ci0gICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQXRvbWljU3RyaW5nVGFibGVMb2Nr
ZXIpOwotcHVibGljOgotICAgIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyKCkgeyB9Ci19OwotCi0j
ZW5kaWYgLy8gVVNFKFdFQl9USFJFQUQpCi0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIEhhc2hTZXQ8
U3RyaW5nSW1wbCo+JiBzdHJpbmdUYWJsZSgpCi17Ci0gICAgcmV0dXJuIHd0ZlRocmVhZERhdGEo
KS5hdG9taWNTdHJpbmdUYWJsZSgpLT50YWJsZSgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBU
LCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4KLXN0YXRpYyBpbmxpbmUgUmVmPFN0cmluZ0ltcGw+
IGFkZFRvU3RyaW5nVGFibGUoY29uc3QgVCYgdmFsdWUpCi17Ci0gICAgQXRvbWljU3RyaW5nVGFi
bGVMb2NrZXIgbG9ja2VyOwotCi0gICAgSGFzaFNldDxTdHJpbmdJbXBsKj46OkFkZFJlc3VsdCBh
ZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgpLmFkZDxIYXNoVHJhbnNsYXRvcj4odmFsdWUpOwotCi0g
ICAgLy8gSWYgdGhlIHN0cmluZyBpcyBuZXdseS10cmFuc2xhdGVkLCB0aGVuIHdlIG5lZWQgdG8g
YWRvcHQgaXQuCi0gICAgLy8gVGhlIGJvb2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMgdXMgaWYgdGhh
dCBpcyBzby4KLSAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkpCi0gICAgICAgIHJldHVybiBh
ZG9wdFJlZigqKmFkZFJlc3VsdC5pdGVyYXRvcik7Ci0gICAgcmV0dXJuICoqYWRkUmVzdWx0Lml0
ZXJhdG9yOwotfQotCi1zdHJ1Y3QgQ1N0cmluZ1RyYW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNp
Z25lZCBoYXNoKGNvbnN0IExDaGFyKiBjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hh
c2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYyk7Ci0gICAgfQotCi0gICAgc3RhdGlj
IGlubGluZSBib29sIGVxdWFsKFN0cmluZ0ltcGwqIHIsIGNvbnN0IExDaGFyKiBzKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIFdURjo6ZXF1YWwociwgcyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZv
aWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgTENoYXIqIGNvbnN0JiBj
LCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6
Y3JlYXRlKGMpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0g
ICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1SZWZQdHI8
U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoY29uc3QgTENoYXIqIGMpCi17Ci0gICAgaWYg
KCFjKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBpZiAoISpjKQotICAgICAgICByZXR1
cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKLQotICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPGNv
bnN0IExDaGFyKiwgQ1N0cmluZ1RyYW5zbGF0b3I+KGMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFt
ZSBDaGFyYWN0ZXJUeXBlPgotc3RydWN0IEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlciB7Ci0gICAg
Y29uc3QgQ2hhcmFjdGVyVHlwZSogczsKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19OwotCi10eXBl
ZGVmIEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlcjxVQ2hhcj4gVUNoYXJCdWZmZXI7Ci1zdHJ1Y3Qg
VUNoYXJCdWZmZXJUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBV
Q2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29t
cHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmLnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQotICAg
IHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHIsIGNvbnN0IFVDaGFyQnVm
ZmVyJiBidWYpCi0gICAgewotICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHIsIGJ1Zi5zLCBi
dWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1w
bComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQotICAg
IHsKLSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlOEJpdElmUG9zc2libGUo
YnVmLnMsIGJ1Zi5sZW5ndGgpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2go
aGFzaCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19Owot
Ci10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPgotc3RydWN0IEhhc2hBbmRDaGFyYWN0
ZXJzIHsKLSAgICB1bnNpZ25lZCBoYXNoOwotICAgIGNvbnN0IENoYXJhY3RlclR5cGUqIGNoYXJh
Y3RlcnM7Ci0gICAgdW5zaWduZWQgbGVuZ3RoOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQ2hh
cmFjdGVyVHlwZT4KLXN0cnVjdCBIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3IgewotICAgIHN0
YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzPENoYXJhY3RlclR5cGU+
JiBidWZmZXIpCi0gICAgewotICAgICAgICBBU1NFUlQoYnVmZmVyLmhhc2ggPT0gU3RyaW5nSGFz
aGVyOjpjb21wdXRlSGFzaEFuZE1hc2tUb3A4Qml0cyhidWZmZXIuY2hhcmFjdGVycywgYnVmZmVy
Lmxlbmd0aCkpOwotICAgICAgICByZXR1cm4gYnVmZmVyLmhhc2g7Ci0gICAgfQotCi0gICAgc3Rh
dGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3QmIHN0cmluZywgY29uc3QgSGFzaEFuZENo
YXJhY3RlcnM8Q2hhcmFjdGVyVHlwZT4mIGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBX
VEY6OmVxdWFsKHN0cmluZywgYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOwotICAg
IH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNv
bnN0IEhhc2hBbmRDaGFyYWN0ZXJzPENoYXJhY3RlclR5cGU+JiBidWZmZXIsIHVuc2lnbmVkIGhh
c2gpCi0gICAgewotICAgICAgICBsb2NhdGlvbiA9ICZTdHJpbmdJbXBsOjpjcmVhdGUoYnVmZmVy
LmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24t
PnNldEhhc2goaGFzaCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAg
ICB9Ci19OwotCi1zdHJ1Y3QgSGFzaEFuZFVURjhDaGFyYWN0ZXJzIHsKLSAgICB1bnNpZ25lZCBo
YXNoOwotICAgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcnM7Ci0gICAgdW5zaWduZWQgbGVuZ3RoOwot
ICAgIHVuc2lnbmVkIHV0ZjE2TGVuZ3RoOwotfTsKLQotc3RydWN0IEhhc2hBbmRVVEY4Q2hhcmFj
dGVyc1RyYW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEhhc2hBbmRV
VEY4Q2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5oYXNo
OwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHJp
bmcsIGNvbnN0IEhhc2hBbmRVVEY4Q2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAg
aWYgKGJ1ZmZlci51dGYxNkxlbmd0aCAhPSBzdHJpbmctPmxlbmd0aCgpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIElmIGJ1ZmZlciBjb250YWlucyBvbmx5IEFTQ0lJ
IGNoYXJhY3RlcnMgVVRGLTggYW5kIFVURjE2IGxlbmd0aCBhcmUgdGhlIHNhbWUuCi0gICAgICAg
IGlmIChidWZmZXIudXRmMTZMZW5ndGggIT0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAg
aWYgKHN0cmluZy0+aXM4Qml0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsTGF0aW4x
V2l0aFVURjgoc3RyaW5nLT5jaGFyYWN0ZXJzOCgpLCBidWZmZXIuY2hhcmFjdGVycywgYnVmZmVy
LmNoYXJhY3RlcnMgKyBidWZmZXIubGVuZ3RoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVxdWFs
VVRGMTZXaXRoVVRGOChzdHJpbmctPmNoYXJhY3RlcnMxNigpLCBidWZmZXIuY2hhcmFjdGVycywg
YnVmZmVyLmNoYXJhY3RlcnMgKyBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChzdHJpbmctPmlzOEJpdCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBMQ2hhciogc3RyaW5n
Q2hhcmFjdGVycyA9IHN0cmluZy0+Y2hhcmFjdGVyczgoKTsKLQotICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAg
IEFTU0VSVChpc0FTQ0lJKGJ1ZmZlci5jaGFyYWN0ZXJzW2ldKSk7Ci0gICAgICAgICAgICAgICAg
aWYgKHN0cmluZ0NoYXJhY3RlcnNbaV0gIT0gYnVmZmVyLmNoYXJhY3RlcnNbaV0pCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBVQ2hhciogc3RyaW5nQ2hh
cmFjdGVycyA9IHN0cmluZy0+Y2hhcmFjdGVyczE2KCk7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKGlz
QVNDSUkoYnVmZmVyLmNoYXJhY3RlcnNbaV0pKTsKLSAgICAgICAgICAgIGlmIChzdHJpbmdDaGFy
YWN0ZXJzW2ldICE9IGJ1ZmZlci5jaGFyYWN0ZXJzW2ldKQotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAg
IHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IEhhc2hB
bmRVVEY4Q2hhcmFjdGVycyYgYnVmZmVyLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAg
VUNoYXIqIHRhcmdldDsKLSAgICAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IG5ld1N0cmluZyA9IFN0
cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQoYnVmZmVyLnV0ZjE2TGVuZ3RoLCB0YXJnZXQp
OwotCi0gICAgICAgIGJvb2wgaXNBbGxBU0NJSTsKLSAgICAgICAgY29uc3QgY2hhciogc291cmNl
ID0gYnVmZmVyLmNoYXJhY3RlcnM7Ci0gICAgICAgIGlmIChjb252ZXJ0VVRGOFRvVVRGMTYoJnNv
dXJjZSwgc291cmNlICsgYnVmZmVyLmxlbmd0aCwgJnRhcmdldCwgdGFyZ2V0ICsgYnVmZmVyLnV0
ZjE2TGVuZ3RoLCAmaXNBbGxBU0NJSSkgIT0gY29udmVyc2lvbk9LKQotICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAgICAgaWYgKGlzQWxsQVNDSUkpCi0gICAgICAgICAg
ICBuZXdTdHJpbmcgPSBTdHJpbmdJbXBsOjpjcmVhdGUoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZl
ci5sZW5ndGgpOwotCi0gICAgICAgIGxvY2F0aW9uID0gbmV3U3RyaW5nLnJlbGVhc2UoKS5sZWFr
UmVmKCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOwotICAgICAgICBsb2NhdGlv
bi0+c2V0SXNBdG9taWModHJ1ZSk7Ci0gICAgfQotfTsKLQotUmVmUHRyPFN0cmluZ0ltcGw+IEF0
b21pY1N0cmluZzo6YWRkKGNvbnN0IFVDaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAg
aWYgKCFzKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGlmICghbGVuZ3RoKQotICAg
ICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKLSAgICAKLSAgICBVQ2hhckJ1ZmZlciBi
dWZmZXIgPSB7IHMsIGxlbmd0aCB9OwotICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFVDaGFy
QnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7Ci19Ci0KLVJlZjxTdHJpbmdJ
bXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoLCB1
bnNpZ25lZCBleGlzdGluZ0hhc2gpCi17Ci0gICAgQVNTRVJUKHMpOwotICAgIEFTU0VSVChleGlz
dGluZ0hhc2gpOwotCi0gICAgaWYgKCFsZW5ndGgpCi0gICAgICAgIHJldHVybiAqU3RyaW5nSW1w
bDo6ZW1wdHkoKTsKLQotICAgIEhhc2hBbmRDaGFyYWN0ZXJzPFVDaGFyPiBidWZmZXIgPSB7IGV4
aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07Ci0gICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8SGFz
aEFuZENoYXJhY3RlcnM8VUNoYXI+LCBIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I8VUNoYXI+
PihidWZmZXIpOwotfQotCi1SZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoY29u
c3QgVUNoYXIqIHMpCi17Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQot
ICAgIHVuc2lnbmVkIGxlbmd0aCA9IDA7Ci0gICAgd2hpbGUgKHNbbGVuZ3RoXSAhPSBVQ2hhcigw
KSkKLSAgICAgICAgKytsZW5ndGg7Ci0KLSAgICBpZiAoIWxlbmd0aCkKLSAgICAgICAgcmV0dXJu
IFN0cmluZ0ltcGw6OmVtcHR5KCk7Ci0KLSAgICBVQ2hhckJ1ZmZlciBidWZmZXIgPSB7IHMsIGxl
bmd0aCB9OwotICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVyLCBVQ2hhckJ1
ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7Ci19Ci0KLXN0cnVjdCBTdWJzdHJpbmdMb2NhdGlvbiB7
Ci0gICAgU3RyaW5nSW1wbCogYmFzZVN0cmluZzsKLSAgICB1bnNpZ25lZCBzdGFydDsKLSAgICB1
bnNpZ25lZCBsZW5ndGg7Ci19OwotCi1zdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvciB7Ci0gICAg
c3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgU3Vic3Ry
aW5nTG9jYXRpb24mIGJ1ZmZlciwgdW5zaWduZWQgaGFzaCkKLSAgICB7Ci0gICAgICAgIGxvY2F0
aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0ZVN1YnN0cmluZ1NoYXJpbmdJbXBsKGJ1ZmZlci5iYXNl
U3RyaW5nLCBidWZmZXIuc3RhcnQsIGJ1ZmZlci5sZW5ndGgpLmxlYWtSZWYoKTsKLSAgICAgICAg
bG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0
cnVlKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjggOiBTdWJzdHJp
bmdUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBTdWJzdHJpbmdM
b2NhdGlvbiYgYnVmZmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29t
cHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnM4KCkg
KyBidWZmZXIuc3RhcnQsIGJ1ZmZlci5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29s
IGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHJpbmcsIGNvbnN0IFN1YnN0cmluZ0xvY2F0aW9u
JiBidWZmZXIpCi0gICAgewotICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHJpbmcsIGJ1ZmZl
ci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJzOCgpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3Ro
KTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjE2IDogU3Vic3RyaW5n
VHJhbnNsYXRvciB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgU3Vic3RyaW5nTG9j
YXRpb24mIGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1
dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJzMTYoKSAr
IGJ1ZmZlci5zdGFydCwgYnVmZmVyLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wg
ZXF1YWwoU3RyaW5nSW1wbCogY29uc3QmIHN0cmluZywgY29uc3QgU3Vic3RyaW5nTG9jYXRpb24m
IGJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBXVEY6OmVxdWFsKHN0cmluZywgYnVmZmVy
LmJhc2VTdHJpbmctPmNoYXJhY3RlcnMxNigpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3Ro
KTsKLSAgICB9Ci19OwotCi1SZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoU3Ry
aW5nSW1wbCogYmFzZVN0cmluZywgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCkKLXsK
LSAgICBpZiAoIWJhc2VTdHJpbmcpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgaWYg
KCFsZW5ndGggfHwgc3RhcnQgPj0gYmFzZVN0cmluZy0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVy
biBTdHJpbmdJbXBsOjplbXB0eSgpOwotCi0gICAgdW5zaWduZWQgbWF4TGVuZ3RoID0gYmFzZVN0
cmluZy0+bGVuZ3RoKCkgLSBzdGFydDsKLSAgICBpZiAobGVuZ3RoID49IG1heExlbmd0aCkgewot
ICAgICAgICBpZiAoIXN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIGFkZChiYXNlU3RyaW5nKTsK
LSAgICAgICAgbGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIH0KLQotICAgIFN1YnN0cmluZ0xvY2F0
aW9uIGJ1ZmZlciA9IHsgYmFzZVN0cmluZywgc3RhcnQsIGxlbmd0aCB9OwotICAgIGlmIChiYXNl
U3RyaW5nLT5pczhCaXQoKSkKLSAgICAgICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8U3Vic3Ry
aW5nTG9jYXRpb24sIFN1YnN0cmluZ1RyYW5zbGF0b3I4PihidWZmZXIpOwotICAgIHJldHVybiBh
ZGRUb1N0cmluZ1RhYmxlPFN1YnN0cmluZ0xvY2F0aW9uLCBTdWJzdHJpbmdUcmFuc2xhdG9yMTY+
KGJ1ZmZlcik7Ci19Ci0gICAgCi10eXBlZGVmIEhhc2hUcmFuc2xhdG9yQ2hhckJ1ZmZlcjxMQ2hh
cj4gTENoYXJCdWZmZXI7Ci1zdHJ1Y3QgTENoYXJCdWZmZXJUcmFuc2xhdG9yIHsKLSAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChjb25zdCBMQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMoYnVmLnMsIGJ1
Zi5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNv
bnN0JiBzdHIsIGNvbnN0IExDaGFyQnVmZmVyJiBidWYpCi0gICAgewotICAgICAgICByZXR1cm4g
V1RGOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
dm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBMQ2hhckJ1ZmZlciYg
YnVmLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1w
bDo6Y3JlYXRlKGJ1Zi5zLCBidWYubGVuZ3RoKS5sZWFrUmVmKCk7Ci0gICAgICAgIGxvY2F0aW9u
LT5zZXRIYXNoKGhhc2gpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SXNBdG9taWModHJ1ZSk7Ci0g
ICAgfQotfTsKLQotdHlwZWRlZiBIYXNoVHJhbnNsYXRvckNoYXJCdWZmZXI8Y2hhcj4gQ2hhckJ1
ZmZlcjsKLXN0cnVjdCBDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvciB7Ci0gICAg
c3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMocmVpbnRl
cnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KGJ1Zi5zKSwgYnVmLmxlbmd0aCk7Ci0gICAgfQotCi0g
ICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3QmIHN0ciwgY29uc3QgQ2hhckJ1
ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdURjo6ZXF1YWwoc3RyLCBidWYucywg
YnVmLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0lt
cGwqJiBsb2NhdGlvbiwgY29uc3QgQ2hhckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQotICAg
IHsKLSAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlRnJvbUxpdGVyYWwoYnVm
LnMsIGJ1Zi5sZW5ndGgpLmxlYWtSZWYoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFz
aCk7Ci0gICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci19OwotCi1S
ZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQoY29uc3QgTENoYXIqIHMsIHVuc2ln
bmVkIGxlbmd0aCkKLXsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0g
ICAgaWYgKCFsZW5ndGgpCi0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwotCi0g
ICAgTENoYXJCdWZmZXIgYnVmZmVyID0geyBzLCBsZW5ndGggfTsKLSAgICByZXR1cm4gYWRkVG9T
dHJpbmdUYWJsZTxMQ2hhckJ1ZmZlciwgTENoYXJCdWZmZXJUcmFuc2xhdG9yPihidWZmZXIpOwot
fQotCi1SZWY8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGRGcm9tTGl0ZXJhbERhdGEoY29u
c3QgY2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIEFTU0VSVChjaGFy
YWN0ZXJzKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIENoYXJCdWZmZXIgYnVmZmVyID0g
eyBjaGFyYWN0ZXJzLCBsZW5ndGggfTsKLSAgICByZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxDaGFy
QnVmZmVyLCBDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRhVHJhbnNsYXRvcj4oYnVmZmVyKTsKLX0K
LQotUmVmPFN0cmluZ0ltcGw+IEF0b21pY1N0cmluZzo6YWRkU2xvd0Nhc2UoU3RyaW5nSW1wbCYg
c3RyaW5nKQotewotICAgIGlmICghc3RyaW5nLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gKlN0
cmluZ0ltcGw6OmVtcHR5KCk7Ci0KLSAgICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKLSAgICAg
ICAgaWYgKHN0cmluZy5pczhCaXQoKSkKLSAgICAgICAgICAgIHJldHVybiAqYWRkKHN0cmluZy5j
aGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4gKmFkZChzdHJp
bmcuY2hhcmFjdGVyczE2KCksIHN0cmluZy5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgQVNTRVJU
X1dJVEhfTUVTU0FHRSghc3RyaW5nLmlzQXRvbWljKCksICJBdG9taWNTdHJpbmcgc2hvdWxkIG5v
dCBoaXQgdGhlIHNsb3cgY2FzZSBpZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgYXRvbWljLiIpOwot
Ci0gICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOwotICAgIGF1dG8gYWRkUmVzdWx0
ID0gc3RyaW5nVGFibGUoKS5hZGQoJnN0cmluZyk7Ci0KLSAgICBpZiAoYWRkUmVzdWx0LmlzTmV3
RW50cnkpIHsKLSAgICAgICAgQVNTRVJUKCphZGRSZXN1bHQuaXRlcmF0b3IgPT0gJnN0cmluZyk7
Ci0gICAgICAgIHN0cmluZy5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
KiphZGRSZXN1bHQuaXRlcmF0b3I7Ci19Ci0KLVJlZjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6
OmFkZFNsb3dDYXNlKEF0b21pY1N0cmluZ1RhYmxlJiBzdHJpbmdUYWJsZSwgU3RyaW5nSW1wbCYg
c3RyaW5nKQotewotICAgIGlmICghc3RyaW5nLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gKlN0
cmluZ0ltcGw6OmVtcHR5KCk7Ci0KLSAgICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKLSAgICAg
ICAgaWYgKHN0cmluZy5pczhCaXQoKSkKLSAgICAgICAgICAgIHJldHVybiAqYWRkKHN0cmluZy5j
aGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4gKmFkZChzdHJp
bmcuY2hhcmFjdGVyczE2KCksIHN0cmluZy5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgQVNTRVJU
X1dJVEhfTUVTU0FHRSghc3RyaW5nLmlzQXRvbWljKCksICJBdG9taWNTdHJpbmcgc2hvdWxkIG5v
dCBoaXQgdGhlIHNsb3cgY2FzZSBpZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgYXRvbWljLiIpOwot
Ci0gICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOwotICAgIGF1dG8gYWRkUmVzdWx0
ID0gc3RyaW5nVGFibGUudGFibGUoKS5hZGQoJnN0cmluZyk7Ci0KLSAgICBpZiAoYWRkUmVzdWx0
LmlzTmV3RW50cnkpIHsKLSAgICAgICAgQVNTRVJUKCphZGRSZXN1bHQuaXRlcmF0b3IgPT0gJnN0
cmluZyk7Ci0gICAgICAgIHN0cmluZy5zZXRJc0F0b21pYyh0cnVlKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gKiphZGRSZXN1bHQuaXRlcmF0b3I7Ci19Ci0KLXZvaWQgQXRvbWljU3RyaW5nOjpyZW1v
dmUoU3RyaW5nSW1wbCogc3RyaW5nKQotewotICAgIEFTU0VSVChzdHJpbmctPmlzQXRvbWljKCkp
OwotICAgIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyIGxvY2tlcjsKLSAgICBIYXNoU2V0PFN0cmlu
Z0ltcGwqPiYgYXRvbWljU3RyaW5nVGFibGUgPSBzdHJpbmdUYWJsZSgpOwotICAgIEhhc2hTZXQ8
U3RyaW5nSW1wbCo+OjppdGVyYXRvciBpdGVyYXRvciA9IGF0b21pY1N0cmluZ1RhYmxlLmZpbmQo
c3RyaW5nKTsKLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IGF0b21pY1N0cmlu
Z1RhYmxlLmVuZCgpLCAiVGhlIHN0cmluZyBiZWluZyByZW1vdmVkIGlzIGF0b21pYyBpbiB0aGUg
c3RyaW5nIHRhYmxlIG9mIGFuIG90aGVyIHRocmVhZCEiKTsKLSAgICBhdG9taWNTdHJpbmdUYWJs
ZS5yZW1vdmUoaXRlcmF0b3IpOwotfQotCiBBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpsb3dl
cigpIGNvbnN0CiB7CiAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGhvdCBmdW5jdGlvbiBpbiB0aGUg
RHJvbWFlbyBiZW5jaG1hcmsuCkBAIC00NjgsNyArNDQsNyBAQCBBdG9taWNTdHJpbmcgQXRvbWlj
U3RyaW5nOjpsb3dlcigpIGNvbnN0CiAgICAgICAgIHJldHVybiAqdGhpczsKIAogICAgIEF0b21p
Y1N0cmluZyByZXN1bHQ7Ci0gICAgcmVzdWx0Lm1fc3RyaW5nID0gYWRkU2xvd0Nhc2UoKmxvd2Vy
Y2FzZWRTdHJpbmcpOworICAgIHJlc3VsdC5tX3N0cmluZyA9IEF0b21pY1N0cmluZ0ltcGw6OmFk
ZChsb3dlcmNhc2VkU3RyaW5nLmdldCgpKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC01
MDcsNDUgKzgzLDEwIEBAIEF0b21pY1N0cmluZyBBdG9taWNTdHJpbmc6OmNvbnZlcnRUb0FTQ0lJ
TG93ZXJjYXNlKCkgY29uc3QKICAgICAgICAgcmV0dXJuICp0aGlzOwogCiAgICAgQXRvbWljU3Ry
aW5nIHJlc3VsdDsKLSAgICByZXN1bHQubV9zdHJpbmcgPSBhZGRTbG93Q2FzZSgqY29udmVydGVk
U3RyaW5nKTsKKyAgICByZXN1bHQubV9zdHJpbmcgPSBBdG9taWNTdHJpbmdJbXBsOjphZGQoY29u
dmVydGVkU3RyaW5nLmdldCgpKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1BdG9taWNTdHJp
bmdJbXBsKiBBdG9taWNTdHJpbmc6OmZpbmRTbG93Q2FzZShTdHJpbmdJbXBsJiBzdHJpbmcpCi17
Ci0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghc3RyaW5nLmlzQXRvbWljKCksICJBdG9taWNTdHJp
bmdJbXBscyBzaG91bGQgcmV0dXJuIGZyb20gdGhlIGZhc3QgY2FzZS4iKTsKLQotICAgIGlmICgh
c3RyaW5nLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5n
SW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOwotCi0gICAgaWYgKHN0cmluZy5pc1N5bWJvbCgp
KSB7Ci0gICAgICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmlu
ZEludGVybmFsKHN0cmluZy5jaGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVuZ3RoKCkpOwotICAgICAg
ICByZXR1cm4gZmluZEludGVybmFsKHN0cmluZy5jaGFyYWN0ZXJzMTYoKSwgc3RyaW5nLmxlbmd0
aCgpKTsKLSAgICB9Ci0KLSAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7Ci0gICAg
SGFzaFNldDxTdHJpbmdJbXBsKj4mIGF0b21pY1N0cmluZ1RhYmxlID0gc3RyaW5nVGFibGUoKTsK
LSAgICBhdXRvIGl0ZXJhdG9yID0gYXRvbWljU3RyaW5nVGFibGUuZmluZCgmc3RyaW5nKTsKLSAg
ICBpZiAoaXRlcmF0b3IgIT0gYXRvbWljU3RyaW5nVGFibGUuZW5kKCkpCi0gICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oKml0ZXJhdG9yKTsKLSAgICByZXR1cm4g
bnVsbHB0cjsKLX0KLQotQXRvbWljU3RyaW5nIEF0b21pY1N0cmluZzo6ZnJvbVVURjhJbnRlcm5h
bChjb25zdCBjaGFyKiBjaGFyYWN0ZXJzU3RhcnQsIGNvbnN0IGNoYXIqIGNoYXJhY3RlcnNFbmQp
Ci17Ci0gICAgSGFzaEFuZFVURjhDaGFyYWN0ZXJzIGJ1ZmZlcjsKLSAgICBidWZmZXIuY2hhcmFj
dGVycyA9IGNoYXJhY3RlcnNTdGFydDsKLSAgICBidWZmZXIuaGFzaCA9IGNhbGN1bGF0ZVN0cmlu
Z0hhc2hBbmRMZW5ndGhGcm9tVVRGOE1hc2tpbmdUb3A4Qml0cyhjaGFyYWN0ZXJzU3RhcnQsIGNo
YXJhY3RlcnNFbmQsIGJ1ZmZlci5sZW5ndGgsIGJ1ZmZlci51dGYxNkxlbmd0aCk7Ci0KLSAgICBp
ZiAoIWJ1ZmZlci5oYXNoKQotICAgICAgICByZXR1cm4gbnVsbEF0b207Ci0KLSAgICBBdG9taWNT
dHJpbmcgYXRvbWljU3RyaW5nOwotICAgIGF0b21pY1N0cmluZy5tX3N0cmluZyA9IGFkZFRvU3Ry
aW5nVGFibGU8SGFzaEFuZFVURjhDaGFyYWN0ZXJzLCBIYXNoQW5kVVRGOENoYXJhY3RlcnNUcmFu
c2xhdG9yPihidWZmZXIpOwotICAgIHJldHVybiBhdG9taWNTdHJpbmc7Ci19Ci0KIEF0b21pY1N0
cmluZyBBdG9taWNTdHJpbmc6Om51bWJlcihpbnQgbnVtYmVyKQogewogICAgIHJldHVybiBudW1i
ZXJUb1N0cmluZ1NpZ25lZDxBdG9taWNTdHJpbmc+KG51bWJlcik7CkBAIC01NjIsMzcgKzEwMywx
NCBAQCBBdG9taWNTdHJpbmcgQXRvbWljU3RyaW5nOjpudW1iZXIoZG91YmxlIG51bWJlcikKICAg
ICByZXR1cm4gU3RyaW5nKG51bWJlclRvRml4ZWRQcmVjaXNpb25TdHJpbmcobnVtYmVyLCA2LCBi
dWZmZXIsIHRydWUpKTsKIH0KIAotQXRvbWljU3RyaW5nSW1wbCogQXRvbWljU3RyaW5nOjpmaW5k
SW50ZXJuYWwoY29uc3QgTENoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAg
ICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7Ci0gICAgYXV0byYgdGFibGUgPSBzdHJp
bmdUYWJsZSgpOwotCi0gICAgTENoYXJCdWZmZXIgYnVmZmVyID0geyBjaGFyYWN0ZXJzLCBsZW5n
dGggfTsKLSAgICBhdXRvIGl0ZXJhdG9yID0gdGFibGUuZmluZDxMQ2hhckJ1ZmZlclRyYW5zbGF0
b3I+KGJ1ZmZlcik7Ci0gICAgaWYgKGl0ZXJhdG9yICE9IHRhYmxlLmVuZCgpKQotICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCppdGVyYXRvcik7Ci0gICAgcmV0
dXJuIG51bGxwdHI7Ci19Ci0KLUF0b21pY1N0cmluZ0ltcGwqIEF0b21pY1N0cmluZzo6ZmluZElu
dGVybmFsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAg
QXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOwotICAgIGF1dG8mIHRhYmxlID0gc3RyaW5n
VGFibGUoKTsKLQotICAgIFVDaGFyQnVmZmVyIGJ1ZmZlciA9IHsgY2hhcmFjdGVycywgbGVuZ3Ro
IH07Ci0gICAgYXV0byBpdGVyYXRvciA9IHRhYmxlLmZpbmQ8VUNoYXJCdWZmZXJUcmFuc2xhdG9y
PihidWZmZXIpOwotICAgIGlmIChpdGVyYXRvciAhPSB0YWJsZS5lbmQoKSkKLSAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPigqaXRlcmF0b3IpOwotICAgIHJldHVy
biBudWxscHRyOwotfQotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotYm9vbCBBdG9taWNTdHJpbmc6
OmlzSW5BdG9taWNTdHJpbmdUYWJsZShTdHJpbmdJbXBsKiBzdHJpbmcpCitBdG9taWNTdHJpbmcg
QXRvbWljU3RyaW5nOjpmcm9tVVRGOEludGVybmFsKGNvbnN0IGNoYXIqIGNoYXJhY3RlcnNTdGFy
dCwgY29uc3QgY2hhciogY2hhcmFjdGVyc0VuZCkKIHsKLSAgICBBdG9taWNTdHJpbmdUYWJsZUxv
Y2tlciBsb2NrZXI7Ci0gICAgcmV0dXJuIHN0cmluZ1RhYmxlKCkuY29udGFpbnMoc3RyaW5nKTsK
KyAgICBpZiAoUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGltcGwgPSBBdG9taWNTdHJpbmdJbXBs
OjphZGRGcm9tVVRGOChjaGFyYWN0ZXJzU3RhcnQsIGNoYXJhY3RlcnNFbmQpKSB7CisgICAgICAg
IEF0b21pY1N0cmluZyBhdG9taWNTdHJpbmcoaW1wbC5nZXQoKSk7CisgICAgICAgIHJldHVybiBh
dG9taWNTdHJpbmc7CisgICAgfQorICAgIHJldHVybiBudWxsQXRvbTsKIH0KLSNlbmRpZgogCiAj
aWZuZGVmIE5ERUJVRwogdm9pZCBBdG9taWNTdHJpbmc6OnNob3coKSBjb25zdApkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi93dGYvdGV4dC9BdG9taWNTdHJpbmcuaCBiL1NvdXJjZS9XVEYvd3RmL3Rl
eHQvQXRvbWljU3RyaW5nLmgKaW5kZXggY2JmZGM4OTQ3MzA4ZTcyMDgyN2E3OWI1MTg2NTY4ZWNj
NTUzODE1Mi4uMmFmMDcwNTgzZTNiODBhN2RhYzE0YjU3NTBjYTM0MWQ2ZGRlZWEzZCAxMDA2NDQK
LS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9BdG9taWNTdHJpbmcuaAorKysgYi9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L0F0b21pY1N0cmluZy5oCkBAIC0zNSw3ICszNSw2IEBACiAKIG5hbWVzcGFjZSBX
VEYgewogCi1jbGFzcyBBdG9taWNTdHJpbmdUYWJsZTsKIHN0cnVjdCBBdG9taWNTdHJpbmdIYXNo
OwogCiBjbGFzcyBBdG9taWNTdHJpbmcgewpAQCAtNDMsMzMgKzQyLDMzIEBAIGNsYXNzIEF0b21p
Y1N0cmluZyB7CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHN0YXRpYyB2b2lkIGluaXQoKTsKIAog
ICAgIEF0b21pY1N0cmluZygpIHsgfQotICAgIEF0b21pY1N0cmluZyhjb25zdCBMQ2hhciogcykg
OiBtX3N0cmluZyhhZGQocykpIHsgfQotICAgIEF0b21pY1N0cmluZyhjb25zdCBjaGFyKiBzKSA6
IG1fc3RyaW5nKGFkZChzKSkgeyB9Ci0gICAgQXRvbWljU3RyaW5nKGNvbnN0IExDaGFyKiBzLCB1
bnNpZ25lZCBsZW5ndGgpIDogbV9zdHJpbmcoYWRkKHMsIGxlbmd0aCkpIHsgfQotICAgIEF0b21p
Y1N0cmluZyhjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoKSA6IG1fc3RyaW5nKGFkZChz
LCBsZW5ndGgpKSB7IH0KLSAgICBBdG9taWNTdHJpbmcoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVk
IGxlbmd0aCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKSA6IG1fc3RyaW5nKGFkZChzLCBsZW5ndGgs
IGV4aXN0aW5nSGFzaCkpIHsgfQotICAgIEF0b21pY1N0cmluZyhjb25zdCBVQ2hhciogcykgOiBt
X3N0cmluZyhhZGQocykpIHsgfQorICAgIEF0b21pY1N0cmluZyhjb25zdCBMQ2hhciogcykgOiBt
X3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjphZGQocykpIHsgfQorICAgIEF0b21pY1N0cmluZyhj
b25zdCBjaGFyKiBzKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChzKSkgeyB9Cisg
ICAgQXRvbWljU3RyaW5nKGNvbnN0IExDaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIDogbV9zdHJp
bmcoQXRvbWljU3RyaW5nSW1wbDo6YWRkKHMsIGxlbmd0aCkpIHsgfQorICAgIEF0b21pY1N0cmlu
Zyhjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoKSA6IG1fc3RyaW5nKEF0b21pY1N0cmlu
Z0ltcGw6OmFkZChzLCBsZW5ndGgpKSB7IH0KKyAgICBBdG9taWNTdHJpbmcoY29uc3QgVUNoYXIq
IHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKSA6IG1fc3RyaW5nKEF0
b21pY1N0cmluZ0ltcGw6OmFkZChzLCBsZW5ndGgsIGV4aXN0aW5nSGFzaCkpIHsgfQorICAgIEF0
b21pY1N0cmluZyhjb25zdCBVQ2hhciogcykgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjph
ZGQocykpIHsgfQogCiAgICAgdGVtcGxhdGU8c2l6ZV90IGlubGluZUNhcGFjaXR5PgogICAgIGV4
cGxpY2l0IEF0b21pY1N0cmluZyhjb25zdCBWZWN0b3I8VUNoYXIsIGlubGluZUNhcGFjaXR5PiYg
Y2hhcmFjdGVycykKLSAgICAgICAgOiBtX3N0cmluZyhhZGQoY2hhcmFjdGVycy5kYXRhKCksIGNo
YXJhY3RlcnMuc2l6ZSgpKSkKKyAgICAgICAgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjph
ZGQoY2hhcmFjdGVycy5kYXRhKCksIGNoYXJhY3RlcnMuc2l6ZSgpKSkKICAgICB7CiAgICAgfQog
Ci0gICAgQVRPTUlDU1RSSU5HX0NPTlZFUlNJT04gQXRvbWljU3RyaW5nKFN0cmluZ0ltcGwqIGlt
cCkgOiBtX3N0cmluZyhhZGQoaW1wKSkgeyB9CiAgICAgQXRvbWljU3RyaW5nKEF0b21pY1N0cmlu
Z0ltcGwqIGltcCkgOiBtX3N0cmluZyhpbXApIHsgfQotICAgIEFUT01JQ1NUUklOR19DT05WRVJT
SU9OIEF0b21pY1N0cmluZyhjb25zdCBTdHJpbmcmIHMpIDogbV9zdHJpbmcoYWRkKHMuaW1wbCgp
KSkgeyB9Ci0gICAgQXRvbWljU3RyaW5nKFN0cmluZ0ltcGwqIGJhc2VTdHJpbmcsIHVuc2lnbmVk
IHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgpIDogbV9zdHJpbmcoYWRkKGJhc2VTdHJpbmcsIHN0YXJ0
LCBsZW5ndGgpKSB7IH0KKyAgICBBVE9NSUNTVFJJTkdfQ09OVkVSU0lPTiBBdG9taWNTdHJpbmco
U3RyaW5nSW1wbCogaW1wKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChpbXApKSB7
IH0KKyAgICBBVE9NSUNTVFJJTkdfQ09OVkVSU0lPTiBBdG9taWNTdHJpbmcoY29uc3QgU3RyaW5n
JiBzKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChzLmltcGwoKSkpIHsgfQorICAg
IEF0b21pY1N0cmluZyhTdHJpbmdJbXBsKiBiYXNlU3RyaW5nLCB1bnNpZ25lZCBzdGFydCwgdW5z
aWduZWQgbGVuZ3RoKSA6IG1fc3RyaW5nKEF0b21pY1N0cmluZ0ltcGw6OmFkZChiYXNlU3RyaW5n
LCBzdGFydCwgbGVuZ3RoKSkgeyB9CiAKICAgICBlbnVtIENvbnN0cnVjdEZyb21MaXRlcmFsVGFn
IHsgQ29uc3RydWN0RnJvbUxpdGVyYWwgfTsKICAgICBBdG9taWNTdHJpbmcoY29uc3QgY2hhciog
Y2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBDb25zdHJ1Y3RGcm9tTGl0ZXJhbFRhZykKLSAg
ICAgICAgOiBtX3N0cmluZyhhZGRGcm9tTGl0ZXJhbERhdGEoY2hhcmFjdGVycywgbGVuZ3RoKSkK
KyAgICAgICAgOiBtX3N0cmluZyhBdG9taWNTdHJpbmdJbXBsOjphZGRGcm9tTGl0ZXJhbERhdGEo
Y2hhcmFjdGVycywgbGVuZ3RoKSkKICAgICB7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dW5zaWdu
ZWQgY2hhcmFjdGVyc0NvdW50PgogICAgIEFMV0FZU19JTkxJTkUgQXRvbWljU3RyaW5nKGNvbnN0
IGNoYXIgKCZjaGFyYWN0ZXJzKVtjaGFyYWN0ZXJzQ291bnRdLCBDb25zdHJ1Y3RGcm9tTGl0ZXJh
bFRhZykKLSAgICAgICAgOiBtX3N0cmluZyhhZGRGcm9tTGl0ZXJhbERhdGEoY2hhcmFjdGVycywg
Y2hhcmFjdGVyc0NvdW50IC0gMSkpCisgICAgICAgIDogbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1w
bDo6YWRkRnJvbUxpdGVyYWxEYXRhKGNoYXJhY3RlcnMsIGNoYXJhY3RlcnNDb3VudCAtIDEpKQog
ICAgIHsKICAgICAgICAgQ09NUElMRV9BU1NFUlQoY2hhcmFjdGVyc0NvdW50ID4gMSwgQXRvbWlj
U3RyaW5nRnJvbUxpdGVyYWxOb3RFbXB0eSk7CiAgICAgICAgIENPTVBJTEVfQVNTRVJUKChjaGFy
YWN0ZXJzQ291bnQgLSAxIDw9ICgodW5zaWduZWQofjApIC0gc2l6ZW9mKFN0cmluZ0ltcGwpKSAv
IHNpemVvZihMQ2hhcikpKSwgQXRvbWljU3RyaW5nRnJvbUxpdGVyYWxDYW5ub3RPdmVyZmxvdyk7
CkBAIC04NiwyMSArODUsNiBAQCBjbGFzcyBBdG9taWNTdHJpbmcgewogICAgIEF0b21pY1N0cmlu
ZyhXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpIDogbV9zdHJpbmcoV1RGOjpIYXNoVGFi
bGVEZWxldGVkVmFsdWUpIHsgfQogICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBj
b25zdCB7IHJldHVybiBtX3N0cmluZy5pc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpOyB9CiAKLSAg
ICBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZChMQ2hhciogY2hhcmFjdGVycywgdW5zaWdu
ZWQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmRJbnRlcm5hbChjaGFyYWN0ZXJz
LCBsZW5ndGgpOwotICAgIH0KLSAgICBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZChVQ2hh
ciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZp
bmRJbnRlcm5hbChjaGFyYWN0ZXJzLCBsZW5ndGgpOwotICAgIH0KLSAgICBzdGF0aWMgQXRvbWlj
U3RyaW5nSW1wbCogZmluZChTdHJpbmdJbXBsKiBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAo
IXN0cmluZyB8fCBzdHJpbmctPmlzQXRvbWljKCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KHN0cmluZyk7Ci0gICAgICAgIHJldHVybiBmaW5kU2xv
d0Nhc2UoKnN0cmluZyk7Ci0gICAgfQotCiAgICAgb3BlcmF0b3IgY29uc3QgU3RyaW5nJigpIGNv
bnN0IHsgcmV0dXJuIG1fc3RyaW5nOyB9CiAgICAgY29uc3QgU3RyaW5nJiBzdHJpbmcoKSBjb25z
dCB7IHJldHVybiBtX3N0cmluZzsgfTsKIApAQCAtMTEwLDcgKzk0LDcgQEAgY2xhc3MgQXRvbWlj
U3RyaW5nIHsKICAgICBjb25zdCBMQ2hhciogY2hhcmFjdGVyczgoKSBjb25zdCB7IHJldHVybiBt
X3N0cmluZy5jaGFyYWN0ZXJzOCgpOyB9CiAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMxNigp
IGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nLmNoYXJhY3RlcnMxNigpOyB9CiAgICAgdW5zaWduZWQg
bGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcubGVuZ3RoKCk7IH0KLSAgICAKKwogICAg
IFVDaGFyIG9wZXJhdG9yW10odW5zaWduZWQgaW50IGkpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5n
W2ldOyB9CiAKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0cmluZyBu
dW1iZXIoaW50KTsKQEAgLTE2Myw3ICsxNDcsNyBAQCBjbGFzcyBBdG9taWNTdHJpbmcgewogICAg
IHRlbXBsYXRlPHVuc2lnbmVkIG1hdGNoTGVuZ3RoPgogICAgIGJvb2wgZW5kc1dpdGgoY29uc3Qg
Y2hhciAoJnByZWZpeClbbWF0Y2hMZW5ndGhdLCBib29sIGNhc2VTZW5zaXRpdmUgPSB0cnVlKSBj
b25zdAogICAgICAgICB7IHJldHVybiBtX3N0cmluZy5lbmRzV2l0aDxtYXRjaExlbmd0aD4ocHJl
Zml4LCBjYXNlU2Vuc2l0aXZlKTsgfQotICAgIAorCiAgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJ
IEF0b21pY1N0cmluZyBjb252ZXJ0VG9BU0NJSUxvd2VyY2FzZSgpIGNvbnN0OwogICAgIFdURl9F
WFBPUlRfU1RSSU5HX0FQSSBBdG9taWNTdHJpbmcgbG93ZXIoKSBjb25zdDsKICAgICBBdG9taWNT
dHJpbmcgdXBwZXIoKSBjb25zdCB7IHJldHVybiBBdG9taWNTdHJpbmcoaW1wbCgpLT51cHBlcigp
KTsgfQpAQCAtMTc2LDEzICsxNjAsMTEgQEAgY2xhc3MgQXRvbWljU3RyaW5nIHsKICAgICBib29s
IGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nLmlzTnVsbCgpOyB9CiAgICAgYm9vbCBp
c0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcuaXNFbXB0eSgpOyB9CiAKLSAgICBzdGF0
aWMgdm9pZCByZW1vdmUoU3RyaW5nSW1wbCopOwotICAgIAogI2lmIFVTRShDRikKLSAgICBBdG9t
aWNTdHJpbmcoQ0ZTdHJpbmdSZWYgcykgOiAgbV9zdHJpbmcoYWRkKHMpKSB7IH0KKyAgICBBdG9t
aWNTdHJpbmcoQ0ZTdHJpbmdSZWYgcykgOiAgbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRk
KHMpKSB7IH0KICNlbmRpZiAgICAKICNpZmRlZiBfX09CSkNfXwotICAgIEF0b21pY1N0cmluZyhO
U1N0cmluZyogcykgOiBtX3N0cmluZyhhZGQoKENGU3RyaW5nUmVmKXMpKSB7IH0KKyAgICBBdG9t
aWNTdHJpbmcoTlNTdHJpbmcqIHMpIDogbV9zdHJpbmcoQXRvbWljU3RyaW5nSW1wbDo6YWRkKChD
RlN0cmluZ1JlZilzKSkgeyB9CiAgICAgb3BlcmF0b3IgTlNTdHJpbmcqKCkgY29uc3QgeyByZXR1
cm4gbV9zdHJpbmc7IH0KICNlbmRpZgogCkBAIC0xOTUsNzEgKzE3NywxNyBAQCBjbGFzcyBBdG9t
aWNTdHJpbmcgewogICAgIHZvaWQgc2hvdygpIGNvbnN0OwogI2VuZGlmCiAKLSAgICBXVEZfRVhQ
T1JUX1NUUklOR19BUEkgc3RhdGljIFJlZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgTENoYXIq
KTsKLSAgICBBTFdBWVNfSU5MSU5FIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKGNvbnN0
IGNoYXIqIHMpIHsgcmV0dXJuIGFkZChyZWludGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4ocykp
OyB9OwotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPFN0cmluZ0ltcGw+
IGFkZChjb25zdCBMQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJ
TkdfQVBJIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKGNvbnN0IFVDaGFyKiwgdW5zaWdu
ZWQgbGVuZ3RoKTsKLSAgICBBTFdBWVNfSU5MSU5FIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4g
YWRkKGNvbnN0IGNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCkgeyByZXR1cm4gYWRkKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgTENoYXIqPihzKSwgbGVuZ3RoKTsgfTsKLSAgICBXVEZfRVhQT1JUX1NU
UklOR19BUEkgc3RhdGljIFJlZjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNpZ25l
ZCBsZW5ndGgsIHVuc2lnbmVkIGV4aXN0aW5nSGFzaCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdf
QVBJIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKGNvbnN0IFVDaGFyKik7Ci0gICAgV1RG
X0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKFN0cmluZ0lt
cGwqLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCk7Ci0gICAgQUxXQVlTX0lOTElO
RSBzdGF0aWMgUmVmUHRyPFN0cmluZ0ltcGw+IGFkZChTdHJpbmdJbXBsKiBzdHJpbmcpCi0gICAg
ewotICAgICAgICBpZiAoIXN0cmluZykKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAg
ICAgIHJldHVybiBhZGQoKnN0cmluZyk7Ci0gICAgfQotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQ
SSBzdGF0aWMgUmVmPFN0cmluZ0ltcGw+IGFkZEZyb21MaXRlcmFsRGF0YShjb25zdCBjaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpOwotI2lmIFVTRShDRikKLSAgICBXVEZfRVhQT1JU
X1NUUklOR19BUEkgc3RhdGljIFJlZlB0cjxTdHJpbmdJbXBsPiBhZGQoQ0ZTdHJpbmdSZWYpOwot
I2VuZGlmCi0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdUYWJsZVByb3ZpZGVyPgotICAg
IEFMV0FZU19JTkxJTkUgc3RhdGljIFJlZlB0cjxTdHJpbmdJbXBsPiBhZGRXaXRoU3RyaW5nVGFi
bGVQcm92aWRlcihTdHJpbmdUYWJsZVByb3ZpZGVyJiBzdHJpbmdUYWJsZVByb3ZpZGVyLCBTdHJp
bmdJbXBsKiBzdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoIXN0cmluZykKLSAgICAgICAgICAg
IHJldHVybiBzdHJpbmc7Ci0gICAgICAgIHJldHVybiBhZGQoKnN0cmluZ1RhYmxlUHJvdmlkZXIu
YXRvbWljU3RyaW5nVGFibGUoKSwgKnN0cmluZyk7Ci0gICAgfQotCi0jaWYgIUFTU0VSVF9ESVNB
QkxFRAotICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgYm9vbCBpc0luQXRvbWljU3Ry
aW5nVGFibGUoU3RyaW5nSW1wbCopOwotI2VuZGlmCi0KIHByaXZhdGU6CiAgICAgLy8gVGhlIGV4
cGxpY2l0IGNvbnN0cnVjdG9ycyB3aXRoIEF0b21pY1N0cmluZzo6Q29uc3RydWN0RnJvbUxpdGVy
YWwgbXVzdCBiZSB1c2VkIGZvciBsaXRlcmFscy4KICAgICBBdG9taWNTdHJpbmcoQVNDSUlMaXRl
cmFsKTsKIAotICAgIFN0cmluZyBtX3N0cmluZzsKLQotICAgIEFMV0FZU19JTkxJTkUgc3RhdGlj
IFJlZjxTdHJpbmdJbXBsPiBhZGQoU3RyaW5nSW1wbCYgc3RyaW5nKQotICAgIHsKLSAgICAgICAg
aWYgKHN0cmluZy5pc0F0b21pYygpKSB7Ci0gICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KCFzdHJpbmcubGVuZ3RoKCkgfHwgaXNJbkF0b21pY1N0cmluZ1RhYmxlKCZzdHJpbmcpLCAiVGhl
IGF0b21pYyBzdHJpbmcgY29tZXMgZnJvbSBhbiBvdGhlciB0aHJlYWQhIik7Ci0gICAgICAgICAg
ICByZXR1cm4gc3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGRTbG93Q2FzZShz
dHJpbmcpOwotICAgIH0KLQotICAgIEFMV0FZU19JTkxJTkUgc3RhdGljIFJlZjxTdHJpbmdJbXBs
PiBhZGQoQXRvbWljU3RyaW5nVGFibGUmIHN0cmluZ1RhYmxlLCBTdHJpbmdJbXBsJiBzdHJpbmcp
Ci0gICAgewotICAgICAgICBpZiAoc3RyaW5nLmlzQXRvbWljKCkpIHsKLSAgICAgICAgICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UoIXN0cmluZy5sZW5ndGgoKSB8fCBpc0luQXRvbWljU3RyaW5nVGFi
bGUoJnN0cmluZyksICJUaGUgYXRvbWljIHN0cmluZyBjb21lcyBmcm9tIGFuIG90aGVyIHRocmVh
ZCEiKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIGFkZFNsb3dDYXNlKHN0cmluZ1RhYmxlLCBzdHJpbmcpOwotICAgIH0KLQotICAgIFdURl9F
WFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmPFN0cmluZ0ltcGw+IGFkZFNsb3dDYXNlKFN0cmlu
Z0ltcGwmKTsKLSAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJlZjxTdHJpbmdJbXBs
PiBhZGRTbG93Q2FzZShBdG9taWNTdHJpbmdUYWJsZSYsIFN0cmluZ0ltcGwmKTsKLQotICAgIFdU
Rl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogZmluZFNsb3dDYXNl
KFN0cmluZ0ltcGwmKTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0
cmluZyBmcm9tVVRGOEludGVybmFsKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CiAKLSAgICBX
VEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0cmluZ0ltcGwqIGZpbmRJbnRlcm5h
bChjb25zdCBMQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7Ci0gICAgV1RGX0VYUE9SVF9TVFJJTkdf
QVBJIHN0YXRpYyBBdG9taWNTdHJpbmdJbXBsKiBmaW5kSW50ZXJuYWwoY29uc3QgVUNoYXIqLCB1
bnNpZ25lZCBsZW5ndGgpOworICAgIFN0cmluZyBtX3N0cmluZzsKIH07CiAKK3N0YXRpY19hc3Nl
cnQoc2l6ZW9mKEF0b21pY1N0cmluZykgPT0gc2l6ZW9mKFN0cmluZyksICJBdG9taWNTdHJpbmcg
YW5kIFN0cmluZyBtdXN0IGJlIHNhbWUgc2l6ZSEiKTsKKwogaW5saW5lIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBBdG9taWNTdHJpbmcmIGEsIGNvbnN0IEF0b21pY1N0cmluZyYgYikgeyByZXR1cm4g
YS5pbXBsKCkgPT0gYi5pbXBsKCk7IH0KIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdG9taWNTdHJp
bmcmLCBjb25zdCBMQ2hhciopOwogaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdG9taWNT
dHJpbmcmIGEsIGNvbnN0IGNoYXIqIGIpIHsgcmV0dXJuIFdURjo6ZXF1YWwoYS5pbXBsKCksIHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTENoYXIqPihiKSk7IH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
VEYvd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5jcHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0
b21pY1N0cmluZ0ltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRlNTQ1OTRiM2U3MjMxNDQxZDg1ZWEyOTU5
Y2Q4M2I4YmZhYjU1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0
b21pY1N0cmluZ0ltcGwuY3BwCkBAIC0wLDAgKzEsNTIyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA0LTIwMDgsIDIwMTMtMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgUGF0cmljayBHYW5zdGVyZXIgPHBhcm9nYUBwYXJvZ2EuY29t
PgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgWXVzdWtlIFN1enVraTx1dGF0YW5lLnRlYUBnbWFpbC5j
b20+LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkF0b21pY1N0cmluZ0ltcGwuaCIKKworI2luY2x1ZGUgIkF0b21pY1N0cmluZ1RhYmxlLmgi
CisjaW5jbHVkZSAiSGFzaFNldC5oIgorI2luY2x1ZGUgIkludGVnZXJUb1N0cmluZ0NvbnZlcnNp
b24uaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSAiVGhyZWFkaW5nLmgiCisj
aW5jbHVkZSAiV1RGVGhyZWFkRGF0YS5oIgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VURjguaD4K
KworI2lmIFVTRShXRUJfVEhSRUFEKQorI2luY2x1ZGUgIlNwaW5Mb2NrLmgiCisjZW5kaWYKKwor
bmFtZXNwYWNlIFdURiB7CisKK3VzaW5nIG5hbWVzcGFjZSBVbmljb2RlOworCisjaWYgVVNFKFdF
Ql9USFJFQUQpCisKK2NsYXNzIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyIDogcHVibGljIFNwaW5M
b2NrSG9sZGVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShBdG9taWNTdHJpbmdUYWJsZUxv
Y2tlcik7CisKKyAgICBzdGF0aWMgU3RhdGljU3BpbkxvY2sgc19zdHJpbmdUYWJsZUxvY2s7Citw
dWJsaWM6CisgICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIoKQorICAgICAgICA6IFNwaW5Mb2Nr
SG9sZGVyKCZzX3N0cmluZ1RhYmxlTG9jaykKKyAgICB7CisgICAgfQorfTsKKworU3RhdGljU3Bp
bkxvY2sgQXRvbWljU3RyaW5nVGFibGVMb2NrZXI6OnNfc3RyaW5nVGFibGVMb2NrOworCisjZWxz
ZQorCitjbGFzcyBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciB7CisgICAgV1RGX01BS0VfTk9OQ09Q
WUFCTEUoQXRvbWljU3RyaW5nVGFibGVMb2NrZXIpOworcHVibGljOgorICAgIEF0b21pY1N0cmlu
Z1RhYmxlTG9ja2VyKCkgeyB9Cit9OworCisjZW5kaWYgLy8gVVNFKFdFQl9USFJFQUQpCisKK3N0
YXRpYyBBTFdBWVNfSU5MSU5FIEhhc2hTZXQ8U3RyaW5nSW1wbCo+JiBzdHJpbmdUYWJsZSgpCit7
CisgICAgcmV0dXJuIHd0ZlRocmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpLT50YWJsZSgp
OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4KK3N0
YXRpYyBpbmxpbmUgUmVmPEF0b21pY1N0cmluZ0ltcGw+IGFkZFRvU3RyaW5nVGFibGUoY29uc3Qg
VCYgdmFsdWUpCit7CisgICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOworCisgICAg
SGFzaFNldDxTdHJpbmdJbXBsKj46OkFkZFJlc3VsdCBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgp
LmFkZDxIYXNoVHJhbnNsYXRvcj4odmFsdWUpOworCisgICAgLy8gSWYgdGhlIHN0cmluZyBpcyBu
ZXdseS10cmFuc2xhdGVkLCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCisgICAgLy8gVGhlIGJv
b2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KKyAgICBpZiAoYWRkUmVz
dWx0LmlzTmV3RW50cnkpCisgICAgICAgIHJldHVybiBhZG9wdFJlZihzdGF0aWNfY2FzdDxBdG9t
aWNTdHJpbmdJbXBsJj4oKiphZGRSZXN1bHQuaXRlcmF0b3IpKTsKKyAgICByZXR1cm4gKnN0YXRp
Y19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPigqYWRkUmVzdWx0Lml0ZXJhdG9yKTsKK30KKworc3Ry
dWN0IENTdHJpbmdUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBM
Q2hhciogYykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNo
QW5kTWFza1RvcDhCaXRzKGMpOworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBlcXVh
bChTdHJpbmdJbXBsKiByLCBjb25zdCBMQ2hhciogcykKKyAgICB7CisgICAgICAgIHJldHVybiBX
VEY6OmVxdWFsKHIsIHMpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJp
bmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IExDaGFyKiBjb25zdCYgYywgdW5zaWduZWQgaGFzaCkK
KyAgICB7CisgICAgICAgIGxvY2F0aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0ZShjKS5sZWFrUmVm
KCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+
c2V0SXNBdG9taWModHJ1ZSk7CisgICAgfQorfTsKKworUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+
IEF0b21pY1N0cmluZ0ltcGw6OmFkZChjb25zdCBMQ2hhciogYykKK3sKKyAgICBpZiAoIWMpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmICghKmMpCisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICBy
ZXR1cm4gYWRkVG9TdHJpbmdUYWJsZTxjb25zdCBMQ2hhciosIENTdHJpbmdUcmFuc2xhdG9yPihj
KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4KK3N0cnVjdCBIYXNoVHJh
bnNsYXRvckNoYXJCdWZmZXIgeworICAgIGNvbnN0IENoYXJhY3RlclR5cGUqIHM7CisgICAgdW5z
aWduZWQgbGVuZ3RoOworfTsKKwordHlwZWRlZiBIYXNoVHJhbnNsYXRvckNoYXJCdWZmZXI8VUNo
YXI+IFVDaGFyQnVmZmVyOworc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvciB7CisgICAgc3Rh
dGljIHVuc2lnbmVkIGhhc2goY29uc3QgVUNoYXJCdWZmZXImIGJ1ZikKKyAgICB7CisgICAgICAg
IHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1Zi5zLCBi
dWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBj
b25zdCYgc3RyLCBjb25zdCBVQ2hhckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IFdURjo6ZXF1YWwoc3RyLCBidWYucywgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgc3RhdGlj
IHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgVUNoYXJCdWZmZXIm
IGJ1ZiwgdW5zaWduZWQgaGFzaCkKKyAgICB7CisgICAgICAgIGxvY2F0aW9uID0gJlN0cmluZ0lt
cGw6OmNyZWF0ZThCaXRJZlBvc3NpYmxlKGJ1Zi5zLCBidWYubGVuZ3RoKS5sZWFrUmVmKCk7Cisg
ICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0SXNB
dG9taWModHJ1ZSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlw
ZT4KK3N0cnVjdCBIYXNoQW5kQ2hhcmFjdGVycyB7CisgICAgdW5zaWduZWQgaGFzaDsKKyAgICBj
b25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzOworICAgIHVuc2lnbmVkIGxlbmd0aDsKK307
CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CitzdHJ1Y3QgSGFzaEFuZENoYXJh
Y3RlcnNUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBIYXNoQW5k
Q2hhcmFjdGVyczxDaGFyYWN0ZXJUeXBlPiYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGJ1ZmZlci5oYXNoID09IFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMo
YnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZl
ci5oYXNoOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0
JiBzdHJpbmcsIGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzPENoYXJhY3RlclR5cGU+JiBidWZmZXIp
CisgICAgeworICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHJpbmcsIGJ1ZmZlci5jaGFyYWN0
ZXJzLCBidWZmZXIubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUo
U3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBIYXNoQW5kQ2hhcmFjdGVyczxDaGFyYWN0ZXJU
eXBlPiYgYnVmZmVyLCB1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSAm
U3RyaW5nSW1wbDo6Y3JlYXRlKGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKS5sZWFr
UmVmKCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlv
bi0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAgfQorfTsKKworc3RydWN0IEhhc2hBbmRVVEY4Q2hh
cmFjdGVycyB7CisgICAgdW5zaWduZWQgaGFzaDsKKyAgICBjb25zdCBjaGFyKiBjaGFyYWN0ZXJz
OworICAgIHVuc2lnbmVkIGxlbmd0aDsKKyAgICB1bnNpZ25lZCB1dGYxNkxlbmd0aDsKK307CisK
K3N0cnVjdCBIYXNoQW5kVVRGOENoYXJhY3RlcnNUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBIYXNoQW5kVVRGOENoYXJhY3RlcnMmIGJ1ZmZlcikKKyAgICB7Cisg
ICAgICAgIHJldHVybiBidWZmZXIuaGFzaDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVh
bChTdHJpbmdJbXBsKiBjb25zdCYgc3RyaW5nLCBjb25zdCBIYXNoQW5kVVRGOENoYXJhY3RlcnMm
IGJ1ZmZlcikKKyAgICB7CisgICAgICAgIGlmIChidWZmZXIudXRmMTZMZW5ndGggIT0gc3RyaW5n
LT5sZW5ndGgoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJZiBi
dWZmZXIgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzIFVURi04IGFuZCBVVEYxNiBsZW5n
dGggYXJlIHRoZSBzYW1lLgorICAgICAgICBpZiAoYnVmZmVyLnV0ZjE2TGVuZ3RoICE9IGJ1ZmZl
ci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmctPmlzOEJpdCgpKQorICAgICAgICAg
ICAgICAgIHJldHVybiBlcXVhbExhdGluMVdpdGhVVEY4KHN0cmluZy0+Y2hhcmFjdGVyczgoKSwg
YnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5jaGFyYWN0ZXJzICsgYnVmZmVyLmxlbmd0aCk7CisK
KyAgICAgICAgICAgIHJldHVybiBlcXVhbFVURjE2V2l0aFVURjgoc3RyaW5nLT5jaGFyYWN0ZXJz
MTYoKSwgYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5jaGFyYWN0ZXJzICsgYnVmZmVyLmxlbmd0
aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyaW5nLT5pczhCaXQoKSkgeworICAgICAg
ICAgICAgY29uc3QgTENoYXIqIHN0cmluZ0NoYXJhY3RlcnMgPSBzdHJpbmctPmNoYXJhY3RlcnM4
KCk7CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoaXNBU0NJSShidWZmZXIuY2hhcmFjdGVy
c1tpXSkpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdDaGFyYWN0ZXJzW2ldICE9IGJ1ZmZl
ci5jaGFyYWN0ZXJzW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAg
ICAgY29uc3QgVUNoYXIqIHN0cmluZ0NoYXJhY3RlcnMgPSBzdHJpbmctPmNoYXJhY3RlcnMxNigp
OworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgICAgIEFTU0VSVChpc0FTQ0lJKGJ1ZmZlci5jaGFyYWN0ZXJzW2ldKSk7Cisg
ICAgICAgICAgICBpZiAoc3RyaW5nQ2hhcmFjdGVyc1tpXSAhPSBidWZmZXIuY2hhcmFjdGVyc1tp
XSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1w
bComIGxvY2F0aW9uLCBjb25zdCBIYXNoQW5kVVRGOENoYXJhY3RlcnMmIGJ1ZmZlciwgdW5zaWdu
ZWQgaGFzaCkKKyAgICB7CisgICAgICAgIFVDaGFyKiB0YXJnZXQ7CisgICAgICAgIFJlZlB0cjxT
dHJpbmdJbXBsPiBuZXdTdHJpbmcgPSBTdHJpbmdJbXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKGJ1
ZmZlci51dGYxNkxlbmd0aCwgdGFyZ2V0KTsKKworICAgICAgICBib29sIGlzQWxsQVNDSUk7Cisg
ICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZSA9IGJ1ZmZlci5jaGFyYWN0ZXJzOworICAgICAgICBp
ZiAoY29udmVydFVURjhUb1VURjE2KCZzb3VyY2UsIHNvdXJjZSArIGJ1ZmZlci5sZW5ndGgsICZ0
YXJnZXQsIHRhcmdldCArIGJ1ZmZlci51dGYxNkxlbmd0aCwgJmlzQWxsQVNDSUkpICE9IGNvbnZl
cnNpb25PSykKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworCisgICAgICAgIGlm
IChpc0FsbEFTQ0lJKQorICAgICAgICAgICAgbmV3U3RyaW5nID0gU3RyaW5nSW1wbDo6Y3JlYXRl
KGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKTsKKworICAgICAgICBsb2NhdGlvbiA9
IG5ld1N0cmluZy5yZWxlYXNlKCkubGVha1JlZigpOworICAgICAgICBsb2NhdGlvbi0+c2V0SGFz
aChoYXNoKTsKKyAgICAgICAgbG9jYXRpb24tPnNldElzQXRvbWljKHRydWUpOworICAgIH0KK307
CisKK1JlZlB0cjxBdG9taWNTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmdJbXBsOjphZGQoY29uc3Qg
VUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVy
biBudWxscHRyOworCisgICAgaWYgKCFsZW5ndGgpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICBVQ2hhckJ1
ZmZlciBidWZmZXIgPSB7IHMsIGxlbmd0aCB9OworICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxl
PFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7Cit9CisKK1JlZjxB
dG9taWNTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmdJbXBsOjphZGQoY29uc3QgVUNoYXIqIHMsIHVu
c2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKQoreworICAgIEFTU0VSVChzKTsK
KyAgICBBU1NFUlQoZXhpc3RpbmdIYXNoKTsKKworICAgIGlmICghbGVuZ3RoKQorICAgICAgICBy
ZXR1cm4gKnN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPihTdHJpbmdJbXBsOjplbXB0eSgp
KTsKKworICAgIEhhc2hBbmRDaGFyYWN0ZXJzPFVDaGFyPiBidWZmZXIgPSB7IGV4aXN0aW5nSGFz
aCwgcywgbGVuZ3RoIH07CisgICAgcmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8SGFzaEFuZENoYXJh
Y3RlcnM8VUNoYXI+LCBIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I8VUNoYXI+PihidWZmZXIp
OworfQorCitSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkKGNv
bnN0IFVDaGFyKiBzKQoreworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICB1bnNpZ25lZCBsZW5ndGggPSAwOworICAgIHdoaWxlIChzW2xlbmd0aF0gIT0gVUNoYXIo
MCkpCisgICAgICAgICsrbGVuZ3RoOworCisgICAgaWYgKCFsZW5ndGgpCisgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisK
KyAgICBVQ2hhckJ1ZmZlciBidWZmZXIgPSB7IHMsIGxlbmd0aCB9OworICAgIHJldHVybiBhZGRU
b1N0cmluZ1RhYmxlPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7
Cit9CisKK3N0cnVjdCBTdWJzdHJpbmdMb2NhdGlvbiB7CisgICAgU3RyaW5nSW1wbCogYmFzZVN0
cmluZzsKKyAgICB1bnNpZ25lZCBzdGFydDsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitz
dHJ1Y3QgU3Vic3RyaW5nVHJhbnNsYXRvciB7CisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0
cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlciwgdW5z
aWduZWQgaGFzaCkKKyAgICB7CisgICAgICAgIGxvY2F0aW9uID0gJlN0cmluZ0ltcGw6OmNyZWF0
ZVN1YnN0cmluZ1NoYXJpbmdJbXBsKGJ1ZmZlci5iYXNlU3RyaW5nLCBidWZmZXIuc3RhcnQsIGJ1
ZmZlci5sZW5ndGgpLmxlYWtSZWYoKTsKKyAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7
CisgICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICB9Cit9OworCitzdHJ1
Y3QgU3Vic3RyaW5nVHJhbnNsYXRvcjggOiBTdWJzdHJpbmdUcmFuc2xhdG9yIHsKKyAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChjb25zdCBTdWJzdHJpbmdMb2NhdGlvbiYgYnVmZmVyKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNrVG9wOEJpdHMo
YnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnM4KCkgKyBidWZmZXIuc3RhcnQsIGJ1ZmZlci5s
ZW5ndGgpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmluZ0ltcGwqIGNvbnN0
JiBzdHJpbmcsIGNvbnN0IFN1YnN0cmluZ0xvY2F0aW9uJiBidWZmZXIpCisgICAgeworICAgICAg
ICByZXR1cm4gV1RGOjplcXVhbChzdHJpbmcsIGJ1ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJz
OCgpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3RoKTsKKyAgICB9Cit9OworCitzdHJ1Y3Qg
U3Vic3RyaW5nVHJhbnNsYXRvcjE2IDogU3Vic3RyaW5nVHJhbnNsYXRvciB7CisgICAgc3RhdGlj
IHVuc2lnbmVkIGhhc2goY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlcikKKyAgICB7Cisg
ICAgICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGJ1
ZmZlci5iYXNlU3RyaW5nLT5jaGFyYWN0ZXJzMTYoKSArIGJ1ZmZlci5zdGFydCwgYnVmZmVyLmxl
bmd0aCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3Qm
IHN0cmluZywgY29uc3QgU3Vic3RyaW5nTG9jYXRpb24mIGJ1ZmZlcikKKyAgICB7CisgICAgICAg
IHJldHVybiBXVEY6OmVxdWFsKHN0cmluZywgYnVmZmVyLmJhc2VTdHJpbmctPmNoYXJhY3RlcnMx
NigpICsgYnVmZmVyLnN0YXJ0LCBidWZmZXIubGVuZ3RoKTsKKyAgICB9Cit9OworCitSZWZQdHI8
QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkKFN0cmluZ0ltcGwqIGJhc2VT
dHJpbmcsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKCFiYXNl
U3RyaW5nKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGlmICghbGVuZ3RoIHx8IHN0
YXJ0ID49IGJhc2VTdHJpbmctPmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
QXRvbWljU3RyaW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOworCisgICAgdW5zaWduZWQg
bWF4TGVuZ3RoID0gYmFzZVN0cmluZy0+bGVuZ3RoKCkgLSBzdGFydDsKKyAgICBpZiAobGVuZ3Ro
ID49IG1heExlbmd0aCkgeworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJu
IGFkZChiYXNlU3RyaW5nKTsKKyAgICAgICAgbGVuZ3RoID0gbWF4TGVuZ3RoOworICAgIH0KKwor
ICAgIFN1YnN0cmluZ0xvY2F0aW9uIGJ1ZmZlciA9IHsgYmFzZVN0cmluZywgc3RhcnQsIGxlbmd0
aCB9OworICAgIGlmIChiYXNlU3RyaW5nLT5pczhCaXQoKSkKKyAgICAgICAgcmV0dXJuIGFkZFRv
U3RyaW5nVGFibGU8U3Vic3RyaW5nTG9jYXRpb24sIFN1YnN0cmluZ1RyYW5zbGF0b3I4PihidWZm
ZXIpOworICAgIHJldHVybiBhZGRUb1N0cmluZ1RhYmxlPFN1YnN0cmluZ0xvY2F0aW9uLCBTdWJz
dHJpbmdUcmFuc2xhdG9yMTY+KGJ1ZmZlcik7Cit9CisgICAgCit0eXBlZGVmIEhhc2hUcmFuc2xh
dG9yQ2hhckJ1ZmZlcjxMQ2hhcj4gTENoYXJCdWZmZXI7CitzdHJ1Y3QgTENoYXJCdWZmZXJUcmFu
c2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBMQ2hhckJ1ZmZlciYgYnVm
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRNYXNr
VG9wOEJpdHMoYnVmLnMsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVx
dWFsKFN0cmluZ0ltcGwqIGNvbnN0JiBzdHIsIGNvbnN0IExDaGFyQnVmZmVyJiBidWYpCisgICAg
eworICAgICAgICByZXR1cm4gV1RGOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBj
b25zdCBMQ2hhckJ1ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9j
YXRpb24gPSAmU3RyaW5nSW1wbDo6Y3JlYXRlKGJ1Zi5zLCBidWYubGVuZ3RoKS5sZWFrUmVmKCk7
CisgICAgICAgIGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgICAgICBsb2NhdGlvbi0+c2V0
SXNBdG9taWModHJ1ZSk7CisgICAgfQorfTsKKwordHlwZWRlZiBIYXNoVHJhbnNsYXRvckNoYXJC
dWZmZXI8Y2hhcj4gQ2hhckJ1ZmZlcjsKK3N0cnVjdCBDaGFyQnVmZmVyRnJvbUxpdGVyYWxEYXRh
VHJhbnNsYXRvciB7CisgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgQ2hhckJ1ZmZlciYg
YnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2hBbmRN
YXNrVG9wOEJpdHMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KGJ1Zi5zKSwgYnVmLmxl
bmd0aCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3Qm
IHN0ciwgY29uc3QgQ2hhckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdURjo6
ZXF1YWwoc3RyLCBidWYucywgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQg
dHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgQ2hhckJ1ZmZlciYgYnVmLCB1
bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSAmU3RyaW5nSW1wbDo6Y3Jl
YXRlRnJvbUxpdGVyYWwoYnVmLnMsIGJ1Zi5sZW5ndGgpLmxlYWtSZWYoKTsKKyAgICAgICAgbG9j
YXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJc0F0b21pYyh0cnVl
KTsKKyAgICB9Cit9OworCitSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1w
bDo6YWRkKGNvbnN0IExDaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKCFzKQor
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOwor
CisgICAgTENoYXJCdWZmZXIgYnVmZmVyID0geyBzLCBsZW5ndGggfTsKKyAgICByZXR1cm4gYWRk
VG9TdHJpbmdUYWJsZTxMQ2hhckJ1ZmZlciwgTENoYXJCdWZmZXJUcmFuc2xhdG9yPihidWZmZXIp
OworfQorCitSZWY8QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbUxp
dGVyYWxEYXRhKGNvbnN0IGNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAg
ICBBU1NFUlQoY2hhcmFjdGVycyk7CisgICAgQVNTRVJUKGxlbmd0aCk7CisKKyAgICBDaGFyQnVm
ZmVyIGJ1ZmZlciA9IHsgY2hhcmFjdGVycywgbGVuZ3RoIH07CisgICAgcmV0dXJuIGFkZFRvU3Ry
aW5nVGFibGU8Q2hhckJ1ZmZlciwgQ2hhckJ1ZmZlckZyb21MaXRlcmFsRGF0YVRyYW5zbGF0b3I+
KGJ1ZmZlcik7Cit9CisKK1JlZjxBdG9taWNTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmdJbXBsOjph
ZGRTbG93Q2FzZShTdHJpbmdJbXBsJiBzdHJpbmcpCit7CisgICAgaWYgKCFzdHJpbmcubGVuZ3Ro
KCkpCisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KFN0cmlu
Z0ltcGw6OmVtcHR5KCkpOworCisgICAgaWYgKHN0cmluZy5pc1N5bWJvbCgpKSB7CisgICAgICAg
IGlmIChzdHJpbmcuaXM4Qml0KCkpCisgICAgICAgICAgICByZXR1cm4gKmFkZChzdHJpbmcuY2hh
cmFjdGVyczgoKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuICphZGQoc3RyaW5n
LmNoYXJhY3RlcnMxNigpLCBzdHJpbmcubGVuZ3RoKCkpOworICAgIH0KKworICAgIEFTU0VSVF9X
SVRIX01FU1NBR0UoIXN0cmluZy5pc0F0b21pYygpLCAiQXRvbWljU3RyaW5nSW1wbCBzaG91bGQg
bm90IGhpdCB0aGUgc2xvdyBjYXNlIGlmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBhdG9taWMuIik7
CisKKyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7CisgICAgYXV0byBhZGRSZXN1
bHQgPSBzdHJpbmdUYWJsZSgpLmFkZCgmc3RyaW5nKTsKKworICAgIGlmIChhZGRSZXN1bHQuaXNO
ZXdFbnRyeSkgeworICAgICAgICBBU1NFUlQoKmFkZFJlc3VsdC5pdGVyYXRvciA9PSAmc3RyaW5n
KTsKKyAgICAgICAgc3RyaW5nLnNldElzQXRvbWljKHRydWUpOworICAgIH0KKworICAgIHJldHVy
biAqc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCphZGRSZXN1bHQuaXRlcmF0b3IpOwor
fQorCitSZWY8QXRvbWljU3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nSW1wbDo6YWRkU2xvd0Nhc2Uo
QXRvbWljU3RyaW5nVGFibGUmIHN0cmluZ1RhYmxlLCBTdHJpbmdJbXBsJiBzdHJpbmcpCit7Cisg
ICAgaWYgKCFzdHJpbmcubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXRv
bWljU3RyaW5nSW1wbCo+KFN0cmluZ0ltcGw6OmVtcHR5KCkpOworCisgICAgaWYgKHN0cmluZy5p
c1N5bWJvbCgpKSB7CisgICAgICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpCisgICAgICAgICAgICBy
ZXR1cm4gKmFkZChzdHJpbmcuY2hhcmFjdGVyczgoKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAg
ICAgcmV0dXJuICphZGQoc3RyaW5nLmNoYXJhY3RlcnMxNigpLCBzdHJpbmcubGVuZ3RoKCkpOwor
ICAgIH0KKworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIXN0cmluZy5pc0F0b21pYygpLCAiQXRv
bWljU3RyaW5nSW1wbCBzaG91bGQgbm90IGhpdCB0aGUgc2xvdyBjYXNlIGlmIHRoZSBzdHJpbmcg
aXMgYWxyZWFkeSBhdG9taWMuIik7CisKKyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2Nr
ZXI7CisgICAgYXV0byBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZS50YWJsZSgpLmFkZCgmc3RyaW5n
KTsKKworICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSkgeworICAgICAgICBBU1NFUlQoKmFk
ZFJlc3VsdC5pdGVyYXRvciA9PSAmc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nLnNldElzQXRvbWlj
KHRydWUpOworICAgIH0KKworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1w
bCo+KCphZGRSZXN1bHQuaXRlcmF0b3IpOworfQorCit2b2lkIEF0b21pY1N0cmluZ0ltcGw6OnJl
bW92ZShBdG9taWNTdHJpbmdJbXBsKiBzdHJpbmcpCit7CisgICAgQVNTRVJUKHN0cmluZy0+aXNB
dG9taWMoKSk7CisgICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2VyOworICAgIEhhc2hT
ZXQ8U3RyaW5nSW1wbCo+JiBhdG9taWNTdHJpbmdUYWJsZSA9IHN0cmluZ1RhYmxlKCk7CisgICAg
SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGl0ZXJhdG9yID0gYXRvbWljU3RyaW5nVGFi
bGUuZmluZChzdHJpbmcpOworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gYXRv
bWljU3RyaW5nVGFibGUuZW5kKCksICJUaGUgc3RyaW5nIGJlaW5nIHJlbW92ZWQgaXMgYXRvbWlj
IGluIHRoZSBzdHJpbmcgdGFibGUgb2YgYW4gb3RoZXIgdGhyZWFkISIpOworICAgIGF0b21pY1N0
cmluZ1RhYmxlLnJlbW92ZShpdGVyYXRvcik7Cit9CisKK0F0b21pY1N0cmluZ0ltcGwqIEF0b21p
Y1N0cmluZ0ltcGw6Omxvb2t1cFNsb3dDYXNlKFN0cmluZ0ltcGwmIHN0cmluZykKK3sKKyAgICBB
U1NFUlRfV0lUSF9NRVNTQUdFKCFzdHJpbmcuaXNBdG9taWMoKSwgIkF0b21pY1N0cmluZ0ltcGxz
IHNob3VsZCByZXR1cm4gZnJvbSB0aGUgZmFzdCBjYXNlLiIpOworCisgICAgaWYgKCFzdHJpbmcu
bGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4o
U3RyaW5nSW1wbDo6ZW1wdHkoKSk7CisKKyAgICBpZiAoc3RyaW5nLmlzU3ltYm9sKCkpIHsKKyAg
ICAgICAgaWYgKHN0cmluZy5pczhCaXQoKSkKKyAgICAgICAgICAgIHJldHVybiBsb29rdXBJbnRl
cm5hbChzdHJpbmcuY2hhcmFjdGVyczgoKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0
dXJuIGxvb2t1cEludGVybmFsKHN0cmluZy5jaGFyYWN0ZXJzMTYoKSwgc3RyaW5nLmxlbmd0aCgp
KTsKKyAgICB9CisKKyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2NrZXI7CisgICAgSGFz
aFNldDxTdHJpbmdJbXBsKj4mIGF0b21pY1N0cmluZ1RhYmxlID0gc3RyaW5nVGFibGUoKTsKKyAg
ICBhdXRvIGl0ZXJhdG9yID0gYXRvbWljU3RyaW5nVGFibGUuZmluZCgmc3RyaW5nKTsKKyAgICBp
ZiAoaXRlcmF0b3IgIT0gYXRvbWljU3RyaW5nVGFibGUuZW5kKCkpCisgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBsKj4oKml0ZXJhdG9yKTsKKyAgICByZXR1cm4gbnVs
bHB0cjsKK30KKworUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IEF0b21pY1N0cmluZ0ltcGw6OmFk
ZEZyb21VVEY4KGNvbnN0IGNoYXIqIGNoYXJhY3RlcnNTdGFydCwgY29uc3QgY2hhciogY2hhcmFj
dGVyc0VuZCkKK3sKKyAgICBIYXNoQW5kVVRGOENoYXJhY3RlcnMgYnVmZmVyOworICAgIGJ1ZmZl
ci5jaGFyYWN0ZXJzID0gY2hhcmFjdGVyc1N0YXJ0OworICAgIGJ1ZmZlci5oYXNoID0gY2FsY3Vs
YXRlU3RyaW5nSGFzaEFuZExlbmd0aEZyb21VVEY4TWFza2luZ1RvcDhCaXRzKGNoYXJhY3RlcnNT
dGFydCwgY2hhcmFjdGVyc0VuZCwgYnVmZmVyLmxlbmd0aCwgYnVmZmVyLnV0ZjE2TGVuZ3RoKTsK
KworICAgIGlmICghYnVmZmVyLmhhc2gpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAg
cmV0dXJuIGFkZFRvU3RyaW5nVGFibGU8SGFzaEFuZFVURjhDaGFyYWN0ZXJzLCBIYXNoQW5kVVRG
OENoYXJhY3RlcnNUcmFuc2xhdG9yPihidWZmZXIpOworfQorCitBdG9taWNTdHJpbmdJbXBsKiBB
dG9taWNTdHJpbmdJbXBsOjpsb29rdXBJbnRlcm5hbChjb25zdCBMQ2hhciogY2hhcmFjdGVycywg
dW5zaWduZWQgbGVuZ3RoKQoreworICAgIEF0b21pY1N0cmluZ1RhYmxlTG9ja2VyIGxvY2tlcjsK
KyAgICBhdXRvJiB0YWJsZSA9IHN0cmluZ1RhYmxlKCk7CisKKyAgICBMQ2hhckJ1ZmZlciBidWZm
ZXIgPSB7IGNoYXJhY3RlcnMsIGxlbmd0aCB9OworICAgIGF1dG8gaXRlcmF0b3IgPSB0YWJsZS5m
aW5kPExDaGFyQnVmZmVyVHJhbnNsYXRvcj4oYnVmZmVyKTsKKyAgICBpZiAoaXRlcmF0b3IgIT0g
dGFibGUuZW5kKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWNTdHJpbmdJbXBs
Kj4oKml0ZXJhdG9yKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworQXRvbWljU3RyaW5nSW1w
bCogQXRvbWljU3RyaW5nSW1wbDo6bG9va3VwSW50ZXJuYWwoY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBBdG9taWNTdHJpbmdUYWJsZUxvY2tlciBsb2Nr
ZXI7CisgICAgYXV0byYgdGFibGUgPSBzdHJpbmdUYWJsZSgpOworCisgICAgVUNoYXJCdWZmZXIg
YnVmZmVyID0geyBjaGFyYWN0ZXJzLCBsZW5ndGggfTsKKyAgICBhdXRvIGl0ZXJhdG9yID0gdGFi
bGUuZmluZDxVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1ZmZlcik7CisgICAgaWYgKGl0ZXJhdG9y
ICE9IHRhYmxlLmVuZCgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5n
SW1wbCo+KCppdGVyYXRvcik7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKyNpZiAhQVNTRVJU
X0RJU0FCTEVECitib29sIEF0b21pY1N0cmluZ0ltcGw6OmlzSW5BdG9taWNTdHJpbmdUYWJsZShT
dHJpbmdJbXBsKiBzdHJpbmcpCit7CisgICAgQXRvbWljU3RyaW5nVGFibGVMb2NrZXIgbG9ja2Vy
OworICAgIHJldHVybiBzdHJpbmdUYWJsZSgpLmNvbnRhaW5zKHN0cmluZyk7Cit9CisjZW5kaWYK
KworfSAvLyBuYW1lc3BhY2UgV1RGCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L0F0
b21pY1N0cmluZ0ltcGwuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5o
CmluZGV4IDYyYTkwZTA2ZTUzOGY2NjNlNGJmMGUwM2JlMzJlYjY0MDE3YzIyYzIuLmI4MzE3ZGEz
ZGYyZjY0OTU3MWMxOTNmYmNlZTk2NzBiMDBiZjliMzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYv
d3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvQXRv
bWljU3RyaW5nSW1wbC5oCkBAIC0yNSwxMCArMjUsOTIgQEAKIAogbmFtZXNwYWNlIFdURiB7CiAK
K2NsYXNzIEF0b21pY1N0cmluZ1RhYmxlOworCiBjbGFzcyBBdG9taWNTdHJpbmdJbXBsIDogcHVi
bGljIFN0cmluZ0ltcGwKIHsKK3ByaXZhdGU6CisgICAgQXRvbWljU3RyaW5nSW1wbCgpID0gZGVs
ZXRlOworCiBwdWJsaWM6Ci0gICAgQXRvbWljU3RyaW5nSW1wbCgpIDogU3RyaW5nSW1wbCgwKSB7
fQorICAgIHN0YXRpYyBBdG9taWNTdHJpbmdJbXBsKiBsb29rdXAoTENoYXIqIGNoYXJhY3RlcnMs
IHVuc2lnbmVkIGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb29rdXBJbnRlcm5hbChj
aGFyYWN0ZXJzLCBsZW5ndGgpOworICAgIH0KKyAgICBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCog
bG9va3VwKFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCisgICAgeworICAgICAg
ICByZXR1cm4gbG9va3VwSW50ZXJuYWwoY2hhcmFjdGVycywgbGVuZ3RoKTsKKyAgICB9CisgICAg
c3RhdGljIEF0b21pY1N0cmluZ0ltcGwqIGxvb2t1cChTdHJpbmdJbXBsKiBzdHJpbmcpCisgICAg
eworICAgICAgICBpZiAoIXN0cmluZyB8fCBzdHJpbmctPmlzQXRvbWljKCkpCisgICAgICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KHN0cmluZyk7CisgICAgICAg
IHJldHVybiBsb29rdXBTbG93Q2FzZSgqc3RyaW5nKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9p
ZCByZW1vdmUoQXRvbWljU3RyaW5nSW1wbCopOworCisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJ
IHN0YXRpYyBSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gYWRkKGNvbnN0IExDaGFyKik7CisgICAg
QUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBj
aGFyKiBzKSB7IHJldHVybiBhZGQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KHMpKTsg
fTsKKyAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIFJlZlB0cjxBdG9taWNTdHJpbmdJ
bXBsPiBhZGQoY29uc3QgTENoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIFdURl9FWFBPUlRf
U1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBVQ2hh
ciosIHVuc2lnbmVkIGxlbmd0aCk7CisgICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRyPEF0
b21pY1N0cmluZ0ltcGw+IGFkZChjb25zdCBjaGFyKiBzLCB1bnNpZ25lZCBsZW5ndGgpIHsgcmV0
dXJuIGFkZChyZWludGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4ocyksIGxlbmd0aCk7IH07Cisg
ICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWY8QXRvbWljU3RyaW5nSW1wbD4gYWRk
KGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpOwor
ICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0cmluZ0ltcGw+
IGFkZChjb25zdCBVQ2hhciopOworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVm
UHRyPEF0b21pY1N0cmluZ0ltcGw+IGFkZChTdHJpbmdJbXBsKiwgdW5zaWduZWQgb2Zmc2V0LCB1
bnNpZ25lZCBsZW5ndGgpOworICAgIEFMV0FZU19JTkxJTkUgc3RhdGljIFJlZlB0cjxBdG9taWNT
dHJpbmdJbXBsPiBhZGQoU3RyaW5nSW1wbCogc3RyaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCFz
dHJpbmcpCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+
KHN0cmluZyk7CisgICAgICAgIHJldHVybiBhZGQoKnN0cmluZyk7CisgICAgfQorICAgIFdURl9F
WFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmPEF0b21pY1N0cmluZ0ltcGw+IGFkZEZyb21MaXRl
cmFsRGF0YShjb25zdCBjaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpOworCisgICAg
Ly8gQXRvbWljU3RyaW5nSW1wbDo6YWRkRnJvbVVURjggd2lsbCByZXR1cm4gYSBudWxscHRyIGlm
CisgICAgLy8gdGhlIGlucHV0IGRhdGEgY29udGFpbnMgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZXMu
CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWZQdHI8QXRvbWljU3RyaW5nSW1w
bD4gYWRkRnJvbVVURjgoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCk7CisjaWYg
VVNFKENGKQorICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgUmVmUHRyPEF0b21pY1N0
cmluZ0ltcGw+IGFkZChDRlN0cmluZ1JlZik7CisjZW5kaWYKKworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIFN0cmluZ1RhYmxlUHJvdmlkZXI+CisgICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmUHRy
PEF0b21pY1N0cmluZ0ltcGw+IGFkZFdpdGhTdHJpbmdUYWJsZVByb3ZpZGVyKFN0cmluZ1RhYmxl
UHJvdmlkZXImIHN0cmluZ1RhYmxlUHJvdmlkZXIsIFN0cmluZ0ltcGwqIHN0cmluZykKKyAgICB7
CisgICAgICAgIGlmICghc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0
b21pY1N0cmluZ0ltcGwqPihzdHJpbmcpOworICAgICAgICByZXR1cm4gYWRkKCpzdHJpbmdUYWJs
ZVByb3ZpZGVyLmF0b21pY1N0cmluZ1RhYmxlKCksICpzdHJpbmcpOworICAgIH0KKworI2lmICFB
U1NFUlRfRElTQUJMRUQKKyAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc3RhdGljIGJvb2wgaXNJ
bkF0b21pY1N0cmluZ1RhYmxlKFN0cmluZ0ltcGwqKTsKKyNlbmRpZgorCitwcml2YXRlOgorICAg
IEFMV0FZU19JTkxJTkUgc3RhdGljIFJlZjxBdG9taWNTdHJpbmdJbXBsPiBhZGQoU3RyaW5nSW1w
bCYgc3RyaW5nKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmluZy5pc0F0b21pYygpKSB7CisgICAg
ICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFzdHJpbmcubGVuZ3RoKCkgfHwgaXNJbkF0b21p
Y1N0cmluZ1RhYmxlKCZzdHJpbmcpLCAiVGhlIGF0b21pYyBzdHJpbmcgY29tZXMgZnJvbSBhbiBv
dGhlciB0aHJlYWQhIik7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3Ry
aW5nSW1wbCY+KHN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFNsb3dDYXNl
KHN0cmluZyk7CisgICAgfQorCisgICAgQUxXQVlTX0lOTElORSBzdGF0aWMgUmVmPEF0b21pY1N0
cmluZ0ltcGw+IGFkZChBdG9taWNTdHJpbmdUYWJsZSYgc3RyaW5nVGFibGUsIFN0cmluZ0ltcGwm
IHN0cmluZykKKyAgICB7CisgICAgICAgIGlmIChzdHJpbmcuaXNBdG9taWMoKSkgeworICAgICAg
ICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghc3RyaW5nLmxlbmd0aCgpIHx8IGlzSW5BdG9taWNT
dHJpbmdUYWJsZSgmc3RyaW5nKSwgIlRoZSBhdG9taWMgc3RyaW5nIGNvbWVzIGZyb20gYW4gb3Ro
ZXIgdGhyZWFkISIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmlu
Z0ltcGwmPihzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRTbG93Q2FzZShz
dHJpbmdUYWJsZSwgc3RyaW5nKTsKKyAgICB9CisKKyAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkg
c3RhdGljIFJlZjxBdG9taWNTdHJpbmdJbXBsPiBhZGRTbG93Q2FzZShTdHJpbmdJbXBsJik7Cisg
ICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBSZWY8QXRvbWljU3RyaW5nSW1wbD4gYWRk
U2xvd0Nhc2UoQXRvbWljU3RyaW5nVGFibGUmLCBTdHJpbmdJbXBsJik7CisKKyAgICBXVEZfRVhQ
T1JUX1NUUklOR19BUEkgc3RhdGljIEF0b21pY1N0cmluZ0ltcGwqIGxvb2t1cFNsb3dDYXNlKFN0
cmluZ0ltcGwmKTsKKworICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgQXRvbWljU3Ry
aW5nSW1wbCogbG9va3VwSW50ZXJuYWwoY29uc3QgTENoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwor
ICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzdGF0aWMgQXRvbWljU3RyaW5nSW1wbCogbG9va3Vw
SW50ZXJuYWwoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwogfTsKIAogI2lmICFBU1NF
UlRfRElTQUJMRUQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5j
cHAgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuY3BwCmluZGV4IGIwMTk3YjI0YWFl
MGU3MDhmNmUyNDQwYzFhZWQ3ZDg5ZjA4MmY5MGQuLjhmZjNmOGJiN2M5NjcyNTU4ZDU4YTIzZWQw
MjNlMjE1YWNlMThhYTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1w
bC5jcHAKKysrIGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdJbXBsLmNwcApAQCAtMTExLDcg
KzExMSw3IEBAIHZvaWQgU3RyaW5nU3RhdHM6OnByaW50U3RhdHMoKQogICAgIFNUUklOR19TVEFU
U19SRU1PVkVfU1RSSU5HKCp0aGlzKTsKIAogICAgIGlmIChpc0F0b21pYygpICYmIGxlbmd0aCgp
ICYmICFpc1N5bWJvbCgpKQotICAgICAgICBBdG9taWNTdHJpbmc6OnJlbW92ZSh0aGlzKTsKKyAg
ICAgICAgQXRvbWljU3RyaW5nSW1wbDo6cmVtb3ZlKHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0lt
cGwqPih0aGlzKSk7CiAKICAgICBpZiAoaXNTeW1ib2woKSAmJiBzeW1ib2xSZWdpc3RyeSgpKQog
ICAgICAgICBzeW1ib2xSZWdpc3RyeSgpLT5yZW1vdmUodGhpcyk7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5n
SW1wbC5oCmluZGV4IGRhMjlmYmFjMjQyN2E0YzljYmZjMGUyNDg2YzBiOWE3NzZiYWQ2ZmMuLmNm
NzYwMTBiODM2MWJjM2JjMjAyMmY1ZDQyOTg5NjMxNTY4YjljNDkgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvU3Ry
aW5nSW1wbC5oCkBAIC0xMzEsNyArMTMxLDYgQEAgY2xhc3MgU3RyaW5nSW1wbCB7CiAgICAgZnJp
ZW5kIHN0cnVjdCBXVEY6OkxDaGFyQnVmZmVyVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0
IFdURjo6U3Vic3RyaW5nVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IFdURjo6VUNoYXJC
dWZmZXJUcmFuc2xhdG9yOwotICAgIGZyaWVuZCBjbGFzcyBBdG9taWNTdHJpbmdJbXBsOwogICAg
IGZyaWVuZCBjbGFzcyBKU0M6OkxMSW50OjpEYXRhOwogICAgIGZyaWVuZCBjbGFzcyBKU0M6OkxM
SW50T2Zmc2V0c0V4dHJhY3RvcjsKICAgICAKQEAgLTMzMCw2ICszMjksOCBAQCBjbGFzcyBTdHJp
bmdJbXBsIHsKICAgICAgICAgU1RSSU5HX1NUQVRTX0FERF8xNkJJVF9TVFJJTkcyKG1fbGVuZ3Ro
LCB0cnVlKTsKICAgICB9CiAKK3Byb3RlY3RlZDoKKyAgICAvLyBUbyBhbGxvdyBnZW5lcmF0aW5n
IHRoZSBkZXN0cnVjdG9yIGluIHRoZSBiYXNlIGNsYXNzZXMsIHdlIGV4cG9zZSB0aGUgZGVzdHJ1
Y3RvciBhcyBwcm90ZWN0ZWQuCiAgICAgflN0cmluZ0ltcGwoKTsKIAogcHVibGljOgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaCBiL1NvdXJjZS9XVEYvd3RmL3Rl
eHQvV1RGU3RyaW5nLmgKaW5kZXggNTMyM2IyNzdhZDljODc0ZDFjNDZiYzIxNDEwMjNiNmU4N2M5
NDAwYy4uMTAxNTY4N2MyNDliZWFiNzVhN2YxNzM2ZGY5NjEwZDI5Yzc0MGI5MSAxMDA2NDQKLS0t
IGEvU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90
ZXh0L1dURlN0cmluZy5oCkBAIC0xMTgsNiArMTE4LDEwIEBAIGNsYXNzIFN0cmluZyB7CiAgICAg
U3RyaW5nKFJlZjxTdHJpbmdJbXBsPiYmIGltcGwpIDogbV9pbXBsKFdURjo6bW92ZShpbXBsKSkg
eyB9CiAgICAgU3RyaW5nKFJlZlB0cjxTdHJpbmdJbXBsPiYmIGltcGwpIDogbV9pbXBsKGltcGwp
IHsgfQogCisgICAgU3RyaW5nKFBhc3NSZWZQdHI8QXRvbWljU3RyaW5nSW1wbD4gaW1wbCkgOiBt
X2ltcGwoaW1wbCkgeyB9CisgICAgU3RyaW5nKFJlZjxBdG9taWNTdHJpbmdJbXBsPiYmIGltcGwp
IDogbV9pbXBsKFdURjo6bW92ZShpbXBsKSkgeyB9CisgICAgU3RyaW5nKFJlZlB0cjxBdG9taWNT
dHJpbmdJbXBsPiYmIGltcGwpIDogbV9pbXBsKGltcGwpIHsgfQorCiAgICAgLy8gQ29uc3RydWN0
IGEgc3RyaW5nIGZyb20gYSBjb25zdGFudCBzdHJpbmcgbGl0ZXJhbC4KICAgICBXVEZfRVhQT1JU
X1NUUklOR19BUEkgU3RyaW5nKEFTQ0lJTGl0ZXJhbCBjaGFyYWN0ZXJzKTsKIApkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi93dGYvdGV4dC9jZi9BdG9taWNTdHJpbmdDRi5jcHAgYi9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L2NmL0F0b21pY1N0cmluZ0NGLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggNTljODJiZjNjNDkyNzhkMWUwMjIzZDI1OTUzZWRmNzFmMmNkNGI0ZC4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0
L2NmL0F0b21pY1N0cmluZ0NGLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvQXRvbWlj
U3RyaW5nLmg+Ci0KLSNpZiBVU0UoQ0YpCi0KLSNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3Jl
Rm91bmRhdGlvbi5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotbmFtZXNwYWNl
IFdURiB7Ci0KLVJlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChDRlN0cmluZ1Jl
ZiBzdHJpbmcpCi17Ci0gICAgaWYgKCFzdHJpbmcpCi0gICAgICAgIHJldHVybiBudWxscHRyOwot
Ci0gICAgQ0ZJbmRleCBsZW5ndGggPSBDRlN0cmluZ0dldExlbmd0aChzdHJpbmcpOwotCi0gICAg
aWYgKGNvbnN0IExDaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IExDaGFyKj4oQ0ZT
dHJpbmdHZXRDU3RyaW5nUHRyKHN0cmluZywga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEpKSkK
LSAgICAgICAgcmV0dXJuIGFkZChwdHIsIGxlbmd0aCk7Ci0KLSAgICBpZiAoY29uc3QgVW5pQ2hh
ciogcHRyID0gQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzUHRyKHN0cmluZykpCi0gICAgICAgIHJldHVy
biBhZGQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHB0ciksIGxlbmd0aCk7Ci0KLSAg
ICBWZWN0b3I8VW5pQ2hhciwgMTAyND4gdWNoYXJCdWZmZXIobGVuZ3RoKTsKLSAgICBDRlN0cmlu
Z0dldENoYXJhY3RlcnMoc3RyaW5nLCBDRlJhbmdlTWFrZSgwLCBsZW5ndGgpLCB1Y2hhckJ1ZmZl
ci5kYXRhKCkpOwotICAgIHJldHVybiBhZGQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+
KHVjaGFyQnVmZmVyLmRhdGEoKSksIGxlbmd0aCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdURgot
Ci0jZW5kaWYgLy8gVVNFKENGKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9jZi9B
dG9taWNTdHJpbmdJbXBsQ0YuY3BwIGIvU291cmNlL1dURi93dGYvdGV4dC9jZi9BdG9taWNTdHJp
bmdJbXBsQ0YuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRhM2YxNWRhZTQ5ODQ3YWE4ZmYyOGRjM2E3NzZiNjc1
YzUxZjkwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L2NmL0F0b21p
Y1N0cmluZ0ltcGxDRi5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdJbXBsLmg+CisKKyNp
ZiBVU0UoQ0YpCisKKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdURiB7CisKK1JlZlB0
cjxBdG9taWNTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmdJbXBsOjphZGQoQ0ZTdHJpbmdSZWYgc3Ry
aW5nKQoreworICAgIGlmICghc3RyaW5nKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAg
IENGSW5kZXggbGVuZ3RoID0gQ0ZTdHJpbmdHZXRMZW5ndGgoc3RyaW5nKTsKKworICAgIGlmIChj
b25zdCBMQ2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KENGU3RyaW5n
R2V0Q1N0cmluZ1B0cihzdHJpbmcsIGtDRlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xKSkpCisgICAg
ICAgIHJldHVybiBhZGQocHRyLCBsZW5ndGgpOworCisgICAgaWYgKGNvbnN0IFVuaUNoYXIqIHB0
ciA9IENGU3RyaW5nR2V0Q2hhcmFjdGVyc1B0cihzdHJpbmcpKQorICAgICAgICByZXR1cm4gYWRk
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPihwdHIpLCBsZW5ndGgpOworCisgICAgVmVj
dG9yPFVuaUNoYXIsIDEwMjQ+IHVjaGFyQnVmZmVyKGxlbmd0aCk7CisgICAgQ0ZTdHJpbmdHZXRD
aGFyYWN0ZXJzKHN0cmluZywgQ0ZSYW5nZU1ha2UoMCwgbGVuZ3RoKSwgdWNoYXJCdWZmZXIuZGF0
YSgpKTsKKyAgICByZXR1cm4gYWRkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIqPih1Y2hh
ckJ1ZmZlci5kYXRhKCkpLCBsZW5ndGgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2Vu
ZGlmIC8vIFVTRShDRikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9UcmVlU2NvcGUu
Y3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL1RyZWVTY29wZS5jcHAKaW5kZXggNDJhZDkyMWE0YTQx
MGNiODUyNDQzNmMxMTg1NGRjZThkNWFiNmUxYi4uMzY2MTZmOGE4ZTFkOTVlNjYwNDk3ZTVjYmQ4
MTE3NzRiMTc2YzM2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL1RyZWVTY29wZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL1RyZWVTY29wZS5jcHAKQEAgLTExMiw3ICsxMTIs
NyBAQCBFbGVtZW50KiBUcmVlU2NvcGU6OmdldEVsZW1lbnRCeUlkKGNvbnN0IFN0cmluZyYgZWxl
bWVudElkKSBjb25zdAogICAgIGlmICghbV9lbGVtZW50c0J5SWQpCiAgICAgICAgIHJldHVybiBu
dWxscHRyOwogCi0gICAgaWYgKEF0b21pY1N0cmluZ0ltcGwqIGF0b21pY0VsZW1lbnRJZCA9IEF0
b21pY1N0cmluZzo6ZmluZChlbGVtZW50SWQuaW1wbCgpKSkKKyAgICBpZiAoQXRvbWljU3RyaW5n
SW1wbCogYXRvbWljRWxlbWVudElkID0gQXRvbWljU3RyaW5nSW1wbDo6bG9va3VwKGVsZW1lbnRJ
ZC5pbXBsKCkpKQogICAgICAgICByZXR1cm4gbV9lbGVtZW50c0J5SWQtPmdldEVsZW1lbnRCeUlk
KCphdG9taWNFbGVtZW50SWQsICp0aGlzKTsKIAogICAgIHJldHVybiBudWxscHRyOwpkaWZmIC0t
Z2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9nCmluZGV4IGViYzJjZTljMjUx
Nzk5NjIzNjMyNDczODg4MDk1MTEwZTNkZmFiNTIuLjI0YjUzMTA4NWQ1ZTE1ZGQ5YmRmMzJhYTcz
MjIzMzU3MTdkNzg4MDUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29scy9D
aGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAxNS0wNS0xNyAgWXVzdWtlIFN1enVraSAgPHV0
YXRhbmUudGVhQGdtYWlsLmNvbT4KKworICAgICAgICBNb3ZlIEF0b21pY1N0cmluZ0ltcGwgdGFi
bGUgcmVsYXRlZCBvcGVyYXRpb25zIGZyb20gQXRvbWljU3RyaW5nIHRvIEF0b21pY1N0cmluZ0lt
cGwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTEw
OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogVGVz
dFdlYktpdEFQSS9UZXN0cy9XVEYvU3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChUZXN0V2ViS2l0
QVBJOjpURVNUKToKKwogMjAxNS0wNS0xNyAgRGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUu
Y29tPgogCiAgICAgICAgIGJpc2VjdC1idWlsZHM6IEFkZCAncmV0cnknIG9wdGlvbiB3aGVuIHBy
b21wdGluZyB3aGV0aGVyIHRoZSBidWcgcmVwcm9kdWNlZApkaWZmIC0tZ2l0IGEvVG9vbHMvVGVz
dFdlYktpdEFQSS9UZXN0cy9XVEYvU3RyaW5nSW1wbC5jcHAgYi9Ub29scy9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNwcAppbmRleCA4MzMyMmM5YzJiYzkzNTY3Y2Q2ODg5MWY0
NWU0OTA2MDk2ODQyZGNkLi42ZGM5OTM0MDk4YmQ3ZDE1NTA3YzEyYWVhNzlkZDRmYTg1YjAxOTcx
IDEwMDY0NAotLS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNw
cAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9TdHJpbmdJbXBsLmNwcApAQCAt
NTI1LDcgKzUyNSw3IEBACiAgICAgQVNTRVJUX1RSVUUocmVmZXJlbmNlLT5pc1N5bWJvbCgpKTsK
ICAgICBBU1NFUlRfRkFMU0UocmVmZXJlbmNlLT5pc0F0b21pYygpKTsKIAotICAgIFJlZlB0cjxT
dHJpbmdJbXBsPiBhdG9taWMgPSBBdG9taWNTdHJpbmc6OmFkZChyZWZlcmVuY2UuZ2V0KCkpOwor
ICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBhdG9taWMgPSBBdG9taWNTdHJpbmdJbXBsOjphZGQocmVm
ZXJlbmNlLmdldCgpKTsKICAgICBBU1NFUlRfVFJVRShhdG9taWMtPmlzQXRvbWljKCkpOwogICAg
IEFTU0VSVF9GQUxTRShhdG9taWMtPmlzU3ltYm9sKCkpOwogICAgIEFTU0VSVF9UUlVFKHJlZmVy
ZW5jZS0+aXNTeW1ib2woKSk7CkBAIC01MzgsNyArNTM4LDcgQEAKICAgICBBU1NFUlRfVFJVRShy
ZWZlcmVuY2UtPmlzU3ltYm9sKCkpOwogICAgIEFTU0VSVF9GQUxTRShyZWZlcmVuY2UtPmlzQXRv
bWljKCkpOwogCi0gICAgUmVmUHRyPFN0cmluZ0ltcGw+IGF0b21pYyA9IEF0b21pY1N0cmluZzo6
YWRkKHJlZmVyZW5jZS5nZXQoKSk7CisgICAgUmVmUHRyPFN0cmluZ0ltcGw+IGF0b21pYyA9IEF0
b21pY1N0cmluZ0ltcGw6OmFkZChyZWZlcmVuY2UuZ2V0KCkpOwogICAgIEFTU0VSVF9UUlVFKGF0
b21pYy0+aXNBdG9taWMoKSk7CiAgICAgQVNTRVJUX0ZBTFNFKGF0b21pYy0+aXNTeW1ib2woKSk7
CiAgICAgQVNTRVJUX1RSVUUocmVmZXJlbmNlLT5pc1N5bWJvbCgpKTsK
</data>
<flag name="review"
          id="278173"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>